All posts
Engineering
·
·
6 min read
Moving two million users off a homegrown auth system
How Kestrel migrated with password hashes intact and no forced resets, over a single weekend.

Lucía Ferrer
Developer Relations

Kestrel ran its own authentication for six years: a users table, bcrypt hashes, a homegrown session cookie and a growing list of edge cases. When they moved to Lintel this summer, the rule was simple. Nobody gets signed out and nobody resets a password.
Import the hashes, not the passwords
Lintel accepts bcrypt, scrypt, Argon2 and PBKDF2 hashes on import. Kestrel exported their users table, mapped the columns in the import tool and did a dry run against a staging instance. Every existing password kept working, and Lintel upgraded each hash to Argon2 the next time its owner signed in.
Run both systems for a week
For seven days, Kestrel’s API accepted both its old session cookie and a Lintel session token. New sign-ins went through Lintel, and old sessions kept working until they expired on their own, so nobody was signed out halfway through a task.
The numbers
2.1 million users imported in 38 minutes, with zero forced resets. Support tickets during migration week were lower than the week before, which the team still finds slightly suspicious.
Keep reading.
More from the blog.

Product
·
Passkeys are ready. Here's how we turned them on by default
What we learned switching passkeys on for 9,000 products, and the fallbacks that kept sign-in working for everyone else.

Tobias Lindqvist

Security
·
Why your sign-in page should never say “wrong password”
Small copy decisions that stop account enumeration without making the page harder to use.

Kwame Asante

Guides
·
A practical guide to organizations and roles
How to model teams, invitations and permissions so your B2B plan doesn't need a rewrite in a year.

Aarav Mehta