<?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: LocalLensProject</title>
    <description>The latest articles on DEV Community by LocalLensProject (@locallensproject).</description>
    <link>https://dev.to/locallensproject</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3863039%2F66778b6b-b517-4274-8b21-9da30119f274.png</url>
      <title>DEV Community: LocalLensProject</title>
      <link>https://dev.to/locallensproject</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/locallensproject"/>
    <language>en</language>
    <item>
      <title>Why We Built a Local-First iPhone Authenticator Instead of Another Cloud-Synced 2FA App</title>
      <dc:creator>LocalLensProject</dc:creator>
      <pubDate>Mon, 06 Apr 2026 03:24:00 +0000</pubDate>
      <link>https://dev.to/locallensproject/why-we-built-a-local-first-iphone-authenticator-instead-of-another-cloud-synced-2fa-app-51bm</link>
      <guid>https://dev.to/locallensproject/why-we-built-a-local-first-iphone-authenticator-instead-of-another-cloud-synced-2fa-app-51bm</guid>
      <description>&lt;p&gt;Most authenticator apps force a flat security model.&lt;/p&gt;

&lt;p&gt;Every token lives behind the same unlock flow.&lt;br&gt;
Every account gets treated as if it has the same value.&lt;br&gt;
And if you want stronger protection, the answer is often to make everything more cumbersome.&lt;/p&gt;

&lt;p&gt;We thought that was the wrong tradeoff.&lt;/p&gt;

&lt;p&gt;We’re a small team building LocalAuth, an open-source iPhone authenticator, and I’m the primary developer behind it. The project started as a small internal experiment, but it kept growing because we wanted to explore a different question:&lt;/p&gt;

&lt;p&gt;What if a TOTP authenticator used multiple trust boundaries instead of one?&lt;/p&gt;

&lt;p&gt;That led us to a 3-channel model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Face ID / Secure Enclave for everyday accounts&lt;/li&gt;
&lt;li&gt;a dedicated YubiKey channel for higher-value accounts&lt;/li&gt;
&lt;li&gt;a generic FIDO hmac-secret channel for compatible security keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From there, other design choices followed naturally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local-first storage by default&lt;/li&gt;
&lt;li&gt;nearby encrypted transfer for migration&lt;/li&gt;
&lt;li&gt;no mandatory account layer for core use&lt;/li&gt;
&lt;li&gt;an optional self-hostable Travel Vault for temporary off-device backup / restore&lt;/li&gt;
&lt;li&gt;end-to-end encryption for Travel Vault, with encryption happening locally before upload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post isn’t really about “shipping a new app.”&lt;br&gt;
It’s about a design choice we rarely see in authenticator tools: not every account deserves the same protection model.&lt;/p&gt;

&lt;p&gt;If you’ve worked on security tools, hardware-key flows, or local-first apps, I’d love to hear whether this approach feels practical or overengineered.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>security</category>
      <category>ios</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
