Engineering

Local-first is a boundary, not a feature

"Local-first" is on a lot of landing pages now, including ours. The phrase has been diluted enough that it's worth writing down exactly what we mean by it, in terms someone can verify rather than trust.

The claim

When you run Orinth, no dataset, annotation, weight, prediction, or log leaves the machine unless you take a specific action that sends it.

Not "we don't sell your data." Not "encrypted in transit." The data does not go anywhere.

What makes it checkable

A promise that can't be checked isn't a boundary, it's marketing. Three things make this one checkable:

There is no account. There is nothing to sign up for, which means there is no user record, no workspace on our side, and no session to attach your activity to. The absence of an account isn't a convenience feature — it removes the entity that telemetry would attach to.

Telemetry is off by default. Not opt-out-buried-in-settings. Off, in the default configuration, with no first-run prompt engineered to get a yes.

The source is Apache 2.0. You can read the network calls. So can anyone who wants to check our work and publish the result. That's the part that actually keeps us honest — the claim is falsifiable by a stranger with an afternoon.

The two exceptions, stated plainly

Two things in Orinth reach the network. Both are deliberate, and both are visible at the moment they happen:

  1. Hugging Face Hub imports. Pulling a dataset or base model means fetching it from the Hub. That's an outbound request, initiated by you, to a service you chose.
  2. Chat web search. The chat surface has a search toggle. While it's on, queries go out and results come back with inline citations. While it's off, nothing does.

Neither happens in the background. Neither is required to complete the core workflow — label, train, test, and serve all work with the network cable unplugged.

If we add a third, it goes in this list.

Why the desktop app downloads 2.7 GB

One honest wrinkle: the macOS .dmg ships source rather than bundled runtimes, so first launch downloads and installs the ML environment — roughly 2.7 GB, 10–20 minutes, with per-step progress on screen.

That's a network dependency, and we'd rather name it than have you discover it. It's a one-time environment install, not data movement: nothing of yours goes out during it. Later launches start in seconds, offline.

We may bundle runtimes in a future build and trade a small download for a much larger one. We haven't decided which trade is better yet.

Why this is the whole product strategy

There's a version of this project that's a cloud app with a local mode bolted on. It would be easier to build and easier to monetize.

But local-with-a-cloud-escape-hatch and cloud-with-a-local-mode are not the same product, and you can tell which one you're using the first time you're offline. The architecture follows from which one you picked, and it's very hard to change your mind later.

We picked local. Orinth Cloud exists for teams whose GPU budget outgrows their laptop, and it's genuinely useful for that. It will never be the thing that makes the local app work.

All posts