clone

a self-hosted sync node for lofi apps: jazz sync over iroh, ticket-gated, with no static ip or cloud needed

docs/adopt-site-pages
lofi-node / docs / site / README.md
README.md 2.2K rendered
1# Your data, on your node23<!-- Source: FelineStateMachine/lofi-node README.md; site-voice page owned by lofi docs/node/. -->45You use lofi apps; lofi-node is how you decide where their data lives. This is not something an6app's developer sets up for you, and it is not a way to host the app itself — the app stays wherever7it is deployed. The node is yours: [lofi-node](https://github.com/FelineStateMachine/lofi-node) is8one daemon that embeds a real Jazz sync server, [iroh](https://iroh.computer) node-to-node9transport, and a ticket-based access gate. Browsers keep speaking Jazz's protocol; only the server10URL changes, and that URL is data you hand the app at runtime, not configuration its developer11compiled in.1213What the node gives you:1415- **A real Jazz sync server** — SQLite-backed, health-checked, running exactly the pinned Jazz16 version the apps you use run. Any lofi app you use can sync into it.17- **Tickets, not accounts.** A `lofisync1.` app-connect ticket carries location and access in one18 string; possession is transport access, revocation is one command. A provision-scoped ticket19 additionally administers the store, with the admin secret never leaving the node.20- **Node-to-node replication over iroh.** Two homes converge by pairing tickets: dialed by public21 key, hole-punched, no static IPs, no cloud dependency — down to22 [the relay itself, which you can run](beyond-the-lan.md).23- **No silent degradation.** If the native transport layer can't load, the Jazz server still runs24 LAN-only and `status()` says exactly why pairing is off.2526## Where to go2728- Never run a node before? Start with [Self-host your first sync node](self-host-a-sync-node.md).29- Two locations that should hold the same data: [Pair two homes](pair-two-homes.md).30- Setting up the store an app syncs into — including a second app joining a store that already holds31 data: [Provision a store](provision-a-store.md).32- The mental model behind all of it — slices, shared stores, and why apps can't clobber each other:33 [Sliceable apps and shared stores](sliceable-apps-and-shared-stores.md).3435The app-side enrollment flow (pasting a ticket into a lofi app) is part of the framework docs:36[Sync and recovery](/docs/sync-and-recovery).