MATTES.DEV

← Blog

· 3 min read

Local-first, and why it shapes Clessira

Most applications in everyday use run on someone else's infrastructure. Input is sent to a server, the result comes back, and the local device largely acts as a rendering surface. The failure modes of that arrangement are well known: without a network connection the application is unavailable, and when the provider discontinues the service or a subscription lapses, access to the data stored in it ends along with it.

Local-first describes the opposite arrangement. The term was introduced by Ink & Switch for software that keeps the authoritative copy of the data on the user's device. The application functions without a network connection, reads and writes go to local storage, and synchronisation — where it exists at all — distributes changes between devices rather than holding the only copy.

What follows from it

Several properties follow directly from that storage model:

  • Latency is bounded by local storage rather than by a round trip, so most operations complete without a loading state.
  • Offline is the normal operating mode rather than an error condition; connectivity affects synchronisation, not availability.
  • The data remains readable and exportable in a documented format, independent of an account.
  • Data that is never transmitted cannot be logged, aggregated or exposed in a breach on the provider's side.

Consequences for a time tracker

Clessira, my time tracker for macOS, is built on that model. Time tracking data is a minute-by-minute record of what somebody worked on and when — the category of data least suited to being stored on third-party infrastructure by default.

Clessira therefore keeps its data in a local file. There is no account, and no server-side component is required for the application to work. It starts without a network check, records regardless of connectivity, and reads context from the tools already installed on the machine — Jira, the current Git branch — instead of routing that information through a backend. Export is an ordinary operation on a file that was never inaccessible to begin with.

The trade-off

Local-first shifts backup and multi-device synchronisation from the provider to the user. Moving the data to a server to avoid that is not a solution, and neither is ignoring it. Clessira addresses it by making export unconditional and by supporting file-based sync over a directory the user selects — iCloud Drive, another sync service, or a network share — so replication across devices is available without a service that holds the only copy.

The trade-off is worth making where the data is sensitive and the application does not depend on a server for its actual function. For a time tracker, both conditions hold.