.learn
DotLearn
Accelerated interview prep: you pick the topic, AI builds the lesson around it.
the essence
You put the lesson topic into words yourself, a free-form request, even for one specific interview question. Once you ask, the agent gets to work: lesson-forge checks the topic for conflicts with the existing catalog and generates a package, MDX theory and YAML exercises that are automatically validated in the browser runtime. Everything gets committed to the repo, not written to a database, which means any topic can be forked, extended, or fixed with a normal pull request. Alongside the topics sits a ready-made bank of 368 interview questions across 10 tracks, also with a "how to answer" breakdown, exercises, and its own flashcard mode.
Code runs in a Web Worker where 15 network APIs are neutralized at startup: fetch, WebSocket, RTCPeerConnection, BroadcastChannel, and others. What you write cannot send data out or open a hidden channel: that's architecture, not policy. Progress, notes, bookmarks, and FSRS flashcards live in IndexedDB; the backend is optional and the platform installs as a PWA for full offline use. Configurable settings include content language (RU/EN on the fly), exercise difficulty, daily goal, font, text size, and Monaco editor preferences.
Under the hood
Seven steps as one story: from cloning the repo to exporting your progress. Step through with ←/→ and watch how it works inside.
- 34 topics
- 7 exercise types
- visualizations & interactive animations
- local-first · no backend
Run it locally, ask in plain words
Clone the repo, bring up the player with one command, and ask the AI agent right in your editor. No forms, no code, just plain language.
AI assembles the topic as files
The lesson-forge skill first shows a curriculum plan and waits for your OK, then writes the manifest, theory and exercises one file at a time. A topic is code, not a database row.
- Classes and objects
- __init__ and self
- Instance attributes
- Inheritance
- Method overriding
- Encapsulation and properties
- manifest.json topic structural contract
- theory/python-oop.ru.mdx longread theory with a viz
- exercises/python-oop.ru.yaml exercises with a gold solution
- flashcards/python-oop.ru.yaml flashcards for review
One Zod schema, a single standard
A malformed topic won't pass: one shared Zod contract validates both web and server. An extra field means rejection. Then gold solutions actually run in Pyodide.
Code runs right on the page
Python runs via Pyodide, SQL via sql.js. Both in a Web Worker, no server. Write a solution, hit Run, and see the result at once: a test run or a table.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return f"{self.name} makes a sound"
class Dog(Animal):
def speak(self):
return f"{self.name} says Woof"
- Dog("Rex").speak() → Rex says Woof
- Animal("Rex").speak() → Rex makes a sound
- isinstance(Dog("Rex"), Animal) → True
Not a wall of text, but live diagrams
Theory embeds visualizations and interactive animations: from class inheritance and hash tables to attention and gradient descent. Plus quick check questions as you read.
- inheritance
- hash table
- attention
- gradient descent
- tokenization
Which statements about class inheritance in Python are true?
Without its own __init__, a subclass uses the parent's; but once __init__ is overridden, super().__init__() must be called explicitly, or the parent's fields never get set. isinstance() looks at the whole class hierarchy.
Progress builds, cards bring it back
A streak and an activity heatmap live in the browser (IndexedDB), no account. And FSRS flashcards decide on their own when to resurface a topic.
All your progress in one file
Progress, cards, notes and bookmarks export as one JSON. Back up and move between devices, no server, no account.
- progress and attempts
- flashcard reviews (FSRS)
- notes and bookmarks
- highlights and achievements
scale
size and timeframe: what stands behind the product.
architecture
Offline AI skill authors topics and opens PRs (Cursor/Claude)
- topics/ generates
File-based topics: manifest, MDX theory and YAML tasks
- web · local-first glob
A separate interview-question bank: articles and exercises
- web · local-first glob
Vite+React SPA, local-first; reads topics via glob
- lesson-engine
- IndexedDB progress
- NestJS API · opt opt
Shared Zod schemas: validate topics and submission DTOs
- web · local-first
- NestJS API · opt
Progress, notes and FSRS reviews in the browser (Dexie)
Optional: topic submissions, hardened admin, search
Topic loader, exercise runners and a CLI validator
- sql.js + Pyodide Web Worker
Code execution in Web Workers: SQL, Python, JS
stack
- Language 2
- Framework 5
- Data 4
- Infrastructure 4
- Client 4
- AI / ML 2
Language
- TypeScript 5 (strict)
- Python (Pyodide)
Framework
- React 18
- Vite 5
- NestJS 10 (DDD)
- TanStack Router
- Tailwind
Data
- IndexedDB / Dexie
- Zod contracts
- MDX + Shiki
- Elasticsearch
Infrastructure
- pnpm workspaces
- Turborepo
- Docker Compose
- GitHub Actions CI
Client
- sql.js (WASM)
- Pyodide (WASM)
- Monaco editor
- Web Workers
AI / ML
- lesson-forge skill
- ts-fsrs (SRS)
what it does
the product's key capabilities right now.
Topics as code
Each topic is stored as files in the repo: theory in MDX, exercises in YAML. It's not a database row, so a fix can land as a normal pull request.
A Zod schema checks the topic manifest against 70+ rules, from uniqueness to RU/EN parity. If even one check fails, the change doesn't merge.
The lesson-forge AI agent
The AI writes a whole course itself (theory and exercises), validates it, and solves its own exercises in the sandbox before opening a PR.
If the AI's own reference solution fails in the exact sandbox a learner sees, the PR never opens. CI separately checks theory compilation and variant parity.
Code in the browser
sql.js and Pyodide in Web Workers plus a Monaco editor: Python and SQL genuinely execute in the browser, no server involved.
The worker starts with fetch, WebSocket, and a dozen other network APIs disabled, so what's written physically can't leak out. The editor also offers SQL-schema autocompletion and two custom themes.
Seven exercise types
From a quiz to a Python function: every type grades itself automatically, and the most unexpected one, git-challenge, simulates real Git right in the browser.
A homemade ~600-line engine genuinely runs commit, branch, merge, rebase, and stash, with zero risk to any real repository.
Interview question bank
368 questions across 10 categories, from data structures to system design, each with a "how to answer" breakdown, plus flashcard and exam modes.
Grew from an open Python question set, fully rewritten: its own article structure, 988 original exercises and diagrams.
Flashcards that remind you on their own
The FSRS algorithm decides when a card is due: answer confidently and you see it less, start forgetting and it comes back sooner.
Same principle as language-learning apps. Separately, a 14-week activity heatmap, like GitHub's.
Local-first
Opens on localhost with no backend, no accounts, and no internet, and installs as a PWA for full offline use.
The backend is only needed for submission intake and admin. Everything else (exercises, progress, flashcards) lives in the browser on IndexedDB.
Community and your own server
Topic proposals via PR or form, moderation in a TOTP two-factor admin, self-hosting in Docker.
The form is capped at 5 submissions per minute per address. Login needs a password plus a one-time code, and 5 wrong attempts in a row locks the account for 5 minutes.
timeline
how the product grew from its first version.
-
9 Jun 2026
Local-first player
6 exercise types, sql.js and Pyodide in Web Workers, Monaco, FSRS reviews, TOTP admin, and RU/EN i18n.
-
11 Jun 2026
Content explosion
lesson-forge proves its speed: the catalog grows from 1 to 21 topics in two days, 15 of them in a single commit, plus the first seeds of what becomes the interview-question bank.
-
16 Jun 2026
Content and flashcards
28 bilingual RU/EN topics, a 7th exercise type git-challenge (a deterministic in-browser git engine), flashcard decks, lesson-forge with Zod contract, vitest tests, and a NestJS backend for submissions.
-
24 Jun 2026
Production hardening
Pyodide sandbox fixes, CSP, pre-launch security hardening, and CI gates for i18n, bundle, coverage, and a11y.
-
30 Jun 2026
Final polish
The catalog reaches its final 34 topics (django, DRF, python-testing, S3, Litestar), NestJS is upgraded to major version 11, and one more hardening pass clears vulnerabilities before launch.