Repository navigation
Plan B1 Plans
Source of truth: this wiki page.
Written 2026-10-06. After the skill model (done: ADR-0034), before deck downloads (owner's order).
Every deck path will have a B1 plan from now on. The app will use this explicitly.
Asked what it should entail, the owner decided:
- Completeness: words drive the percentage, and grammar topics are shown beside it: "18% of B1 · 12 of 30 grammar topics".
- Themes per level come from the current CEFR descriptors.
- Units not written yet show to learners as "Coming".
- When: the plans are written before deck downloads, so the deck index is designed around them.
- A path (
decks/<lang>/<lang>-<native>-path.yaml, ADR-0013) is a list of units, each a list of existing deck ids in teaching order, plus the decks that need the alphabet. Telugu's has 30 units. Paths become one per language learnt,<lang>-path.yaml, naming core ids (owner, 2026-10-09; below). - Nothing marks a level, and nothing records what is still to write.
-
language-paths.mdsets B1 as the target, about 2,500–3,000 words, and estimates 280–420 hours of content for the seven Indian languages to get there. Today they teach 450–680 vocabulary cards each, and Spanish 41.
Written in the path, by whoever writes the course, and read by the app unchanged:
- Every unit up to B1, written or not, in teaching order.
-
A unit not written yet is
planned, with its future deck id and its theme or grammar topic. -
Each unit's planned size in words (
words). A grammar unit names its topic (grammar), which counts toward the grammar figure, not the words. -
Milestones:
milestone: A1,A2andB1on the unit where each level ends.
units:
- decks: ["te-family", "te-grammar-be", "*"]
words: 45
grammar: ["be"]
- decks: ["te-work", "te-grammar-demonstratives", "*"]
words: 45
grammar: ["demonstratives"]
milestone: "A1"
- planned: { id: "te-health", theme: "health", words: 60 }
listening_passages:
- { id: "doctor-call", text: { "en": "Booking a doctor's appointment by phone" } }
reading_passages:
- { id: "clinic-notice", text: { "en": "A notice at the clinic" } }
- planned: { id: "te-grammar-conditional", grammar: "conditional" }
listening_passages:
- { id: "rain-plans", text: { "en": "A friend's plans if it rains" } }
reading_passages:
- { id: "late-train", text: { "en": "A message: if the train is late" } }
milestone: "B1"The path names each deck by its core id (te-family), and a learner is
taught their own native language's deck for it (te-en-family from
English); the exact format is in docs/DECK-FORMAT.md, "Paths" and "The B1 plan".
Units after the B1 mark, if any, are written as today. Units with the alphabet stay where they are; they count neither words nor grammar.
The CEFR's global scale describes each level by what a learner can do (Council of Europe, 2001, kept in the 2020 Companion Volume). Paraphrased:
| Level | Can do | Themes and grammar it implies |
|---|---|---|
| A1 | Use everyday expressions for concrete needs; introduce themselves and others; ask and answer about where they live, people they know and what they have | Greetings, self and family, home, numbers, basic needs; present tense, questions, pronouns |
| A2 | Understand frequent expressions on personal and family information, shopping, local geography and work; exchange information on routine matters; describe their background and surroundings | Shopping, directions, work, daily routine, time and calendar; past, future, comparison |
| B1 | Follow the main points of clear standard speech on work, school and leisure; handle most situations while travelling; write simple connected text; describe experiences, hopes and plans, and give reasons and opinions | Travel, health, services, feelings, opinions, events and news; subordinate clauses, conditionals, reported speech, the language's own B1 grammar |
The descriptors describe abilities, not word lists, so the skeleton turns
each into themes and grammar topics. It is written once and shared. Each
language adds its family's grammar in the scheme's order
(language-paths-scheme.md).
The owner first asked for films and songs "near the bottom" of the path,
then chose to make them, with books, an optional shelf the learner picks
from by interest: books-films-songs.md.
- They are not units of the B1 plan and never hold back the path.
- Each item on the shelf carries a level, A1, A2 or B1. Songs and films come at every level; books only at B1, for learners who learn the script. The finale, a great film without subtitles, is offered at the B1 mark.
- The words of famous songs' and films' titles are ordinary path vocabulary, in early units (#169; #170 is the first), as the owner confirmed. Only whole works stay on the shelf.
- They count toward neither words nor grammar topics. The picker can show them apart, e.g. "2 films, 1 book done".
| Where | How |
|---|---|
| Language picker (built, #443 and #626) | "18% of B1 · 12 of 30 grammar topics": words = Σ min(a unit's words, its plan) ÷ Σ planned words up to B1; grammar = topics with a written unit ÷ topics planned |
| Decks tab | Planned units show greyed, with "Coming", in their place; they cannot be started |
| Lessons and Today | Planned units are skipped |
Achievements (achievements.md) |
The A1, A2 and B1 badges come from the milestones |
| Hours per language (built, #227) | "Hours left" counts down to the end of the B1 plan |
Pacing (language-paths.md) |
The scheme's phases line up with the milestones |
| Deck downloads (ADR-0037) | The index carries each plan and the counted words, so the picker shows completeness before a download |
The words a unit has are always counted from its decks: distinct
vocabulary cards. Script decks, grammar tables and learners' own decks
("*") are left out.
Every deck written for a B1 plan follows "Script in prose" in
docs/DECK-FORMAT.md, as the owner asked: "Always keep the transliteration,
even in descriptions or labels." Each word quoted in a deck's notes,
meanings, labels, descriptions and facts carries its ISO 15919 reading,
లేదు (lēdu), so that a beginner who cannot read the script yet can read
them. The validator rejects a deck that leaves one out.
-
The format first: the B1 format (phrasebook, rule cards,
rules:,bases:, typed notes, planned units, core and layer) is built in the parser, the validator anddocs/DECK-FORMAT.mdbefore any B1 deck is written, so that what is written validates. Then one agent writes the Bengali course and another the Telugu one (Sonnet writes the decks; CLAUDE.md). - A1 decks only, for now (owner, 2026-10-09: "once B1 plan is done, we will only create A1 level decks (if any existing deck goes beyond, that's okay) for Bengali and Telugu"). The B1 plan is still written in full, every unit to B1 with its passages, but the deck agents write decks for the A1 units only; A2 and B1 units stay planned ("Coming"). An existing deck that already reaches past A1 stays as it is.
-
Pictures: the agents use
tools/data/picture-mapping.json, the meanings already matched to Noto Emoji pictures and checked, with the matches dropped and why. The 330 cards given pictures keep them. - Colours: a shade of the accent colour each for a card's word in the script, its ISO reading, its IPA and its meaning, on every screen that shows a card, checked for contrast in light and dark.
- A rule's forms are made from each word's stem, with exceptions listed, and checked (owner, 2026-10-16: "Stem + exceptions, checked", replacing "listed for every word" of 2026-10-09). The rule gives the endings; a word gives its stem (ఇల్లు (illu) → ఇంటి- (iṇṭi-), so ఇంట్లో (iṇṭlō)) and any exceptions; the validator compares the generated forms with Wiktionary's where they exist and flags mismatches, and checks every taught word of the rule's kind has a stem.
-
A layer's files live in
decks/<lang>/<native>/, the core indecks/<lang>/(owner). - Notes about the language learnt keep their language facts (the words and readings) in the core; each layer writes the explanation around them in its own language (owner).
- Words per level: A1 700, A2 900 more, B1 1,200 more (about 700, 1,600 and 2,800 in all; low confidence, scaled from English, Milton & Alexiou 2009), and each planned unit names its listening and reading passages too (owner).
-
Paths are one per language learnt now (
te-path.yaml, shared by every native layer), not one per course (owner). -
The minimal-pair partner comes from the card's pair notes; a B1 core
has no
pair:of its own; existing decks'pair:still works (owner). - A B1 plan is required on a path once its language has a core (written in the new format), and on every path once all eight have plans (owner).
- Planned units must name their listening and reading passages (an error); written units need none (owner).
- The format is built on its own branch, in parallel with the skill model, so that the Bengali and Telugu deck agents can start (owner).
The owner's answers to the questions of the B1 format spec (now folded into
docs/DECK-FORMAT.md, and in git history):
-
One path per language learnt,
<lang>-path.yaml, shared by every native layer, now, before the deck agents start: it lists core ids, and each passage is named once with a description per native language. Today's course paths move to it once. - Grammar understood is choosing what a form means; choosing among the same word's forms, or typing the form, is grammar produced.
- A plan is required on a path whose language has a core; every planned unit names its passages; a grammar topic is one rule; scripts without spaces wait; pairs come from pair notes.
-
Regions (the owner asked where the rating screen's "Where you speak
Telugu" is defined): in the language's path,
regions:, each with an id and a name per native language; the app adds "Elsewhere". A rater's region and a card's region note name them.
Each unit of a B1 plan is written in the order words-rules-sentences.md
sets: its theme's words, then the rules they need, then its sentences, which
unlock only once their words and rules are known. A small phrasebook comes
first in the course, taught whole.
The owner: "all derived words on a card will also show their base words on the cards (like for 'he went to our school', card shall also have 'go' and 'we')." So a card names the base of every inflected or derived word in its target and in its examples:
- id: hi-0712
target: "वह हमारे स्कूल गया।"
native: "He went to our school."
reading: "vah hamāre skūl gayā"
bases:
- { word: "गया", ref: hi-0201 } # जाना (jānā), to go
- { word: "हमारे", ref: hi-0045 } # हम (ham), we-
refnames the card that teaches the base, so its target, reading and meaning are shown from that card, in the learner's own language (docs/DECK-FORMAT.md, "Core and layer files"). A base no card teaches is written in full instead:base,reading, and its meaning in the layer. -
Shown on the lesson's teach card, and in reviews once the question is answered, with the other taught details: "गया ← जाना (jānā), to go; हमारे ← हम (ham), we". Never before an answer, since on a Write question it would give the answer away.
-
Examples carry their own
basesthe same way. -
The validator, for every deck in a B1 plan:
- every word of a target or example that is not itself the target of a
card in the course has a
basesentry; - every
refnames a card, and everywordoccurs in its text.
Words are split at spaces, punctuation dropped. Scripts without spaces need their words given (
language-paths.md). - every word of a target or example that is not itself the target of a
card in the course has a
-
Existing decks gain their bases as each language's B1 plan is written. A tool,
tools/suggest_bases.py, proposes them from the course's own cards, and the writer confirms each one.
The owner: "we need to add a wikitionary link to every word card so that the user can check the word out in detail, including etymology. And add informative notes in every card when taught ... Multiple notes per card is fine. The app will randomly pick one note fact when teaching / showing after answers."
Notes become a list of facts, each with its kind:
notes:
- { kind: pair, ref: te-0412, text: "Not కాలం (kālaṁ), time: the a is long there." }
- { kind: culture, text: "…", source: "…" }
- { kind: usage, text: "Also 'pen-name' in old usage." }| Kind | What it says |
|---|---|
pair |
A minimal pair: a word of the language that sounds almost the same |
culture |
Its cultural significance |
usage |
Another context it is used in, or another sense |
behaviour |
How it behaves unlike similar words: an irregular form, a gender, a use |
note |
Anything else worth knowing |
- One note at a time, shown when the word is taught, and after an answer with the other taught details. Shuffled, never repeated, until every note of the card has been shown once (owner's choice).
- Every word card should have one or more; a word card with none gets a validator warning, not an error (owner's choice).
-
pairnotes are proposed by a tool: course words whose readings differ by one sound, such as కలం (kalaṁ) and కాలం (kālaṁ). The same pairs give Hear its sound-alike options (ADR-0034). -
A
pairnote names its partner (ref, the card of the word that sounds almost the same). -
culturenotes follow the culture-deck rules (#99): each checkable claim names itssource, and the deck stays marked unreviewed until a speaker checks it (owner's choice). -
Transliteration ("Script in prose") applies to every note. Notes live
in the native layer (
docs/DECK-FORMAT.md, "Core and layer files"). -
Today's single
notesstring reads as one note of kindnote, so existing decks keep working until they are rewritten.
The minimal-pair button. The owner: "the minimal pairs can be a button where found and clicking it will show the words side by side and let the user play their sounds and practice them together (like whether the speech is detecting kalam or kaalam) in that same card. No logging here, pure practice."
-
Shown on a card with a
pairnote, when it is taught and after an answer, with the taught details. Never before an answer: there it would give the answer away, above all when the partner is among Hear's options. -
It opens, on the same card, the two words side by side, each with
its reading and meaning:
- Play each word, at normal and slow speed;
- Say one: the phone listens and shows what it heard ("Heard: కాలం (kālaṁ), time"), and which of the two it matched, or neither. Only where speaking is on;
- Which did you hear?: the app plays one of the two at random, and the learner taps which. It says right or wrong.
- Nothing is recorded: no review, no schedule, no strength. It is practice only.
- The phone's recogniser prefers common words, and may miss vowel length in a single word. So the panel says what was heard, not whether the learner said it right.
- With sound off, or no voice for the language, the speakers and "Which did you hear?" are greyed out, as elsewhere.
The Wiktionary link opens the word's entry, with its etymology, in the browser:
- It is built from the word and the language, not stored:
en.wiktionary.org/wiki/<word>#Telugu. For a sentence or an inflected form, it is built for each base word (bases). A learner taught from Bengali gets bn.wiktionary, with the native layers. -
Shown only where Wiktionary has an entry (owner's choice). A tool
checks each word against Wiktionary's extracts (kaikki.org, as
tools/import_wiktionary.pyuses), and marks the words that have one. Many Indian language words have none yet. - Nothing is fetched until the learner taps the link.
-
Errors:
- a path without its A1, A2 and B1 marks, in that order;
- a unit up to B1 without a planned size or grammar topic;
- a planned id that does not follow deck naming, or names a deck that already exists.
-
Warnings:
- a unit with more words than planned, since then the plan needs raising;
- planned words up to B1 outside 2,000–3,500, as a sanity check. Nothing is stored.
- When a planned deck's file appears, it counts as written. Its
plannedentry is turned intodecksin the same change.
-
Format: the path parser, the validator,
docs/DECK-FORMAT.md, and an ADR. - The skeleton, from the descriptors above.
-
A plan for each of the eight languages, in its one path. Telugu and Kannada are written
together with their reorder to the Dravidian order, which
language-paths.mdcalls for. - "Coming" on the Decks tab, and lessons skipping planned units.
-
Base words: the
basesfield in the parser, the validator anddocs/DECK-FORMAT.md; showing them with the taught details; andtools/suggest_bases.py. -
Notes:
- the list of typed notes, read alongside today's string;
- shuffled without repeats when teaching and after answers;
- a tool proposing
pairnotes; - the validator's warning, and sources on
culture.
- The minimal-pair button and panel: play, say one, which did you hear; recording nothing.
- The Wiktionary link: marked by a tool from Wiktionary's extracts, and shown with the taught details.
- Content: notes for every word card, written with each language's B1 plan.
- Tests: the parser, each validator rule, the counts, the Decks tab and lessons with planned units, base words shown only after an answer, every note shown once before any repeats, the minimal-pair panel shown only after an answer and recording nothing, and the Wiktionary link only where an entry exists.
Nothing left: see "Format details, settled" above.
| Part | Hours |
|---|---|
| Format, parser, validator, docs, ADR | 2–3 |
| The skeleton | 2–3 |
| Plans for the seven Indian languages | 7–14 |
| Spanish | 2 |
| "Coming" on the Decks tab, lessons skipping planned units | 1–2 |
| Base words: format, validator, display, suggestion tool | 3–5 |
| Notes: format, shuffle, pair tool, validator | 3–4 |
| Minimal-pair panel: play, say one, which did you hear | 3–4 |
| Wiktionary link: marking tool, display | 2–3 |
| All | 25–40 |
Writing the notes themselves is content, per language, outside these hours: about 3,800 word cards today.
Writing the plans does not write the content. The content to reach B1 is
language-paths.md's estimate. Confidence: medium.
See also: Roadmap · Plans-Index · Home
1. Learner guides
- Learner Guide
- Getting Started
- Today and Daily Lessons
- Drills and Skills
- Courses and Paths
- Proficiency Levels
- Scripts and Readings
- Readings ISO 15919
- Speaking and Listening
- Progress and Stats
- Profiles and Settings
- Backup and Restore
- Reporting a Problem
2. Deck building guides
- Deck Building Guide
- Deck Format
- Romanising Indic Languages
- Deck Licences and Quoted Books
- Deck Tools
3. Review guides
4. Translation guide
5. Building on iOS
6. Roadmap
7. Sources and attributions
8. Contribution and agentic coding