A simple 180-day Korean learning tracker that runs directly in the browser.
- Track Vocabulary, Writing, Speaking and Listening, each with an estimated time (e.g. "Vocab · 10m") so you know what a day actually costs
- A per-day study timer - start, pause, and reset it while you work, and it keeps counting even if you check off tasks or navigate away mid-session
- A "Time studied" total in the header stats, tallied from every day's timer
- Each day links out to the two resources that actually match its goal: a study link (Hangul lesson, Billy playlist, or Talk To Me In Korean, depending on what the day covers) and a listening link (Comprehensible Korean)
- A Resources modal (via the button in the controls row) listing every course, listening channel, dictionary, and app used across the plan, grouped and described
- Add daily notes
- Set a confidence level from 1–5
- View weekly and monthly progress
- Change the study start date
- Automatically save progress in the browser
- Download and restore progress backups
- Install as an app on supported phones and browsers
- Offline support through a service worker
The app is completely client-side. No backend or database is required.
index.html- App interface, layout, and stylesapp.js- App logic: progress tracking, resource/duration resolution, the study timer, and local storagedata.js- 180-day Korean study plan, plus the resource library and per-day metadatamanifest.json- Makes the website installable as a PWAsw.js- Provides offline supporticons/- App icons
Your progress is stored in the browser using localStorage, including the accumulated time on each day's timer.
Use Download backup to save your progress as a JSON file.
Use Restore backup to import the saved progress again.
data.js exports a single APP_DATA object:
resources- a flat map of resource keys to URLs (billyBeginner,billyHangul,ttmik,comprehensible,naver,anki). This is the only place a URL needs to change if a link ever moves.months/weeks- the six-month arc and week-by-week breakdown shown in the stepper and week headers.days- one entry per day, each with:topic- what the day coversvocab/writing/speaking/listening- the task descriptions shown as checklist itemsdurations- estimated minutes for each of those four tasks (parsed from the task text where a time is mentioned, otherwise a sensible default)studyRes/listenRes- whichresourceskey to link to for the main study task and for listening practice
Resource labels and icons (what's shown on the link chip, and in the Resources modal) live in app.js, in RESOURCE_LABELS and RESOURCE_GROUPS - so adding a new resource is: add its URL to resources in data.js, then add its label/description in app.js.
You can run the app with any simple local web server.
For example:
python3 -m http.server 8000Then open:
http://localhost:8000
For PWA installation and offline support on a deployed website, use HTTPS.
GitHub Pages provides HTTPS automatically.
MIT