There is no vault here. Nothing is stored, synced, or uploaded — not by us, not on this computer. Your passwords are worked out fresh each time from one phrase you remember and one thing you keep.
Deterministic derivation through a two-party oblivious PRF over ristretto255, with a verified oracle. No vault, no sync, no stored secret.
Your oracle is the half of the secret that lives outside your head. It can be a small device, or a square of paper. Both do exactly the same job.
Is this oracle brand new, or have you used it before?
Plug the board into a USB port, then install the firmware. Your computer will ask which device to talk to — pick the one that appears when you plug it in.
Never tick “erase device” when reflashing one you have used. Erasing wipes the oracle's key, and every password it has ever made is gone for good. Installing firmware on its own leaves the key untouched.
Done? Then carry on and connect it below.
Plug the oracle in and press connect. Your browser will ask permission to talk to it — that permission is what keeps other pages away from it.
This browser has no WebSerial, so it cannot connect to a hardware oracle at all. Open the site in Chrome or Edge, or go back and choose a paper oracle.
Do you already have a printed square, or do you need to make one?
A hardware oracle does a secret handshake to make your passwords. This prints a square of paper that does that same handshake instead — so you need no device at all. Your phrase stays in your head, the paper stays somewhere safe, and it takes both to make a password. No password is printed on it.
Scribble in the box. Your squiggle gets stirred into the randomness your browser already produces. It can only add to it — never replace it — so a lazy scribble is no worse than none, and a wild one is a little better.
Finish step 2 and this opens up.
Neither yet? — the demo runs the whole handshake with a pretend key, so nothing you see is a real password.
Pick something only you know and can always remember. It never leaves this device.
Master passphrase. Hashed with the index to a ristretto255 point; never transmitted.
Every account gets its own number, so every account gets a different password. Give it a nickname and we'll remember the number for you — the nickname stays on this device only.
Sub-index. Included in the hash-to-group input and the HKDF salt. Nicknames are a local convenience in localStorage and never affect derivation.
Not sure? The first one is a good default. Some websites don't allow symbols — then pick letters & numbers.
Second-stage HKDF keyed by format name, rejection-sampled into the charset.
That's everything — press the big button. You can come back and change the account number any time; the same phrase and number always give the same password.
Derive against the hardware oracle over WebSerial, or the in-browser simulator (ephemeral session key, not pinned).
Think of your oracle as a keyholder that never tells anyone its key.
Because the answer depends on both your phrase and your oracle, someone who steals only one of them gets nothing. And because the same two things always produce the same answer, there's no vault to lose, back up, or have stolen.
Worth knowing: if you lose your oracle, you lose the passwords it makes. And anything plugged into it while it's connected can ask it to stamp things, so unplug it when you're done.
vaultless is a deterministic password manager: every password is re-derived on demand from your master passphrase and a sub-index. Same two inputs, same password, every time. Nothing to sync, back up, or leak.
Pure deterministic derivation lets anyone who steals the passphrase recompute every password offline. vaultless closes that with a second factor that never leaves a physical device: a two-party oblivious PRF over ristretto255.
passphrase‖index to a curve point P and blinds it with
a random scalar r to get B = r·P — indistinguishable from random.log_G(Y) == log_B(B′).firmware/SECURE_PROVISIONING.md.| Display (ST7789) | SPI: MOSI 19 · SCLK 18 · CS 5 · DC 16 · RST 23 · BL 4 |
| Buttons | GPIO 35 / GPIO 0 — cycle the info pages and wake the screen. Requests are still auto-approved; a button never approves one. |
| Backlight | GPIO 4 — sleeps after 5 minutes idle, wakes on a button or an incoming request |
Easiest: plug the board in over USB and press Install firmware above. It uses ESP Web Tools over WebSerial — no local toolchain needed.
To build from source instead:
git clone https://github.com/Ak1ra00/SK cd SK/firmware pio run -e esp32dev -t upload
The oracle scalar k is generated on first boot from the hardware RNG and stored in NVS — it never touches the serial line, the browser, or this repo. Source: firmware/src/main.cpp.
You are reading over plain HTTP. Anyone
between you and the server — a network, an ISP, whoever runs the Wi-Fi — can
change this page before it reaches you, and a changed page can send your
master phrase and every password it makes straight to them.
This site is refusing to make passwords here. That is deliberate: its whole premise is that the code you audited is the code that runs, and over HTTP nobody can promise that.
Two things are already broken and are not your device's fault: the camera and the USB hardware oracle both require HTTPS, so both report as missing on every machine you try.
If this is your site: serve it over HTTPS and turn on
"Enforce HTTPS". If you are a visitor: try the
https:// address, and do not type your phrase until it loads.