A personal ADHD task manager that won't let things disappear. Tasks always come back.
Captured from a demo dataset (scripts/demo-data.json) — every task, loop and label below is fictional.
The same app; the phone layout expands into three columns rather than becoming a different product.
![]() |
![]() |
More in the wiki gallery.
docker run -d -p 3001:3001 -v boomerang-data:/data ghcr.io/ryakel/boomerang:latestOpen http://localhost:3001 and add your API keys in Settings.
- Persistent nagging — snooze requires "then when", reframe after too many snoozes
- AI-powered assistance — task suggestions, note polishing, date inference, reframing, and "What Now?" task picker
- Energy/capacity tagging — AI-inferred energy type (desk, people, errand, creative, physical) and drain level (1-3) on every task, tap-to-cycle override
- AI toast messages — pre-generated contextual one-liners on task complete/reopen, speed-aware
- Recurring tasks (routines) with automatic scheduling and AI-suggested due dates
- Checklists — multiple named checklists per task with drag-and-drop reordering
- File attachments — attach files to tasks, auto-included in AI research queries
- Notion integration — pull sync from parent page, ongoing bidirectional sync for linked tasks
- Trello integration — push tasks with native checklists and attachments, ongoing sync
- Shared lists — a list (groceries, say) stays in sync both ways with a checklist on a Trello card, including one someone else owns and shared with you. Server-side polling, 3-way merge so concurrent edits from both people survive, and it never deletes anything on Trello except by your explicit delete. Add by typing, by voice through Quokka, or from the lists surface
- Google Calendar integration — bidirectional sync with AI-inferred event times, OAuth 2.0
- Package tracking — track packages with auto carrier detection, status-colored cards, delivery/exception notifications, signature-required auto-task creation
- Pushover integration — reliable iOS notifications via the Pushover app's APNs entitlements, with priority-2 (Emergency) for the highest-stakes alarms (bypasses Do Not Disturb, repeats every 30s)
- Offline support — mutation queue with auto-replay on reconnect, sync status indicator
- Real-time sync — cross-client sync via Server-Sent Events (SSE)
- Desktop UI — kanban board with drag-and-drop, responsive modals, hover states
- Mobile-first PWA — installable to home screen, swipe gestures (left for Edit/Done, right to delete)
- Themes — Light, Dark, Terminal Dark (GitHub Dark), Terminal Light (GitHub Light). Terminal mode swaps the calm-modern aesthetic for a monospace power-user shell with ASCII flourishes,
> verbmodal headers, flat sigil+text controls, and density signals on every task card - Routines + Habits + Suggestions — recurring tasks with cadence (daily/weekly/monthly/quarterly/annually), an optional trigger time (surface-at clock time so a chore stays hidden/silent until e.g. 8pm) including absolute clock times on follow-up steps, an
auto_rollflag for meds that can't double up, habit mode for target-frequency tracking (2× / week, behind-pace nudges), plus a weekly server scan that detects patterns in completed-task history and surfaces them as routine suggestions - Projects with sessions — long-term work lives as projects. Pin a project to the main list to chip away; "Log session" awards points + bumps the streak (capped at 10 sessions before requiring a child completion). Add child tasks for the concrete steps; completing them awards their own points. Silent by default; opt in to nags via
Allow nags without a due dateor just set a deadline - "Later — set aside" snooze — park a task indefinitely with no auto-resurface; bring it back from the Snooze modal when you're ready
- Optional authentication — opt-in login gate for public/external hosting: password → session cookie for the browser, plus a static API token for automations. Off by default (single-user, trusted-machine). See Configuration below
- iOS Shortcut intake — create tasks from the share sheet / Siri / Action button via
POST /api/intakeand a static API token (wiki/iOS-Shortcut.md) - Voice capture — "Hey Siri, Boomerang Capture" → dictate → task in the inbox, hands-free from phone/Watch/CarPlay via
POST /api/capture(rate-limited, provenance-stamped;wiki/Capture-Shortcut.md) - Custom labels, due dates, high-priority escalation
Configurable notification types with ADHD-friendly defaults:
| Type | Description | Default frequency |
|---|---|---|
| High priority | Escalating reminders — before due (24h), on due date (1h), overdue (0.5h) | 3-stage escalation |
| Overdue | Alerts for past-due tasks | configurable (hours) |
| Stale | Nudges for tasks that haven't been touched | configurable (hours) |
| Nudges | General ADHD-friendly pokes | configurable (hours) |
| Size-based | Reminders scaled by task size | configurable (hours) |
| Pile-up warnings | Alerts when too many tasks accumulate | configurable (hours) |
| Habit nudges | Behind-pace pokes for habit-mode routines (push only, never Pushover) | 24h per habit |
| Routine suggestions | Weekly summary of pattern-detected routine candidates from history | weekly |
All frequencies are set in hours (supports fractional values, e.g. 0.25 = 15 minutes). Quiet hours, notification history, and avoidance boost (confrontation/errand tasks get nagged more frequently) included.
Three transports run independently: web push (browser/PWA), email (SMTP), and Pushover (iOS APNs via the Pushover app). Pushover adds priority-2 (Emergency) for stage-3 high-priority overdue and avoidance-flagged overdue tasks — repeats every 30 seconds for up to 1 hour and bypasses Do Not Disturb / silent mode. Setup: create a Pushover account, buy the iOS app ($5 one-time), paste User Key + App Token in Settings → Pushover.
API keys can be set via environment variables or in the UI Settings:
docker run -d -p 3001:3001 \
-v boomerang-data:/data \
-e ANTHROPIC_API_KEY=sk-ant-... \
-e NOTION_INTEGRATION_TOKEN=ntn_... \
-e TRELLO_API_KEY=your_api_key \
-e TRELLO_SECRET=your_trello_token \
-e TRACKING_API_KEY=your_17track_key \
-e PUSHOVER_DEFAULT_APP_TOKEN=your_pushover_app_token \
ghcr.io/ryakel/boomerang:latestPUSHOVER_DEFAULT_APP_TOKEN is optional — it provides a default app token so you don't have to paste it in the UI for every install. Per-user keys are always entered in the Settings UI.
Boomerang ships with no auth (single-user, trusted-machine threat model). If you expose it to the internet, turn the login gate on by setting credentials:
node scripts/auth-setup.js # prints AUTH_PASSWORD_HASH + a fresh API_TOKENdocker run -d -p 3001:3001 -v boomerang-data:/data \
-e AUTH_PASSWORD_HASH='scrypt$...$...' \ # browser login
-e API_TOKEN=long_random_hex \ # iOS Shortcut / automations
-e COOKIE_SECURE=1 \ # behind a TLS proxy
ghcr.io/ryakel/boomerang:latestHumans log in with the password (→ httpOnly session cookie); the iOS Shortcut
and any automations authenticate with Authorization: Bearer <API_TOKEN>. Run
behind HTTPS. Not serverless-friendly — needs one always-on instance (it runs
persistent notification loops, holds SSE connections, and uses local SQLite), so
host on a small VPS / Fly.io machine / Render service rather than Lambda.
- Frontend: React 19, Vite, PWA (vite-plugin-pwa)
- Backend: Express, SQLite (sql.js), SSE
- AI: Anthropic Claude API
- Integrations: Notion API, Trello API, Google Calendar API, 17track API
- Deployment: Docker (multi-arch: amd64/arm64), GitHub Actions CI/CD, GHCR
See the wiki for full documentation.
Security note: Boomerang is built for single-user self-hosted deployment. API keys and integration tokens are stored in plaintext in the SQLite database and (for some) in browser localStorage. This is acceptable for "your own machine, your own data" but not for multi-tenant or untrusted hosting. See Security Notes for the full picture before deciding whether the app fits your situation.
npm install
cp .env.example .env
node server.js &
npm run devMIT








