I kept trying password managers and getting annoyed with them. Eventually, I started building my own. It’s called Ravenpass, and it’s now open source and available for macOS and Android.
The UI was what bothered me first. I care a lot about how an app looks and feels, especially when I open it constantly. Finding a login or editing an entry should take very little thought. In several apps I tried, those everyday actions felt awkward despite the long feature lists.
Organisation mattered too. Work accounts and personal accounts are different parts of my life. I wanted to keep them separate instead of searching through one pile of work logins, shopping accounts and old subscriptions.
Then there was autofill.
I wanted it to work outside the browser
On macOS, I wanted passwords, passkeys and two-factor codes available through the system’s native autofill, including in other apps. That narrowed my options considerably, and the ones that met my needs were more expensive than I was happy with.
That requirement also led to one of the more interesting parts of Ravenpass’s implementation.
The desktop app uses Wails, with a Go backend and a React and TypeScript UI. Native macOS autofill runs through a separate Swift credential provider extension, built around ASCredentialProviderViewController.
So selecting a password involves communication between two processes. The extension talks to the Go app over a Unix socket in their shared App Group container. The app checks the request and supplies the credential.
Both sides check who they’re talking to: the extension verifies the app’s code signature, and the app verifies the connecting peer before handling requests. The app also checks that the selected credential matches the request before releasing a password, code or passkey.
The interesting part is what happens while the user is deciding.
A picker can stay open. The vault can lock. A request can be cancelled while another operation is waiting for verification. By the time a result is ready, the state that allowed the operation to start may have changed.
A related case is tested directly in the vault core: start reading a selected credential, pause after decryption, lock the vault, then let the read continue. The pending read must fail rather than return the credential after the lock.
That test covers a vault read, but it illustrates the timing problem these integrations have to account for. Checking access at the start of an operation is only part of the work.
Keeping the vault independent of the platform
The vault core is written in Go and shared across the apps. It handles records, encryption, recovery and session state. Platform-specific code handles native autofill and device unlock.
This lets the macOS and Android integrations use the same vault format and credential logic. It also means those session tests can run without opening a desktop window or driving a phone.
The vault itself is an encrypted file. You choose where to keep it, locally or in a cloud drive folder you already use. There’s no Ravenpass account to create.
Inside the file, the index and individual records are encrypted with XChaCha20-Poly1305. Device unlock integrates with the Secure Enclave on macOS and Android Keystore on Android.
Recovery uses a generated 24-word phrase. It can restore access to an existing vault file, but it cannot recreate a file that’s gone. Ravenpass supports automatic encrypted backups as well, because recovering access and recovering lost data are separate problems.
What I wanted to keep in it
Passwords were only part of what needed organising. Card details, document scans, private notes and wallet recovery phrases also need somewhere to live.
Ravenpass keeps those together so there’s one place to look. Otherwise, even when something is saved, finding it still depends on remembering which app or folder it ended up in.
I think the best product I can build is one I’ll use myself every day. With this project, that gives me a reason to care about both the code underneath and the small interactions on top. A correctly handled autofill request still needs a picker that’s pleasant to use.
Try it
The macOS and Android apps are available now. Support for iOS, Windows and Linux is planned.
You can download Ravenpass at ravenpass.org, and the source is on GitHub.
If you try it, I’d be particularly interested in hearing how autofill behaves in the apps you use. That’s where other people’s routines can reveal things my own testing misses.
And if the project looks useful, a GitHub star would be appreciated ⭐
Top comments (0)