<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>selfstore blog</title><description>selfstore is a local-first storage library for browser apps: an automatic working copy in IndexedDB, portable encrypted ZIP backups, durable homes (a disk file, Google Drive, WebDAV, an S3 bucket) and serverless multi-device sync.</description><link>https://selfstore.dev/</link><item><title>What happens when the user opens a second tab</title><link>https://selfstore.dev/blog/the-second-tab/</link><guid isPermaLink="true">https://selfstore.dev/blog/the-second-tab/</guid><description>A server app serialises writes at the database. A local-first app has no such point, and every user eventually opens the app twice. The four ways that goes wrong, and the three browser primitives that fix it.</description><pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate></item><item><title>There is no password reset</title><link>https://selfstore.dev/blog/there-is-no-password-reset/</link><guid isPermaLink="true">https://selfstore.dev/blog/there-is-no-password-reset/</guid><description>A &quot;forgot password&quot; link is a statement about who holds the key. An app that encrypts on the client cannot offer one - so recovery has to be designed at the moment the password is chosen, not at the moment it is lost.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Browser storage is not durable storage</title><link>https://selfstore.dev/blog/browser-storage-is-not-durable/</link><guid isPermaLink="true">https://selfstore.dev/blog/browser-storage-is-not-durable/</guid><description>IndexedDB can be deleted without asking you - under disk pressure, after seven days of Safari inactivity, or with one click in the settings. What an app can actually find out about its own storage, and what it should do with the answer.</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate></item><item><title>An export button is not portability</title><link>https://selfstore.dev/blog/leaving-a-local-first-app/</link><guid isPermaLink="true">https://selfstore.dev/blog/leaving-a-local-first-app/</guid><description>Every app has an export. Almost none of them let you leave. The difference is whether the file is readable without the software that wrote it - and there is a short test that settles it.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Schema migrations when you do not hold the database</title><link>https://selfstore.dev/blog/schema-migrations-without-a-database/</link><guid isPermaLink="true">https://selfstore.dev/blog/schema-migrations-without-a-database/</guid><description>Local-first inverts who owns the data, and with it who can run a migration. What replaces the deploy-time script - a read-time upgrade, a version that travels with the file, and a loud refusal in the other direction.</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Designing an interface when the network is optional</title><link>https://selfstore.dev/blog/offline-first-interfaces/</link><guid isPermaLink="true">https://selfstore.dev/blog/offline-first-interfaces/</guid><description>Offline-first deletes most of the UI states a server app needs - spinners, retry toasts, optimistic rollback - and adds three smaller obligations in their place.</description><pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why IndexedDB is the right working copy for a local-first app</title><link>https://selfstore.dev/blog/indexeddb-as-working-copy/</link><guid isPermaLink="true">https://selfstore.dev/blog/indexeddb-as-working-copy/</guid><description>A local database as the app&apos;s live state - not a server round-trip, not localStorage - and the separation between a working copy and a durable home that makes it safe.</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Local-first is a security posture, not just a privacy feature</title><link>https://selfstore.dev/blog/local-first-is-a-security-posture/</link><guid isPermaLink="true">https://selfstore.dev/blog/local-first-is-a-security-posture/</guid><description>The largest breaches are server-side. Keeping one person&apos;s data on their own device removes a whole class of them - and here is exactly which class, and which threats it does not touch.</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Encrypted backups in the browser, done right</title><link>https://selfstore.dev/blog/encrypted-backups-browser/</link><guid isPermaLink="true">https://selfstore.dev/blog/encrypted-backups-browser/</guid><description>What client-side encryption actually protects against, why AES-256-GCM over Argon2id, and why a format spec beats a vendor promise.</description><pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Your side project does not need a backend (yet)</title><link>https://selfstore.dev/blog/no-backend/</link><guid isPermaLink="true">https://selfstore.dev/blog/no-backend/</guid><description>An honest decision tree for when a web app actually needs a server - and how far durability, backups and multi-device sync go without one.</description><pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Multi-device sync without a sync server</title><link>https://selfstore.dev/blog/sync-without-server/</link><guid isPermaLink="true">https://selfstore.dev/blog/sync-without-server/</guid><description>Storage-as-mailbox, hybrid logical clocks and per-collection merge strategies - how deterministic convergence works when nobody runs a server.</description><pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate></item></channel></rss>