Skip to content

Primico developer docs

A local-first todo app for Android and the desktop, in Kotlin and Compose Multiplatform. This is how it works inside, and how to change it.
If you want to… Start with
get it running and see where things live Quickstart → A tour of the code
make your first change with a test and a pull request Your first contribution
get one job done — a schema change, a new string, a release the how-to guides
understand why it is local-first, how sync merges, why recurrence is a chain of rows Concepts
look something up — a table’s columns, the backup format, a keyboard shortcut Reference
know what was decided and what it cost Decisions (ADRs)

Everything else in these pages follows from four decisions. Each one links to the page that explains it.

  1. The SQLite database on the device is the truth. The app is complete signed out and offline; an account only lets your own devices merge. → Local-first
  2. Nothing is deleted, only tombstoned; the newest write wins. That is the whole sync protocol, and it is why every row carries updatedAt and deletedAt. → How sync works
  3. Importance first, the due date breaks ties. The one product rule every list is sorted by. → Tasks, projects and tags
  4. One codebase, two shells. The domain and every screen are shared; Android and the desktop differ only in thin shells and a handful of ports. → Architecture at a glance
flowchart LR
  subgraph shared["Shared by every platform"]
    core[":core<br/>domain · storage · sync"]
    ui[":ui<br/>screens · ViewModel · strings"]
  end
  android[":app-android<br/>Android shell"]
  desktop[":app-desktop<br/>Ubuntu · macOS · Windows"]
  neon[("Neon Postgres<br/>optional")]
  ui --> core
  android --> ui
  desktop --> ui
  core <-. "sync, when signed in" .-> neon
  • Tutorials — learn by doing, one path that always works.
  • How-to guides — recipes for a job you already understand.
  • Concepts — the reasoning, the trade-offs, the diagrams.
  • Reference — schema, formats, grammar, shortcuts, configuration.
  • Decisions — the architecture decision records, oldest first.
  • Plans — what comes next and why in that order; the live list is the issue tracker, sorted by priority:P0–P3.

These pages are Markdown in docs/, built into this site by docs-site/. To fix or add one, see Write and preview the docs.