What it solves
Naming a baby is a two-person decision made from thousands of options, and a shared list on the fridge only records what got said out loud. Baby Name Picker gives each partner the same deck of names to swipe through on their own, keeps both sets of answers, and shows the overlap. From the names you both accepted it generates ranked first, middle and last combinations, so the shortlist turns into full names without a brainstorming session.
How it is built
The catalog is the top 1,000 boys' and 1,000 girls' names from the Social Security Administration's public-domain 2024 file, ranked by count and loaded into Firestore once by an admin script; clients can read it but never write to it. Every read and write goes through a repository interface with a single Firestore implementation, which lets the tests run against an in-memory fake. The deck handles the unglamorous states on purpose: a first launch with no connection shows a message rather than a silently empty deck, a failed swipe goes back on the stack instead of being lost, and undo removes the swipe outright.
The hard decision
Partner matching was planned for a later version, and it shipped in the first one.
The design review behind the plan cut shared spaces from the first version as over-engineering for a single couple, but it fixed the later move in advance: swipes would be copied from each user into a shared space, never rewritten, so adding matching could not destroy anyone's data. Matching then shipped in the first version anyway, built to that design. Partners join a space with a six-character code drawn by a secure random generator from an alphabet with no O, 0, I or 1, so it can be read aloud. Each swipe is stored under the space and tagged with its author, the security rules reject any write tagged with someone else's ID so one partner cannot vote for the other, and a match is simply a name both members accepted.
What it taught me
Ship the sign-in that works and keep the other one as an option. The plan called for Google Sign-In, and on Android it stayed unreliable because the build never produced the web client ID that Google's flow needs. Email and password became the main way in and Google the secondary one, which unblocked everything else instead of holding the app on one configuration bug.