Read a chapter Β· run the code Β· git switch --detach chNN to see exactly what that chapter built.
β If a
Forkable*repo saves you an afternoon, a star helps someone else find it.
| Info | Details |
|---|---|
| π― What | A notes app with checklists, instant search and a purple light/dark theme β running in your browser, served from your own computer |
| π How you learn | 5 sections Β· 12 chapters, each ending in a Git tag (ch00 β¦ ch11) you can check out |
| π§° Stack | Python Flask Jinja2 Waitress SQLite FTS5 HTML CSS JS pytest Playwright GitHub Actions PyInstaller |
| π» Runs on | π macOS Β· πͺ Windows Β· π§ Linux β Python 3.10 or newer |
| π Privacy | Listens on 127.0.0.1 only. No account, no cloud, no analytics β and a test proves nothing leaves your machine |
| πΊοΈ Part of | The Forkable* index β clone it, run it, keep it or throw it away |
| π macOS Β· Terminal (zsh) | πͺ Windows Β· PowerShell |
|---|---|
git clone https://github.com/suryakulshreshtha/Forkable-ToDoNotes.git
cd Forkable-ToDoNotes
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
python -m todonotes # opens http://127.0.0.1:8765/ |
git clone https://github.com/suryakulshreshtha/Forkable-ToDoNotes.git
cd Forkable-ToDoNotes
py -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
python -m todonotes # opens http://127.0.0.1:8765/ |
Stop it with Ctrl+C. Your notes are kept in one SQLite file in your user data folder (details in Chapter 03).
Every version tag builds ready-to-run apps for macOS (Apple Silicon and Intel), Windows and Linux on the Releases page. They are not code-signed yet β see Chapter 10 for the one-time "Open Anyway" step.
| π Dark | βοΈ Light |
|---|---|
![]() |
![]() |
![]() |
![]() |
Captured automatically by Playwright β scripts/capture_screenshots.py.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f3d7f7", "primaryTextColor": "#46104c", "primaryBorderColor": "#5316a6", "lineColor": "#672891", "secondaryColor": "#e7c1ee", "tertiaryColor": "#f8f2fa", "fontFamily": "Helvetica, Arial, sans-serif"}}}%%
flowchart TB
subgraph APP["π The app β runs on 127.0.0.1 only"]
direction LR
B["π Browser<br/>HTML Β· CSS Β· JS<br/><i>ch05β06</i>"] -- "HTTP request" --> W["π§ web.py<br/>Flask routes<br/><i>ch05</i>"]
W -- "render" --> T["π¨ Templates<br/>Jinja2 + theme.css<br/><i>ch05β06</i>"]
T -- "HTML page" --> B
W -- "calls" --> S["π§ service.py<br/>rules Β· validation<br/><i>ch04</i>"]
S -- "calls" --> R["ποΈ storage.py<br/>SQL only<br/><i>ch03</i>"]
R -- "sqlite3" --> D[("πΎ notes.db<br/>SQLite + FTS5<br/><i>ch03 Β· ch07</i>")]
end
subgraph AUTO["π Automation β proves it works"]
direction LR
PW["Playwright<br/><i>ch08β09</i>"] -- "drives" --> B
PY["pytest<br/><i>ch01β09</i>"] -- "tests" --> S
end
subgraph SHIP["π Ship β from commit to download"]
direction LR
G["git<br/>chapter tags"] --> GH["GitHub"] --> A["Actions<br/>CI gate Β· <i>ch10</i>"] --> PI["PyInstaller"] --> REL["π¦ Releases<br/>macOS Β· Windows Β· Linux"]
end
APP ~~~ SHIP
classDef app fill:#f3d7f7,stroke:#5316a6,color:#46104c
classDef auto fill:#e7c1ee,stroke:#672891,color:#46104c
classDef ship fill:#f1e4f4,stroke:#46104c,color:#46104c
class B,W,T,S,R,D app
class PW,PY auto
class G,GH,A,PI,REL ship
πΌοΈ Offline copy: tech-map.svg Β· source: tech-map.mmd
| Chapter | What you'll build | Stack | Tag |
|---|---|---|---|
| 00 Β· How to read this repo | The map, the conventions, following along with tags | Git Markdown |
ch00 |
| 01 Β· Setup: Python, Git, venv | A working toolchain on π and πͺ, an installable package, the first test | Python pip venv pytest ruff |
ch01 |
| 02 Β· Architecture & data flow | Layers, Mermaid diagrams, documentation that is tested | Mermaid pytest |
ch02 |
| Chapter | What you'll build | Stack | Tag |
|---|---|---|---|
| 03 Β· SQLite storage | Schema, migrations, parameters, per-OS data folder | SQLite sqlite3 |
ch03 |
| 04 Β· Service layer & unit tests | Business rules, fixtures, parametrize, markers | Python pytest |
ch04 |
| Chapter | What you'll build | Stack | Tag |
|---|---|---|---|
| 05 Β· Flask routes & templates | Pages, forms, JSON API, local-only safety checks | Flask Jinja2 Waitress |
ch05 |
| 06 Β· Design system: CSS & JS | Purple palette tokens, light/dark, contrast tests, autosave | CSS JavaScript WCAG |
ch06 |
| 07 Β· Full-text search (FTS5) | Prefix search, ranking, safe <mark> highlights |
SQLite FTS5 MarkupSafe |
ch07 |
| Chapter | What you'll build | Stack | Tag |
|---|---|---|---|
| 08 Β· Playwright foundations | Live server fixture, page objects, first browser tests | Playwright pytest |
ch08 |
| 09 Β· Playwright showcase | API+UI hybrids, offline proof, emulation, screenshots | Playwright |
ch09 |
| Chapter | What you'll build | Stack | Tag |
|---|---|---|---|
| 10 Β· CI & releases | A CI gate on 3 OSes, one-file apps on GitHub Releases | GitHub Actions PyInstaller |
ch10 |
| 11 Β· Fork, extend & audit | Make it yours, audit the supply chain, pick a next feature | Git Dependabot |
ch11 |
Section 1 π§ 00 β 01 β 02 read the map, set up, see the whole design
Section 2 ποΈ 03 β 04 data first, rules second (no web yet!)
Section 3 π¨ 05 β 06 β 07 pages, then looks, then search
Section 4 π 08 β 09 prove it works in a real browser
Section 5 π 10 β 11 ship it, then make it yours
Full index with time estimates: π docs/README.md.
Files arrive chapter by chapter β the right-hand column says when.
Forkable-ToDoNotes/
βββ src/todonotes/ the app
β βββ __main__.py launcher: picks a port, starts Waitress, opens the browser (ch01, ch05)
β βββ config.py where notes.db lives on each OS (ch03)
β βββ models.py Note Β· ChecklistItem Β· SearchHit (ch03, ch07)
β βββ storage.py all SQL: migrations, CRUD, FTS5 search (ch03, ch07)
β βββ service.py rules: validation, defaults, export (ch04)
β βββ web.py Flask routes, JSON API, safety checks (ch05)
β βββ templates/ Jinja HTML (ch05)
β βββ static/ theme.css Β· app.css Β· app.js (ch06)
βββ tests/unit/ fast tests β no browser (ch01 β ch07)
βββ tests/e2e/ Playwright tests + page objects (ch08, ch09)
βββ scripts/ contrast check Β· screenshots Β· build Β· dependency audit
βββ packaging/launch.py PyInstaller entry point (ch10)
βββ .github/ CI, release workflow, issue/PR templates, Dependabot (ch10, ch11)
βββ docs/ π the course: sections β chapters, diagrams, assets
- π€ Contributing β branch, test, Conventional Commits
- π Security policy β what the app protects, how to report a problem
- π€ Rules for AI coding agents β may address reviews, fix CI and resolve conflicts; never merge
- π Code of conduct
| Repo | What it is |
|---|---|
| ForkablePythonLearningShowcase | Test automation fundamentals, built up step by step |
| Forkable04EyePythonPlaywrightLearning | E2E testing workflows wired to GitHub Actions CI |
| ForkablePythonProjectShowcase | A full UI + API test automation framework |
| πΊοΈ The full index | Every Forkable* repo and the order to read them in |
π MIT licence Β· π @suryakulshreshtha




