A deliberately-constrained task tracker that enforces what not to open, with a clean REST + MCP API, open-source self-host, and (optionally) a free, ad-supported hosted tier.
FoFoDo is not a productivity maximizer. It is a constraint instrument. Most todo apps fail in two directions: they let you pile on infinite work (fragmentation), and they nag about what you forgot instead of surfacing what you're avoiding. FoFoDo makes it easy to capture anything, hard to over-commit, and impossible to ignore what you're dodging — while staying frictionless enough that you actually open it.
It is also a clean, hackable, API/MCP-first task backend that you can self-host and that other tools (Claude Code, FOREMAN, your own scripts) can drive programmatically.
The headline feature is the limit, not the feature list.
- A task moves through
inbox→next→active→done, plussnoozed. - No more than 3 tasks can be
activeat once. This is enforced server-side in a Firestore transaction — not advisory client UI. Trying to activate a 4th returns a kind prompt to bump one of your current three. - Backing off is a first-class action. Whole projects can be paused or snoozed guilt-free and resumed later.
- Avoidance is made visible: a weekly audit surfaces the hat with no activity, the project paused longest, and the task you keep pushing.
- Nudges are kind and curious ("Grow's been quiet — worth a 10-minute poke?"), never scolding. No streaks, no guilt walls.
The "3" is not configurable in v1, on purpose.
| Area | What you get | REQ-IDs |
|---|---|---|
| Capture | One-box quick-add; lands in inbox instantly; optional natural-language parse (call Jamie tomorrow 3pm #grow); voice via Web Speech API; inbox triage |
REQ-CAP-01..04 |
| Tasks | Full CRUD + complete/restore; markdown notes; manual reorder; views (Today/Active, Next, Inbox, By Hat, By Project, Done, Snoozed); snooze with wake date | REQ-TASK-01..05 |
| FoFo OS layer | WIP-3 hard limit; four hats everywhere; one Active Bet + leading indicator; four-tile dashboard; dismissible cadence prompts; avoidance audit | REQ-FOS-01..06 |
| Search | Global fuzzy search over titles, notes, project names (client-side Fuse.js over the offline cache; a basic server endpoint also exists) | REQ-SRCH-01 |
| Reminders | Browser push (FCM web push) and signed webhook reminders; a scheduled engine that never double-fires | REQ-REM-01..03 |
| AI (optional) | NL capture parse, auto-triage suggestion, avoidance summary, "What now?", break-it-down — all behind a per-user kill switch with deterministic fallbacks | REQ-AI-01..06 |
| API | Authenticated REST API for everything; OpenAPI spec; Firebase ID token or API key auth; create/revoke hashed API keys; hosted quotas | REQ-API-01..04 |
| MCP | Streamable-HTTP MCP server with 9 tools that honour the same auth + WIP-3 rules as the API | REQ-MCP-01..03 |
| Auth | Firebase Auth (email/password + Google); FFN sign-in slot reserved for hosted | REQ-AUTH-01..02 |
| Data ownership | Full JSON export; complete account/data delete | REQ-DATA-01..02 |
| Hosted (flagged off in OSS) | Ad slots, free-tier quotas | REQ-HOST-01..02 |
You bring your own Firebase project; firebase deploy does the rest. Clone → running in well under an hour.
git clone https://github.com/Sweet-Papa-Technologies/FoFoDo.git fofodo
cd fofodo
# 1. Install the Firebase CLI and log in
npm install -g firebase-tools
firebase login
# 2. Point the repo at YOUR Firebase project
# (edit .firebaserc, or: firebase use --add)
# 3. Configure the backend
cp functions/.env.example functions/.env # then edit
cd functions && npm install && cd ..
# 4. Deploy rules, indexes, functions, and hosting
firebase deploy --only firestore:rules,firestore:indexes,functions,hostingFor the full walkthrough — including how to use the default Firestore database instead of a named one, every environment variable, and the optional Terraform path — see SELF-HOST.md.
Heads-up for the SPT/hosted deployment: FoFoDo ships into the shared
fofoapps-934beproject and is isolated there via a named Firestore database (fofodo), a dedicated Hosting site (fofodo→ https://fofodo.web.app), andfofodo-prefixed Cloud Functions. A fresh self-host project does not need this — see DESIGN.md and SELF-HOST.md.
| Doc | What's in it |
|---|---|
| DESIGN.md | Architecture, the shared-project isolation strategy, data model, WIP-3 enforcement, the reminder engine, the AI-additive design, and the auth model |
| SELF-HOST.md | Deploy on a fresh Firebase project: prerequisites, env vars, deploy commands, the Terraform option |
| docs/API.md | Every REST endpoint, with auth, body, and curl examples |
| docs/openapi.yaml | Machine-readable OpenAPI 3.0 spec |
| docs/MCP.md | Connecting an MCP client and the full tool reference |
| OPEN-QUESTIONS.md | Decisions made and decisions still open |
cd app
npm install
npm run dev # http://localhost:5173
npm run build # type-check + production build into app/dist/pwa| URL | What it serves |
|---|---|
/ |
The marketing landing page to signed-out visitors, the dashboard to everyone else (src/views/Home.vue switches on auth, so / stays canonical for both) |
/login |
Sign in / create an account |
/demo |
The demo account — the whole app running against an in-memory dummy dataset (src/demo.ts). Nothing touches Firestore, Auth or the REST API; the WIP-3 gate is enforced locally so the headline constraint is genuinely live. Data dies with the tab |
Two query params exist for tooling and are safe to ignore otherwise:
?theme=dark|light|system overrides the theme for one page load, and ?shots=1
freezes animations and hides the demo banner for screenshot runs.
The landing page advertises real screenshots rather than mock-ups. They're captured from the demo account, so re-running this after a UI change keeps the marketing honest:
npm run dev -- --port 5199 &
npm run shots -- http://localhost:5199 # → public/img/shots/<view>[-mobile]-<theme>.pngNeeds Google Chrome (driven over the DevTools Protocol — no Playwright/Puppeteer
dependency). Captures four views × light/dark × desktop/mobile, and optimises them
with ImageMagick if it happens to be installed. scripts/preview.mjs does ad-hoc
full-page captures of any route, which is handy for reviewing the landing page.
- Frontend: Quasar Framework + TypeScript, built as an installable PWA (offline-first via Firestore persistence; Fuse.js for client-side search). Theming is CSS custom properties in
src/theme.css— a warm orange-cream palette with dark, light and system modes. - Hosting: Firebase Hosting (static).
- Backend compute: Cloud Functions for Firebase, 2nd gen — one surface for the REST API, the MCP server, and the scheduled reminder engine. Scales to zero.
- Data: Cloud Firestore (with offline persistence) + Firestore Security Rules.
- Auth: Firebase Authentication (email/password + Google).
- AI: Firebase Genkit flows on Vertex AI (Gemini Flash-Lite by default; configurable). All AI is optional.
- Push: Firebase Cloud Messaging (web push).
- Scheduling: Cloud Scheduler → a scheduled Cloud Function (every 5 minutes).
All four config flags — HOSTED, ADS_ENABLED, FFN_AUTH_ENABLED, QUOTAS_ENABLED — default off in the open-source build (REQ-OSS-03).
MIT. See LICENSE. Copyright (c) 2026 Forrester Terry / Sweet Papa Technologies.