Ora brand mark: a blue ring with a dumbbell.
Co-founded app

Ora — a local-first training and progress app for lifters

A Flutter app for logging training, diet, and progress on-device, with a coach that drafts one change at a time and shows its confidence, and two Python research packages — exercise mechanics and a muscle-tendon-bone digital twin — beside it.

Status · Private beta (waitlist on the public site, live at oracoach.app since June 2026; current version deployed 2026-06-22, last updated 2026-07-18); last app commit 2026-08-17; research packages active through 2026-09-05.

Overview

A co-founded, local-first training and progress app for lifters: on-device logging, optional cloud or on-device language models under strict contracts, and a biomechanics research spine that says what it will not claim.

Ora is a training and progress app for lifters that keeps core records in an on-device SQLite database and opens without an account, cloud key, or Firebase. The coach drafts one change to today's session with one reason and a confidence level, and nothing changes until the lifter applies it. Beside the app sit two research packages: one with a deterministic planar mechanics engine and an explicit wall of allowed and barred outputs, and a finite-element muscle-tendon-bone demonstrator run as a contract-and-decision-log research loop.

What does a training app look like when the data lives on the phone, the AI can only draft, and the physics is honest about what it cannot say?

What Ora is

Ora started in January 2026 as an IEEE SPS @ UF team project and has become a co-founded app in private beta. The shell has four surfaces — Training, Diet, Progress, and Hub — and a floating input hub called the Ora Orb that gives camera, upload, microphone, and text entry from anywhere in the app. Training covers programs, day selection, live session logging with a rest timer and next-set targets, and exercise sheets with technique, safety, and personal history. Diet is deliberately basic logging: search, barcode scan, recipes, and step-calorie carryover. Progress is a weekly review built around estimated one-rep max (e1RM) trends, hard sets per muscle, and weekly volume.

The coach follows one rule from the public site: it drafts a change to today's session with one reason and a confidence level, and nothing changes until you apply it. Estimates are labeled as estimates and missing data is shown before a recommendation rather than hidden behind one.

Training
Programs, live session logging, rest and next-set targets, exercise info sheets, undo/redo on every set edit.
Diet
Food search, barcode scan, recipes, goals, step-calorie carryover — positioned as logging, not a nutrition product.
Progress
Weekly review, e1RM trend per lift, hard sets per muscle, weekly volume, powerlifting calculators.
Coach
One drafted change, one reason, a confidence level, apply or ignore.

Local-first and LLM-optional

The architecture is deterministic-first. Core records live in an on-device SQLite database and the app opens straight into the shell with no account, cloud key, or Firebase. A command bus owns every set mutation, which gives undo/redo for free and lets voice and tap commands share the same reducer.

Voice runs through an on-device Vosk speech model and a hand-written grammar before anything else. Cloud parsing (OpenAI or Gemini) is optional and only prompted when a user invokes an AI action with their own key; each such call is being moved onto a typed contract that declares what data may leave the device, a token ceiling, cancellation, and a content-free receipt that cannot contain the prompt, transcript, or provider response. There is also an optional on-device path: quantized GGUF models run through llama.cpp, plus a LiteRT-LM channel, pinned by a release manifest. A census tracks every model-call site in the app so a new one cannot appear unaudited. The rule that binds all of it: language models may phrase, summarize, classify, or propose drafts, while deterministic services own calculations, progression math, consent, and mutations.

Firebase exists in the build, but it initializes only when the app is compiled with an explicit flag and only backs account-based surfaces such as the coach portal. The public site is honest that some beta and web features store data in cloud services; the tracker itself does not depend on them.

The privacy contract

The public site states the contract in plain terms, and the app is built to keep it structural rather than a slogan. The app's dependency list contains no advertising or analytics SDK. The public site says support never means selling or sharing your data, and that privacy, export, and delete are always free; the waitlist card says export or delete anytime. Coach access is explicit, scoped, revocable, and auditable — sharing is athlete-granted, report-first, and can be withdrawn.

The site does not claim that everything stays on your device, because Ora has account-backed and shared surfaces. What it says instead is which surfaces are local, account-backed, or shared, and that report exports keep their caveats attached.

  • No ad or analytics SDK in the app's dependencies; the privacy policy says Ora does not sell personal information.
  • Privacy, export, and delete are always free.
  • Sharing with a coach is opt-in, scoped to reports, revocable, and auditable.
  • Cloud AI is bring-your-own-key, and each call's receipt is content-free.

The biomechanics research spine

Two Python packages sit beside the app. Both are research demonstrators, not validated models, and both encode that fact in code rather than in a disclaimer.

ora-biomech (started May 2026) contains a deterministic two-dimensional quasi-static mechanics engine. It compares two exercise setups — load, pulley height, limb lengths, range of motion — and returns unit-labeled joint-moment curves, finite-difference sensitivities, and bounded uncertainty. Its central asset is a claim wall: an enum of nine outputs a mechanics packet may contain and nine it structurally cannot, such as muscle activation, individual muscle force, joint contact force, tendon force, ligament stress, injury probability, and medical interpretation. Promoting anything across that wall is a reviewed decision with a named validation bar. A released, digest-pinned response surface for a single-arm cable lateral raise lets the Dart app interpolate results on-device; the in-app feature that uses it is still behind a flag that is off.

canonical-msk-twin (started 2026-08-13, standard-library Python only) is a finite-element muscle-tendon-bone demonstrator: a pennate muscle belly, two aponeuroses, a tapered tendon, a graded enthesis, and cortical and trabecular bone, from which meshes and a total-Lagrangian nonlinear solve are derived as disposable numerical views. Later increments add prescribed and computed activation, calcium and crossbridge state, and a sagittal human-scale frame with gravity and routed muscle paths. It is run as an explicit RESEARCH → EXECUTE → EVALUATE → REPEAT loop with a numbered design contract (through §82 as of 2026-09-05), a decision log (through D-097), and a typed program graph. Its honesty statement is the point: everything is a reference parametric anatomy and a structural benchmark, with zero measured inputs, no biological validation, and no medical interpretation — and a claim guard enforces that the prose cannot say otherwise.

ora-biomech
Planar quasi-static mechanics, A/B setup comparison, 9 allowed vs 9 barred outputs, released response surface consumed by the app.
canonical-msk-twin
Nonlinear FE muscle-tendon-enthesis-bone anatomy, byte-deterministic packages, contract + decision log + program graph, claim guard on the prose.

My role and the team

Ora is co-founded with a small student team from the IEEE SPS @ UF chapter, and the app is a team effort. My own workstreams are machine learning — how voice, cloud, and on-device models may touch training data — the coach experience, and the two mechanics and digital-twin research packages, which I authored. The public site, a separate public repository, carries the positioning and privacy copy this page quotes.

Where it stands

Ora is in private beta with a waitlist on the public site, which has been live at oracoach.app since June 2026; the current version was deployed 2026-06-22 and last updated 2026-07-18. The site lists voice logging as upcoming for beta users even though the on-device pipeline described here is in the codebase, and it is explicit that the app does not analyze form from video. The last commit touching the Flutter app on my working branch is 2026-08-17.

Since mid-August the activity has been the research packages: canonical-msk-twin's contract and decision log ran through 2026-09-05. None of the mechanics or twin results are published, and the honest framing is that they are structural benchmarks with no validation claim. Nothing here is a medical device, and the site says so.

FAQ

Does Ora need an account or an internet connection?

No. The app opens into the shell with core records in an on-device SQLite database. Accounts and Firebase exist only for account-backed surfaces such as sharing reports with a coach, and only when the app is built with that flag on.

Is the coach an AI that changes my program?

It drafts one change to today's session with one reason and a confidence level, and waits for you to apply or ignore it. Language models may phrase and propose; deterministic services own the math and the mutations.

Does the biomechanics engine tell me my injury risk or muscle forces?

No, and it cannot: those outputs are on the barred side of the claim wall and are structurally unreachable. The engine reports modeled positions, external forces, moment arms, balancing joint moments, A/B differences, sensitivities, and bounded uncertainty.

Is the digital twin a validated model?

No. canonical-msk-twin is a reference parametric anatomy and a structural benchmark with zero measured inputs, no biological validation, and no medical interpretation. A claim guard rejects prose that says otherwise.

What I built

  • The machine-learning workstream: how voice, cloud, and on-device language models are allowed to touch training data, and the contracts (data allowlist, token budget, cancellation, content-free receipt) each call must declare.
  • The coach experience: recommendation surfaces that carry one reason, a confidence label, evidence, and a missing-data state, and plan changes that go recommendation → preview draft → confirm → apply → rollback.
  • ora-biomech: a Python package whose mechanics kernel is a deterministic two-dimensional quasi-static solver that compares two exercise setups and returns unit-labeled joint-moment curves, sensitivities, and bounded uncertainty, with a released response surface the Dart app can interpolate on-device.
  • The ora-biomech claim wall: nine outputs the engine may report and nine it structurally cannot (muscle activation, individual muscle force, joint contact force, tendon force, ligament stress, tissue stress, injury probability, medical interpretation, 3D dynamics).
  • canonical-msk-twin: a pure-standard-library nonlinear finite-element muscle-tendon-enthesis-bone anatomy from which meshes and solves are derived views, with byte-deterministic result packages and a claim guard that rejects 'validated' or 'subject-specific' language.
  • The research loop that runs the twin: a numbered design contract, a decision log, and a program graph, with each increment checking that earlier committed packages stay byte-identical, and any regeneration recorded as an explicit decision.

How it works

  • Every set mutation goes through a command bus, so tap and voice edits share one semantics and undo/redo comes for free.
  • Voice is parsed on-device first: Vosk transcribes, a deterministic grammar turns the transcript into a command. Cloud parsing only runs if the user has added their own key, and only under a typed contract with a token ceiling and a receipt that carries no prompt, transcript, or response text.
  • Language models may phrase, summarize, classify, or propose drafts; deterministic services own calculations, progression math, consent, and mutations.
  • Firebase initializes only when the app is built with an explicit flag, and only backs account-based surfaces such as coach sharing; the tracker itself does not need it.
  • ora-biomech evaluates a scenario either with its direct solver or from a released, digest-pinned response surface, and every packet lists which outputs were unavailable and why.
  • canonical-msk-twin treats the hierarchical anatomy as the canonical object; meshes, solver models, and the HTML viewer are regenerated numerical views for a declared context of use.

Snapshot

Track
IEEE SPS @ UF · app systems · biomechanics
Status
Private beta (waitlist on the public site, live at oracoach.app since June 2026; current version deployed 2026-06-22, last updated 2026-07-18); last app commit 2026-08-17; research packages active through 2026-09-05.
Focus
Local-first SQLiteOn-device speechDraft-with-confidence coachDeterministic mechanicsDigital-twin research

Stack

  • Flutter + Dart
  • SQLite (sqflite, sqflite_common_ffi on desktop)
  • Vosk on-device speech recognition
  • Hand-written NLU grammar for voice commands
  • Optional OpenAI / Gemini parsing with a user-supplied key
  • Optional on-device LLMs via llama.cpp (GGUF) and LiteRT-LM
  • Firebase (build-flag optional, for account-backed surfaces)
  • Python 3 (ora-biomech; canonical-msk-twin is standard-library only)
  • GitHub Actions

Collaborators

  • The Ora team at IEEE SPS @ UF — co-founded with a small student team

Glossary

Local-first
Core app functionality and data storage work on-device by default; network and account features are optional additions rather than requirements.
RPE / RIR
Rate of perceived exertion and reps in reserve: two effort scales logged next to load so a set records how hard it was, not only what was lifted.
e1RM
Estimated one-rep max, computed from a set's load and reps; Ora tracks it per lift as a strength trend and labels it as an estimate.
Claim wall
In ora-biomech, the pair of enums listing the nine outputs a mechanics packet may contain and the nine it structurally cannot; crossing it requires a reviewed decision.
Digital twin
Here, a parametric computational anatomy from which meshes and finite-element solves are derived; in canonical-msk-twin it is explicitly a structural benchmark, not a subject-specific or validated model.