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.

Portrait of Lucía Ferrer

Lucía Ferrer

Developer Relations

A room filled with lots of boxes and plants

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.

Open the door.

Free for your first 5,000 users. Live in about four minutes.

Open the door.

Free for your first 5,000 users. Live in about four minutes.

Open the door.

Free for your first 5,000 users. Live in about four minutes.

Create a free website with Framer, the website builder loved by startups, designers and agencies.