A quiet planner that unifies calendar and todos into one simple system: activities. Plan Today and shape the week with Day/Week/Board views, Inbox and Later, drag-and-drop, and keyboard shortcuts — stored locally in your browser and installable as a PWA.
One object (activity). No projects, tags, priorities, or busy dashboards.
Haku is built around one type of object: an activity.
There’s no split between “task” and “event.” An activity can be:
- Timed (e.g.,
6:30 PM • 90 min • Aikido training) - Untimed but dated (e.g.,
Sometime Friday — clean kitchen) - Unscheduled in Inbox (capture) or Later (not now)
The app is designed for people who want a calm surface for Today and This Week, without maintaining a system.
- Day — your primary view: Today, plus a nearby Overdue section.
- Week — a wide-angle view to shape the week and rebalance across days.
- Board — capture-only mode: Inbox and Later as simple lists.
An activity is intentionally boring:
title- optional
note - optional
date - optional
time+duration list:"inbox" | "day" | "later"completed:boolean
Rich meaning lives in your head; Haku stores only the handle.
- One object: activities — no duplicate “task vs event” models.
- Drag & drop planning — move activities between days and sections.
- Light “repeat” via duplication — copy timed activities forward across days/weeks (no recurrence engine).
- Local-first & offline — stored in your browser via
localStorage. - Installable PWA — manifest + service worker (offline support + install flow on supported browsers).
- Keyboard-friendly (desktop) — quick creation/navigation shortcuts.
- Minimal motion — subtle transitions that support orientation, not distraction.
- Storage:
localStorage(key:haku:v1:state) - Offline by default: no server, no accounts.
- Backups: Import/export is provided to move data between devices.
If I ever add sync, it will be clearly documented and opt-in.
Note on storage: Haku persists data in your browser via localStorage. It’s private (stays on your device) but not encrypted. Use Export to keep backups.
- Node.js (LTS or newer)
- pnpm
pnpm install
pnpm run devpnpm run build
pnpm run previewpnpm run dev— start dev serverpnpm run build— production buildpnpm run preview— preview built app
High-level entry points:
src/main.tsx— app entrysrc/app/App.tsx— composition + routingsrc/app/shell/*— layout primitives (desktop/mobile headers + mobile tab bar)
Feature areas:
src/features/day— Day viewsrc/features/week— Week view + column distribution logicsrc/features/board— Board view (Inbox/Later)src/features/settings— Settings + install instructions
Core domain + shared code:
src/shared/types/activity.ts— activity schemasrc/shared/state/*— store, persistence, import/exportsrc/shared/ui/*— cards/rows, modals, date/time pickers, drag overlay, animationssrc/shared/hooks/*— media queries, PWA install flow, touch drag helpers
Static assets:
public/icons/site.webmanifest+public/icons/*— PWA manifest/iconspublic/fonts/*— custom fontspublic/images/*— README screenshots
- New activity:
Cmd/Ctrl + K - Close dialogs:
Esc - Confirm:
Enter
If you want to poke around:
- Keep changes small and focused.
- Prefer clarity over clever abstractions.
- Test on mobile + desktop (touch + mouse).
Original work by Kyle Brooks. See LICENSE and NOTICE.



