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.