<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: anthy</title>
    <description>The latest articles on DEV Community by anthy (@dortanes).</description>
    <link>https://dev.to/dortanes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4145099%2F463f97ad-2836-4391-881f-791cd717203c.jpg</url>
      <title>DEV Community: anthy</title>
      <link>https://dev.to/dortanes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dortanes"/>
    <language>en</language>
    <item>
      <title>I built a password manager because I’m picky about the apps I use</title>
      <dc:creator>anthy</dc:creator>
      <pubDate>Sun, 27 Sep 2026 05:29:58 +0000</pubDate>
      <link>https://dev.to/dortanes/i-built-a-password-manager-because-im-picky-about-the-apps-i-use-5028</link>
      <guid>https://dev.to/dortanes/i-built-a-password-manager-because-im-picky-about-the-apps-i-use-5028</guid>
      <description>&lt;p&gt;I kept trying password managers and getting annoyed with them. Eventually, I started building my own. It’s called &lt;strong&gt;Ravenpass&lt;/strong&gt;, and it’s now open source and available for macOS and Android.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Then there was autofill.&lt;/p&gt;

&lt;h2&gt;
  
  
  I wanted it to work outside the browser
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;That requirement also led to one of the more interesting parts of Ravenpass’s implementation.&lt;/p&gt;

&lt;p&gt;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 &lt;code&gt;ASCredentialProviderViewController&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;The interesting part is what happens while the user is deciding.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the vault independent of the platform
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I wanted to keep in it
&lt;/h2&gt;

&lt;p&gt;Passwords were only part of what needed organising. Card details, document scans, private notes and wallet recovery phrases also need somewhere to live.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The macOS and Android apps are available now. Support for iOS, Windows and Linux is planned.&lt;/p&gt;

&lt;p&gt;You can download Ravenpass at &lt;a href="https://ravenpass.org" rel="noopener noreferrer"&gt;ravenpass.org&lt;/a&gt;, and the source is on &lt;a href="https://github.com/dortanes/ravenpass" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;And if the project looks useful, a GitHub star would be appreciated ⭐&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>go</category>
      <category>react</category>
    </item>
  </channel>
</rss>
