Plan tomorrow's tasks and keep daily, weekly, monthly and yearly goals alive, on an Android phone and a Windows PC that share one Supabase backend. Claude joins through a connector. The product spec is docs/spec.md; the plan is docs/roadmap.md.
M0 to M10 are built; 1.14.0 is the latest release. What works today, on both apps unless it says otherwise:
- Delivery (M0): sign-in with an emailed 6-digit code (docs/sign-in.md), or on the PC by scanning its QR code with the signed-in phone (ADR 0020), sessions kept across restarts, a signed update channel on GitHub Releases that both apps verify before installing, the migration chain with full-chain, isolated and row-security tests, CI for every part and a tag-driven release.
- Sync (M1): a SQLite replica with an outbox on each device, offline work, Realtime refresh (docs/sync.md).
- Tasks (M2): Today, Tomorrow and Inbox, the bottom bar with shortcuts and a live preview, Plan tomorrow, repeating tasks (docs/repeating.md), reminders with quiet hours and snooze (docs/reminders.md), areas and tags with filters, a task's detail view with notes in light Markdown that save on their own and a checklist, the searchable archive (docs/archive.md), the four switchable themes, and on Windows the tray's Today flyout and a global quick-add shortcut.
- Claude (M3): the connector, an MCP Edge Function Claude reaches through a secret link, with the activity log and undo (docs/connector.md).
- Goals, habits, reviews, stats (M4): the year to day goal cascade with three progress modes (docs/goals.md), habits with cadences, check-ins, streaks, a heatmap, skips and fails (docs/habits.md), limits to stay under for a day, a week or a month (typed in the bottom bar too: "at most 2 takeaways a week"), an amount filled to its target in one tap, the guided weekly, monthly and yearly review with a rotating prompt library and prompts that react to the period's data (docs/reviews.md), review reminders, and the stats screen (docs/stats.md).
- Projects, calendar, widgets and the desktop (M5): projects with a Backlog, To do, Doing, Done and Dropped board and short item ids like GM-12 (docs/projects.md), a week and month calendar with dragging and today and tomorrow picked out (docs/calendar.md), Today, Habits, Goals, Motivation, Life goals and quick-add widgets on Android (docs/widgets.md), projects through the connector, where Claude finds the project by the repository or folder it is working in (docs/connector.md), sharing text or a link from any Android app into a task (docs/composer.md), the pinnable Today and Habits mini windows on Windows (docs/mini-windows.md), and starting with Windows, with Add to Startup Profiles when that app is installed (docs/startup.md).
- v1 (M6): a versioned backup and a checked restore (docs/backup.md), updates from the latest GitHub Release, the Problems place in Settings, and hardening: a session the server refuses sends the app to sign-in with the outbox kept, and a replica that won't open says so.
- Quick chat (M7): the bottom bar switches between quick-add and a chat that plans with the
connector's everyday tools through the
assistantEdge Function (docs/assistant.md). - Wants, the Letter and Tally (M8): pinned places and a Places hub with room to grow; Wants, a
wishlist where everything waits out a cooldown before it is bought or dropped, with a Needs tab
for things to buy now (docs/wants.md); the Letter, a weekly letter a Claude
routine writes from
get_review_digestthat opens the review (docs/letter.md); and Tally, where time went on the phone and the PC by category and project, with only daily minutes leaving the device, a To sort list and an 8-week trend (docs/tally.md). - Life goals (M9): what the owner wants in the long run, with why it matters, a by date and pictures, a why reminder now and then and a picture widget (docs/life-goals.md).
- Calendar events (M10): trips and holidays as bars across their days, "day 2 of 4" on Today, and adding from the calendar's bottom bar on one day or several (docs/calendar.md).
Next: the owner's board. GoalMaker is for personal use only (ADR 0011). The plan is in docs/roadmap.md.
Releases are on GitHub, and both apps update from the latest one. GoalMaker is built for one person, so there is no server of ours to join: running it means standing up your own project, sender and signing keys, which docs/setup/your-own-copy.md walks through from a clean clone.
| Folder | What | Stack |
|---|---|---|
android/ |
The phone app | Kotlin, Jetpack Compose, Material 3 Expressive, supabase-kt |
windows/ |
The PC app with tray | .NET 10 WPF, DotNetLib.Tray (WPF UI, H.NotifyIcon), Supabase C# client |
supabase/ |
Database migrations, tests, config | Postgres, Supabase CLI (local Docker stack) |
contracts/ |
Rules both apps must implement the same way | JSON schemas and golden vectors |
tools/ |
Repository, migration, release and signing tools | Python, PowerShell |
- Windows 10/11 for development (the Windows app and the installer are Windows only).
- JDK 21, the Android SDK (Gradle downloads compile SDK 37 by itself), an emulator or a phone.
- .NET SDK 10.0.200 or later in the 10.0 band (windows/global.json).
- Node.js 22+ for the pinned Supabase CLI (
npm install), Docker Desktop for the local stack. - Python 3.11+, OpenSSL (ships with Git for Windows), Inno Setup 6 for the installer.
npm install # pinned Supabase CLI
npx supabase start # local stack on ports 553xx
python tools/supabase_migrations.py test # migration chain, isolated steps, pgTAP
android\gradlew.bat -p android testDebugUnitTest assembleDebug lintDebug
dotnet test --solution windows\GoalMaker.slnx
python tools/validate_repository.py --root .Running the apps against the local stack, including reading sign-in codes from the local mail viewer, is in docs/setup/local-development.md. How GitHub Actions splits and skips these checks is in docs/setup/ci.md.
See ARCHITECTURE.md: the parts, module boundaries inside each app, composition roots, data flow and delivery. Decisions are recorded in docs/adr/.
- Source of truth: the Supabase project (ADR 0002): profiles, areas, tags, tasks, steps, reminders, goals, habits, projects, wants, Tally totals, life goals, events and the activity log, each row visible only to its owner. Deleted rows stay as tombstones for 90 days so every device learns about them, then a nightly job purges them.
- Device replicas: each app keeps a SQLite copy with an outbox of unsent changes (one file per backend). Signing out pushes first and asks before discarding anything unsent.
- Migrations: immutable
supabase/migrations/0001_description.sqlfiles, locked by checksum insupabase/migrations.lock.json, each tested from0001and in isolation with fixtures. - Local data: the Windows app keeps its session (DPAPI-encrypted), settings and crash log in
%LOCALAPPDATA%\GoalMaker(GoalMaker-devfor dev builds); the Android app keeps its session, settings and its ownfiles/crash.login private app storage, excluded from Android backups. Life goal pictures are cached infiles/life-goal-pictureson the phone and in apictures-folder per backend under the same Windows folder. - Backup: a versioned full export both apps read and a checked restore that merges and never wipes, plus a weekly automatic export on Windows (docs/backup.md). The raw Tally record never leaves its device and is in no backup; its daily minutes are. Life goal pictures are files in a private Storage bucket, not in the backup; their rows are (ADR 0018).
- Versions: one
version.propertiesfor everything. Local builds areX.Y.Z-dev, never offered updates; release builds are plainX.Y.Z. - Android: a signed APK, sideloaded. Debug is
com.goalmaker.app.debug, releasecom.goalmaker.app. - Windows: a per-user Inno Setup installer (framework-dependent, about 9 MB) that can start GoalMaker in the tray at sign-in.
- Updates: tag
vX.Y.Zand the release workflow publishes the APK, the installer and a signed manifest as a GitHub Release. Apps read the latest release and trust it only through the manifest's signature (ADR 0010). Settings opens the same release for a manual download.
Setup: docs/setup/signing-and-releases.md.
PolyForm Noncommercial 1.0.0, the CodePrint default.