Personal Work Telemetry β a mobile-first PWA that keeps your tasks, habits, and output in one calm, focused place.
Chakra is built for people who want deep insight into how they actually spend their time β not just a to-do list. It tracks tasks, projects, habits, streaks, and focus areas, then surfaces smart insights about where your hours really go. No subscription. No paid tier. No noise.
The main workspace. Three views, one shortcut:
- Kanban β classic Todo / In Progress / Done columns with drag-and-drop on desktop and swipe gestures on mobile
- List β flat, scannable task list with inline filtering
- Calendar β see your tasks laid out by due date
Switch between views instantly from the top bar. On mobile, the board adapts automatically.
A dedicated daily view that cuts through everything else:
- Shows only tasks flagged for today, sorted by priority
- Highlights recurring tasks due today with their recurrence label (daily, weekly, etc.)
- Tracks your warm streak β consecutive days you've completed at least one task
- Includes the Karma widget in full checklist mode (see below)
- Live Daily Pulse header showing tasks completed and hours logged so far today
A smart overview of your productivity across time:
- Time-ranged reports β toggle between This Week, This Month, and This Year
- Tasks completed and hours logged with breakdowns by project and category
- Effort drift analysis β compares your estimated vs. actual hours per category. After 3+ data points in a category, Chakra tells you whether you consistently under- or over-estimate that kind of work
- Active projects summary with colour-coded breakdown
- Karma widget in compact mode β your streak score at a glance
- Personalised time-of-day greeting (yes, it knows when you're burning midnight oil)
Lightweight collaborative spaces, separate from your project board:
- Four stream types: Checklist, Notes, Links, or Layers (mixed)
- Checklist streams show a live progress bar (items done / total)
- Pin important streams to the top; archive ones you're done with
- Share streams with other users β they get their own view into the same stream
- Per-stream activity timestamp ("updated 3h ago")
- Streams you own vs. streams shared with you are distinguished clearly
A habit streak system built into Today and Home:
- Comes pre-loaded with six default rituals: Meditate, Workout, Read, Go outside, Drink water, Reflect
- Tick rituals off as you do them each day β all must be complete for the day to count
- Karma score = consecutive fully-completed days (your streak)
- Fully customisable β add, rename, reorder, or delete rituals; choose from a curated emoji palette grouped by theme
- Score resets gracefully: today only counts once every ritual is ticked
Group your tasks into meaningful workspaces:
- Projects typed as Work, Study, or Personal β each with its own colour
- Per-project task counts and progress at a glance
- Share projects with other users by email β set them as viewer or editor
- Inline task creation from the project card
- Full project editing and deletion with confirmation
Set tasks to repeat automatically, never lose track of habits:
- Frequencies: daily, weekly, monthly, annual
- Fine-grained control: day of week, day of month, specific month
- Automatic cycle advancement on completion β the task resets itself with a new due date
- Current streak tracked per recurring task
- Recurring tasks appear in Today view when they're due
Two smart daily briefings, no app open required:
| Time | What it does |
|---|---|
| 11:00 AM | Morning briefing β lists your pending Today-flagged tasks |
| 8:00 PM | Evening reminder β prompts you to log completed work |
The evening notification is skipped entirely if there's nothing actionable β no unlogged tasks, no pending today items. It's designed to never be noise.
Powered by Web Push (VAPID) + Vercel Cron. Works on iOS via PWA (Add to Home Screen), Android, and desktop Chrome.
Full dark and light mode support with zero flash on load. The theme is stored and applied before the page renders, so there's no flicker between system preference and the app.
Chakra is a Progressive Web App β install it on your iPhone or Android home screen and it feels like a native app:
- Bottom navigation bar on mobile
- Swipe gestures on the Kanban board
- Bottom sheet modals instead of desktop-style overlays
- Offline-capable service worker
| Layer | Tool |
|---|---|
| Framework | Next.js 14 (App Router) |
| Database + Auth | Supabase |
| Hosting | Vercel |
| Styling | Tailwind CSS |
| Push notifications | Web Push (VAPID) + Vercel Cron |
| Language | TypeScript |
Everything runs on free tiers. No paid services required.
git clone https://github.com/iamtanay/chakra.git
cd chakranpm installCreate a .env.local file in the root:
touch .env.localFill it in β see the Environment variables section below for where to get each value.
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
NEXT_PUBLIC_VAPID_PUBLIC_KEY=
VAPID_PRIVATE_KEY=
VAPID_EMAIL=
CRON_SECRET=npm run devOpen http://localhost:3000.
- Go to supabase.com β your project β Settings β API
- Copy Project URL β
NEXT_PUBLIC_SUPABASE_URL - Copy anon / public key β
NEXT_PUBLIC_SUPABASE_ANON_KEY
Same page as above. Copy the service_role key (labelled "Secret"). Used server-side only by the notification cron routes to bypass RLS and read all subscriptions.
β οΈ Never expose this in client-side code or commit it to git.
VAPID keys authenticate your server when sending push notifications. Generate them once:
node scripts/generate-vapid-keys.mjsCopy the two values from the output. Generate once and store them β they never change.
β οΈ The private key must stay secret. Never commit it to git.
Your email address, e.g. you@example.com. Used as a contact in the VAPID header.
A random secret that protects your cron routes. Generate one:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"Go to supabase.com β New project. Pick a name, region, and password. Wait for it to provision.
Go to Authentication β Providers β Email β make sure it is enabled. Turn off Confirm email if you want to sign in immediately without a confirmation step.
Go to Authentication β Users β Add user. Enter your email and password. This is the account you will log in with.
Go to SQL Editor and run each migration file in order:
Migration 1 β paste and run:
supabase/migrations/20260325141644_create_projects_and_tasks_tables.sql
Migration 2 β paste and run:
supabase/migrations/20260328000000_add_recurring_tasks.sql
Migration 3 β paste and run:
supabase/migrations/20260329000000_add_push_subscriptions.sql
Run them in this order. Each one builds on the previous.
Go to Table Editor β you should see three core tables: projects, tasks, and push_subscriptions, plus streams, stream_items, stream_members, karma_rituals, karma_logs, and task_occurrences.
git add .
git commit -m "initial commit"
git push origin main- Go to vercel.com β Add New Project
- Import your GitHub repository
- Framework will be auto-detected as Next.js
- Do not deploy yet β add environment variables first
Go to Settings β Environment Variables and add all 7 variables. For each one, select Production, Preview, and Development.
| Variable | Type |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Public |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Public |
SUPABASE_SERVICE_ROLE_KEY |
Secret |
NEXT_PUBLIC_VAPID_PUBLIC_KEY |
Public |
VAPID_PRIVATE_KEY |
Secret |
VAPID_EMAIL |
Plain |
CRON_SECRET |
Secret |
Click Deploy. Vercel will build and deploy the app.
Go to Settings β Crons. You should see two entries:
| Schedule | Route | Time (IST) |
|---|---|---|
30 5 * * * |
/api/cron/notify-morning |
11:00 AM |
30 14 * * * |
/api/cron/notify-evening |
08:00 PM |
If they are not there, make sure vercel.json is committed and redeploy.
- Open Safari on your iPhone and go to your Vercel app URL
- Tap the Share button β Add to Home Screen β Add
- Open Chakra from the home screen icon (not from Safari β push only works in PWA mode)
- Tap More in the bottom nav β find the Notifications toggle
- Tap it β iOS will show a permission prompt β tap Allow
To test immediately without waiting for the scheduled time:
# macOS / Linux
curl -H "Authorization: Bearer YOUR_CRON_SECRET" https://your-app.vercel.app/api/cron/notify-morning# Windows PowerShell
(Invoke-WebRequest -Uri "https://your-app.vercel.app/api/cron/notify-morning" -Headers @{ "Authorization" = "Bearer YOUR_CRON_SECRET" }).ContentExpected response: {"success":true,"sent":1,"skipped":0,"failed":0}
If you get skipped: 1 β open Chakra, flag at least one task as Today, then try again.
chakra/
βββ app/
β βββ api/cron/
β β βββ notify-morning/route.ts # 11 AM IST cron
β β βββ notify-evening/route.ts # 8 PM IST cron
β βββ canvas/ # Main task board (Kanban / List / Calendar)
β βββ home/ # Dashboard + insights + karma
β βββ today/ # Daily focus view
β βββ spaces/ # Project management
β βββ streams/ # Collaborative focus channels
β βββ login/
β βββ globals.css
β βββ layout.tsx
βββ components/
β βββ board/ # KanbanBoard, MobileBoard, TaskCard
β βββ karma/ # KarmaWidget (rituals + streak)
β βββ layout/ # Sidebar, BottomNav, DailyPulse
β βββ modals/ # TaskModal, CompleteModal
β βββ projects/ # ProjectCard, ProjectModal, ShareModal
β βββ streams/ # StreamCard, StreamDetail, StreamCreateModal, StreamShareModal
β βββ ui/ # Button, Input, NotificationToggle, PillToggle, etc.
β βββ views/ # ListView, CalendarView
βββ hooks/
β βββ useMediaQuery.ts
β βββ usePushNotifications.ts # Push subscription lifecycle
β βββ useTheme.ts
βββ lib/
β βββ notifications/
β β βββ buildPayload.ts # Notification message formatting
β β βββ types.ts
β βββ database.types.ts
β βββ insights.ts # Report generation + drift analysis
β βββ recurrence.ts # Recurring task logic + streak tracking
β βββ supabase.ts
β βββ viewContext.tsx
βββ public/
β βββ sw.js # Service worker
β βββ manifest.json
β βββ icons/
βββ supabase/migrations/
βββ scripts/
β βββ generate-vapid-keys.mjs
βββ types/index.ts
βββ middleware.ts
βββ vercel.json # Cron schedule
βββ next.config.js
- Single-user by default, but the schema supports up to ~10 users. The
push_subscriptions,stream_members, andproject_memberstables all haveuser_idcolumns and RLS policies in place β multi-user is mostly wiring, not rearchitecting. - Push notifications on iOS require the app to be opened from the home screen icon. Opening it in Safari browser does not support push.
- Evening notification is skipped entirely if there is nothing actionable. This is intentional β it should never feel like noise.
- VAPID keys should be generated once and never rotated. Rotating them invalidates all existing push subscriptions and users would need to re-subscribe.
- Effort drift requires at least 3 completed tasks in a category with both estimated and actual hours filled in before it surfaces a signal. It's intentionally conservative.
- Karma streak only counts a day as complete if every configured ritual is ticked. Partial days don't extend the streak.