Vibe code your own 1Password
Vibe code your own 1Password as a locked vault, a generator, and copy. Individual is $3.99 a month. Autofill, passkeys, and Watchtower stay later.
You can vibe code your own 1Password as a locked vault, a generator, and a copy button. 1Password is that product. The catalog line is “Logins in a vault. Find one, copy it, move on.”
The card lists $3.99 to $5.99 a month. 1Password’s families page lists Individual at $3.99 a month through Families at $5.99 a month, on annual billing. The card leaves out first-year promotions. The first estimate is 10 hours. The verdict is “A vault you can open”.
Last time I wrote about vibe coding your own Strava. That was a regular post. This one is a teardown.
The public sources are the security design paper, the security model, the SRP support page, and the Watchtower privacy page. Where those pages stop, I call it a guess.
Vibe code your own 1Password from one vault
The 1Password page splits the work into three rows.
The first row is 10 hours. A vault, login items, a generator, and copy. You unlock, you find the login, you copy the password.
The second row is 3 days. Folders, notes, cards, search, and a CSV import. A credit card and a folder tree can wait until the login you reuse is already in the vault.
The third row is 1 month and up. Browser autofill, passkeys, Watchtower, and family sharing. The table labels that row as the part you should skip.
If you tell an agent to “clone 1Password”, it aims at the third row. Copy the prompt, then pin it to the first one.
Store Vault, VaultItem, LoginSecret, and Tag. The card names all four. For these 10 hours, Vault, VaultItem, and LoginSecret are enough. Tag arrives with folders and search.
A vault is the locked box for one owner. A vault item is the title and the username you can list. A login secret is the password, stored as ciphertext. A tag is a label for the 3-day search.
The audience is one person storing logins on a site they host. The goal on the card is to keep logins in a private vault, generate a password, and copy it. The same v1 also stands in for LastPass, Dashlane, and Bitwarden. The card lists all three and does not give them prices.
Signing your app’s users in is a different product. Auth0 is $35 to $240 a month at 500 monthly active users, for users, a password or a magic link, and a session. That card’s long row is SAML and organizations. This one is your own passwords.
The guardrail is the rule you paste into the prompt. Encrypt item secrets with a key derived from the master password. Never store or log plaintext secrets. Lock the vault after idle time.
How a 1Password vault stays locked
Their design paper treats 1Password as an encryption system. Keys are generated on the device. Encryption happens on the device. The server stores ciphertext and helps you sign in.
Two secrets open an account. The account password is the one you remember. The Secret Key is generated on the client when you sign up. The paper describes it as a version, a non-secret account id, and 26 characters drawn from a 31-character set, a little over 128 bits. You are not expected to memorize it. It lives on the device, and on the Emergency Kit, which is a piece of paper.
They derive keys with both secrets. The paper calls that two-secret key derivation. The account password and the Secret Key go through PBKDF2-HMAC-SHA256. The design paper states 650,000 iterations. The result wraps your private key. A copy of the encrypted private key sits on the server so a new device can download it. The Secret Key is mixed into that derivation, so a password-guessing run against the server blob has nothing to check. Their summary line is that nothing crackable is stored.
Each vault then has its own key. The client generates a 256-bit vault key and encrypts items with AES-GCM-256. Overview and details are encrypted separately, with that same vault key. The overview holds the title, the URL, a strength indicator, and tags, so the app can list and match a site without decrypting the password. The details hold the password and the note body. The vault key itself is encrypted to your public key. Your private key unwraps it. The server never holds the decrypted vault key.
Sign-in does not send either secret. Secure Remote Password is the handshake. The app proves it can derive a secret from the account password and the Secret Key. The server proves it holds the matching verifier, so the app is not talking to an impostor. The password and the Secret Key stay off the wire. The handshake also produces a session key. TLS is still there, and that session key encrypts the traffic again, including non-secrets such as your name. Their developer post counts four layers on an account: the password, the Secret Key, SRP, and TLS. The design paper’s “thrice encrypted in transport” is the item ciphertext, then TLS, then that extra session key.
They cannot reset this for you. The privacy page says they do not know the account password and cannot bypass it. Lose the password and the Secret Key, and the Emergency Kit was the backup. I would print that kit before I trusted the vault with a bank login. The 10-hour clone has the same trap in a smaller form. The key comes from the master password, so a forgotten password is a lost vault. Put the recovery line in the prompt with the encryption rule.
Screens of a 1Password alternative
v1 needs the list and one login. Folders, a card, and a CSV preview are the 3-day row. An extension popup is the month row.
The vault
Maya has unlocked. Two logins are visible. GitHub, username maya-north. Figma, username maya. Search is not on this row. She scrolls.
One login
She opens GitHub. The username is maya-north. Generate asks for 20 characters, upper, lower, and digits. Copy writes the password and the screen says it will clear. Save stores ciphertext. The master password never leaves the browser.
How a login gets copied
Maya types the master password. The page derives a key in the browser and holds it in memory. Node.js plus Astro is the default. Use TanStack Start if React is your weekday language. The capability line on the card is Astro, Alpine, and D1. Alpine is there because the key has to live in the page, not in the request log.
She opens GitHub and presses Generate. The new password is shown once, then she presses Save. The browser encrypts that field and posts the ciphertext. D1 stores the item. A server log of the request body should show the blob, not the password. If it shows the password, the guardrail failed.
Copy writes the decrypted password to the clipboard and the page schedules a clear. Their support page says 1Password can remove a copied password so a clipboard history does not keep it. The clone’s timer is the small version of that. Lock, or the idle timer, drops the key. The next visit asks for the master password again. A guessed item id from another account returns an empty page.
The hard half of a 1Password alternative
Ten hours is one owner, a master password, ciphertext in D1, a generator, and a copy button that clears. Open GitHub, copy, lock, and confirm the row is still ciphertext.
The Secret Key is why a server dump is a different incident for them. Your clone’s master password is the only secret. Someone who copies D1 and watches you type a weak password is closer to the items than someone who copies 1Password’s database without the Secret Key. A normal login request can still contain the password. Their handshake leaves the password off the wire.
Encrypted titles are the other quiet half. The privacy page says titles, URLs, and tags are encrypted too. Search runs after unlock, on the device, against decrypted overviews. The card’s 3-day search can be a SQL query on titles you left readable. That is a smaller product. It is also a list of your sites sitting in the database. Say so in the prompt if you leave titles in the clear.
Autofill is a browser extension. Their security model says 1Password only fills on the site where the password was saved, and that it checks the browser’s code signature before filling. A phishing page with a lookalike host gets nothing. The 10-hour app does not see the page you are on, so a paste can land in the wrong form.
Watchtower checks breaches on the device. The privacy page says website checks download breach data from watchtower.1password.com and compare it locally. Password checks hash with SHA-1, send the first five characters of that 40-character hash to Have I Been Pwned, and compare the returned list on the device. The password stays put. Weak and reused passwords are local too. Their pwned-passwords post writes up that prefix. A hash client, the remote list, and a rule for what you store afterward are the month row.
Family sharing is public-key wrapping. The design paper’s example is an Everyone vault. Alice adds Bob by encrypting a copy of the vault key to Bob’s public key. Bob’s client decrypts it with his private key. The server never sees the decrypted vault key, so it cannot hand the vault to someone else. A shared password column on your clone gives the second person the secret itself. Passkeys sit on the same month row. The design paper does not describe passkey sync, so that part stays a guess.
Paste the no-plaintext rule from How to write a coding agent prompt, and keep the split in How to scope a SaaS clone.
Start with the first row
Go to Build your own 1Password. Copy the Astro prompt, or TanStack Start if that is what you write.
Tell the agent the first estimate only. A vault, login items, a generator, and copy. Ten hours.
Save a GitHub login, copy it, lock the page, and read the server log. You want ciphertext. If you need autofill, a breach check, or a second person on the vault, keep the $3.99 plan for that part.