This is a self-hostable web app that:
- ✅ Tracks your 6-month quant finance learning checklist
- 🔄 Syncs in real-time between you and your GF — check a box on your phone, she sees it instantly
- 🔔 Sends push notifications every 6 hours with your next uncompleted task
- 💾 Stores all progress in Supabase (free tier is plenty)
- 🌐 Hosted on Netlify for free with HTTPS (required for push notifications)
- Go to supabase.com and sign in (use your GitHub account)
- Click "New project" → give it a name like
quant-checklist→ set a password → pick a region close to you → Create project - Wait ~1 minute for it to spin up
- Click "SQL Editor" in the left sidebar
- Paste this SQL and click Run:
-- Create the checklist table
CREATE TABLE quant_checklist (
task_id TEXT PRIMARY KEY,
done BOOLEAN NOT NULL DEFAULT FALSE,
updated_by TEXT,
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Allow anyone with the anon key to read and write
-- (This is fine since the URL isn't public — only you and your GF have it)
ALTER TABLE quant_checklist ENABLE ROW LEVEL SECURITY;
CREATE POLICY "allow_all" ON quant_checklist
FOR ALL USING (true) WITH CHECK (true);
-- Enable realtime updates
ALTER PUBLICATION supabase_realtime ADD TABLE quant_checklist;- Go to Settings → API in the left sidebar
- Copy two values — you'll need them in Step 3:
- Project URL (looks like
https://xyzabcdef.supabase.co) - anon public key (a long JWT string starting with
eyJ...)
- Project URL (looks like
- Go to netlify.com → sign up with GitHub
- On your dashboard, find the "Deploy manually" area at the bottom
- Drag the entire
quant-checklistfolder onto it - Netlify gives you a URL like
https://random-name-123.netlify.app - (Optional) Click "Domain settings" to rename it to something like
stan-quant.netlify.app
- Push this folder to a GitHub repo:
cd quant-checklist git init git add . git commit -m "Initial deploy" git remote add origin https://github.com/YOUR_USERNAME/quant-checklist.git git push -u origin main
- Go to Netlify → "Add new site" → "Import from Git" → connect GitHub → select the repo
- Build settings: leave everything blank (it's just static HTML)
- Click Deploy
That's it. Netlify handles HTTPS automatically — this is required for push notifications to work.
- Open your Netlify URL — you'll see the homepage
- Click "Open Checklist" → you'll see the setup modal asking for:
- Supabase URL — paste the Project URL from Step 1
- Supabase Anon Key — paste the anon key from Step 1
- Your Name — type
Stan
- Click Save & Start
Share the same Netlify URL with your GF. When she opens it and goes to the Checklist, she'll do the same setup but type her own name. From that point on, every checkbox either of you ticks syncs to the other instantly — with a toast notification showing who made the change.
- When you open the app, a gold banner will appear: "Enable 6-hour reminders"
- Click Enable Reminders → browser will ask for permission → click Allow
- Done — you'll get a push notification every 6 hours with your next uncompleted task
- Your GF needs to do this on her own device too — push notifications are per-device
Note: Push notifications only fire when the tab has been open at some point in the last 6 hours. For reliable background notifications without keeping a tab open, see the Advanced section below.
┌─────────────────┐ Supabase Realtime ┌─────────────────┐
│ Stan's device │ ←─── websocket ────────→ │ GF's device │
│ (any browser) │ │ (any browser) │
└────────┬────────┘ └────────┬────────┘
│ │
└──────────────┬──────────────────────────────┘
│
┌────────▼────────┐
│ Supabase │
│ (PostgreSQL) │
│ Free tier: │
│ 500MB storage │
│ 50k rows/mo │
└─────────────────┘
- Checking a box → writes to Supabase → Supabase realtime pushes update → other person's app updates instantly
- Push notifications → browser Service Worker fires every 6 hours → finds the next unchecked task → shows OS-level notification
- Offline → falls back to localStorage → syncs when back online
quant-site/
├── index.html ← Homepage / landing page (start here)
├── guide.html ← Full 6-month playbook (read once, reference often)
├── checklist.html ← Interactive 24-week task tracker (use every day)
├── sw.js ← Service Worker for push notifications
├── favicon.svg ← SVG favicon (all modern browsers)
├── favicon.ico ← ICO favicon (legacy browsers)
├── favicon.png ← 64px PNG favicon
├── icon.png ← 192px icon (iOS home screen)
└── README.md ← This file
Navigation flow:
/(index.html) — Landing page with links to both tools/guide.html— Full guide: your edge, roadmap, skills, jobs, resources, AI shifts/checklist.html— Live tracker: 24 weeks, 200+ tasks, real-time sync, push notifications
The browser-based 6-hour timer only fires if the tab is open. For true background notifications that fire even when the browser is closed, you can set up a free cron job:
- Create
netlify/functions/remind.js:
const webpush = require('web-push');
exports.handler = async () => {
// Set up web-push with VAPID keys (generate at: vapidkeys.com)
webpush.setVapidDetails(
'mailto:your@email.com',
process.env.VAPID_PUBLIC,
process.env.VAPID_PRIVATE
);
// Push to stored subscriptions in Supabase
// (requires storing push subscriptions in a separate table)
return { statusCode: 200 };
};- Add to
netlify.toml:
[functions."remind"]
schedule = "0 */6 * * *" # every 6 hoursThis is optional — the in-browser 6-hour timer works great for most use cases.
If you want to add tasks or change content:
- Edit
index.html— theMONTHSarray near the bottom contains all the task data - If using GitHub deploy:
git push→ Netlify redeploys automatically in ~30 seconds - If using drag-and-drop: drag the folder onto Netlify again
| Problem | Fix |
|---|---|
| "Could not reach Supabase" | Double-check your URL and anon key in Settings (⚙ button) |
| Changes not syncing | Check that you ran the SQL in Step 1, including the realtime line |
| Push notifications not showing | Make sure you clicked Allow in the browser permission dialog. Check Settings → Notifications in your OS. |
| GF sees different progress | Make sure she's using the same Supabase URL + key |
| Reset button cleared everything | It's in Supabase — run SELECT * FROM quant_checklist in SQL Editor to verify |
- No data leaves your Supabase instance
- Supabase free tier is private by default — your URL + anon key are the only access
- Don't share your Netlify URL publicly if you want to keep it between just you two
Built for Stanley Nelavala · April 2026 · Claude / Anthropic