Engineering · How Korivo Is Engineered

Engineering Korivo Without Accounts or a Cloud

How we built Korivo without requiring accounts, a cloud database, or permanent control of your training, nutrition, and biometric information.


Most lifting and nutrition apps begin with the same architectural assumptions: create an account, upload your data, keep it on the company’s servers, and charge a recurring subscription to pay for the infrastructure.

Korivo begins with a different question: What if the company never needed to have your data at all?

That’s a core product decision. It’s also the core engineering challenge for Korivo. Korivo combines workout programming, nutrition planning, biometric measurements, supplements, cardio, progress analysis, and a desktop authoring environment. These aren’t isolated features, but form an interconnected record of someone’s training, nutrition, and behavior over time.

We wanted Korivo to work without requiring you to register for yet another account, without making our servers the home of user data, and without incurring ongoing infrastructure costs that we’d have to pass on to you, forcing you into a subscription and holding your data at ransom unless you keep paying.

Instead, we chose a local-first architecture. Your device remains the authority for your data, synchronization is built from portable records you control, and the core rules live in a local engine that behaves identically across platforms.

All of this makes the engineering much harder, but we believe you should control your own data. Fully and completely.

01 / Constraint

Privacy as an architectural constraint

Privacy informs the core design of Korivo. If we don’t operate a central cloud service, we can’t depend on one for identity, synchronization, conflict resolution, migrations, or recovery. The app has to solve those problems on devices controlled by the user. That means Korivo had to establish several principles:

  • Core functionality shouldn’t require a Korivo account.
  • A remote Korivo database shouldn’t store personal health data.
  • Records remain portable and inspectable rather than trapped in an opaque service.
  • Losing access to Korivo’s infrastructure shouldn’t make a person lose access to their history.
  • Our business shouldn’t force users into a perpetual subscription.
Authority mapLocal-first
Your phone
Your computer
User-controlled authority
Portable records
Korivo data cloud
No company data custodian
The user’s devices and portable records remain authoritative. Korivo doesn’t insert a personal-data service in the middle.

02 / Coordination

In most applications, the backend does a lot of the heavy lifting

A conventional application backend does much more than store rows. It provides a global ordering of events. It decides which edit wins. It records deletions. It serializes concurrent writes. It runs migrations. It creates backups. It tells every client which version is current.

Remove that backend and every device can possess a different, locally reasonable view of reality.

A phone might record a workout while a desktop edits the program that produced it. One device might delete a meal while another modifies an older copy. A sync process can be interrupted after writing the record but before advertising the change.

Putting JSON files in a shared folder is pretty easy. Making sure they behave like a database is much harder.

Missing refereeCoordination work
Phone
Workout v4
Central server
Desktop
Program v7
Ordering
Conflict
Recovery
The protocol must absorb the work the server used to do
Removing the server doesn’t remove coordination. It relocates that responsibility into an explicit, deterministic protocol.

03 / Representation

Using portable records and your cloud storage

Korivo represents user information as typed, portable records organized into a well-defined folder structure.

The format covers more than just workouts. It includes programs, routines, diets, meals, sessions, cardio, exercises, biometrics, observations, supplements, historical diet targets, templates, and application state.

A portable representation gives us things a server-owned database doesn’t:

  • Users retain a comprehensible copy of their information.
  • Desktop and mobile applications don’t need to route anything through Korivo infrastructure.
  • Backups don’t depend on an account remaining active.
Portable storeInspectable records
/programstyped
hypertrophy.json id + modified
/sessions/2026/07UTC
workout-42.json record
meal-19.tombstone deleted
/statemanifest
Stable IDs, timestamps, UTC partitions, manifests, and tombstones turn plain files into a portable synchronization contract.

04 / Convergence

Conflict resolution without a central referee

In a local-first system, conflicts can’t be avoided.

Korivo uses metadata to resolve those conflicts. A modified timestamp establishes the primary order, and device identity provides a stable tie-break when versions have the same timestamp. Two clients have to independently make the same decision about which copy to keep.

Deletion makes this harder. If one device removes a file, another device can’t distinguish “intentionally deleted” from “temporarily missing.” Korivo records deletions as tombstones so other devices retain evidence of the deletion instead of resurrecting an older copy. The system also has to heal duplicated copies, preserve local work, and recover from interruptions without pretending partial success means everything is in sync.

You won’t notice any of this when using Korivo, of course. We’ve put in the engineering work so it feels seamless and no different from a typical app.

Same inputsSame survivor
Phone version12:04:16 · device A
+
Desktop version12:04:16 · device B
Deterministic survivortimestamp → device ID → pending edits
Each client applies the same ordered comparison. There’s no vote and no hidden referee, only a decision every implementation can reproduce.

05 / Interoperability

Two implementations are a disagreement waiting to happen

Korivo currently has an iOS app written in Swift and a desktop app written in TypeScript/Tauri.

One non-negotiable was that the desktop app work not just on Mac, but also on Windows and Linux. Both apps read the same JSON records, but they are parallel implementations. That creates plenty of room for disagreement.

One app might tolerate a missing field while the other rejects it. One date parser might accept a value that another rejects.

Usually the solution to bad behavior is tests. But unit tests written independently for each platform can’t prove both apps are doing the same thing. They only prove that a particular app is doing what it was written to do.

Korivo uses shared fixtures to address this. These define the shape of data on disk, our edge cases, how partitions should behave, and how to decide conflicts. Every client, whether written in Swift, TypeScript, or Rust, is tested against the same specification.

Shared evidenceCross-platform contract
Canonical fixtures
bytes · edges · tombstones · folders
Swift
TypeScript
Rust
The languages don’t define correctness independently. All three are measured against the same checked-in evidence.

06 / Shared core

One core, multiple native applications

Maintaining all the synchronization and domain logic across multiple implementations and languages stops scaling pretty quickly, especially with a small team.

We want to bring Korivo to Android. That wasn’t on the agenda originally, but leaving Android users out indefinitely isn’t where we want to end up. We can’t make promises, but we’ve decided to invest in the foundational work that makes it possible.

We’re consolidating Korivo’s codecs and synchronization logic into a core Rust library. UniFFI lets us generate bindings for Swift and Kotlin, while the desktop application can call the same library through its Tauri boundary. This gives us one strongly typed implementation and makes it much easier to add new platforms.

Each app can then focus on what can’t be shared: presentation, accessibility, lifecycle, and integration with devices.

The existing apps remain authoritative while the Rust core runs alongside them and compares outputs. Differences are recorded, but the new implementation can’t change user data until it proves that it behaves identically.

Joel Spolsky famously called full rewrites one of the things you should never do. We agree. We’re building the Rust core because maintaining these rules separately in every client eventually becomes the riskier option.

One semantics layerNative at the edges
Rust core
codecs · conflict · partitions · snapshots
Swift
UniFFI
Kotlin
UniFFI
Desktop
Tauri
Portable semantics are shared. Presentation, lifecycle, accessibility, and platform integrations remain native.

07 / Tradeoffs

But why not use a normal cloud sync service?

Using a managed cloud service would make much of this simpler. Accounts, server-side recovery, telemetry, and scalability all have familiar managed solutions with a lower initial implementation cost.

Those solutions come with consequences, though:

  • The company becomes the custodian of your potentially sensitive data.
  • Product economics push the company toward recurring billing.
  • Export and portability become secondary features instead of being intrinsic.
  • Shutting down the service means users lose access to their data.

Korivo still has to store your data somewhere if you want it available across multiple devices, but cross-device synchronization is optional. If you enable it, you choose the storage provider. Local-first doesn’t mean infrastructure-free or free from security concerns. It means Korivo doesn’t need to insert itself into the middle of the relationship or know anything about your data.

Building Korivo this way aligns our architecture with our business model. Years ago, you bought software and owned it forever. We miss those days. We don’t think you should lose your data just because you don’t want to pay us forever.

Structural tradeoffWho holds the obligation?
Company cloud
Per-user cost
Recurring billing
Access dependency
VS
User storage
Portable data
Durable value
Continued access
Architecture creates economic pressure. Avoiding a permanent data service weakens the need to manufacture a permanent payment relationship.

08 / Reliability

The difficult parts are mostly invisible

As a user, you don’t need to understand manifests, tombstones, canonical encoders, or partition ledgers. You just log a workout on your phone, edit a plan on your computer, and trust that your history and data remain coherent and accessible.

That means we need to test situations most users will never intentionally create:

  • Two devices edit the same record.
  • A deletion races with an older update.
  • A write fails halfway through a synchronization cycle.
  • One file is corrupt while hundreds of neighboring records remain valid.
  • A client receives a wire shape produced by a different language and version.
  • The application is terminated while local work is still pending.

Privacy and architecture can’t be an excuse for important stuff breaking. Removing the centralized safety net makes consistent behavior and recovery even more important.

Reliability stackComplexity below the surface
Log workout · Edit plan · Trust history
ManifestsTombstonesCanonical bytes Atomic writesPartitionsDirty tracking MigrationsFixturesFFI gates
The ordinary experience is the visible result. Most of the work exists below the surface to keep it ordinary.

09 / What we think is worth sharing

Architecture expresses values

Korivo didn’t invent local-first software, deterministic conflict resolution, portable file formats, or shared-language cores. What matters is how those pieces fit together inside a lifting app:

  • No Korivo account as the foundation of identity.
  • No company-operated database storing your data.
  • Portable records as the synchronization contract.
  • Independent native clients verified against shared fixtures.
  • A business model that avoids forcing users into a subscription only to support an architecture that demanded one.

This is considerably more work than putting every record behind an API. But Korivo expresses its values as much through how it was built as through its features.

Another possibility

Your Data. Your Device.

We’re building Korivo to be the most powerful lifting and nutrition app out there. Your data stays yours, and access to it will never depend on paying us forever.