Skip to content

Roadmap ​

Where UNDA is, what's next, and what we're not building yet. Updated: 2026-08-09.

Legend ​

  • βœ… Shipped
  • 🚧 In progress
  • πŸ”œ Next up
  • πŸ“‹ Planned
  • ⏸️ Deferred / out of scope for now

Where we are ​

UNDA is a cycle-aware workout tracker for iOS (Android after v1). Local-first by default, opt-in cloud sync (Phase 7), evidence-based phase-aware training recommendations, and privacy-first architecture.

Stack: Flutter (Dart), SQLite via sqflite_sqlcipher (AES-256 at rest), Riverpod, Cloudflare Pages for the OAuth redirect + this docs site.

Progress by phase ​

Phase 0 β€” Design + prototype scaffold βœ… ​

  • Product brief, UNDA visual system, 5-phase cycle model.
  • Flutter skeleton, phase-prediction engine, recommender, workout library with sport-specific programming (road cycling, bouldering, running).
  • Activity-import layer (ActivityHistoryImporter) + ProfileInferenceService that proposes a personalised profile from imported activities.

Phase 1 β€” UNDA visual system βœ… ​

  • Dark teal theme, Inter type via google_fonts, outlined-button-first.
  • Today / Calendar / Plan / Insights / Settings screens.
  • CustomPainter waveform driven by per-day phase energy.
  • 3-step onboarding β€” welcome, age gate, health-consent, cycle length, last period.

Phase 2 β€” Persistence + Insights βœ… ​

  • Schema v1: profiles, cycle_days, cycles, workout_sessions.
  • Insights tab: symptoms per phase, sessions per phase, average felt score, recent sessions.
  • Full /docs/legal, /docs/privacy, /docs/security, /docs/evidence, /docs/product tree per Legal Rules Β§21.

Phase 4 β€” Compliance blockers B1–B4 βœ… ​

  • B1 Delete all my data (Β§12.1).
  • B2 Provenance tagging on sensitive rows (Β§9.3).
  • B3 Uncertainty rendering β€” ovulation window, confidence chip, Β± days.
  • B4 Algorithm-version + factor breakdown persisted per session (Β§9.7, Β§9.5).

Phase 5 β€” Compliance blockers B5–B10 βœ… ​

  • B5 Versioned consent architecture (consents table, no bundling).
  • B6 18+ age gate with audit timestamp.
  • B7 Recommender: phase becomes a weight, not a filter (Β§9.1).
  • B8 Export ZIP β€” UNDA-export-*.zip with README, profile.json, cycle.csv, sessions.csv, consents.csv, integrations.json (Β§12.2).
  • B9 Privacy Center β€” Export / Manage consents / Delete account.
  • B10 SQLCipher AES-256 encryption at rest with key in Keychain / EncryptedSharedPreferences.

All 10 Pre-Beta Gate blockers closed.

Phase 6 β€” Integrations βœ… ​

  • .ics and .fit exporters β€” structured workout steps render to spec-compliant Garmin FIT files and RFC 5545 calendar entries.
  • Apple Health / Health Connect β€” reads menstruation + workouts, writes completed sessions back (opt-in, separate WRITE permission).
  • Strava OAuth β€” --dart-define client credentials, HTTPS redirect via Cloudflare Pages, tokens in Keychain, activity fetch.
  • Intervals.icu β€” API-key auth, activity fetch, planned-workouts read for Today's suggestion override.
  • Cross-provider dedup β€” same ride from Garmin β†’ Strava β†’ Intervals collapses to one row at read time (Β±5 min startedAt, Β±30 s duration, priority: intervals_icu > strava > apple_health).
  • Sync service β€” 30-min throttle, refresh on app foreground, pull-to- refresh on Insights.
  • In-app workout runner β€” full-screen countdown per step, up-next preview, pause / prev / skip, felt-score sheet on finish, auto-logs the session. Enabled only for indoor workouts (bodyweight / dumbbells / gym); outdoor endurance shows "Push to Garmin" as the primary action instead.
  • Today's suggestion priority β€” already-trained today > Intervals-planned for today > UNDA recommender > no match.

In progress / next up ​

πŸ”œ Phase 7 β€” Supabase sync + accounts ​

  • Cross-device sync for profile / cycle_days / workout_sessions / consents.
  • Sign in with Apple + magic-link email via Supabase Auth.
  • RLS policies keyed on auth.uid() on every user-owned table.
  • Red-team CI test β€” assert user A can't read user B's rows.
  • Delete-account propagates to remote + verified against backup rotation.
  • Threat model updated for attackers A4 (MITM) and A5 (Supabase incident).

Blockers for starting Phase 7:

  • User creates a Supabase project (EU region, free tier is fine).
  • Signed DPA on file.
  • processors.md entry filled in (Supabase + AWS as subprocessor).

πŸ“‹ Garmin Connect integration ​

  • Requires Garmin developer partner approval β€” slow, needs a business entity + a written use case.
  • Once approved: OAuth 2.0 flow similar to Strava, activity fetch, planned- workout push.

πŸ“‹ Google Health Connect (Android) ​

  • Companion to Apple Health once we ship Android.
  • Same read (menstruation + workouts) + write (completed sessions) pattern.
  • Runtime permissions per category, incremental grants.

πŸ“‹ Recommender v1.0.0 ​

  • Feed real signals into the recommender: today's subjective energy, recent felt-scores per phase, imported HRV / RHR / sleep from Health.
  • "Recent felt-score in this phase" as a factor so historically-bad phases auto-downshift.
  • Explainability panel: show per-factor contribution history over the last N recommendations so users understand how UNDA is learning.

πŸ“‹ UX + content ​

  • More workouts in the library (currently 20+, aim for 60+).
  • Rest-day interstitial explaining recovery is training.
  • Copy pass across all screens β€” soften remaining "peak strength" language per the claims register.
  • Notification scheduling (workout reminder, period countdown).

πŸ“‹ Testing ​

  • Widget tests for onboarding + delete-all-my-data flows.
  • Golden tests for Today / Calendar / Plan screens.
  • Repository unit tests for schema migrations and dedup.
  • CI (GitHub Actions): analyzer + tests on every push.

Pre-launch gates ​

Pre-Beta Gate (Β§24) ​

βœ… All 10 engineering blockers closed. Still need before beta:

  • Named security officer + real security@ mailbox.
  • Signed DPA with any cloud processor.
  • DPIA completed (Data Protection Impact Assessment) or formal applicability decision documented.
  • Incident-response tabletop exercise run once.

Pre-Public-Launch Gate (Β§25) ​

Beyond the beta gate:

  • Final Privacy Policy, Terms of Service, Spanish Legal Notice (LSSI).
  • Cookie/tracker consent for the web app.
  • Trademark clearance for "UNDA".
  • App Store privacy declarations completed.
  • Google Play Health Apps declaration completed.
  • MDR medical-device boundary reviewed by counsel.
  • CRA applicability + reporting process reviewed.
  • AI Act assessment if any AI features have shipped.
  • Retention automation active (rolling deletion jobs).
  • End-to-end user export + deletion verified.

What we're deliberately NOT doing ​

  • ⏸️ Fertility / pregnancy tracking β€” out of scope for v1. Different regulatory posture; would need a separate assessment before any code.
  • ⏸️ AI coach / LLM features β€” no in-app AI in v1. If added later, needs Β§11 review (no health data to third-party LLMs without approval).
  • ⏸️ Ads / analytics β€” no product analytics wired at all today. When we add any, the event allowlist is enforced by review.
  • ⏸️ Social / sharing β€” no follows, no cycle sharing between users. Not on the roadmap.
  • ⏸️ Wearable direct BLE β€” we integrate via HealthKit / Health Connect, not directly with device Bluetooth.
  • ⏸️ Under-18 version β€” UNDA v1 is 18+. A minors' product needs a separate legal, privacy, and safeguarding assessment first.

Non-negotiable engineering rules ​

From /legal/UNDA_LEGAL_ENGINEERING_RULES:

  1. No sensitive health data in generic analytics.
  2. No sensitive health data in generic logs.
  3. No production health data in development.
  4. Explicit provenance on every data point.
  5. Predictions are not facts.
  6. Fitness guidance, not diagnosis.
  7. Every recommendation is versioned.
  8. Data must be deletable.
  9. Data must have a purpose.
  10. Third-party data sharing requires review.
  11. Least privilege.
  12. Consent is versioned.

Every PR touching personal-data handling runs through the Β§22 checklist.

UNDA is a fitness and training support product. It is not a medical device.