ryakel/boomerang

★ 1Forks 0JavaScriptGitHub ↗Compare

README

Boomerang

A personal ADHD task manager that won't let things disappear. Tasks always come back.

Screenshots

Captured from a demo dataset (scripts/demo-data.json) — every task, loop and label below is fictional.

Today: a points arc, the day's list, overdue and reminder badges Loops: recurring tasks with completion trails and streaks Quick capture in reminder mode, with a date and time picker
Today — one arc, one list, no dashboard Loops — a trail per habit, not a guilt counter Throw — task, reminder or note in one gesture
Quick task editor with chips for status, due date, reminder, repeats, priority, energy, size and tags Reminders grouped into passed, later today and upcoming Long-press action sheet offering today, tomorrow, next week, no date, edit and delete
Quick edit — everything behind chips Reminders — a lens, not a second inbox Long press — reschedule without opening anything

On a bigger screen

The same app; the phone layout expands into three columns rather than becoming a different product.

Desktop: sidebar, grouped task list with inline subtasks, and a Today rail

Dark

Today view in dark mode Loops view in dark mode

More in the wiki gallery.

Quick Start

docker run -d -p 3001:3001 -v boomerang-data:/data ghcr.io/ryakel/boomerang:latest

Open http://localhost:3001 and add your API keys in Settings.

Features

  • 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, > verb modal 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_roll flag 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 date or 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/intake and 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

Notifications

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.

Configuration

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:latest

PUSHOVER_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.

Authentication (for public hosting)

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_TOKEN
docker 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:latest

Humans 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.

Tech Stack

  • 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.

Development

npm install
cp .env.example .env
node server.js &
npm run dev

License

MIT

Contributors

clauderyakeldependabot[bot]

Issues