JONATHAN ALPHABERT
Back to site
Project Write-upSelf-Directed Learning2025

Compound — Learning Roadmap Tracker.

A roadmap.sh-style web app for self-guided learning with progress saved entirely in the browser. No login, no backend — every visitor owns their data. The first published roadmap is a curated ~10-month path to becoming an independent long-term dividend investor.

Stack
Next.js 14TypeScript · React 18
Persistence
localStorageZero backend
Roadmaps
1 live4 planned
Hosting
Fully staticZero-cost · offline
01 — Overview

Built for learners who don't want to log in.

Compound is structured like roadmap.sh— a curated, opinionated path through a subject — but built for individuals tracking their own progress privately. The “database” is a set of JSON files; the “user account” is localStorage. Every interaction is instant, fully offline-capable, and privacy-first by design.

Roadmaps are grouped by category (Finance, Development, Design) and rendered as a “growth spine” — a vertical track that fills in visually as tasks are completed. Stages collapse accordion-style; the first incomplete stage auto-opens when you return.

The name. Compound refers to compound interest — the principle that consistent small steps build disproportionate long-term results. The same logic applies to daily learning streaks.

02 — UX Details

The details that make it feel considered.

Each feature below was deliberate — a small friction-removal or delight that makes daily use smoother without adding complexity.

Collapsible Stages

Each stage is an accordion. The first incomplete stage auto-opens on return — no hunting for where you left off. Completed stages collapse out of the way.

Live Progress

Percentage updates instantly on task check. The spine fills visually in real time — a persistent reminder of how far you've come and how much remains.

Task Detail Panel

A side sheet with step-by-step breakdown, tiered resources (Essential / Highly Recommended / Optional), and a checklist. Closes on outside click or Escape.

Celebrations

Confetti + toast on stage completion. A one-time modal congratulates roadmap completion — not re-triggered on reload. Canvas-based confetti, zero dependency.

Fully Responsive

Layout adapts from mobile to desktop. Touch targets sized correctly throughout. Installable as a PWA for a native-app feel on any device.

Reduced Motion

Respects prefers-reduced-motion. GSAP animations and confetti are skipped entirely when the preference is set — function is never gated on animation.

03 — Content Scale

The dividend investing roadmap, in numbers.

The first and only live roadmap covers the full journey from financial basics to building a real dividend portfolio — curated, sequenced, and scoped to roughly 10 months of consistent daily study.

8
Stages
49
Tasks
23
Resources
~10
Months

Four additional roadmaps are planned as placeholders on the dashboard — visible to users as “coming soon” so the category structure is already legible.

PlannedFrontend DevelopmentDevelopment
PlannedProduct DesignDesign
PlannedPersonal Finance FundamentalsFinance
PlannedBackend EngineeringDevelopment
04 — Tech Stack

Chosen to be fast, offline, and zero-dependency where it counts.

Every library earned its place. The guiding constraint: no external requests at runtime— fonts self-hosted, confetti hand-rolled, i18n custom-built. The browser's localStorage is the only database.

Framework & Language
Next.js 14TypeScript 5.6React 18App RouterStatic generation per slug
Styling & UI
Tailwind CSS 3.4Radix UIGSAPshadcn-style componentstailwindcss-animateclass-variance-authorityclsx + tailwind-mergeLucide React
Typography
FrauncesInterJetBrains MonoSelf-hosted via FontsourceZero external font requests
Architecture & Data
localStorageJSON data filesCustom i18nService Worker (PWA)Web Manifestuse-progress hookuse-activity hookuse-theme hookCanvas confetti (lib/confetti.ts)
05 — Architecture

A database without a server.

Each roadmap is a single JSON file registered via data/roadmaps/index.ts. Adding a new roadmap means writing a new file and one import — no migrations, no CMS, no API keys. Progress, theme, and streak are the only things that need to persist, and localStorage handles all three.

Content layer

JSON files as the database

Roadmap data lives in data/roadmaps/. Static generation at build time turns each slug into a route — no server-side rendering, no API calls.

data/roadmaps/dividend.json — content
data/roadmaps/index.ts — registry
/[lang]/roadmap/[slug] — route
User layer

localStorage as the user account

Three keys store everything a user needs: completed tasks, active theme, and daily streak timestamp. Privacy-first by design — data never leaves the device.

compound-progress — task checklist
compound-theme — light / dark
compound-streak — last-active date

Privacy-first by architecture, not by policy. There is no server to send data to. Progress is yours, stored locally — nothing to breach, nothing to GDPR-delete.

06 — Outcome

Shipped, self-hosted, and quietly useful every day.

Compound runs as a fully static site — no server to pay for, no database to back up. It loads instantly, works offline, and installs to the home screen, so the daily ritual of checking off a task has zero friction. The architecture that made it cheap to build also made it cheap to keep alive.

More importantly, it does the one job it set out to do: it makes a long, intimidating learning path feel finite. Watching the growth spine fill in — and the streak count climb — turns abstract progress into something you can see, which is the whole reason the project exists.

Because every roadmap is just a JSON file, the project stays open-ended. New roadmaps slot in without touching the app code, so it can keep growing alongside whatever I'm learning next.

The takeaway.Constraints — no backend, no accounts, no runtime requests — weren't limitations to work around; they were the feature. The result is a tool that's fast, private, and genuinely mine to maintain.