⚠️ Unfinished — this is a work in progress. Lunara is not on the App Store or Google Play, and there is no installer to double-click. You build it from this repository and run it on your own phone. Features are landing continuously and things will break. Do not rely on it as your only record of your health data.
An open-source, local-first cycle, fertility, pregnancy, and perimenopause companion.
Lunara ships through native iOS and Android shells powered by Capacitor. Core tracking works without an account or Lunara-hosted user database. Optional backup and AI features transmit data only after you enable them; their scope and security boundaries are documented in the repository.
Lunara is an open-source alternative to Flo®. It is not affiliated with, endorsed by, or connected to Flo Health Inc.
- No subscription gate. Tracking, pattern insights, reports, pregnancy guidance, and perimenopause tools are part of the open-source app.
- Local first by architecture. Core logs live in the app's local storage. Optional backup stores a client-encrypted blob; optional AI shares only the categories you select for that request.
- No 54-screen onboarding funnel. No paywall gauntlet. No nagging.
There is no download. You compile the app on a computer and install it on your own phone over a cable. What you need depends on the phone you have:
| Your phone | Your computer | Works? | What you'll use |
|---|---|---|---|
| iPhone | Mac | ✅ | Xcode |
| Android | Mac | ✅ | Android Studio |
| Android | Windows | ✅ | Android Studio |
| iPhone | Windows | ❌ | Not possible — see below |
iPhone + Windows is not possible. Apple only allows iOS apps to be built and
signed on macOS with Xcode; there is no supported Windows path, and no amount of
setup works around it. Your options are to borrow a Mac, or run Lunara as a web
app in your phone's browser (pnpm dev, then open the printed network URL on
your phone) — the browser version keeps your data on the phone but has no
widgets, notifications, or Health integration.
You need Git, Node.js LTS, and pnpm. With Node installed:
npm install -g pnpmgit clone https://github.com/Blueturboguy07/lunara.git
cd lunara
pnpm install
pnpm --filter @lunara/app native:syncnative:sync type-checks, builds the web bundle, and copies it into the native
iOS and Android projects. Re-run it after every code change — the native
shells load a copied bundle, not your live source.
- Install Xcode from the Mac App Store, then open it once so it finishes installing its components.
- Open the iOS project:
pnpm --filter @lunara/app native:ios
- In Xcode, select the App target → Signing & Capabilities. Under Team, pick your Apple ID. A free Apple ID works — you do not need the $99/year Developer Program. If you have never added your Apple ID, use Add an Account… in the Team dropdown.
- If Xcode reports the bundle identifier is unavailable, change it to something
unique to you (for example
app.lunara.mobile.yourname). - Plug in your iPhone, unlock it, and tap Trust if asked. Select it from the device dropdown at the top of the Xcode window.
- Press ▶ Run.
- The first launch will fail with "Untrusted Developer." On your iPhone go to Settings → General → VPN & Device Management, tap your Apple ID, and tap Trust. Then open Lunara again.
With a free Apple ID the app stops working after 7 days. Re-run step 6 to renew it. A paid Developer Program account extends this to a year.
- Install Android Studio. On first launch let it install the default SDK and platform tools.
- On your phone, enable developer mode: Settings → About phone, tap Build number seven times. Then in Settings → System → Developer options, turn on USB debugging.
- Open the Android project:
pnpm --filter @lunara/app native:android
- Plug in your phone and tap Allow on the USB-debugging prompt.
- Pick your phone from the device dropdown in Android Studio and press ▶ Run.
pnpm: command not found— Node's global bin isn't on your PATH. Close and reopen your terminal, then try again.cap: command not found— you skippedpnpm install, or ran the command from the wrong folder. Run it from the repository root.- Xcode "No account for team" — you haven't picked a Team under Signing & Capabilities (step 3a.3).
- Android Studio doesn't see your phone — the cable is charge-only, or USB debugging is off. Try a different cable first; it is usually the cable.
- Your changes don't show up — re-run
pnpm --filter @lunara/app native:sync.
app/— React/Vite product layer plus Capacitor iOS and Android projectsworkers/backup/— stateless zero-knowledge backup relay (Cloudflare Worker + R2)workers/reminders/— opt-in generic email reminders (no health terms, ever)docs/NATIVE_ARCHITECTURE.md— current runtime and platform designdocs/FEATURE_PARITY.md— honest implementation and release-readiness map
pnpm install
pnpm dev # run the app in a browser
pnpm test # engine unit tests
pnpm --filter @lunara/app native:syncThe cycle engine is covered by a seeded fuzz audit
(app/src/engine/estimateAudit.test.ts) that exercises every user-facing
estimate across 360 generated histories. It must stay at zero violations —
run pnpm test before touching any prediction math.
Lunara ships no shared API key and works fully without AI. If you enable it, you supply your own credential:
- Anthropic — an API key, or a token from
claude setup-tokento bill answers to a Claude subscription instead of API credits. - OpenAI — a project API key.
Credentials are stored in the iOS Keychain / Android Keystore, never in the cycle database and never in a backup. Nothing from your tracker is sent unless you tick the specific categories for that message.
Lunara is not a medical device and does not diagnose, treat, cure, or prevent any condition. Predictions are estimates for informational purposes only and must not be used to prevent pregnancy.
AGPL-3.0 — see LICENSE.