"You must do one more thing, and you'll get to rest."
Steal your time back.
Momo is a task management app built for people who struggle with avoidance, procrastination, and the overwhelming weight of everyday tasks. Not a power-user productivity suite β a quiet, daily companion that asks only one thing of you: one small step, today.
π Live version: momotask.app
π Documentation: jp1337.github.io/momo
The name Momo comes from Michael Ende's 1973 novel Momo β one of the most quietly radical books about time, attention, and what it means to be present.
In the story, the Grey Gentlemen β shadowy figures carrying briefcases β visit ordinary people and convince them to "save time." They tell people to stop lingering, to cut out the things that don't produce anything: long conversations, idle afternoons, play, rest. People comply. They become efficient. They become joyless. They lose themselves.
Momo is a small, homeless girl who has a rare gift: she truly listens. And through that gift, she sees what others cannot β that the Grey Gentlemen are stealing people's time, not saving it. She fights them. Alone. Slowly. One step at a time.
The parallel to procrastination and avoidance is not accidental.
When anxiety or overwhelm turns every task into a wall, when the Grey Gentlemen of your own mind tell you that you're behind, that you'll never catch up, that you should just wait until tomorrow β Momo is on your side. She doesn't ask you to be productive. She asks you to do one thing. Just one. That's enough for today.
This app is named in her honor.
- Daily Quest β One small task, chosen for you each day. No overwhelm, just one step forward.
- Topics & Subtasks β Break big projects (like "Moving" or "Tax Return") into tiny, manageable pieces.
- Recurring Tasks β Weekly laundry, monthly cleaning, fortnightly grocery runs. Set it and forget it.
- Gamification β Earn coins, build streaks, level up. Small wins deserve real celebration.
- Wishlist & Budget β Track things you want to buy, with a monthly budget indicator to spend more consciously.
- Push Notifications β Daily reminders via browser push. No third-party service, no subscription.
- PWA β Install on your phone like a native app. Works offline. The task creation form is fully usable on mobile β a corrected z-index ensures it renders above the bottom navigation bar as a proper full-height modal.
- REST API & API Keys β Full public REST API with personal access tokens (read-only flag, expiry dates). Interactive Swagger UI at
/api-docs. - Account Linking β Connect multiple OAuth providers to one account.
- Multilingual β German, English, and French UI with cookie-based locale switching. Add any language by dropping in a
messages/XX.jsonfile. - Statistics β Personal stats dashboard showing tasks completed, coins earned, streaks, level progress, achievements unlocked, and wishlist purchases.
- Admin Panel β Platform-wide statistics for operators (user growth, top users, achievement distribution). Protected by
ADMIN_USER_IDSenv var β only listed user UUIDs can access/admin. - Procrastination Counter β Every task tracks how many times it has been postponed. Tasks postponed 3 or more times award double coins on completion.
- Daily Quest Postpone Limit β Configurable per-user daily postpone limit (1β5, default 3) in Settings. Prevents endless deferral of the one thing that matters.
- Task Breakdown β Split any task into subtasks with a single button. A new Topic is created from the breakdown; the original task is removed. The
totalTasksCreatedstatistics counter is correctly incremented for each generated subtask. - Timezone-Aware Daily Quest β The daily quest selection respects the user's local timezone (
GET /api/daily-quest?timezone=Europe/Berlin), ensuring the quest resets at local midnight rather than UTC. - Immutable Statistics Counter β
totalTasksCreatedis a cumulative counter that only ever increases. Deleting a task never decrements it, giving an accurate lifetime picture of your output. - Time Estimates β Assign a time estimate (5, 15, 30, or 60 minutes) to any task. Estimates are displayed as a badge on task cards.
- Quick Wins β Dashboard section that surfaces all tasks estimated at 15 minutes or less, so a short window of focus never goes to waste.
- Public Landing Page β Atmospheric Momo-themed landing page (Lora italic, dark forest green, feather animation, Michael Ende quote) for unauthenticated visitors.
- Dark & Light Mode β Cozy warm tones in both themes. Because productivity shouldn't feel clinical.
- DSGVO / GDPR Ready β Data export (JSON), account deletion with full cascade, Impressum + DatenschutzerklΓ€rung pages, no tracking cookies.
- Open Source & Self-Hostable β Your data, your server, your rules. Migrations run automatically on container start.
Sign in with the account you already have. No new password to forget.
| Provider | Live (momotask.app) | Self-hosted |
|---|---|---|
| GitHub | β | β (own OAuth App) |
| Discord | β | β (own OAuth App) |
| β | β (own OAuth App) | |
| OIDC (Authentik, Keycloak, β¦) | β | β |
See OAuth Setup Guide for configuration instructions.
| Layer | Technology |
|---|---|
| Frontend | Next.js 16 (App Router) + React 19, TypeScript, Tailwind CSS v4 |
| Animations | Framer Motion |
| Auth | Auth.js v5 (GitHub, Discord, Google, OIDC) |
| Database | PostgreSQL 18 + Drizzle ORM |
| i18n | next-intl β German, English, French (cookie-based, no URL prefix) |
| Push Notifications | Web Push API (VAPID, no third-party) |
| API | OpenAPI 3.1.0 + Personal Access Tokens (Bearer) |
| Container | Docker (Node.js 22 LTS) |
| Orchestration | Kubernetes |
| CI/CD | GitHub Actions (native multi-arch: amd64 + arm64) |
| Image Registries | GHCR, Docker Hub, Quay.io |
Note for React developers: Next.js is a React framework. All UI is written in React β Next.js adds routing, server-side rendering, API routes, and PWA support on top.
Momo is intentionally cozy. Both the dark and light themes use warm, earthy tones β no harsh whites, no cold blues, no sterile greys. The goal is an app you want to open, not one that feels like a spreadsheet.
- Dark theme: Deep forest greens and near-blacks with warm amber accents
- Light theme: Soft parchment whites and warm sand tones
- Typography: Lora (headings) Β· JetBrains Mono (tasks) Β· DM Sans (UI)
- Animations: Subtle, purposeful β a small celebration when you finish something, not a distraction
- Docker & Docker Compose
- Node.js 22+ (for local development only)
- A GitHub or Discord OAuth App (see OAuth Setup)
git clone https://github.com/jp1337/momo.git
cd momocp .env.example .env.local
# Edit .env.local with your credentialsSee Environment Variables for a full reference.
docker compose up -dThe app is available at http://localhost:3000. Database migrations run automatically before the server starts β no manual step needed.
# Install dependencies
npm install
# Start PostgreSQL via Docker Compose
docker compose up db -d
# Run database migrations (local dev only)
npx drizzle-kit migrate
# Start the development server
npm run devThe app runs at http://localhost:3000.
Momo images are published to three registries on every release for redundancy:
| Registry | Image |
|---|---|
| GitHub Container Registry | ghcr.io/jp1337/momo |
| Docker Hub | docker.io/jp1337/momo |
| Quay.io | quay.io/jp1337/momo |
Pull from whichever is available:
docker pull ghcr.io/jp1337/momo:latest
# or
docker pull jp1337/momo:latest
# or
docker pull quay.io/jp1337/momo:latestFull documentation is available at jp1337.github.io/momo
| Guide | Description |
|---|---|
| Deployment | Docker Compose, production checklist, Kubernetes reference |
| Environment Variables | All configuration options |
| OAuth Setup | GitHub, Discord, Google & OIDC configuration |
| API Reference | All REST endpoints β interactive Swagger UI at /api-docs |
| Database | Schema overview, migrations, Drizzle Studio |
| DSGVO / GDPR | Compliance guide for operators |
| Phase | Status | Description |
|---|---|---|
| Phase 1 β Foundation | β Done | Next.js 16 + Auth.js v5 + Drizzle ORM + Design System |
| Phase 2 β Core Tasks | β Done | Task CRUD, Topics, Recurring |
| Phase 3 β Daily Quest | β Done | Quest algorithm, Dashboard |
| Phase 4 β Gamification | β Done | Coins, Streaks, Animations |
| Phase 5 β Wishlist | β Done | Wishlist CRUD, Budget tracking, Affordability, Coin-unlock |
| Phase 6 β PWA & Push | β Done | PWA manifest, Service Worker, VAPID push, Daily quest & streak notifications, Settings page |
| Phase 7 β Deployment | β Done | Multi-stage Docker, GitHub Actions (GHCR + DockerHub + Quay), Security Headers, Rate Limiting, K8s manifests |
| Phase 8 β Polish | β Done | Multilingual (DE/EN/FR), DSGVO compliance, Dark mode redesign, self-hosted fonts, data export, account deletion |
| Phase 9 β API & Keys | β Done | Public REST API, Personal Access Tokens, Swagger UI, Account Linking, Font Awesome icons, SVG Logo |
| Phase 10 β Statistics & Admin | β Done | Personal stats page, Admin panel, Mobile bottom navigation |
| Phase 11 β UX & Anti-Procrastination | β Done | Procrastination counter, postpone limit, bonus coins, task breakdown, time estimates, Quick Wins, public landing page, dashboard redesign, FA icon picker |
| Phase 11 β Bugfixes (2026-04-05) | β Done | Timezone-aware daily quest selection, immutable statistics counter, task breakdown stat increment, mobile task form z-index fix |
Before deploying Momo to production, verify all items below:
- Generate AUTH_SECRET β minimum 32 random bytes:
openssl rand -base64 32
- Set AUTH_TRUST_HOST=true β required when running behind any reverse proxy (nginx, Caddy, Traefik) or in Kubernetes
- Set all required environment variables β see Environment Variables
- Generate VAPID keys for push notifications:
npx web-push generate-vapid-keys
- Register OAuth apps for your production domain with correct callback URLs
- Set CRON_SECRET to protect cron endpoints:
openssl rand -hex 32
- Configure TLS β use a reverse proxy (nginx, Caddy) or cert-manager in Kubernetes
- Configure legal pages (for public deployments) β set
NEXT_PUBLIC_IMPRINT_NAME,NEXT_PUBLIC_IMPRINT_ADDRESS,NEXT_PUBLIC_IMPRINT_EMAIL(see DSGVO Guide) - Set ADMIN_USER_IDS (optional) β comma-separated UUIDs of users who can access
/admin. If unset, the admin page is inaccessible to everyone:# Find your UUID in the database, or check the "access denied" screen at /admin ADMIN_USER_IDS=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - Migrations run automatically β the container applies all pending migrations on startup. Check
docker compose logs appafter deployment to confirm.
See the full Deployment Guide for AUTH_SECRET rotation procedures and Kubernetes deployment steps.
Momo is open source and welcomes contributions. Please open an issue or pull request on GitHub.
MIT β see LICENSE for details.
Named after Momo, by Michael Ende. For everyone whose Grey Gentlemen have been stealing their time.