A small tool for turning a vague learning goal into a concrete plan you can act on. You give it a topic, it helps you narrow that topic down, then it produces a sheet with five hands-on experiments, one keystone project that ties them together, and five follow-up directions to chase next.
The flow is the same in the CLI and the web app:
fermentation,
pendulums, color theory. Broad is fine.python webapp.py starts a local server (default http://localhost:8000/).
The home page takes a topic and walks you through refinement step by step —
each suggestion is a clickable button that posts back the new topic. When
you commit, the generated sheet is rendered as HTML with the raw markdown
tucked into a collapsed View raw markdown section below it, plus a
download button for the .md file.
Every generation is saved to ./sheets/ (overridable with $SHEETS_DIR)
along with a JSON index. A View saved sheets link on the home page lists
past topics newest-first; clicking one shows it again without re-generating.
A FastCGI mode is also available — python webapp.py --mode fastcgi — for
deployment behind nginx or lighttpd.
python learn.py "your topic" runs the same flow in the terminal.
Refinement is interactive (numbered choices), and the final sheet streams
to stdout while being written to <slug>-<date>.md in the current
directory (override with -o).
Both interfaces share a core.py module that wraps the Anthropic API:
messages.parse() helper with a Pydantic
schema so each response is structured (rationale plus a list of 5–7
sub-topics) and validated automatically.messages.stream() with adaptive thinking on
claude-opus-4-7. The web app collects the full stream and renders the
result in one shot; the CLI prints chunks as they arrive.If the model wraps its output in a ```markdown fence (it
occasionally does despite being told not to), the web app strips the outer
fence before rendering — otherwise the whole document would render as one
giant code block.
Here is the code if you want to play with it.