Development - ryakel/boomerang GitHub Wiki

Development

Prerequisites

  • Node.js 20+
  • npm

Setup

git clone https://github.com/ryakel/boomerang.git
cd boomerang
npm install
cp .env.example .env
# Edit .env with your API keys (or add them in the UI later — both are optional)

Running Locally

Two processes needed:

# Terminal 1: API server
node server.js

# Terminal 2: Vite dev server (hot reload)
npm run dev

Open http://localhost:5173. The Vite dev server proxies /api/* requests to the Express server on port 3001.

Project Structure

boomerang/
├── server.js              # Express API server (Claude proxy, Notion proxy, data routes, health check)
├── db.js                  # SQLite data layer (sql.js, JSON blob storage)
├── src/
│   ├── App.jsx            # Main app component (task list, sections, bottom bar, modals)
│   ├── App.css            # All styles
│   ├── api.js             # API client (Claude AI, Notion, key status, data sync)
│   ├── store.js           # Data model, localStorage, helpers (tasks, routines, settings, labels)
│   ├── components/
│   │   ├── AddTaskModal.jsx    # Task creation with notes, polish, size, due date, labels, Notion
│   │   ├── EditTaskModal.jsx   # Task editing with all fields + convert-to-routine option
│   │   ├── TaskCard.jsx        # Individual task display with swipe gestures, expanded actions
│   │   ├── SnoozeModal.jsx     # Snooze options (tonight, tomorrow, weekend, next week)
│   │   ├── ReframeModal.jsx    # AI task reframing when snooze threshold exceeded
│   │   ├── ExtendModal.jsx     # Due date extension (+1d, +1w, +2w, custom date)
│   │   ├── WhatNow.jsx         # AI task suggestions (time + energy → recommendations)
│   │   ├── Routines.jsx        # Recurring task management (add, pause, resume, delete)
│   │   ├── DoneList.jsx        # Completion history grouped by date, with reopen
│   │   ├── Settings.jsx        # App settings, API keys, labels, notifications, data export/import
│   │   ├── Toast.jsx           # Motivational completion/reopen toasts with undo and points
│   │   ├── Analytics.jsx       # Analytics screen (streaks, best stats, vacation mode)
│   │   ├── Rings.jsx           # Activity rings component (tasks, points, streak)
│   │   ├── FindRelatedModal.jsx # Search Notion from a task card, link or create pages
│   │   └── Logo.jsx            # Boomerang icon SVG component
│   └── hooks/
│       ├── useTasks.js         # Task state management (add, complete, snooze, update, uncomplete)
│       ├── useRoutines.js      # Routine state management (add, delete, pause, spawn)
│       ├── useServerSync.js    # SSE-based server sync (real-time cross-client, debounced push, visibility resume)
│       ├── useSync.js          # (deprecated) Old localStorage ↔ SQLite sync
│       ├── useTrelloSync.js    # Bidirectional Trello sync (pull, push status, AI dedup, list mapping)
│       ├── useNotifications.js # Browser push notifications (overdue, stale, AI nudges, size-based reminders)
│       └── usePullToRefresh.js # Pull-to-refresh touch gesture on task list
├── public/
│   ├── favicon.svg         # Boomerang icon
│   ├── icon-192.svg        # PWA icon
│   └── icon-512.svg        # PWA icon
├── wiki/                   # Documentation (synced to GitHub Wiki)
├── Dockerfile              # Multi-stage, multi-arch build with APP_VERSION arg
├── docker-compose.yml      # Compose config with healthcheck
├── vite.config.js          # Vite config with PWA plugin, version injection, API proxy
└── .github/workflows/
    ├── build-and-publish.yml  # CI + GHCR publish
    └── wiki-sync.yml          # Wiki content sync

Scripts

Command Description
npm run dev Start Vite dev server (port 5173)
npm run build Build production frontend to dist/
npm start Start production server
npm run lint Run ESLint

Tech Stack

  • Frontend: React 19, Vite, PWA (vite-plugin-pwa)
  • Backend: Express 5, sql.js (SQLite in-process)
  • AI: Anthropic Claude API (claude-sonnet-4-20250514)
  • Integrations: Notion API, Trello REST API
  • Deployment: Docker (node:22-alpine), GitHub Actions, GHCR