Cramfast product spec
Status: implemented and deployed (version 4, 16 October 2026; study modes, courses with exams, studying together, typed uploads, starting from a name, research papers and example comparisons added 17 October 2026; critical user journeys, goals, Home, teaching, help on demand, explainers and past exams as tests, section 2, 18 October 2026; bringing your own material, building with review, forking and publishing guides, and the rest of the instructor's flow, sections 2.8 and 2.10-2.13, all built 19 October 2026; every journey has a live check and a demo, section 2). This document describes what the product does, the journeys and screens, every data type behind them and how each one is drawn. The pipeline that produces the data (stages, models, checks, costs) is in PIPELINE_DESIGN.md. The fuller design that v4 is built towards, with phone and desktop wireframes and the open questions, is the UI spec and user journey; section 10 lists what of it is not built yet.
1. Goal and principles
A student with an exam in days uploads their course material and wants to know what to study, in what order, to score as well as possible in the time they have.
- Exam first. Every concept carries a predicted share of the exam. The roughly 20% of concepts that carry most of the marks (the core) are taught first; supporting and detail concepts are further levels.
- Two ways to study, one set of content. Follow along goes through each lecture as it was given (an overview of the whole deck first, then every slide explained); Learn re-teaches the course as a short curriculum of modules at the depth the student chooses. Both sit on the concept graph and share one question bank.
- Learning and testing are always separate. Reading never contains questions. Every lecture and module has its own Test yourself; questions use whichever verifiable format tests the skill best (choose one, select all, numeric, short answer, order, match, explain), all graded by code.
- Learn in cards, look up in pages. Anything with an answer, a reveal or forward motion is a card in a session. Anything a student scans, searches or returns to (map, concept page, notes, progress) is a page. Both draw the same typed content.
- Grounded and attributed. Lessons are built on the course's own facts and cite them; every fact cites the slide blocks it comes from. Accurate general knowledge of the subject may be added where it helps (a definition the slides assume, a standard example), and is shown as "General knowledge" instead of a page chip, so the student always knows where a statement comes from.
- The model fills typed slots; the UI owns the layout. Content arrives as typed forms with word limits that fit a phone card. A part that does not fit is dropped, never squeezed. Inside text fields the model writes Markdown and LaTeX maths, which Cramfast draws itself; it never writes markup, layout or styling.
- One schema for every subject. Concept kinds, fact roles and block types describe structure (a process, a rule, a comparison), not subject matter.
- Calm and honest. No points or badges. "Secure" means predicted recall of 90% or better now, so it decays without practice.
2. Critical user journeys
Everyone who opens Cramfast wants one of a small number of things. A journey is supported when someone can finish it from the home screen without knowing the app's words for its parts (module, bundle, tier). This section lists them; sections 3 and 4 describe the parts they use. Status: Built, Partial (what is missing is named) or Missing.
2.1 Goals
A person says what they want when they start a course, in a few taps, and can change it later. A course can have several goals at once for the same person (learn it over the term and pass the midterm), and a single session can have its own goal ("just lecture 3", "the midterm", "what's due"). Goals belong to a person in a course: the owner's, and each member's or visitor's (a share link offers the owner's goals as defaults).
| Goal | Concepts ranked by | Follow-up questions (each skippable) | The home screen plans |
|---|---|---|---|
| Prepare for an exam | Predicted share of the exam | Which exam; date; what it covers (all, some lectures); format; do you have a past exam? | Days to the exam: learn the core, then test, then the weakest; the last day is Cram |
| Learn it over time | Foundations first (how much of the course builds on a concept), then the course's order | Why (work, a course, curiosity); what you know already (new to it · some · reviewing); time a week; finish by (optional) | This week: new modules for the time set, plus due reviews |
| Keep up with a course | The course's order, newest lecture first | Lectures so far; how often new ones come | The newest lecture (Follow along, then its test), then reviews of older ones |
| Teach it | The educator's emphasis (the model's ranking until they change it) | Who the students are and their level; when they need it; how it is used (before class · review after · assessed) | The author's home: what to check, preview as a student, share, People, tests sent |
| Understand one thing | One concept and what it needs | What you want to understand; how deep (the gist · properly · in depth) | One explainer with a few questions; Keep learning this turns it into a course |
When goals are combined, the plan blends them: an exam's weight grows as its date nears (it leads from 14 days out, and is all there is in the last 2 days); otherwise the other goal's ranking leads.
2.2 Starting with nothing but a question
| # | They say | What happens | Status | Demo (live check, 2026-10-19) |
|---|---|---|---|---|
| A1 | "Explain recursion to me" | Type a topic or question; within a minute a short explainer (the idea, a worked example, common mistakes, from general knowledge and labelled so) and 3-5 questions. Keep learning this makes it a course (A2) | Built (quick.py): the landing page's No material? Just ask; gist · properly · in depth |
Owner: /cramfast/ (owner) → No material? Just ask. “Explain dynamic programming” → an explainer “Dynamic programming” with 3 sections all labelled general knowledge and 4 graded questions; Keep learning this offered |
| A2 | "I want to learn Bayesian statistics over the next month" | Topic → goal Learn it over time with its follow-ups → sources found and topics outlined (3.1) → guide → weekly plan | Built: from the name, then goals with follow-ups on Home and a weekly plan | Open. Goal Learn it over time, 3 h a week → “THIS WEEK · 0 MIN OF 3 H”, “0 of 14 modules done · At 3 h a week you'd finish around Mon, Oct 26.” |
| A3 | "I'm taking 14.01 at MIT" | Start from the course's name (3.1): sources found, chosen, built; asked their goal | Built: goals asked on Home once the guide exists | Open. Started from “Principles of Microeconomics (MIT 14.01)”: open MIT material found and built into 14 modules; Home asks the goal |
| A4 | "Recent papers by Ada Lovelace" | arXiv search, papers listed and built (3.1) | Built | Open. “Recent papers by Shikib Mehri” → 14 papers from arXiv, each followable page by page; 29 modules across them |
| A5 | "Here's my course's website" | Paste a link; the page is followed to the files it links (lecture notes, problem sets, past exams), shown for review like A3 | Built: The course's website on the start form is followed first | Owner: /cramfast/ (owner) → No files yet? Start from the course's name → The course's website. a pasted course page leads the search and is followed to the files it links (tested: test_quick.py::test_a_pasted_course_website_is_followed_first test_start.py::test_a_course_site_is_followed_to_its_files) |
2.3 Starting with material
| # | They say | What happens | Status | Demo (live check, 2026-10-19) |
|---|---|---|---|---|
| B1 | "Here are my lecture slides" | Upload; the guide builds by itself; asked their goal while it builds | Built: goals asked on Home | Open. One uploaded lecture built by itself into Learn (2 modules) and Follow along; Home opens on “What do you want from this course?” |
| B2 | "Slides, the textbook, two past exams and my notes" | Each file typed (3.1); the map asks for what would help most | Built | Open. Lectures, a problem set, a past quiz and marked work, each typed: “Predicted from 0 stated objectives and 1 past exam and 1 problem set · problems (calculations, proofs, code) (inferred) · expected depth: ap” |
| B3 | "I have class tomorrow, here's the deck" | One file → Follow along, slide by slide | Built | Open. One deck → Follow along: overview, then slide 1 of 6 beside its notes |
| B4 | "Give me more questions on this" | More questions on a module, lecture, concept or my weak spots: new questions on the same facts, in the formats that suit them, added to the bank | Built: in each module's Test yourself, focused on what the student got wrong (ondemand.py) |
Open. More questions on this module in Test yourself; earlier extra questions added to module 1's bank and graded like the rest |
| B5 | "I don't get this part" | Explain it differently on any module section, slide note or concept: simpler, another example, or more depth, answered in place from the course's facts (general knowledge labelled) | Built: Still unclear? under every module section and slide note | Owner: /cramfast/?set=faec51609b1546b8ae061d24698ebef5&view=learn (owner) → a module → Still unclear?. Still unclear? Explain it differently or ask under each of the module's 1 sections |
| B6 | "Why does X cause Y?" | Ask about the course: an answer from the course's facts with page citations, general knowledge labelled, and the concepts it touches linked | Built: Ask about this course on Home, and about any section or slide | Owner: /cramfast/ (owner) → Home → Ask about this course. Ask about this course on Home (not asked in this run: --spend) |
| B7 | "This doesn't cover the background I'm missing" | The map names gaps (missing lectures, assumed background); Fill this in writes labelled notes for a topic the material does not cover | Built: Add a topic your material doesn't cover in Update this guide (owner) | Open. A topic no material covered is taught from notes Cramfast wrote, each part labelled General knowledge |
| B8 | "Here's lecture 7" | Add files later; only what they touch is rewritten (3.2) | Built | Open. Lectures added over a term (5 now, the last two added later); only touched modules rewritten (2 marked Updated) |
| B9 | "Make the hash tables module use an example" | Change the guide in words (owner, 3.2) | Built | Open. “Make the hash tables module use an example” → the module now has a worked example (edition 6, $0.04) |
2.4 Exams
| # | They say | What happens | Status | Demo (live check, 2026-10-19) |
|---|---|---|---|---|
| C1 | "What's going to be on my exam?" | The map's headline and the concepts ranked by predicted share, with why | Built | Open. “18 core concepts are predicted to carry 40% of the exam”, then every concept ranked by predicted share with why |
| C2 | "The midterm is lectures 1-4 on 2 November" | Asked as the exam goal's follow-ups; scopes Test, Cram and Progress | Built: the exam goal's follow-ups (an owner's become a course exam) | Open. Exams named with their lectures and dates; Test, Cram and Progress follow the one picked (“Midterm · Nov 2 · 3 lectures”) |
| C3 | "Here's last year's exam" | Typed upload re-ranks what is core (3.2) | Built | Open. A past quiz uploaded as Past or practice exam re-ranked what is core: “Predicted from 0 stated objectives and 1 past exam and 1 problem set · problems (calculations, proofs, code) (inferred) ” |
| C4 | "Let me sit last year's exam" | The past exam's own questions as a timed test, graded where they can be, with model answers; exam paperwork (name, honour code, cover page) is left out (course_plan.administrative, also applied to every question Cramfast writes) |
Built (pastexam.py): Sit a past exam in Test, once the owner prepares it |
Open. Sit a past exam: quiz 1 as a 120-minute timed test of 17 questions with model answers; cover-page items left out |
| C5 | "Plan my week until the exam" | Day by day to the date: each day's concepts and minutes, what is done, what moved | Built: Home's exam plan and The days until… | Open. Goal Prepare for an exam → “TODAY · MIDTERM IN 14 DAYS” with today's tasks and 9 days planned to the date |
| C6 | "Test me like the real thing" | Practice exam, timed, weighted like the exam | Built | Open. Practice exam: “Start a 15-minute exam”, weighted like the exam, results only when handed in |
| C7 | "My exam is in 3 hours" | Cram | Built | Open. Cram: “9 concepts in 30 minutes, about 32% of the predicted exam”, a countdown of learn and check cards |
| C8 | "Am I ready?" | Readiness: share of the exam secure, weakest first | Built | Open. After a short quiz: “0 of 79 concepts secure · 4 started · 0 sessions. Secure means at least two answers, 80% right, and the latest”, weakest first |
| C9 | "Here's my marked midterm" | Compared concept by concept with the report | Built | Owner: /cramfast/?set=07ea6fc146544e18b88446aa6460ba3a&view=progress (owner) → Your marked homework and tests. Marked practice set A read question by question and compared concept by concept with the report (comparison collapsed) |
| C10 | "I have a midterm and a final" | Several exams; pick the one being studied for | Built | Open. Two exams to pick between: Midterm · Nov 2 · 3 lectures, Final |
2.5 Learning over time
| # | They say | What happens | Status | Demo (live check, 2026-10-19) |
|---|---|---|---|---|
| D1 | "I have 3 hours a week" | A weekly plan: new modules for the time set, due reviews, what is left | Built: Home's week (time done of time set, pace to the finish date) | Open. 3 h a week → 0 of 9 modules done · At 3 h a week you'd finish around Mon, Oct 26. |
| D2 | "New lecture every Tuesday" | The home leads with the newest lecture (Follow along, its test), then reviews | Built: Home's Keep up plan | Open. Goal Keep up → the home leads with “Follow along: Lecture 5: Linear Sorting”, then its test and catching up |
| D3 | "I'll listen on my walk" | Listen to a module or lecture | Built | Open. Listen on a module: 3 parts read aloud (intro, sections, mistakes, summary), then Test yourself |
| D4 | "Where was I?" | Last time and what is next, on every start screen | Built | Open. After a quiz, Home opens with “LAST TIME · TODAY A short quiz on Everything: 3 of 5 right. Still shaky, so we start there: Array Cram these Test me ” |
| D5 | "On my phone now" | The same progress on another device | Built (Device.tsx, api.py /device-links): a one-time link (an hour) makes another browser the same member, or opens the owner's courses there; joining carries what was answered before |
Open. Answered on a laptop, joined, Continue on another device → the link opened on a phone as the same member, with the answers: “0 of 79 concepts secure · 1 started · 0 sessions. Secure means at least two answers, 80% right, and the latest”; then left |
2.6 Teaching
| # | They say | What happens | Status | Demo (live check, 2026-10-19) |
|---|---|---|---|---|
| E1 | "I'm making a guide for my class" | Goal Teach it; the author's home lists what to check: the core concepts and their order, then modules | Built: Home's author checklist | Owner: /cramfast/?set=2548f33a0a3c46ea9d11c871812793a7&view=home (owner). Goal Teach it → the author's checklist: “Check what's core: 18 concepts, 51% of the predicted exam”, then modules, preview, share |
| E2 | "Hash tables matter more than that; drop this topic" | Make core, Leave out and reorder on the map take effect: the ranking, Learn's depths, Test and Cram follow | Built (emphasis.py): Teach it as on each concept page; reorder is part of the instructor's flow (2.8, G2) |
Owner: /cramfast/?set=2548f33a0a3c46ea9d11c871812793a7&view=map (owner) → a concept → Teach it as. “In-place sort” made core: tier detail → core at once; Study's depths and Test follow (plan tier core); then put back |
| E3 | "Let me see what my students see" | Preview as a student opens the share link's view inside the author's | Built: Preview it as a student on the author's home | Owner: /cramfast/?set=2548f33a0a3c46ea9d11c871812793a7&view=home (owner) → Preview it as a student. Preview it as a student opens the share link's view |
| E4 | "Share it; who's keeping up?" | Share link, People, sent tests | Built | Owner: /cramfast/?set=07ea6fc146544e18b88446aa6460ba3a&view=people (owner). People: 5 members with exam secure, answers right, weakest concept, last active; tests sent and who took them |
| E5 | "Here's this week's lecture" | Update during the term (B8) | Built | Open. Lectures added over a term (5 now, the last two added later); only touched modules rewritten (2 marked Updated) |
2.7 Studying with others
| # | They say | What happens | Status | Demo (live check, 2026-10-19) |
|---|---|---|---|---|
| F1 | "Let's study this together" | Join by name, the group's progress and what it finds hardest | Built | Open. Joined by name (“Checker 3275”, no account), saw the group's progress and hardest concepts, then left (membership and answers deleted) |
| F2 | "Quiz my friends" | Any member can send a test from the bank | Built: members send tests and see who took them | Open. A sent test opens on the share link; after joining by name: 5 questions, 8 minutes, results at the end |
2.8 Shaping a guide as its instructor
An instructor or tutor making a guide for their students needs more than the student-side tools (2.6): control over what students see and when, the guide's structure, how it is written, and the questions. The person who makes the guide owns it (below). Today those tools exist as scattered single actions (Teach it as, Suggest a change, Fill a gap, preview). This journey gathers them, and adds the missing ones, into one process the instructor walks through once after the first build and returns to during the term.
Principles. Every step is optional and starts from a good default, so a guide is usable without doing any of it. Students see only what the instructor has published. Anything that rewrites text shows its price before it runs. An instructor's own edits are never overwritten by a later update or rewrite.
The flow (Shape this guide, from the author's home; a stepper that remembers where they got to):
| Step | They decide | Options | Model calls |
|---|---|---|---|
| 1. Who it's for | The students and the guide's use | Level (intro · intermediate · advanced); what they know already (prerequisites, free text); how it is used (before class · review after · exam prep · assessed); the course's learning objectives (pasted, or confirmed from the syllabus) | None; feeds steps 3-5 |
| 2. Outline | What is taught, in what order | Reorder modules and the concepts in them (drag, or up/down on a phone); rename; merge two modules or split one; move a concept to another module; Teach it as core / supporting / detail / leave out; add a topic (B7); hide a lecture from Follow along | Only for added topics and for modules whose content changed (priced) |
| 3. How it is written | The voice and density of every module | Reading level; length (brief · standard · thorough); worked examples (few · some · many); notation and terms to use (a glossary the instructor can edit); general knowledge allowed, labelled, or not at all (course material only); language | A rewrite of the affected modules, priced first (about $0.03 a module); applied all at once or module by module |
| 4. Review the content | Each module and lecture, approved or changed | A review queue (not reviewed · approved · changed) with counts; for each part: approve, edit the text directly, ask for a change in words (3.2), or lock it so updates leave it as is | Only for changes asked in words |
| 5. Questions | What students are tested on | Approve, edit or remove any question; write their own (any of the seven formats); per module: how many and which formats; difficulty mix (recall · apply · analyse); match my exams (questions written in the style of an uploaded past exam) | Only for new or restyled questions (priced) |
| 6. Assessments | Tests for the class | Build a test from chosen questions or a rule (lectures, count, time); set an opening date and a due date; results only after the due date or straight away; send to the whole class or some members | None |
| 7. Publish | What students see | Students see the published edition; everything above goes into a draft; Publish with a note to students (what changed); earlier editions kept and restorable | None |
| 8. During the term | Keep it current and see how the class is doing | Add this week's lecture (B8; the draft gets its parts, the outline keeps the instructor's order and locks); the class's hardest concepts and most-missed questions, each linking to the part to fix; return to any step | As in steps 2-5 |
Journeys:
| # | They say | What happens | Status | Demo (live check, 2026-10-19) |
|---|---|---|---|---|
| G1 | "Set it up for my second-years, who haven't done calculus" | Step 1; the level and prerequisites feed every later rewrite and question | Built: Presentation for the whole guide (students, used for, what they already know) | Owner: /cramfast/?set=2548f33a0a3c46ea9d11c871812793a7&view=shape (owner) → Presentation. Presentation for the whole guide: students' level, what it's used for, what they already know, shown as “The writer is told…” |
| G2 | "Teach recursion before sorting, merge these two, hash tables are core and a fifth of the exam" | Step 2: concepts (tier, share of the exam, name, topic) at once; modules (reorder, rename, merge, split, move concepts, teaching order within a module, remove) as a priced update | Built (steer.py, Shape this guide → Concepts, Outline) |
Owner: /cramfast/?set=2548f33a0a3c46ea9d11c871812793a7&view=shape (owner) → Concepts, Outline. Concepts tree (tier, % of the exam, name, topic; 18 core · 51%) applied at once; Outline of 12 modules: reorder, rename, merge, split, move, remove, priced |
| G3 | "Shorter, more worked examples, use my notation" | Step 3 for the whole guide, Learn, Follow along, a module or a lecture; priced, then rewrites only the parts in scope | Built (Shape this guide → Presentation) | Owner: /cramfast/?set=2548f33a0a3c46ea9d11c871812793a7&view=shape (owner) → Presentation. Presentation per scope; one module's “brief, many examples” priced at $0.04 for 1 module, applied only on Apply |
| G4 | "Let me check everything before my students see it" | Steps 4 and 7: precise feedback on any passage, review queue, direct edits, locks, draft and publish | Built (review.py, Shape this guide → Review): every part with flags, approve (of one version), edit the text, lock; Hold changes until I publish keeps share links on the published edition; plus Steer this passage |
Owner: /cramfast/?set=2548f33a0a3c46ea9d11c871812793a7&view=shape (owner) → Review; Study → select text → Steer this passage. Held for publishing: the author's edit to module 1 made a draft (students kept edition 7) until Publish edition 8; the edited module is locked; every passage can also be steered (priced) |
| G5 | "I want to choose the questions, and add my own" | Step 5 | Built (Shape this guide → Questions): every question with its key; approve, hide, edit (same id, answers still count), write one's own in any format; more like <a past exam> (about a cent); formats, difficulty and number per module in Presentation | Owner: /cramfast/?set=2548f33a0a3c46ea9d11c871812793a7&view=shape (owner) → Questions. Every question with its key: “152 not reviewed” → approved one, hid one, wrote my own (numeric) → “151 not reviewed”; 4 more like Quiz 1 wrote questions in that exam's style (traces of a Python procedure, running-time reasoning) for about a cent |
| G6 | "Quiz on lectures 1-3, due Friday, marks after" | Step 6 | Built: Send as a test sets when it opens and is due, results straight away or after the due date (held on the server), everyone or chosen members; members see Tests set for you and their result once released | Open. “Quiz on lectures 1-3, due Friday, marks after”: listed for the student (“Quiz on lectures 1-3 · 6 questions, 15 min · due Fri, Oct 23, 9:00 PM ”), taken under time, answers graded and kept but not shown (“results after it's due, 10/23/2026, 9:00:00 PM”); results and worked answers on the due date |
| G7 | "Where is the class struggling, and fix it" | Step 8: hardest concepts and missed questions linking to their parts | Built: Where the class struggles and Most-missed questions on People, each with Fix … opening the part that teaches it | Owner: /cramfast/?set=07ea6fc146544e18b88446aa6460ba3a&view=people (owner) → Where the class struggles. The class's hardest concepts and most-missed questions, each with the part that teaches it (“Dynamic array: 1 of 5 answers right · Fix “Dynamic Arrays and Amortized Analysis””); 4 Fix … links, the first opening its module |
As built (18 October 2026). Shape this guide (owner sidebar) has four tabs. Concepts: the
hierarchy as a tree; per concept its tier (with the prediction shown), its share of the exam in
percent (the rest keep their proportions), its name and its topic; new topics. Applied each time the
course map is loaded, over the stored map, so each change can go back to the prediction; no model
call, and every view follows at once. Outline: each change becomes an owner edit on the pending
update (editions.py actions plus rename_module, order_concepts); a rename or reorder rewrites
nothing. Presentation: options per scope rendered into one standing instruction for that scope
(shown to the owner as "The writer is told…"); a narrower scope adds to a wider one. Update: the
pending update with every change, its price, Apply. In Learn and Follow along the owner can select
any passage and Steer this passage (quick instructions plus their own words); it becomes a request
aimed at that part with the passage quoted.
Build order for this journey: (1) steering concepts, outline and presentation, and precise feedback (G1-G3, built first because instructors asked to steer the content and its look most); (2) draft and publish, direct edits, locks and the review queue (G4); (3) question curation and assessments with dates (G5, G6); (4) the class view linking to fixes (G7).
Who shapes a guide. A tutor or instructor who makes a guide owns it, independently: they upload or start it themselves and every step above is theirs. There is no shared editing of one guide (no editor role); someone else who wants to change a guide makes their own.
2.9 Build order (all five built 18 October 2026)
In this order, each usable on its own:
- Goals and one home. Goals with follow-ups (2.1) for owners, members and visitors; a home screen that plans from them (C5, D1, D2) and replaces Today; navigation Home · Study (Learn and Follow along) · Test · Map (with progress) · More. No model calls.
- Teach it. The author's home (E1), overrides taking effect (E2), preview as a student (E3); members can send tests (F2). No model calls.
- On demand: ask, explain differently, more questions (B4-B6). About a cent each. The owner can always use them; people on the share link only after joining, and only once the owner sets a daily amount for them (off by default, since share links are public).
- Quick start: one question, a course link, filling a gap (A1, A5, B7).
- Past exam as a timed test (C4).
Not now: accounts across devices (D5), calibrating predictions on real results (ExamOutcome).
2.10 Bringing what you already have
Many people arrive with significant prepared material of their own: years of flashcards, a question bank, old quizzes with solutions, a study guide they wrote, a whole course in an LMS. Today every file is read as course material for facts, so a deck of 400 cards is mined and thrown away. The aim: what you bring is used as it is, first; Cramfast fills only the gaps.
Principles.
- Kept as-is. Imported cards, questions and notes keep their wording, answers and marking. They are never rewritten silently; Cramfast may flag a problem ("this card disagrees with lecture 3, slide 12") and suggest a fix, which the owner accepts or not.
- Origin shown. Every item says where it came from: Your card, From your quiz 2, Your notes, Written by Cramfast, General knowledge.
- Coverage visible. Imported items are linked to concepts on the map, so the map can say what they cover and what they don't ("your cards cover 61 of 79 concepts, 88% of the predicted exam"). Fill the gaps writes only for the concepts not covered, in the style of what was brought (card length, question formats, notation).
- Unclear is flagged, not guessed. An item that can't be read reliably (no answer key, two candidate answers, a broken image) goes to a short Check these list, not into the bank.
- Cheap. Parsing costs nothing; linking items to concepts is a small model call per batch. The price is shown before anything is written.
- Nothing is locked in. What goes in can come out (H10).
What people bring, and what it becomes:
| They bring | Read from | It becomes |
|---|---|---|
| Flashcards | Anki (.apkg, .colpkg, with images and review history), Quizlet and Mochi exports, CSV/TSV, a pasted list | Cards in Flashcards, Cram and spaced review, linked to concepts; review history seeds mastery (H9) |
| A question bank or tests | Word/PDF with an answer key, Google Forms, LMS exports (QTI from Canvas, Blackboard; Moodle XML, GIFT, Aiken), Kahoot/Quizizz exports, CSV | Questions in the seven formats with their answers, marks and rubrics; tagged to concepts; they lead Test |
| Old quizzes or exams with solutions | As past exams today, plus the solution file paired to it | As past exams (C3, C4), with model answers taken from the solutions |
| Their own study guide or notes | Markdown, Word, Google Docs, Notion and Obsidian exports, OneNote PDF | The guide's text for the parts they cover, kept and locked; Cramfast structures around them and fills gaps |
| A cheat sheet or formula sheet | PDF, image, Markdown | A reference page; pinned in Cram's last pass; shown during practice exams when the real exam allows a sheet; its notation becomes the guide's |
| Syllabus and learning objectives | As today, plus objectives pasted or read from the syllabus | The backbone: course goals, module order, and an objective on every module and question (I8) |
| Answer keys, solutions, rubrics | Any file, paired by name and content to what they answer | Joined to their problem set, quiz or question bank for grading and worked solutions |
| Lecture recordings | Video or audio, a YouTube or Panopto link, Zoom and lecture-capture transcripts | Transcript aligned to the slides by time; Follow along draws on what was said; spoken emphasis ("this will be on the exam") feeds the prediction |
| A whole LMS course | IMS Common Cartridge export (Canvas, Moodle, Blackboard, D2L) | Its modules, pages, files, quizzes and rubrics in their structure; the outline follows the LMS's module order |
| A folder of everything | A zip, or a Google Drive / Dropbox / OneDrive folder | Every file typed as above in one review screen; duplicates and old versions found (slides v2 replaces v1); solutions paired with their problems |
| Someone else's guide | A share link or library page | A fork (2.12) |
Journeys:
| # | They say | What happens | Status | Demo (live check, 2026-10-19) |
|---|---|---|---|---|
| H1 | "Here are my 400 Anki cards for this course" | Imported with their images; linked to concepts; used by Flashcards, Cram and spaced review; the map shows coverage; Fill the gaps writes cards only for uncovered concepts, in the same style | Built (cards.py, Flashcards in Test): Anki (classic package), Quizlet, CSV, pasted; linked by the names they use; Fill the gaps in the deck's style (about a cent) |
Open. An Anki deck of 24 cards imported as written (one image, 14 reviews), linked to the map, studied self-graded beside the questions (44 cards); the deck covers 48 of 76 concepts (85% of the exam) after Fill the gaps |
| H2 | "Here's my question bank" | Read into the seven formats with answers, marks and rubrics; unclear items in Check these; tagged to concepts; the bank's questions come first in Test and practice exams, weighted by exam share | Built (qbank.py, Your question bank in Test): Moodle XML, GIFT, Aiken, QTI (Canvas, Blackboard), CSV read without a model; Word or PDF as a Question bank file, read by the past-exam step; Check these lists what couldn't be read |
Open. A GIFT bank of 16 questions imported (choose one, true/false, numeric, short, match, explain); 14 kept, 12 linked, 2 listed to check; Your question bank (14) asked first in Test, graded |
| H3 | "Here are last year's quizzes and the solutions" | Each quiz paired with its solutions; evidence for the prediction (as C3) and sittable (as C4) with real model answers | Built (pastexam.solutions_for): a solutions file named like its exam supplies the model answers, isn't listed as an exam and adds nothing to the prediction |
Open. Quiz 1 and MIT's official solutions, paired by name: one exam to sit (17 questions, 120 min), its model answers taken from the solutions; the solutions file adds nothing to the prediction |
| H4 | "I already wrote a study guide" | Their sections are kept as the guide's text for the concepts they cover, labelled Your notes and locked; Cramfast adds structure, questions and only the missing parts | Built (mynotes.py, Shape → Review → Use my own notes as the text): notes split at their headings replace the sections they fit best (shared concepts, then title words), marked Written by you and locked; questions and examples stay; notes matching nothing are listed to add as material |
Owner: /cramfast/?set=2548f33a0a3c46ea9d11c871812793a7&view=shape (owner) → Review → Use my own notes as the text. An instructor's notes (Markdown, 4 headed sections) placed by best fit: 3 sections now in their words, e.g. “Dynamic arrays” in “Linked Lists and Dynamic Arrays”, marked Written by you and locked; questions and examples kept; the note matching nothing listed |
| H5 | "Here's my formula sheet" | A reference page, Cram's last pass, shown in practice exams if the real one allows a sheet; its notation is used throughout | Built (file type Formula or reference sheet, Sheet.tsx): beside Study, in Cram's last pass, in practice exams when the owner marks the real exam as allowing it; Use its notation in the guide sets the notation (priced rewrite) |
Open. The course's formula sheet (a one-page Markdown file, typed Formula or reference sheet) beside Study, in Cram's last pass, and in practice exams, since the owner marked the real exam as allowing it; Use its notation in the guide sets the notation, priced |
| H6 | "Here are the course's learning objectives" | Objectives become the course goals; each module and question carries the objective it serves; coverage per objective (I8) | Built (objectives.py): the author's objectives (pasted, one per line) or the syllabus's, matched to concepts by name; every module shows the ones it serves; coverage in I8 |
Open. The course's objectives (the author's own, pasted; else the syllabus's) on every module students open: “Serves: Analyse the asymptotic running time of an algorithm in the Word-RAM model · Prove an algorithm correct by mathematical induction · Solve recur” |
| H7 | "Here's our Canvas course export" | One upload brings modules, pages, files, quizzes and rubrics; the outline keeps the LMS order; quizzes join the bank | Built (folder.cartridge, through A whole folder): a Common Cartridge (.imscc) brings its files typed, its QTI quizzes into the bank, and its module order; Outline → Your LMS's order → Order like my LMS (free) |
[Open](https://appliedtheology.ai/cramfast/?set=cd99f8bad9d74085911456c2b70acfd3&view=shape (copy's owner) → Outline → Your LMS's order). A Canvas-style course export (.imscc) through A whole folder: “Your LMS's order: 5 modules”; its 5 lectures recognised as already here, its QTI check-in quiz in the bank (3 questions); Order like my LMS → 31 module moves in the update, free |
| H8 | "Here's the lecture recording" | Transcribed and aligned to the slides; slide notes can draw on what was said; emphasis the lecturer gave feeds what is core | Built (recordings.py, file type Lecture recording or captions): captions (VTT, SRT) read free, audio or video (up to 25 MB) transcribed by the model (tested with a stand-in; not yet run on a real recording); matched to its lecture and aligned to the slides in order; In the lecture under each slide; slide notes written from then on read what was said; stressed concepts with Make these core |
Owner: /cramfast/?set=4f108547336643fbaf731eb53bf005e3&view=follow (owner) → Lecture 7. MIT's captions for lecture 7 (WebVTT, free; audio or video would be transcribed by the model): 101 parts, matched to the lecture by name and to 4 of its slides in order; “In the lecture (0:00)” under each slide in Follow along; the lecturer stressed Leaf, Node, Root, Binary tree… (Make these core); slide notes written from now on read what was said |
| H9 | "I've been studying this in Anki for weeks" | Review history seeds mastery, so Home, Progress and Cram start from where they are | Built: an Anki deck's review log becomes the owner's answers | Owner: /cramfast/?set=07ea6fc146544e18b88446aa6460ba3a&view=progress (owner). The deck's Anki reviews became 7 answered cards, counted in the report: “0 of 51 concepts secure · 14 started · 6 sessions. Secure means at least two answers, 80% ” |
| H10 | "Can I get it all back out?" | Export cards (Anki, CSV), questions (QTI, Moodle XML, CSV), the guide (Markdown, PDF) and the course map (CSV); an LMS cartridge for instructors | Built (Settings → Take it with you, exports.py): the guide (Markdown, and a printable page saved as PDF), the map (CSV), every question (Moodle XML, QTI, CSV), every card (CSV, TSV for Anki), and the course as a Common Cartridge for an LMS |
Owner: /cramfast/?set=07ea6fc146544e18b88446aa6460ba3a&view=settings (owner) → Take it with you. Settings → Take it with you: 186 questions as Moodle XML and 135 as QTI, 161 cards as CSV and TSV for Anki, the guide as Markdown (20387 words) and as a 262 KB PDF, the course as a Common Cartridge (14 module pages and their quizzes), the course map as CSV (76 concepts) |
| H11 | "Here's my messy folder" | Zip or cloud folder: typed, de-duplicated, versions and solutions paired, irrelevant files set aside; one screen to confirm | Built (folder.py, Update this guide → A whole folder (.zip), and on the start page): types from names, duplicates, older versions, files already in the course and non-material set aside, solutions paired; decks and banks imported; one screen to confirm. Cloud folders: download them as a zip |
[Open](https://appliedtheology.ai/cramfast/?set=cd99f8bad9d74085911456c2b70acfd3&view=learn (copy's owner) → Update this guide → A whole folder (.zip)). A zip sorted in one screen before anything is added: types from names (syllabus, exams, homework, notes, a formula sheet, decks), duplicates and older versions set aside, solutions paired with their quiz, photos and system files left out; the live demo's 12-file 6.006 folder added just its new formula sheet |
| H12 | "Are my cards even right?" | Imported cards and questions checked against the course material: disagreements, outdated notation and cards with no support flagged, each with the source page; the owner decides | Built (checks.py, Check what you brought in Test): imported cards and questions against the facts of their concepts (about a cent per 30): backed, disagrees, other notation, not covered, each with the pages; the owner removes or keeps |
Owner: /cramfast/?set=07ea6fc146544e18b88446aa6460ba3a&view=test (owner) → Check what you brought. The demo deck and question bank checked against the course (about 2 cents): “Checked 35: 28 backed by the course, 0 disagree, 0 other notation, 7 not covered”; each flagged item with what the course says and the page (“The course doesn't cover it · MIT6_006S20_lec1 · page 1, MIT6_006S20_lec4 · page”), to keep, edit or remove |
How it works. New file roles (Flashcards, Question bank, Answer key or solutions, Reference sheet, Recording, LMS export) beside today's. Each imported item is an authored item with its origin (file, row or page), its concept links, and a lock: the pipeline reads it as evidence but never rewrites it. Links are redone when the map changes. Imported questions grade by code like generated ones, and their answers never reach the browser before grading.
2.11 Building it with you: automatic or reviewed
Today a build runs end to end by itself. That suits a student the night before an exam, but not an instructor, or someone who brought material and wants to steer how it is used. Each build offers:
- Build it for me: as today. Every review below stays available afterwards.
- Build it with me: the build pauses at checkpoints. At each one you see what was made, change what you want, and continue. Do the rest automatically is always there.
Default: with me when the goal is Teach it or the upload includes cards, a question bank or an LMS export; for me otherwise.
Principles. Cheap decisions come before expensive writing: nothing is written until the structure is agreed, and the price of writing is shown at the checkpoint before it. Every checkpoint starts from a good default, so Continue without changes always works. The build remembers where it stopped; leaving and coming back resumes it. Reviewing large amounts has three speeds: everything, only what's flagged (parts Cramfast is unsure of: unreadable slides, diagrams it could not read, statements with weak support, questions whose answer it could not verify), and a sample (check a few; if they're fine, approve the rest).
The checkpoints:
| Step | You see | You can | Cost to continue |
|---|---|---|---|
| 1. Purpose | The goal (2.1) and who it is for (G1) | Pick goals, level, prerequisites, use | Free |
| 2. Material | Every file with its detected type, pages, duplicates, pairs (solutions ↔ problems), what will be set aside (cover pages, admin pages) | Retype, unpair, drop, skip pages or slides | Reading the files (most of the course map's cost) |
| 3. Goals and objectives | Course goals drafted from the syllabus, or from the material when there is none | Edit, reorder, add, remove | About a cent |
| 4. Course map | Concepts by tier and share, the hierarchy, what imported items cover | Shape's Concepts (G2), plus merge two concepts that are the same and split one that is two | Free |
| 5. Outline and presentation | Modules in order; lectures for Follow along; how it will be written; the price of writing it all | Shape's Outline and Presentation (G2, G3); write all now, or module by module as approved | The writing (shown here, before it starts) |
| 6. Review the writing | Parts as they finish: each module section, each lecture overview and slide note, flagged ones first | Approve, Steer this passage (priced edit), edit the text directly, lock | Only steered changes |
| 7. Questions | Imported questions, then generated ones; how the bank spreads over concepts, formats and difficulty against the exam's shares | Approve, edit, remove, write their own, more like this, fill this gap | Only new questions |
| 8. Try it as a student | The student view; a practice exam taken by the author | Note anything else to fix | Free |
| 9. Publish | What students will see | Publish to the share link, a class or the library (2.12) | Free |
The slide review is one screen: the slide on the left, its notes on the right, with keys on desktop (A approve, S steer, E edit, → next) and swipes on a phone, and a counter ("14 of 40 slides reviewed · 3 flagged left").
Journeys:
| # | They say | What happens | Status | Demo (live check, 2026-10-19) |
|---|---|---|---|---|
| I1 | "Just build it" | As today: one run, no stops | Built | Open. Built by itself, no stops (as B1: One uploaded lecture built by itself into Learn (2 modules) and Follow along; Home opens on “What do you want from this course?”) |
| I2 | "Let me check the plan before you write anything" | Pauses after the map and after the outline; the price of writing shown before it starts | Built (jobs.py checkpoints, Checkpoint.tsx, Build it with me on the start page): writing uses the map as the owner shaped it |
Owner: /cramfast/?set=584e68cfb20849259dbd5af8ada9b65b&view=home (owner). Built with review: stops at the course map (only Shape, the map and settings open), then at an outline of 3 modules, 3 unwritten; writing it all is priced first ($0.06) |
| I3 | "Go through it slide by slide with me" | The review queue: approve, steer, edit or lock each slide note and module section | Built: Review lists every module, lecture overview and slide note; approve, edit in place (locked so updates keep it), lock | Owner: /cramfast/?set=2548f33a0a3c46ea9d11c871812793a7&view=shape (owner) → Review → Everything. The review queue lists all 50 parts (50 shown): a slide's headline edited in place (now 2 changed by you, each locked so updates keep it); approve and lock on every part |
| I4 | "Only show me what you're unsure about" | Flagged parts first, with why each is flagged; the rest approved | Built: Only what's flagged, with why each is flagged, then Approve the other … | Owner: /cramfast/?set=2548f33a0a3c46ea9d11c871812793a7&view=shape (owner) → Review → Only what's flagged. Only what's flagged: 44 parts shown with why (“1 sections cite nothing”); Approve the other 6 parts → 39 approved |
| I5 | "Check a few; if they're fine, do the rest" | A sample from each lecture and module; approving the sample approves the rest | Built: A sample, then the rest: one part from each module and lecture | Owner: /cramfast/?set=2548f33a0a3c46ea9d11c871812793a7&view=shape (owner) → Review → A sample. A sample of 18 parts (one from each module and lecture), three checked by hand, then Approve the other 32 → 35 approved |
| I6 | "I'll finish this tomorrow" | The build stops at its checkpoint; the author's home shows where it is and what is left | Built: the checkpoint panel on the owner's screens | Owner: /cramfast/?set=1e2b3bef40bf4900878894ccad84d403&view=home (owner). Coming back later, the course opens where the build waits: “BUILT WITH YOU · STEP 4 OF 9: THE COURSE MAP”, with Continue and Do the rest automatically |
| I7 | "Lecture 8 is up" | The new parts get the same checkpoints in small: its concepts, where it goes in the outline, its slide notes | Built (Checkpoint.UpdateCheckpoint): on a course built with review, new material shows its new concepts, its new modules and where the rest go, and the price, before writing; after, Review → New in this edition |
Owner: /cramfast/?set=4f108547336643fbaf731eb53bf005e3&view=shape (owner) → Review → New in this edition. Lecture 7 added to a course built with review: the owner was shown its 9 new concepts, its 2 new modules and where the rest go, and the price ($0.05) before writing; applied, its 9 new parts are under Review → New in this edition |
| I8 | "Does what I teach match my objectives?" | A table of objectives × modules × questions: objectives with nothing taught or tested, questions that serve no objective | Built (Shape → Outline → Learning objectives): each objective with the modules that teach it and its questions; gaps highlighted; questions serving no objective counted | Owner: /cramfast/?set=07ea6fc146544e18b88446aa6460ba3a&view=shape (owner) → Outline → Learning objectives. “Learning objectives: 7, 1 not fully covered”: each objective with the modules that teach it and its questions; the gap shown (“7. Keep an AVL search tree balanced under insertions and del…: nothing teaches it”); “83 questions of 155 serve no objective” |
How it works. The build already runs in stages (extraction, course map, plan, writing); a checkpoint is a stage that waits for Continue instead of starting the next. Approval states (not reviewed · approved · changed · locked) are kept per part on the edition, and a locked or edited part is carried over unchanged by later updates (the G4 rule). Flags come from checks the pipeline already runs (unsupported statements, unreadable pages, failed answer checks).
2.12 Making, forking and publishing guides
A guide is data (a course map, modules, slide notes, questions, editions and the author's steering), so copying one costs nothing and adapting it costs only what is rewritten. People should be able to take a good guide, make it theirs, and give back. Everyone owns what they make (2.8: no shared editing; someone who wants to change a guide forks it).
Principles.
- Forking is free and instant. It copies content, not people: no members, answers or sessions.
- Lineage is visible. A fork says what it came from and at which edition; an original shows how many forks it has. Credit follows the chain.
- Your changes win. When the original changes, a fork can take the changes or not; its own edits and locks are never overwritten.
- Private by default. Four levels: Private (only the owner), Link (anyone with the share link, as today), Class (joined members only), Published (listed in the library).
- Published means rights. A guide is listed only if what it is built from may be shared: open material (open courseware, open textbooks, arXiv), the author's own notes and items, and general knowledge. Guides built from third-party slides or textbooks can still be shared by link for study, as today. The source audit already records where every statement comes from, so this is checked per guide, not trusted.
- Ranked by learning, not likes. The library orders guides by how much studiers improve (their readiness gains and completion), then freshness and forks.
Journeys:
| # | They say | What happens | Status | Demo (live check, 2026-10-19) |
|---|---|---|---|---|
| J1 | "Make it mine" | Make a copy on any share link or library page: the guide, its map, questions and steering, in their own library; they own it with all of Shape this guide; their progress carries over if they were studying it | Built (fork.py, Make a copy of my own on share links): the published guide, its cards and questions, files copied into the new owner's space; a member's answers come too; credited. For anyone with Cramfast access (invite-only for now: opening it is a 2.13 decision) |
Open. Make a copy of my own on any share link: copied in about half a minute, free, credited to the original; a second owner's copy has the whole guide (edition 14, 18 modules), its 44 cards, 17 bank questions and quiz 1, slide images copied into their space |
| J2 | "Keep up with the original" | 3 changes upstream: the original's new editions as a proposal on the fork's Update tab; take all, some or none; the fork's edits and locks win | Built (upstream.py, the copy's Settings → Copies): the original's later changes, part by part; take all, some or none; the copy's locked and edited parts keep its own; a rebuild of the original on new material needs a fresh copy |
[Open](https://appliedtheology.ai/cramfast/?set=cd99f8bad9d74085911456c2b70acfd3&view=settings (copy's owner) → Copies). The copy's Settings: “Up to date with the original (edition 7).” (the original's later change was taken; parts the copy locked or edited keep its own) |
| J3 | "I just want the hash tables module" | Fork a module or a lecture into an existing guide; its concepts join that guide's map | Built (Shape → Outline → Bring in modules from another guide): a module by share link or library id, text as written, concepts matched by name; overlapping ones proposed as priced merges | [Open](https://appliedtheology.ai/cramfast/?set=cd99f8bad9d74085911456c2b70acfd3&view=shape (copy's owner) → Outline → Bring in modules from another guide). One module, “Direct Access Arrays and Hash Tables”, brought in from “Algorithms, Full” by its share link: its text as written, its concepts matched to this course's by name; it overlaps one already there, so a merge is proposed in the update, priced (“Merge “Direct Access Arrays and Hash Tables” into “Hash Tables and Collision Resolution””) |
| J4 | "Combine my notes with that guide" | Merge two guides: concepts matched, modules combined, a priced update for what changes | Built: Choose all in the same place merges two guides: their modules, and their concepts this course lacks join its map at their tiers | Open. Two guides merged: lecture 6's 3 binary-tree modules joined the copy of lectures 1-5 (18 modules now); their concepts joined its map (Binary tree, Node, Root, Leaf…) at their tiers; modules covering mostly the same concepts as one already there are proposed as priced merges |
| J5 | "Same course, for high schoolers" / "in Spanish" | Fork, then one Presentation change; only the writing is redone, priced | Built: a copy, then Presentation for the whole guide; priced, applied on Apply | [Open](https://appliedtheology.ai/cramfast/?set=cd99f8bad9d74085911456c2b70acfd3&view=shape (copy's owner) → Presentation). The copy re-pitched for high schoolers (“Write for students new to the subject, who already know: high-school algebra; no…”): rewriting 14 modules and 26 slide notes priced at $0.97, run only on Apply |
| J6 | "Publish my guide" | Title, description, course, school, textbook, subject, level, a licence (CC BY, CC BY-SA, CC BY-NC, all rights reserved); the rights check; listed once it passes | Built (library.py, Settings → Publish to the library): title, course, school, subject, level, licence; listed only when every taught file is found openly, written by Cramfast, or declared the author's own or openly licensed |
Owner: /cramfast/?set=07ea6fc146544e18b88446aa6460ba3a&view=settings (owner) → Publish to the library. Published with a licence (CC BY-NC-SA) after the rights check: 5 uploaded lectures declared openly licensed (MIT OCW); files found openly or written by Cramfast pass by themselves |
| J7 | "Is there already a guide for 6.006?" | The library: search by course, school, textbook or topic; each guide's page shows what it covers, its author, editions, forks and how studiers did; Study it or Make a copy | Built (/cramfast/library/, public): search by course, school, textbook, subject or concept; ranked by studiers' share of the exam secure, then copies and freshness; Study it, Make a copy of my own |
Open. The library (signed out): 2 guides; “hash tables” finds “Introduction to Algorithms (MIT 6.006): lectures 1” (5 people studying, 0% of the predicted exam secure on average · copied 2 times · 14 modules, 5 lectures); Study it opens its share link |
| J8 | "This explanation is wrong" | A studier's Suggest a fix on any passage goes to the author's queue; accepted ones join the next edition; contributors are credited | Built: on a share link, select a passage → Suggest a fix; the author's queue in Shape → Review; taken, it is a request on the next update, and the edition credits its author (shown in What's new) | Open. A studier selects a passage → Suggest a fix (It's wrong, Unclear, Typo, A step is missing, or their words) → the author's queue; taken, it became an update ($0.045) credited to its author: “With suggestions from Sam (a studier)”, shown to students in What's new |
| J9 | "Who's using my guide?" | Studiers, forks and suggestions; where studiers struggle (aggregate only) | Built: Your guide's reach on People: studiers, this week, sessions, answers, copies, listing, suggestions | Owner: /cramfast/?set=07ea6fc146544e18b88446aa6460ba3a&view=people (owner) → Your guide's reach. Your guide's reach on People: “5 people studying together (5 this week) · 9 sessions · 33 answers · copied 2 times · in the library” |
| J10 | "Same course next term" | An instructor forks their own guide: steering, locks and questions kept; this term's lectures swapped in | Built: Settings → Copies → Copy this course | Owner: /cramfast/?set=07ea6fc146544e18b88446aa6460ba3a&view=settings (owner) → Copy this course. Copy this course → “Algorithms, Spring 2027”: Copied from Algorithms (incremental test), edition 6, on 10/19/2026.; 0 students; this term's lectures go in as an update |
| J11 | "Collections" | Curated lists of guides ("6.006 complete", "Step 1 immunology"), made by anyone, published like guides | Built: Add to a collection in the library; collections are public pages | Open. A collection, “MIT intro courses, exam first”, with its 2 guides, public to anyone; made from the library with Add to a collection |
| J12 | "Report this guide" | Report (wrong, spam, copyright); an admin can hide a guide or a fork; a copyright claim takes it down pending review | Built: Report on every guide; a copyright report hides it until an administrator looks; administrators see reports in the library and hide or restore | Open. Reported from the library (“An administrator will look”); the administrator's list shows it, with Hide it / Restore it; a copyright report hides the guide at once (tested) |
What it needs. Accounts (D5) come first: an anonymous owner loses everything with their browser,
and credit, following and publishing need a person. Creation is admin-only today because a build
spends money (about $0.45 on Lightweight, about $20 on Full); forks cost nothing, so they are the way
to open up, with a per-person allowance for new builds and rewrites. Library studiers' on-demand help
(B4-B6) comes from their own allowance, not the author's. Data: a set's lineage (the original set and
edition), visibility, licence; a public library index; a suggestions collection per set; upstream
changes found by comparing the original's editions since the fork's base.
2.13 Build order for 2.10-2.12 (all built 19 October 2026, in this order)
Each step is usable on its own:
- Checkpoints before writing (I2, I6): the build pauses after the map and after the outline, with the price of writing shown. Makes every build steerable before money is spent; reuses Shape.
- Flashcards in and out (H1, H9, H10 for cards): Anki, Quizlet, CSV; coverage on the map; Fill the gaps.
- Question banks in and out (H2, H3, H10 for questions), with answer keys and Check these.
- The review queue (I3-I5, and G4): approval, direct edits, locks; flagged-first and sample.
- Accounts (D5): the prerequisite for everything after.
- Forks and visibility (J1, J5, J10).
- Publishing and the library (J6, J7, J11, J12), with the rights check and moderation.
- Giving back (J8, J9): suggestions and author stats.
- Following and remixing (J2-J4): upstream changes, partial forks, merges.
- Bigger imports (H4-H8, H11, H12, I8): own notes kept, reference sheets, objectives, LMS cartridges, recordings, folders, checking imported items.
Decisions taken while building (19 October 2026), each open to change.
- What may be published: a guide is listed only when every file it teaches was found openly, was written by Cramfast from general knowledge, or is declared by the author as their own or openly licensed (naming the licence); a copyright report hides it until an administrator looks.
- Who pays: creating a course is still for people with Cramfast access (the app is admin-gated); copies, the library and studying are free and public. Opening creation with a monthly allowance per account is the next decision, with accounts (sign-in) beyond one-time device links.
- A copy that takes its original's changes takes them part by part; parts the copy locked or edited keep its own; a presentation the copy set applies the next time those parts are rewritten.
- Imported items with errors are flagged with the course's facts and pages; the owner removes, hides or keeps them; nothing is corrected automatically.
3. What a student brings, and what they do
Every journey below has a live example in DEMOS.md, with a link.
3.1 What they start with
| They have | What happens | Built |
|---|---|---|
| Nothing (just trying it, or no files yet) | No files yet? Start from the course's name: name, and optionally school, instructor, textbook and what the exam covers. Cramfast searches the web for openly published material (the course's own pages, open courseware, open textbooks), follows course pages to the files they link to (lecture notes, problem sets, past exams; see start.py), and outlines the course's topics. The student reviews what was found (each source with a checkbox and a link) and the topics (each marked From the material or General knowledge), then Build my guide. The name can also be a subject or a body of work: for research papers ("recent papers by Ada Lovelace", a topic's literature) the search also writes an arXiv query, and every matching paper (newest 12) is listed as an open PDF, so topics are taught from the papers. Chosen files are added as if uploaded; topics nothing chosen covers get notes written from general knowledge, labelled so everywhere. About 5 cents to search. |
Yes |
| One file | Upload it; the build runs by itself (extraction, study bundle, course map, lessons, Follow along and Learn). | Yes |
| One kind of file, on a budget | Lightweight build (Gemini 3.1 Flash-Lite): under $0.50 for a typical course; best for text-heavy notes. | Yes |
| Many kinds (dense) | Each file says what it is: Slides or lecture notes, Textbook or reading, Research paper or article (Follow along goes page by page), My own notes (all taught), Homework or problem set (which skills the course practises; half the weight of a past exam in the prediction), Past or practice exam (the strongest evidence of what the exam tests; never study content), Syllabus or schedule (order, weights, scope), My marked homework or test (read for the Progress report). The course map asks for what would help most and is missing: a past exam, the exam details, the syllabus, homework, missing lectures, and the textbook when the lectures cite one. | Yes |
3.2 A course over time
- New. As 2.1; each stage's progress shows on the Overview, then Today. The first build is published as edition 1.
- More files later. Added from the sidebar or the Update this guide panel, typed as above. A new lecture is mapped, placed into Learn and given notes; a past exam, homework or syllabus re-ranks what is core without rewriting anything. Only what new material touches is rewritten.
- Feedback in words. See below. Both together are one proposal.
Update this guide: change a finished guide in words, with more files, or both. The panel sits above Learn and Follow along; its bar shows the edition and, once one is ready, Update ready to review.
- Ask in words. Write what should change and choose what it applies to (the whole guide, a lecture, a slide, a module). Suggest a change on each module, lecture overview and slide opens the panel aimed there. Propose changes reads the request in a few seconds (about a cent).
- Add files. Choose what they are (Lectures or notes, Past exam, Syllabus) and pick them. The panel says the course map is being updated and the proposal appears there in 3 to 10 minutes; the owner can leave and come back. The published guide stays up the whole time: the owner and students keep studying the current edition. A past exam or syllabus re-ranks what is core without rewriting the guide.
- Review the proposal. It lists what new material adds (lectures, concepts, new modules, and any lecture that could not be read into the course map), each edit with a checkbox and a one-line summary, what was declined and why (requests about the app rather than the guide are declined), and the price: how many modules, overviews and slide notes will be written, and about how much. Unticking an edit reprices it. Nothing has changed yet.
- Apply or discard. Apply update writes only the parts the edits and the new material touch, usually in one to two minutes; everything else is carried over unchanged. Discard drops the proposal. If writing stops, the panel says so and Apply again resumes it, with finished parts kept.
- After. Owner and students see the new edition: a What's new note (new modules, modules updated, new lectures; dismissible) and Updated marks on each changed module, overview and slide. Questions kept word for word keep their answers, and answers to replaced questions still count. Earlier editions lists every edition and restores one in a click (restoring publishes it again; nothing is deleted).
Requests are standing: a later rewrite of the same part (for example after more material) still follows them.
3.3 Ways to study
| Use | Where | What it does | Built |
|---|---|---|---|
| Follow along | Follow along | Each lecture as given: an overview, then every slide beside its notes; Test yourself on the lecture after. | Yes |
| Learn | Learn | The course re-taught as modules at a chosen depth (Core · Core + supporting · Everything); Test yourself on the module after. | Yes |
| Listen | Listen on a module or lecture | Reads it aloud in the browser's voice, part by part (a module's intro, sections, mistakes to avoid, summary; a lecture's overview, then slide by slide, turning the slides as it goes), from spoken scripts written for the ear (maths said in words). Play, pause, previous and next part, speed. At the end it offers Test yourself. It never reads questions inside Learn. | Yes |
| Quiz and test | Test | One question bank (every Learn and Follow along question, all seven formats). Scope: everything, my mistakes, my weakest concepts, questions not yet tried, a module, a lecture, chosen concepts. Quiz shows each answer at once; Practice exam is timed, weighted like the exam, and shows results only when handed in, with a per-concept breakdown. | Yes |
| Cram | Cram | 15 min to 2 h: as much of the exam as fits, the concepts that count most and that the student knows least first. Each concept: its module section (Got it, test me), then a question or two; a miss comes back once more before the end; a final mixed round. A countdown throughout; the summary says what was covered (and what share of the exam) and what is still shaky (Cram the shaky ones). | Yes |
| Spaced sessions | Home → Daily practice | Due reviews, new concepts in lesson cards, quizzes, a recap (4.1). | Yes |
| Study with others | Together (share link), People (owner) | Anyone with the share link can join by name (no account; the membership lives in that browser). A member's answers and sessions are kept with the course; they choose whether the group sees their progress. Members see the group's headline progress and what the group finds hardest. The owner sees everyone: exam share secure, answers right, weakest concepts, last active, and any one person's full report. | Yes |
| Test others | Test → Send as a test | The owner picks a scope and size; the link opens the test on the share link; takers join by name, take it timed with results at the end; the owner sees each taker's score and what the group found hardest. | Yes |
| Mastery report | Progress | Exam readiness (share of the predicted exam secure), by lecture, by module, concepts weakest first, every session. Secure: at least two answers, 80% right, the latest right. | Yes |
| Against real marks | Progress → Add marked work | A marked homework, quiz or exam is read question by question (what it tests, marks, the marker's comment) and compared concept by concept with the report: agreements, and where the app over- or under-rated the student. | Yes |
| Look things up | Course map, concept pages, Study guide | The whole course by tier; a lesson as a page; the per-lecture study bundle. | Yes |
3.4 A course, its exams, and sessions that build on each other
A course is the long-lived thing: its files, its course map, the guide's editions, and each student's answers. Within it:
- Exams. The owner names the course's exams (Midterm: lectures 1-4, 2 November; Final: everything) and marks the one being studied for; anyone on the share link picks their own. The active exam scopes Test, Cram and Progress to its lectures, and its date is the countdown.
- Sessions. Every finished quiz, practice exam, cram, test and Today session is kept (kind, scope, score, minutes, per-concept results).
- Building on the last one. Today, Test and Cram open with Last time: when, what, the score, and the concepts still shaky, with Cram these and Test me on them. Progress lists every session. Spaced review schedules the rest.
3.5 Who uses it
- Owner: everything above, plus updates, sharing, exams, People and Review.
- Visitor (
/cramfast/s/<token>, no account): every way to study in 2.3 except updates; their answers and sessions stay in their browser. The owner's answers are never shown. - Member: a visitor who joined by name under Together; their answers and sessions are stored with the course and visible to the owner (and to the group if they choose).
- Reviewer (
/cramfast/compare/?a=<token>&b=<token>): two share links side by side (section 8).
4. Screens
Each view has a URL: ?view=<slug>, plus &set=<id> for the owner and &concept=<id> on the map.
Courses built before v4 (no lessons) keep the earlier screens: the map is their home, and concept
pages show study pages (UI 2) or the original claim list (UI 1).
| Screen | Slug | What it shows | Data |
|---|---|---|---|
| Study | learn, follow |
One screen, two orders: By topic (Learn) and Lecture by lecture (Follow along). Navigation: Home · Study · Test · Course map · Progress, then More (Cram, Together or People, Study guide, Practice, Review, Settings, Sources); the phone bar is Home · Study · Test · Map · More | |
| Learn | learn |
Depth picker (Core · Core + supporting · Everything, with concept counts), the modules in order with goal, minutes at that depth and questions done. A module: title, goal, Learn / Test yourself tabs. Learn: intro, contents, sections (heading, concept chips, explanation, worked example revealed step by step, "On the slides" thumbnails that open full size), mistakes to avoid, summary, Test yourself on this module →. Test yourself: section checks and practice questions, then flashcards | GET /plan → modules |
| Follow along | follow |
Lecture picker and Learn / Test yourself tabs. Learn: steps Overview · 1 · 2 …; the overview (story, before you start, key ideas, terms and notation, where it leads), then each slide beside its notes (headline, concept chips, one section per idea, Reading the figure, Explain this more). On wide screens the slide stays beside the notes; on a phone it sits above them, capped in height, with Open full size. Test yourself: the lecture's questions grouped by slide (Review this slide), then flashcards | GET /plan → lectures |
| Home | home (today still opens it) |
First visit: What do you want from this course? (goals and follow-ups, 2.1). Then the goal line (Change goals), Last time, the leading goal's plan (exam: readiness, pace, today's tasks, The days until…; learn: this week's time and modules; keep up: newest lecture, catch-ups; teach: the author's checklist with Preview it as a student), the other goals in a line each, Daily practice (the spaced session: Next up, length chips, Start), Ask about this course, Something else today | goals (set or browser), GET /plan, sessions, StudyView |
| Session player | (overlay) | One card at a time, see 3.1 | StudyView.plan, .lessons, .reviews |
| Course map | map |
Exam headline ("79 core concepts → 75% of the exam"), basis, level picker, evidence requests, lens switch (As taught · By topic · By objective), concept rows with tier dot, share and progress mark | CourseMapView |
| Concept page | map&concept= |
Lesson as a page (4.2), or the facts when the concept has no lesson; "covered in the lesson on X" for folded concepts | ConceptView |
| Topic page | map&concept= |
Intro, Start with X, the topic's concepts with summaries and progress, Practise the whole topic | ConceptView.topic, .child_summaries |
| Test | test (&test=<id> opens a sent test) |
Exam picker and Last time; scope, Quiz or Practice exam, 5 · 10 · 20 · 30 questions; one question at a time with a sticky bar (question n of N, timer, Hand in); results: score and concepts weakest first, then every question with its answer. Owner: Send as a test to others → | GET /plan (bank), POST /attempts, POST /sessions, POST /tests |
| Cram | cram |
Exam picker, Last time; 15 min · 30 min · 1 h · 2 h; preview (n concepts, share of the exam, their chips); the run: learn card (Got it, test me) and question cards with a countdown and a progress line; summary with Cram the shaky ones | GET /plan, POST /sessions |
| Progress | progress |
Exam picker; readiness (share of the predicted exam secure), by lecture and by module (secure and started bars), concepts weakest first, sessions; owner: marked homework and tests compared concept by concept (Add marked work). The spaced review schedule (StudyView.progress) folds below |
GET /plan, /sessions, /graded |
| People | people (owner) |
The share link to invite with; people (exam secure, answers right, weakest, last active; a name opens their report); tests sent, each with its link, results and what the group found hardest | GET /people, /people/<id> |
| Together | together (share link) |
Join this course (name, show my progress to the group) or, once joined: the group's headline progress and what it finds hardest; Leave on this device | POST /join, GET /me, /group |
| Start review | overview of a course started by name |
Searching… → what was found (sources with checkboxes, links and kinds; topics with From the material or General knowledge) → Build my guide → fetching → the usual build progress | set start |
| Practice | practice |
The study bundle's verified questions and flashcards by scope (courses built before the guide; Test replaces it) | snapshot items |
| Study guide | guide |
The per-lecture study bundle (lessons with citations) | bundle |
| Review | review |
Every stored flag, comment, override and badge, newest first (owner) | GET /feedback |
| Settings | settings |
Account settings (section 7) (owner only; visitors get the defaults) | GET/PUT /api/settings |
| Sources & audit | sources |
Originals, extraction per page, every intermediate record (owner) | audit |
4.1 The session
A session is a list of steps planned on the server (plan_session in study_views.py):
- Warm-up: items whose review is due, most overdue first, at most 25% of the time.
- New concepts on the chosen level, in path order (tier, then the course's own order), skipping anything already started: an intro card, one lesson card per block, a check.
- Quiz after every
new_per_blockconcepts (default 3): up to two questions per concept, interleaved so no two in a row share a concept. - Recap, always last.
Time estimates: intro 20 s, lesson card 40 s, check or quiz question 30 s, review 15 s, recap 20 s. The player adds two steps of its own: a wrong check inserts a Watch out card (the lesson's traps) and appends the same check once more before the recap.
| Card | Body | Action |
|---|---|---|
| Intro | Name, tier marker, predicted share, why it matters, "After this you can…" | Start |
| Lesson | One block (section 5.4) in card density: self-test points, step-by-step reveals | Continue |
| Check / Quiz | Stem, four full-width options (or a text box for free response) | Choose → Check → a band with icon and words, each option's reason, citations → Continue |
| Review | A due flashcard (front → Show answer → Again · Hard · Good) or question | Rating or Check |
| Watch out | The lesson's traps (wrong → right) | Continue |
| Recap | Concepts covered with how each check went, answers correct, reviews scheduled | Done |
Every card shares one frame: ✕, ←, progress bar and count on top; concept name · tier · card label; body; citation chips; one primary action pinned at the bottom. Keyboard: Enter/Space continue, 1-4 or A-D choose, F flip, ← back, Esc close, ? shortcuts. Phone: full screen, the action bar sticky at the bottom. Desktop (≥ 1180 px): the card centred at 680 px with the slide behind the current card's facts beside it. The step index is kept in session storage so a reload resumes.
4.2 The concept page (lesson as a page)
Top to bottom: breadcrumbs and position on the path; name, tier, share; the lesson head (summary
and the "On the exam" box with stated objectives, in the order the lesson style setting chooses;
why it matters; "After this you can"); Study as cards (a session for this concept) and Practise
(its check, questions and flashcards); each block in page density with a Flag control; the
slide viewer opened on best_page; memory aid; Watch out; concepts folded into this lesson;
Connects to; drill down; and Everything the course says, the fact ledger grouped by role
(Definition, Parts, Kinds, Steps, Features, What it causes, What causes it, Examples, Exceptions,
Contrasts, …), each fact with its slide citation and a Flag control.
4.3 Layout
| Width | Layout |
|---|---|
| ≥ 1180 px | Sidebar navigation · page (up to 1260 px) · outline rail on concept pages; sessions show the slide panel |
| 800-1180 px | Sidebar · page; the outline opens as a drawer |
| < 800 px | One column; bottom tab bar (Today · Map · Practice · Progress); outline and slides as sheets; tables become stacked rows |
5. Data model and how each type is drawn
Python models are the source of truth (Pydantic, extra="forbid"). Screen views are exported to
TypeScript (web/src/generated/views.ts); fields with defaults are required in the exported types,
because the server always sends them. A test fails when the TypeScript is stale.
Source (file) ─ Unit (page) ─ Block (text | figure | table | equation | transcript)
▲ cited by
Fact (Claim) ── roles per concept ──▶ Concept ── taxonomy parent, syllabus position, objectives
▲ │
│ cited by ├─ derived relations (from roles)
Lesson blocks, traps, options ◀── Lesson + PracticeSet (per concept) [lessons.py]
│
Attempt ─▶ review state ─▶ ConceptProgress ─▶ TodayView, SessionPlan [study_views.py]
5.1 Sources
| Type | Fields | Drawn as |
|---|---|---|
Source |
id, name, kind, role (course, past_exam, syllabus), total_units | Sources list; original download |
Unit |
<source id>-<page index>, page image assets |
Slide viewer; figure blocks; the desktop session panel |
Block |
kind, content, location, interpretation, unit_id | Page chip ("L3 · p. 12") that opens the passage or moves the slide viewer |
5.2 The concept graph (graph_contracts.py, concept-graph-v4)
| Type | Key fields | Meaning |
|---|---|---|
Claim (a fact) |
id, title, text, kind, about[], primary, block_ids[], source_id, provenance (course | background), roles[] {concept, role, of} | One citable learning, and what it tells us about each concept it mentions |
Concept |
id, name, aliases, kind, parents[{id, is_a | part_of, primary}], claim_ids, tier, score, predicted_share, signals, cooccurs, synthesized | A node; synthesized marks a grouping topic the course does not name |
Relation |
source, target, type, claim_ids, basis (stated | inferred) | A typed edge, derived from a role that names another concept |
SyllabusLecture |
source_id, title, concept_ids | The course's own order: each lecture (files in natural order) and the concepts it first teaches |
ExamProfile |
course_title, level, format, depth, objectives[{text, block_ids, concept_ids}], can_do, cues | What success on this exam looks like |
TierTable, ExamQuestion, Signals |
as before | The 20/80 summary; past questions mapped to concepts; why a concept scored as it did |
Concept kinds: topic, entity, process, principle, method, quantity, event, person, work,
condition, other (CONCEPT_KINDS).
Fact roles (FACT_ROLES) and the relation each yields when it names another concept (of):
| Role | The fact says the concept… | Relation |
|---|---|---|
| defines | is … | — |
| kind_of, part_of, step | is a kind of, component of, or stage in of |
(taxonomy) |
| property | has a feature or value | — |
| cause / effect | brings about of / results from of |
causes (effect reversed) |
| prevents | blocks or stops of |
prevents |
| example | is an instance or case (of of) |
example_of |
| exception | does not hold when … | — |
| contrast | differs from of |
contrasts_with |
| measure | is quantified by of |
measured_by |
| uses | is used for of |
used_for |
| location | is found in of |
located_in |
| time | comes before of |
precedes |
| flows | moves, drains or passes to of |
flows_to |
| interacts | binds or communicates with of |
interacts_with |
| requires | depends on of |
requires |
Invariants (validate_graph): every claim cites blocks; roles name concepts the claim is about;
every concept is placed once and the hierarchy is acyclic; syllabus and objectives name known
concepts; objective concepts are never detail; shares sum to 1.
Graphs from earlier versions are read through upgrade_graph (v2's medical vocabulary is mapped to
the general one; v3 differs only by fields with defaults); stored records are not rewritten.
5.3 Views
| View | Fields | Drawn by |
|---|---|---|
CourseMapView |
profile, exam, requests, tiers, depths, roots (MapNode tree), syllabus, by_objective, lessons (concepts with a lesson), folded (concept → host lesson) |
CourseMap.tsx: headline, level picker, requests, lens switch and its rows |
MapNode |
id, name, kind, tier, synthesized, predicted_share, concepts_by_tier, item_ids (bundle and lesson practice), children | Tree rows, outline, progress marks |
ConceptView |
concept, breadcrumbs, parents, children, claims (ClaimView with role), relations, objectives, practice_item_ids, lesson (LessonView), lesson_in, topic, child_summaries |
Concept page (4.2) |
LessonView |
concept_id, name, tier, predicted_share, lesson, check, questions, flashcards (answers withheld), evidence (fact → blocks, for chips) | Concept page and session cards |
StudyView |
today (TodayView), plan (SessionPlan), progress (ConceptProgress[]), lessons used by the plan, review items |
Today, session player, Progress |
5.4 Lessons (lessons.py, concept-lesson-v2)
One record per concept on the level-1 path with at least 4 facts. A smaller concept folds into the nearest ancestor on the path that has a lesson and is covered there as a points entry.
Lesson: summary (≤ 40 words), why_it_matters (≤ 25), can_do (1-3 × ≤ 15), exam_angle (≤ 30),
blocks (2-6), traps (0-3 {wrong ≤ 15, right ≤ 20}), memory_aid (≤ 20), connections (0-4 {concept,
how ≤ 8}), best_page, folded.
| Block | Use it for | Fields | Card / page |
|---|---|---|---|
explain |
an idea in prose, or an example | body ≤ 60, example, shows | Paragraph; "Example" tag |
define |
a term to know exactly | term, definition ≤ 30, not_to_confuse | Term large, definition, "not to be confused with" |
rule |
something that holds under conditions | statement, conditions, exceptions | Boxed statement, ✓ conditions, ⚠ exceptions |
points |
testable facts | 2-5 × {cue ≤ 8, answer ≤ 15} | Card: tap a cue to reveal; page: all shown |
steps |
a process or procedure | 3-8 × {label, detail ≤ 18, then} | Numbered flow with ↓; horizontal on wide pages |
compare |
2-4 things to tell apart | columns, rows {aspect, cells} | Table; a card per column on phones |
tree |
kinds or parts | root, nodes {label, parent, note} | Nested list |
timeline |
events in order | events {when, label, detail} | Dates in a gutter |
formula |
an equation | math (TeX), symbols, note | KaTeX with a symbol legend |
worked |
a problem solved step by step | prompt, steps, answer | Card: one step per tap |
argument |
a claim, reasons and the case against | claim, reasons, counter | Claim, "Because", "But consider" |
code |
an algorithm or syntax | language, snippet ≤ 12 lines, note | Numbered monospace |
figure |
a slide that teaches better than words | page, caption | The slide image |
PracticeSet: check (one choice question), questions (2-5; choice with four options each
carrying a reason, or free with a model answer and a 2-5 point rubric when the exam format calls
for it), flashcards (2-6 {front ≤ 20, back ≤ 25}). Item ids are <concept id>:check, :qN, :fN.
Rules enforced in code (normalize): citations must name the concept's own (or folded) facts (an
unknown id is dropped; a part with no course citation is kept as labelled general knowledge); parts
over their word limit by more than 25% are dropped; blocks
must be complete for their type; options are shuffled (seeded by item id); claims about what exams emphasise are removed; filler step transitions
("then", "next") are cleared; connections name concepts on the map; a lesson needs at least two
valid blocks and a check, or it is repaired once and otherwise skipped.
5.5 Study state (study_views.py)
| Type | Fields | Meaning |
|---|---|---|
Attempt |
item_id, answer, correct or rating (again, hard, good), timestamp | One answer; owners' are stored per set, visitors' in their browser |
| review state (per item) | stability (days), due, retrievability, last_correct | Simplified FSRS: R(t) = (1 + t / 9S)^-1, due when R falls to 0.9; good × 2.5, hard × 1.3, again × 0.3. Or a fixed ladder 1, 3, 7, 14, 30 days |
ConceptProgress |
state (secure, started, new, none), items, secure_items, retrievability, next_due, has_lesson, lesson_in | Secure = every item last answered right and recall ≥ 90% now |
TodayView |
exam_date, days_until, level, level_concepts, level_share, secured_share (Σ share × recall), secure_concepts, due_reviews, next_concepts, weakest | Today |
SessionPlan |
id, minutes, steps[{kind, concept_id, item_id, block}], concepts, reviews | The session player |
ConceptMark |
concept id, understood | "I understand this" for concepts with nothing to practise |
Grading: POST /api/sets/<id>/attempts (owner, stored) or POST /api/shared/<token>/attempts
(visitor, not stored) returns correct and a reveal (the right option, each option's reason, the
explanation and citations; or the model answer and rubric). Asking to see a free-response model
answer is not recorded as an answer.
5.6 Course plan (course_plan.py, course-plan-v1)
Built after the concept graph by create_course_plan; every part is tagged with the concepts it
teaches or tests, and with its source (course, citing fact ids, or general, labelled General
knowledge).
| Type | Fields | Drawn as |
|---|---|---|
| Lecture overview (per PDF) | title, summary (the lecture's story), before, ideas[] (title, text), terms[] (term, meaning), after | Follow along, step Overview |
| Slide notes (per page) | headline, skip, sections[] (title, text), visual (figure walkthrough), deeper, concept_ids, questions[], cards[] | Follow along, one step per slide; questions and cards under Test yourself |
| Module plan | modules[] (key, title, goal, concept_ids in teaching order); every concept in exactly one module | Learn, the module list |
| Module | intro, sections[] (title, concept_ids, text, slides[] {page, note}, example {source, title, problem, steps[], answer}, check[]), practice[], traps[], summary[], cards[] | Learn, a module; checks and practice under Test yourself |
| Question | format (choice · multi · numeric · short · order · match · free), prompt, options / pairs / accepted value and tolerance / rubric, solution, hint, level, concept_ids | One component per format; the key stays on the server until an answer is sent |
Depth: a section's level is its most central concept's tier (core 1, supporting 2, detail 3). A student at depth d sees the sections, questions, traps and cards whose concepts include one at level ≤ d, and the modules that have any; minutes are estimated per depth.
5.7 Editions and revisions (editions.py)
| Type | Fields | Drawn as |
|---|---|---|
| Edition | number, graph_id, plan (modules), excluded concepts, requests[] (target, text: standing instructions), record ids of every module, slide note and lecture overview it shows, changes[] (part, added · updated · removed, why: material · request), cost | What Learn and Follow along show; What's new and Updated marks from changes; Earlier editions |
| Revision | status (proposing · proposed · applying · applied · failed · discarded), requests[] (text, target, declined[]), material (lectures added, concepts added and removed, lectures that failed to reach the map, new modules), edits[] (action, target, instruction, concept_ids, title, other, summary, selected), estimate (USD; modules, slides, overviews to write; changes) | The Update this guide panel |
Questions are identified by a hash of their text, so a question an update keeps word for word keeps the answers given to it; answers to replaced questions still grade and still count toward their concepts.
5.8 A course's study records (api.py, together.py, narration.py, start.py)
| Type | Where | Fields | Drawn as |
|---|---|---|---|
| Exam | set exams |
id, name, date, lectures (source ids; empty = everything), active | The exam picker; scope of Test, Cram and Progress; the countdown |
| Session | sessions |
kind (session · quiz · exam · cram · test), label, exam_id, test_id, answered, right, minutes, concepts {id: right, total}, member_id, finished_at | Last time, Progress → Sessions, a test's results |
| Member | members |
id, name, visible, key_hash (a secret key kept in the member's browser, sent as X-Cramfast-Member), joined_at, last_active |
People, Together |
| Member answer | member_attempts |
item_id, member_id, correct, concept_ids, timestamp | A member's report; group progress |
| Test | tests |
id, title, question_ids, minutes, created_at | Test (&test=), People → Tests sent |
| Graded work | graded_work |
title, kind, items (label, summary, concept_ids, earned, possible, correct, feedback), totals | Progress → marked work |
| Narration | narrations (by record id) |
scripts {overview | slide | intro | section id | traps | summary: text} | Listen |
| Start | set start |
status (searching · proposed · fetching · building · failed), course (what the student said), search (sources, topics, notes), chosen, added, failed | Start review |
Mastery from answers (the same rule on the server and in the browser): per concept, answers and right answers to the guide's questions; secure = at least two answers, 80% right, the latest right. Readiness = the predicted exam share of secure concepts over the share of the concepts in scope.
6. Practice from the study bundle
The study bundle (per lecture) keeps its own verified practice: Question (four options with
explanations, cognitive level, citations) and Flashcard, linked to concepts through
item_concepts. The Practice tab runs these; their attempts count towards progress alongside
lesson practice.
7. Settings
| Setting | Scope | Options (default first) | Stored |
|---|---|---|---|
| Map arrangement | account | As taught · By topic · By objective | server (owner); visitors get the defaults |
| Lesson style | account | Exam first · Study notes (orders the lesson head) | server |
| Session length | account | 25 · 10 · 45 min | server |
| Review schedule | account | Spaced · Fixed ladder · Off | server |
| New concepts before a quiz | account | 3 · 1 · 5 | server |
| Reading font, theme | account | Sans · Serif; System · Light · Dark | server |
| Study level | member | Core · + Supporting · Everything | browser |
| Exam details | set (owner) | date, format, questions, cumulative | server |
| Goals | person in a course | exam, learn over time, keep up, teach, each with follow-ups (2.1) | server (owner, PUT /goals); browser (visitors and members), the owner's as defaults |
| Emphasis | set (owner) | per concept: as predicted · core · supporting · detail · leave it out | server (PUT /emphasis) |
| Help for the share link | set (owner) | daily US$ for members' ask / explain / more questions; 0 (off) by default | server (PUT /help-budget); People shows What people asked |
8. Share links, compare and feedback
- Share links (
POST /api/sets/<id>/share,/share-links): read-only, no account. A link can pin a UI version and study-page mode for courses built before v4. - Compare (
/cramfast/compare/?a=<token>&b=<token>&view=…): two links side by side, one view switch for both (Today, Learn, Follow along, Test, Cram, Map, Progress, Together, Guide), an A/B toggle on phones; labels never name the model. Example pairs loads the demo courses worth comparing (Full vs Lightweight for algorithms and immunology, built at once vs grown over time, found online vs general knowledge, two researchers' papers, one lecture vs six); choosing one says what is compared, so a blind comparison is still made by pasting links. Keep the trailing slash. - Feedback (
POST/GET /api/sets/<id>/feedback): a stored, attributed record with form (flag, comment, override, badge), target (concept, topic, fact, block, item, guide), kind (wrong, unsupported, unclear, missing, too_long, pin_core, exclude, merge_into, move_under, rename, reorder, note, reviewed), note and value. For now feedback is stored and listed under Review; nothing acts on it.
9. Quality method
Unit tests (test_lessons.py, test_graph_pipeline.py, …) use a fake model and check contracts
only: citations, limits, invariants, the planner's order and the review schedule. Quality is judged
on real builds: an independent model reviewer reads each lesson against the exact facts it may use,
lists every unsupported statement and scores faithfulness, exam value, clarity and structure
(1-5). Latest results (run 3): immunology 3.83 / 3.58 / 4.25 / 3.67, algorithms 3.83 / 2.83 / 4.0 /
3.83, with every marked answer correct. Position bias and exam claims are fixed; unsupported
details in option reasons and the low exam value of recall-style lessons on a problem-solving
course are not, and need a per-statement entailment check and subject-aware block and practice
rules. See PIPELINE_DESIGN.md, "Quality method and results".
10. Not built yet
- The on-demand steps (ask, explain, more questions, gap cards, checking brought items) have not yet been judged on real courses the way lessons have (section 9); transcription of raw audio and video is tested with a stand-in model only (captions were read live).
- Opening creation to everyone (accounts with sign-in, an allowance per account): decisions in 2.13.
- Accounts: a member moves between devices with one-time links (D5), not a sign-in;
/r/review links; feedback taking effect. (No editor role: each guide has one owner, 2.8.) - Voice answers in Listen (it reads, the student taps); audio files (it uses the browser's voice).
- Graded work feeding the mastery estimate (it is compared, not merged).
- Fact-to-fact links (same as, elaborates, contradicts) and page roles with figure regions.
- Lessons beyond Level 1;
ExamOutcometo calibrate the prediction.
11. Earlier versions
| Version | What it was | Still served for |
|---|---|---|
| UI 1 (Original) | Concept pages as cited claims grouped by kind | Share links pinned to UI 1 |
| UI 2 (Slides and diagrams) | Study pages (study_pages.py): summary, exam angle, worked question, key points, one diagram, traps, connections; modes exam-4, exam-5, notes-5 and older |
Graphs built before v4 and their share links |
| concept-graph-v2 / v3 | Medical vocabulary (v2); general vocabulary without roles (v3) | Read through upgrade_graph |