Changelog

All notable changes to japaneseness.com.

[1.24.0] — 2026-10-01

Changed

cuisine, experience category and place type; price bands shown as four dots; restaurant, operator, experience, food and place cards redesigned around a tinted icon tile; station pages open with a colour-washed hero carrying the station's kanji and a price-band bar; the Yamanote index shows each station as a tile with its own band bar; the home page gains stat tiles and puts the Tokyo map beside the headline; itineraries use a stamped timeline. All inline SVG, no image requests.

[1.23.0] — 2026-09-30

Added

variety — tempura, unagi, oden, kappo, teishoku and wagashi at stations that were sushi-and-soba heavy. Every station now has at least seven. stops off the loop, each a restaurant from the guide; article stops can now reference a restaurant (restaurant:), checked by the build.

[1.22.0] — 2026-09-30

Added

— three per price band at the major stations where the neighbourhood supports it, with more variety of cuisine (tempura, unagi, kappo, oden, udon, wagashi alongside the sushi and soba). restaurant on the line in one list with filters for cuisine, price band, station, meal and English support, and sorting by station, price or walking time; cuisine chips link straight to a filtered view.

[1.21.0] — 2026-09-30

Added

30 stations, 196 Japanese restaurants within about ten minutes' walk, each placed in one of four price bands (¥ / ¥¥ / ¥¥¥ / ¥¥¥¥) with cuisine, lunch/dinner, walking minutes, English support, booking route and a short bilingual note on why. Every entry was verified on 29–30 Sep 2026 against its official site or its Tabelog listing; no prices or hours are published, only the band. - Index page: a schematic loop map, one tab per station, and price-band tabs inside each station; the station is kept in the URL hash. - One page per station (/travel/yamanote//) with the same price tabs, previous/next station, and a link to the guide's area. - Masters in content/master/travel/yamanote/; build_travel.py checks station and cuisine ids, bands, walking minutes, https links, the verified date, bilingual completeness and that no text contains a price.

[1.20.0] — 2026-09-26

Added

places' coordinates — no tiles, no scripts, no requests. It shows the fifteen areas as coloured regions, every place as a dot, the Yamanote loop and its main stations, the Sumida and Kanda rivers, the palace and the big parks, in English or Japanese. - Travel home and /tokyo/: the whole centre; click an area to open it. - Area pages: a locator in the sidebar and a zoomed map with the places numbered to match the cards below. - Itineraries: the route drawn as numbered stops joined by a dashed line; the numbers repeat in the timeline. - Place pages: a pin on a close-up map. counts.

[1.19.0] — 2026-09-26

Changed

a time." / 「東京を、一日ずつ。」 beneath it. experience, area, price band, English support; sort by experience, name, area, price, duration), Experiences and Food (category, area, price), Media (type, area; newest first) and each area's places (type, priority, tag; sort by priority, name, duration). Runs in the browser with no requests; the choice is kept in the URL so a filtered list can be shared.

[1.18.0] — 2026-09-26

Added

built on verified operators — a hands-on craft day in Asakusa; Ginza dressed up; a sumo morning in Ryogoku; making things in Aoyama; Tsukiji at dawn to Toyosu by night; the old firms of Nihonbashi. Article stops can now reference an operator (provider:), the build checks the id, and operator pages list the itineraries they appear in. 19 itineraries total.

[1.17.1] — 2026-09-26

Added

the thinnest experiences: woodblock printing, antiques markets (Hanazono, Tomioka Hachimangu), geisha evenings (Asakusa Kenban, Kagurazaka), zazen, taiko (TAIKO-LAB Aoyama and Akihabara), sword lessons (HiSUi, Samurai Kenbu), sushi and ramen classes, home cooking, sake tasting and pairing, Cotton Club, Tsukiji breakfast counters and guided tours, a photography walk and an architecture walk. 64 of 69 experiences now have at least two operators.

[1.17.0] — 2026-09-25

Added

lists 129 named operators for the Tokyo experiences — tea rooms, sushi and tempura counters, sumo stables, kimono, craft studios, theatres, baths, guides, cruises, observation decks. Each entry was verified against the operator's official site on the date shown and carries: official URL, booking route, English support (yes / partial / no), price band, typical duration, group size, nearest station, area, a map link, and a short bilingual "why we recommend it". No hours or prices, by design. list their operators; the operator index groups them by category. counters, performance, wellness, shopping, nature and learning. validates ids, experience and area references, https URLs, the english_support enum, the verified date and bilingual completeness. Sitemap and hreflang cover the new pages.

[1.16.0] — 2026-09-25

Added

a true translation, indexable, with EN/JA hreflang) — a hand-written database of central Tokyo for visitors, and a media section of one-day itineraries built on it. First release covers the centre: 15 areas (Ginza to Ryogoku), 86 places each with a bilingual essay, highlights, a tip, best time, duration, station, coordinates and an official link, 24 experiences with how to arrange each, 20 things to eat with how to order them, 20 practical notes with official sources, 46 phrases with kana and romaji, and 13 itineraries (one-day, an evening, a rainy day) timed to the hour each place is at its best and written for the visitor with a little more time and taste than a checklist. every place carries its official URL and the pages say so. Price bands only (¥–¥¥¥¥). No affiliate links, no sponsored places; text CC BY-SA 4.0. content/scripts/build_travel.py, which refuses duplicate ids, dangling references, a bilingual field missing its twin, non-kana kana, non-https links, coordinates outside Tokyo and romaji that does not match the kana (same checker as the vocabulary). Output: site/src/data/travel.json. Article JSON-LD, a Travel entry in the nav and a card on the homepage. with a real translation can be indexed with hreflang instead of noindex.

[1.15.0] — 2026-09-07

Added

with the searchable list at /vocabulary-n2/list/ (codes Y1–Y75) and a two-page printable per set. The vocabulary leaves daily life here, and the sets follow: the abstract nouns an argument is built from (前提, 根拠, 相関), economy and finance, politics and law, industry, environment, media and data, three sheets of compound verbs (取り組む, 押し寄せる, やり抜く), the four-character idioms an editorial reaches for, the formal connectors of written Japanese, the courtesy phrases of a business email, and the body idioms. Not one word is on the N5, N4 or N3 list — the build refuses any that is — so the four levels together are 4,100 distinct words. Linked from /kanji-n2/, /grammar-n2/ and /vocabulary-n3/; both sitemaps updated. All 150 pages measure 297 mm; none is under 55 % filled.

[1.14.0] — 2026-09-07

Added

whole N3 half of the site in order: eleven weeks of kanji (Level G, 45 units), eight of grammar (Level H, 29 units with their 408 fill-in exercises), the 60 vocabulary sets and 20 unspaced passages alongside, then four weeks of recall, timed reading and a sample paper — about 140 hours at 45–55 minutes a day. Every count comes from the ladder and the data files, so the plan cannot drift from the site. It says plainly why kanji come before grammar at this level, and that listening — a third of the exam — is not here and needs twenty to thirty minutes a day from week 1. Linked from the nav's More menu, the homepage guides, the N4 plan and the sitemap.

Fixed

is G (H is N3 grammar).

[1.13.0] — 2026-09-07

Added

pattern, 408 new blanks, so every one of the site's 22 N3 grammar sets now prints a companion exercise sheet with a grey note on what to put in, a line to write a sentence of your own for each pattern, and an answer page with the patterns at a glance. That takes the site to 206 patterns and 618 blanks across N5, N4 and N3. Hand-authored, CC BY-SA 4.0; every kanji is one the level has taught, with furigana, and the build refuses anything else. Answers are kana where the kanji would outrun the level.

Changed

patterns (three columns of answers, a denser reference table), which is what keeps the four largest N3 sets — conditionals, obligation and permission, passive/causative/keigo, degree and quantity — inside A4. and N4; /worksheets/grammar_n3/set/…/exercises/ is in the sitemap.

[1.12.0] — 2026-09-07

Added

(text with furigana, word box and four questions; then answers, the English, and the passage's kanji to write). Two things change at this level: the text is no longer spaced between words, because printed Japanese has none, and the pieces are the kinds of thing a reader actually meets — a water-cut notice on a building's board, a business email moving a meeting, a marathon entry sheet, a call for volunteers, an interview with a baker, an earthquake guide, a town's lift-sharing scheme, an inn reviewed honestly, essays on greetings, working from home and making time to read. 7,770 characters in four bands (280–560 characters). Every kanji is one of the 589 the site teaches by N3, with furigana on all of them; everything else is in kana. Linked from /kanji-n3/, /grammar-n3/, /vocabulary-n3/ and /reading-n4/; both sitemaps updated. All 40 pages measure 297 mm, none under 55 % filled.

Changed

level, so a title cannot use a kanji the sheet has not taught (the N4 sale advert's title moves to kana as a result), and builds N3 from the same rules. translation on long ones, which is what keeps the densest N3 sheets at 297 mm.

[1.11.0] — 2026-09-07

Added

with the full searchable list at /vocabulary-n3/list/ (codes X1–X60) and a two-page printable per set (study, then recall in both directions; page 1 is page 2's key). The level changes shape here, and the sets follow it: three sheets of noun + する verbs, two of abstract nouns, conjunctions and sentence adverbs, set phrases and idioms, prefixes and suffixes, the formal words of notices, two sheets of katakana loanwords, sound and manner words, and verbs grouped by what they do (thought and speech, social action, motion, change, feeling, exchange, everyday handling). Hand-authored, CC BY-SA 4.0. Not one word is on the N5 or N4 list — the build refuses any that is, so the three levels together are 2,600 distinct words. Linked from /kanji-n3/, /grammar-n3/ and /vocabulary-n4/; both sitemaps updated. All 120 pages measure 297 mm; none is under 55 % filled.

Changed

kana→Hepburn converter (long vowels, っ, ん before vowels, yōon, katakana ー) and refuses a mismatch. N5 and N4 pass unchanged.

[1.10.2] — 2026-09-07

Added

kanji is and is not, why sets beat frequency lists, why the hand beats the eye, the three passes, a level-by-level schedule with the site's own unit counts, radicals and mnemonics in their place, and the six mistakes that make people quit. Linked from the homepage guides and /kanji/.

[1.10.1] — 2026-09-07

Added

kana sheets now print a second page: the answers as kana with their romaji, then squared paper to write the row again with the first square as a faint model. The book had keys for these; the site did not, so a learner working alone could not mark page 1. Trace sheets need none. All 170 kana pages measure 297 mm.

[1.10.0] — 2026-09-07

Added (the grammar sheets finally ask something back)

blanks. Each of the 13 grammar sets (4 at N5, 9 at N4) now has a companion sheet at …/set/{slug}/exercises/: three sentences per pattern with a blank and a grey note saying what goes in (a particle; a verb and the form it takes), a line to write your own sentence for each pattern, a box for two more, and an answer page that also carries a one-line reference — formation and example — for every pattern in the set. Sets of more than five patterns paginate at five to a page. /grammar-n4/ say which sets have them; the sitemap lists the 13 URLs. kanji without furigana or beyond the level, and an answer or hint using a kanji the level has not taught. valid (に/へ, と/や, 少し/ちょっと, のに/けれども) now either say which is wanted or use a sentence that admits only one.

Verified

page was half empty and four 5-pattern pages ran 2–6 mm over); the 44 existing set pages unchanged. Build 9,080 files.

[1.9.1] — 2026-09-07

Added

Level E over six weeks, grammar Level F over four, then vocabulary and the longer passages, a cold-recall week and a timed week. Counts and unit codes come from the ladder and the data. The N5 plan now hands over to it.

[1.9.0] — 2026-09-07

Added

moving house, a part-time job, asking the way, a clinic phone call, a notice in the lobby, an email to a teacher, essays on trains and the seasons, lost property, sports day, a wedding, a festival, a health plan, a sale advert, planning a trip, a job interview, pets, library rules, a year in review. N4 grammar throughout — plain forms, たら, 〜と思う, 〜てしまう, 〜ことができる, 〜なければならない — and only the 235 kanji of Levels C and E. the manifest categories that level may draw on (N5: 80; N4: N5 + N4). the east exit", an English "rest room" that meant a break room, a duration asked as "until when", three N3 grammar points brought down to N4, and a dubious statistic corrected to what its source says (children *under* 15).

Changed

densities; passages over 330 characters or with many dialogue lines get the tightest. Page 2 lists the passage's kanji as chips when there are more than thirty, since forty write-lines do not fit a page.

Verified

overflowing — the long translations and 40-word kanji grids). 749 links resolve; sitemap +20; build 9,066 files.

[1.8.1] — 2026-09-07

Added

N5 half of the site in order: a week-by-week table (units, vocabulary sets, reading passages, minutes a day), a paragraph of advice per week, where each thing lives, and what the site does not have (listening) with an honest pointer elsewhere. Every count and unit code on the page is read from the ladder and the data files, so it cannot drift from the site. Linked from the homepage guides and the More menu.

[1.8.0] — 2026-09-07

Added

words after N5. Feelings, the body parts N5 skipped, the giving-and- receiving verbs, transitive/intransitive pairs kept on one sheet (壊す/壊れる, 増える/減る), two sheets of adverbs, connectors and particles, set phrases for a working day. Same two-page format as N5 — study, then recall — and /vocabulary-n4/list/ for the whole 800 with romaji. lowest-first and rejects any N4 word already on the N5 list, so printing both levels is each word once. It caught eleven. inside sets, four filler phrases replaced with real words, twelve written forms switched to the kana an adult actually writes (だめ, ひどい, いじめる, みんな, できる, はがき …), and five N2-level money words swapped for N4 ones.

Changed

(VocabSetSheet, VocabList); the N5 pages render byte-for-byte the same. forward to N4.

Verified

sitemap +40; build 9,044 files.

[1.7.0] — 2026-09-06

Added (where the pieces meet)

piece: a kana, a kanji, a pattern, a word. Nothing asked a learner to read. /reading/ is twenty passages written for the site, from a 65-character self-introduction to a 205-character diary entry, in four bands. Each is two printed pages: the text with furigana on every kanji, ruled space between the lines, the words worth knowing, four questions (three multiple-choice, one written) and a ruled box to copy the first two sentences; then the answers, the English, the passage's kanji words with a line to write each, and a box for two or three sentences of your own. reads the 80 N5 kanji from the manifest and refuses to build if a passage, question, option, answer or vocabulary note uses any other kanji, if a kanji lacks furigana, or if a multiple-choice answer is not among its options. Anything a Japanese adult would write with a harder kanji is in kana here — 買います, 来週, 東京 — because that is what an N5 learner can read. (二十さい is にじゅっさい), a から that should have been が, and the JLPT convention of 「わたし」 in brackets when a question means the writer.

Verified

answer pages and one 317 mm diary — the copy boxes and a four-column kanji grid fixed both). 690 links across the changed pages resolve; the worksheets sitemap gains 20 URLs; build 9,002 files.

[1.6.2] — 2026-09-06

Added

/worksheets/katakana/practice/…: forty loanwords on genkōyōshi (4 sheets; the long-vowel mark ー and the small ッ each get a square, and the romaji is derived from the kana so コーヒー prints *kōhī*), yōon (2), and the pairs that trip people up years later, シ/ツ and ソ/ン first (2). They are the groundwork for Volume 2. Blank genkōyōshi is script-neutral and stays under hiragana; /katakana/ links to it. screenshot with the installed Chrome's --screenshot while Chrome is open: it attaches to the running instance and captures whatever tab is in front.

Verified

URLs; 386 links across /katakana/, /hiragana/ and /genkouyoushi/ resolve.

[1.6.1] — 2026-09-06

Added (now the book's claim is true)

everything in it is also free here; until today three sections were not. Ten companion sheets at /worksheets/hiragana/practice/…, beside the ladder rather than in it (adding units would renumber A1–A50, which the printed progress chart uses): the forty real words on genkōyōshi squares (4 sheets, 10 words each, romaji derived from the kana at build time so きって comes out *kitte*), yōon (2 sheets — trace the row, then write it from memory on the line below; the small kana sits low in its own square), the eight confusable pairs (2 sheets: what tells them apart, then each written three times), and blank genkōyōshi at 15 mm (12 × 15) and school size (18 × 22, 396 characters). writing on it (small kana, punctuation, 禁則, indents, direction), with the sheets. It is a KDP keyword for the book and had no page. these sheets; "only in the book" is down to the progress chart and the answer keys, which is the honest list.

Fixed

strips paragraph margins, list markers and table rules, and nothing put them back for article.container-readable — so the 7-day plan table in *How to learn hiragana* ran into its paragraphs and the numbered lists had no numbers. One block of CSS fixes the five guides, the charts and the book page together.

Verified

squares 15 → 14 mm, tighter word lines, 15 and 22 rows on the blanks). build 8,973 files.

[1.6.0] — 2026-09-06

Added (the words, and the book's front door)

characters and the grammar and never the words. /vocabulary/ is a new category: family on one sheet, the clock on another, twenty verbs of the daily routine on a third, grouped the way a lesson groups them rather than alphabetically. Every word is in exactly one set, so printing all thirty is the whole list once. Each set is two pages — the words with readings, meanings and a line to write each, then the same twenty asked back from memory in both directions, seeded so the sheet never reshuffles. Page 1 is page 2's answer key, so nothing prints twice. /vocabulary/list/ is the full 600 on one searchable page with Hepburn romaji. The list is hand-authored (content/master/vocab_n5.yaml, CC BY-SA like everything else — no dictionary data copied), proofread entry by entry, and built by content/scripts/build_vocab.py. It is deliberately *not* a manifest category: the generic routes would have made 600 one-word pages. paperback editions of Level A say on Amazon that every practice sheet in them is free here. Now there is somewhere that is true: the book's chapters mapped to the site's units (A1–A50, read from the ladder so the codes cannot drift), an honest list of what is *only* in the book (yōon, the confusable pairs, the forty words, the answer keys), and buy buttons that stay "coming soon" until site/src/data/books.json has an ASIN. /workbook/ indexes the volumes. Linked from the homepage, /hiragana/, the More menu and the footer.

Changed

語彙). The homepage's "What is in here" grid has a fifth card. Google Chrome instead of downloading a Chromium.

Verified

Cloudflare Pages' 20,000.

[1.5.0] — 2026-09-03

Fixed (what was capping the ceiling)

/katakana/, /kanji/ and /grammar/ passed no title to the layout, so all four inherited the site tagline — four identical </code>s, not one of them containing "worksheet", "printable" or "N5". They now read the way people search: *Hiragana Practice Sheets — Free Printable PDF*, *JLPT N5 Kanji Worksheets — Free Printable PDF*. N4–N1 and the homepage were retitled to match, with real descriptions. <ul><li><strong>94 % of the pages sitemap was thin duplicates.</strong> 624 of its 661 URLs were</li> </ul> the 38 locale copies of each category page — pages whose *interface* is translated but whose content is still English. They are now <code>noindex,follow</code>, carry no canonical, and are not submitted; hreflang is off until a locale's content is genuinely translated. The pages sitemap went 661 → 24, and the worksheets sitemap now covers the <strong>100 N5 detail pages</strong> that had never been submitted at all. Every one of the 5,976 submitted URLs exists and is indexable — verified, not assumed. <h3>Added</h3> <ul><li><strong>A teacher section on the homepage.</strong> One teacher is twenty or thirty</li> </ul> learners, and "print a class set, use it in paid lessons, change it" is an unusually strong offer that the site was leaving to inference. It now says so. <h2>[1.4.0] — 2026-09-03</h2> <h3>Added (something finally asks you to remember)</h3> Every kanji and grammar sheet on the site was "study this" — trace it, copy it, read the pattern. Nothing ever asked a learner to produce 学 from "study", so a level could be finished without recalling a single character. Kana had its quiz sheets; kanji and grammar had none. <ul><li><strong>100 review sheets, inside the ladder.</strong> Every few units the course inserts a</li> </ul> review of exactly what came before it — <code>C6</code> reviews <code>C1</code>–<code>C5</code>. They are numbered like any other unit, because a review you can skip without noticing is a review nobody does. <ul><li><strong>Both directions, each item once.</strong> Half the items ask you to write the</li> </ul> character from its meaning, half ask what a character means. A 36-kanji review is 18 + 18, not 72 things to write. <ul><li><strong>The answer key is page 2.</strong> Print page 1 on its own to work without it, or</li> </ul> both to hand out and mark. The split and order are seeded from the unit code, so the sheet is identical on every build. <h3>Fixed</h3> <ul><li>Review units were also being rendered by the auto-unit page, producing grammar</li> </ul> "units" of 40 patterns that measured 938 mm — three A4 pages. Unit URLs now come from the content ordinal rather than the ladder number, so adding reviews never moves a URL that is already indexed. <ul><li>The worksheet sitemap only walked chunk-mode levels, so 30 of the 100 new</li> </ul> reviews would never have been discoverable. It walks every level now. <h3>Changed</h3> <ul><li>The course is 507 units. Unit codes after the first review in each level have</li> </ul> shifted, so a browser-saved tick list from before today points at the wrong units. <h2>[1.3.2] — 2026-09-02</h2> <h3>Fixed (the same page-height audit, run over every set and unit)</h3> The kana audit was worth repeating on the other 316 printable pages. It found <strong>50 pages silently printing on two sheets and 22 pages under half full</strong> — none of it visible on screen, because <code>.sheet</code> has <code>min-height: 297mm</code>. <ul><li><strong>Grammar was the worst.</strong> 39 of the 40 N2/N1 auto-units measured about</li> </ul> 390 mm. Units are now <strong>six patterns instead of eight</strong>, and — the real fix — the practice line is elastic: <code>.gstack</code> grows into the free space and each card's writing line takes what is left, down to a 5.5 mm floor. A page of long patterns shrinks its lines instead of spilling onto page two; a page of short ones gets *more* room to write. That one change fixed the overflows and the sparse pages together. <ul><li><strong>Kanji cards got a fourth density.</strong> 11–12 kanji used to split 12 + 1,</li> </ul> leaving a second page 33 % full; they now fit one page at <code>xdense</code>. Sets of 3–4 kanji get roomier two-row boxes instead of half a blank page. Pages are balanced, so 13 kanji print as 7 + 6, never 12 + 1. <ul><li><strong>No more orphan units.</strong> A trailing remainder under a third of a unit (the</li> </ul> 361st N2 kanji, alone on its own sheet) is folded into the last full unit. All 421 printable pages — 100 kana, 100 sets, 221 units — now measure exactly 297 mm, with none under 55 % filled. <code>site/scripts/audit-sheets.mjs</code> covers sets and units as well as single sheets now. <h3>Changed</h3> <ul><li>Levels J and L have more, shorter units (19 → 25 and 21 → 28); the course is</li> </ul> 412 units. <h2>[1.3.1] — 2026-09-02</h2> <h3>Fixed (the beginner path, walked end to end)</h3> <ul><li><strong>Levels A and B are now in study order.</strong> The ladder used to follow the</li> </ul> manifest — all 15 trace sheets, then all 15 recognise, then 20 write — so a learner traced every kana before being asked to recognise あ. Units now go row by row: trace, match, write; the first-strokes sheet is A1, the か–た quiz sits after た, reviews close the basic rows and the dakuten rows. <ul><li><strong>Ten kana sheets were broken.</strong> The review sheets (and the mixed quiz) had</li> </ul> their character list truncated to "あ・い・う・え・お…" — the 46-kana final review printed five characters and an ellipsis in a box. The manifest now carries the full <code>chars</code> list, and those sheets have real titles (五十音 まとめ, か行〜た行 …). <ul><li><strong>26 kana sheets printed on two pages.</strong> Every 5-character match sheet</li> </ul> measured 365 mm and the two 10-character sheets 461 mm. A headless-Chromium audit of all 100 kana sheets now reports every one at exactly 297 mm and at least 61 % filled. The audit lives at <code>site/scripts/audit-sheets.mjs</code>. <h3>Added</h3> <ul><li>Three sheet layouts that existed only in the YAML are now real: large</li> </ul> first-strokes boxes (A1/B1), "read the sound, circle the right kana" quizzes with stable distractors, and memory-review grids. <ul><li><strong>Every unit sheet closes the loop.</strong> Course code and "unit n of 50" in the</li> </ul> header, prev/next in the printed footer, and on screen a "Mark A1 done" button (shared with <code>/course/</code>) next to "Next: A2 →". <h2>[1.3.0] — 2026-09-01</h2> <h3>Added (the course is now the front door)</h3> <ul><li><strong>The homepage leads with the course.</strong> The primary button is the next unit —</li> </ul> "Start at A1", or "Continue at G14" once you have ticked units off — and the A–L ladder is a section on the front page with every level and its unit count. <ul><li><strong>"This is what you print"</strong> renders unit <code>C1</code> live, in a scaled iframe of the</li> </ul> real worksheet page, so a first-time visitor sees the sheet before clicking. <ul><li><strong>Progress you keep.</strong> <code>/course/</code> gives every unit a tick box; ticks live in</li> </ul> your own browser (<code>localStorage</code>, no account, nothing sent anywhere), with per-level counters, a "Continue at …" link and a Clear button. With storage blocked the page is still a plain list of units. <ul><li><strong>34 themed sets for N3 kanji</strong> (level G), replacing the arbitrary</li> </ul> "kanji 1–10" chunks: government and politics, business and the economy, travel and transport, the body, health and illness, feelings, crime and safety, what your hands do, and 26 more. All 354 kanji assigned exactly once. <h3>Changed</h3> <ul><li>Category index pages no longer repeat a print button on every single kanji or</li> </ul> pattern. The themed sets are now the one obvious way to practise, and the flat grid is a compact <strong>"Look one up"</strong> lookup index that links to detail pages only. Side effect: the N1 index dropped 1,231 stroke-order SVG requests. <ul><li>Homepage kanji and grammar counts now include N2 and N1 (2,184 and 521), and</li> </ul> the two cards are no longer mislabelled "JLPT N5". <h2>[1.2.0] — 2026-08-27</h2> <h3>Added (a course, not a pile of sheets)</h3> <ul><li><strong>Course ladder A–L, 403 units</strong> at <code>/course/</code>. Twelve levels — hiragana, katakana,</li> </ul> then kanji and grammar in step from N5 to N1 — where <strong>a unit is one printable sheet</strong>. A learner is no longer "somewhere in N3": they are on <code>G14</code>, unit 14 of 36. <ul><li>Every printable set and unit sheet now carries its course code in the header</li> </ul> (<code>C3</code>, <code>G14</code>) plus "unit 14 of 36", and its footer points to the next unit. <ul><li>Category pages show their level letter and each set's code, and link to the ladder.</li> <li>Levels without themed sets (N3/N2/N1 kanji, N2/N1 grammar) get automatic units —</li> </ul> ten kanji or eight grammar points each — at <code>/worksheets/{category}/unit/{n}/</code>, so all 2,805 sheets have a place in the ladder. 237 new unit sheets. <ul><li><code>/course/</code> carries Course structured data and sits in the nav, the mobile menu</li> </ul> and the sitemap. <h2>[1.1.0] — 2026-08-27</h2> <h3>Added (kanji sets that mean something together)</h3> <ul><li><strong>13 themed N5 sets</strong>, printable as a single sheet each: Numbers 1–10, Hundreds</li> </ul> thousands and yen, Days of the week, Telling time, Where things are, Compass directions, Big small tall white, People and family, School and country, Nature and weather, Coming and going, Everyday verbs, Books words questions. <code>/worksheets/kanji/set/{slug}/</code>, listed on <code>/kanji/</code> and in the sitemap. <ul><li>A learner meets 一二三四五 as one lesson, so 一–十 now print on <strong>one sheet</strong></li> </ul> (a denser card variant keeps a 9–10 kanji set to a single page) instead of ten sheets or an arbitrary 8-per-page slice. <h3>Added (measurement)</h3> <ul><li>Cloudflare Web Analytics enabled on both layouts — site pages and printable</li> </ul> worksheets. Cookie-free, no identifiers, aggregate-only. <code>/privacy/</code> now describes exactly this. <h2>[1.0.0] — 2026-08-27</h2> <h3>Added (JLPT N1 grammar — every JLPT level is now complete)</h3> <ul><li><strong>N1 grammar published</strong> — 165 grammar points (<code>/grammar-n1/</code>, <code>/{lang}/grammar-n1/</code> × 49,</li> </ul> <code>/grammar-n1/{id}/</code> × 165, printable worksheets at <code>/worksheets/grammar_n1/{id}/</code>), each with an English summary, Japanese summary, connection rule and 3 original example sentences (kanji / kana / English), written in the literary register these patterns require. <ul><li>Two native-level review passes machine-diffed all 495 readings against a kana converter and</li> </ul> corrected 10 items — 〜ずにはおかない's doubled ない, 〜にしたところで taking a noun (not V-た), 〜こそすれ with する-nouns, 〜に寄せて needing an offered message, 〜ずして replaced with the set phrase 期せずして, and a register clash in 〜ときては. <ul><li><code>content/master/n1/grammar_n1.yaml</code>; <code>/api/grammar-n1.json</code>; sitemaps, N2 → N1 navigation,</li> </ul> <code>/jlpt/</code> (all five levels ✅), <code>/roadmap/</code>, <code>/embed/</code>, homepage JLPT table. <h3>Milestone</h3> <strong>All five JLPT levels are complete: 2,805 worksheets</strong> — 100 kana, 2,184 kanji (N5–N1) and 521 grammar points (N5–N1), every one of them free, printable and CC BY-SA 4.0. Build: 12,215 files (Cloudflare Pages limit 20,000). <h2>[0.23.0] — 2026-08-27</h2> <h3>Changed (kana worksheets — recall practice)</h3> <ul><li>Kana sheets left <strong>33% of the page blank</strong> and stopped at copying. Each trace,</li> </ul> write and recognize sheet now ends with a <strong>recall block: two rows of boxes prompted by romaji</strong> (write the kana for the sound, from memory) — the step that actually proves you know the character. Blank space: 33% → 11% (recognize sheets 1%). No extra sheets of paper. <h2>[0.22.0] — 2026-08-27</h2> <h3>Changed (worksheet density — less paper, more practice)</h3> <ul><li>Kanji worksheets wasted <strong>52% of every A4 page</strong> and gave only 3 empty practice</li> </ul> boxes. Each sheet now has <strong>20 boxes (2 traced + 18 blank) plus a word-writing line for each example word</strong> — blank space down to 5%, and the sheet finally practises the vocabulary it teaches. <ul><li>New <strong>compact set</strong> for bulk printing: <code>/worksheets/{kanji-category}/compact/</code></li> </ul> puts <strong>8 kanji per page</strong> (stroke order, readings, example words, 5 boxes each). Printing a whole level drops from one sheet per kanji to one eighth: N5 80 → 10 pages, N4 158 → 20, N3 354 → 45, N2 361 → 46, N1 1,231 → 154. <ul><li>Category pages now offer both (compact first for kanji), and say plainly how</li> </ul> many sheets of paper each option costs. Compact pages are in the sitemap. <h2>[0.21.0] — 2026-08-27</h2> <h3>Added (JLPT N1 kanji — every JLPT kanji is now covered)</h3> <ul><li><strong>N1 kanji published</strong> — 1,231 kanji (<code>/kanji-n1/</code>, <code>/{lang}/kanji-n1/</code> × 49,</li> </ul> <code>/kanji-n1/{id}/</code> × 1,231, printable worksheets at <code>/worksheets/kanji_n1/{id}/</code>), generated with <code>build_kanji_level.py --level 1</code> (kanji-data + KanjiVG, 0 SVG failures). <ul><li>Every N1 kanji has a Japanese gloss and 2 example words (word / reading / English).</li> </ul> Four native-level review passes fixed 45 entries — invented or ad-hoc compounds (妊娠初期, 桐箪笥, 収穫量), disputed readings (較差, 豊稔), missing rendaku (鮎釣り → あゆづり), circular glosses, and a loaded wartime slogan replaced. One reviewer machine-checked every word against JMdict/JMnedict via jamdict. <ul><li><strong>Kanji coverage is now complete: 2,184 kanji across N5–N1</strong>, each with stroke order,</li> </ul> readings, a Japanese gloss and example words. <ul><li><code>/api/kanji-n1.json</code>; sitemaps, N2 → N1 navigation, <code>/jlpt/</code>, <code>/roadmap/</code>, <code>/embed/</code></li> </ul> and the homepage JLPT table updated. <ul><li>Site total: <strong>2,640 worksheets</strong>. Build: 11,594 files (Cloudflare Pages limit 20,000).</li> </ul> <h2>[0.20.0] — 2026-08-27</h2> <h3>Added (JLPT N2 grammar — N2 is now complete)</h3> <ul><li><strong>N2 grammar published</strong> — 150 grammar points (<code>/grammar-n2/</code>, <code>/{lang}/grammar-n2/</code> × 49,</li> </ul> <code>/grammar-n2/{id}/</code> × 150, printable worksheets at <code>/worksheets/grammar_n2/{id}/</code>), each with an English summary, Japanese summary, connection rule and 3 original example sentences (kanji / kana / English). Two native-level review passes fixed 10 items (ものだから with a request clause, ではあるまいし and なくてはならない connection rules, こそ formation, てたまらない register, dropped particle in a kana reading, …). <ul><li><code>content/master/n2/grammar_n2.yaml</code> master; <code>/api/grammar-n2.json</code> endpoint; sitemaps,</li> </ul> N3 ↔ N2 grammar navigation, <code>/jlpt/</code> (N2 ✅ 361 kanji + 150 grammar), <code>/roadmap/</code>, <code>/embed/</code>, and the homepage JLPT table updated. <ul><li>Site total: <strong>1,409 worksheets</strong> — 100 kana, 953 kanji (N5–N2), 356 grammar points (N5–N2).</li> </ul> Build: 6,507 files (Cloudflare Pages limit 20,000). <h2>[0.19.0] — 2026-08-26</h2> <h3>Added (SEO content)</h3> <ul><li><strong>Six new pages</strong> targeting the highest-volume beginner queries, all interlinked</li> </ul> with the worksheet sections: <code>/hiragana-chart/</code> and <code>/katakana-chart/</code> (full gojūon + dakuten + yōon tables with romaji, generated from the kana data, each row linked to its tracing sheet), <code>/how-to-learn-hiragana/</code>, <code>/how-to-learn-katakana/</code>, <code>/japanese-stroke-order/</code> and the pillar <code>/how-to-learn-japanese/</code> — ~6,400 words total, each with Article/LearningResource + BreadcrumbList JSON-LD. <ul><li>Homepage: "Start here" guide block, a JLPT level table linking to all seven</li> </ul> kanji/grammar hubs (N5–N2), and counts now derived from the manifest so they can never go stale again. <ul><li><code>/faq/</code> is data-driven and emits <strong>FAQPage</strong> JSON-LD for its 12 questions.</li> <li>Guides linked from the header nav, mobile menu and footer.</li> </ul> <h3>Fixed</h3> <ul><li><strong>Language picker linked to 404s</strong>: on en-only pages it offered 49 locale URLs</li> </ul> that do not exist (~1,200 internal links to 404s). <code>localized</code> now defaults to false and is set explicitly on the 20 pages that really exist in every locale; elsewhere the picker points at the locale home. Site-wide internal link check now reports <strong>0 broken links</strong>. <ul><li>Header nav overflowed between 768–1024px — moved the desktop/mobile breakpoint to <code>lg</code>.</li> <li>Stale copy across the site ("200 worksheets", "Phase 1 covers N5 only",</li> </ul> "800 PDFs in the pipeline"): now 1,259 worksheets, JLPT N5–N2, with /stats/ and the homepage computing the numbers from the manifest. <h2>[0.18.1] — 2026-08-26</h2> <h3>Fixed / Changed (SEO)</h3> <ul><li><strong>hreflang no longer points at 404s</strong>: the ~1,900 en-only detail pages</li> </ul> (kanji*/{id}, grammar*/{id}) emitted 50 hreflang alternates to locale URLs that do not exist. New <code>localized={false}</code> prop suppresses them (canonical kept). <ul><li><strong>sitemap-pages.xml is now generated</strong> (was a stale hand-rolled file):</li> </ul> 17 static pages + 49 locales × 10 localized index pages = 507 URLs, including /kanji-n2/. en category indexes moved into sitemap-worksheets.xml. <ul><li><strong>Unique titles/descriptions</strong> for the 49-locale category index pages</li> </ul> (were all falling back to the site default). <ul><li><strong>Page-level JSON-LD</strong> (LearningResource + BreadcrumbList) on all 1,159</li> </ul> kanji and grammar detail pages. <ul><li>RTL now applied for fa/he/ur (previously only ar).</li> <li>Removed dead Cloudflare Analytics beacon (unconfigured token, render cost).</li> <li>Google Fonts preconnect on printable worksheet pages.</li> </ul> <h2>[0.18.0] — 2026-08-24</h2> <h3>Added (JLPT N2 kanji)</h3> <ul><li><strong>N2 kanji published</strong> — 361 kanji (<code>/kanji-n2/</code>, <code>/{lang}/kanji-n2/</code> × 49, <code>/kanji-n2/{id}/</code> × 361,</li> </ul> printable worksheets at <code>/worksheets/kanji_n2/{id}/</code>) generated with <code>build_kanji_level.py --level 2</code> (kanji-data + KanjiVG), excluding kanji already in N5–N3. <ul><li>Every N2 kanji has a Japanese gloss and 2 reviewed example words (word / reading / English).</li> <li><code>content/master/n2/kanji_n2.yaml</code> master; <code>/api/kanji-n2.json</code> endpoint; sitemap, N3 → N2</li> </ul> navigation, <code>/jlpt/</code> (N2 kanji 361/361), <code>/roadmap/</code>, <code>/embed/</code> updated. <ul><li>Build: 5,890 files (Cloudflare Pages limit 20,000).</li> </ul> <h3>Known gaps</h3> <ul><li>N2 grammar not started.</li> </ul> <h2>[0.17.0] — 2026-08-24</h2> <h3>Added (JLPT N3 kanji)</h3> <ul><li><strong>N3 kanji published</strong> — 354 kanji (<code>/kanji-n3/</code>, <code>/{lang}/kanji-n3/</code> × 49, <code>/kanji-n3/{id}/</code> × 354)</li> </ul> with KanjiVG stroke-order SVGs and printable worksheets at <code>/worksheets/kanji_n3/{id}/</code>. <ul><li><code>content/scripts/build_kanji_level.py</code> — generic N3/N2/N1 builder from</li> </ul> davidluzgouveia/kanji-data (KANJIDIC2) + KanjiVG. Skips kanji already published at a lower level, so N3 = 367 candidates − 13 already in N4 = 354. <ul><li><code>content/master/n3/kanji_n3.yaml</code> master file (N4-compatible schema).</li> <li><code>/api/kanji-n3.json</code> public endpoint; N3 detail pages added to sitemap.</li> <li>N4 → N3 navigation on category pages; <code>/jlpt/</code>, <code>/roadmap/</code>, <code>/embed/</code> updated.</li> </ul> <h3>Added (JLPT N3 grammar)</h3> <ul><li><strong>N3 grammar published</strong> — 136 grammar points (<code>/grammar-n3/</code>, <code>/{lang}/grammar-n3/</code> × 49,</li> </ul> <code>/grammar-n3/{id}/</code> × 136, printable worksheets at <code>/worksheets/grammar_n3/{id}/</code>). Each point has an English summary, Japanese summary, formation rule and 3 original example sentences (kanji / kana / English). Content reviewed for grammar, readings and translations. <ul><li><code>content/master/n3/grammar_n3.yaml</code> master; <code>/api/grammar-n3.json</code> endpoint.</li> <li>Grammar detail pages and printable worksheets now render <code>formation</code> and</li> </ul> <code>examples</code> when present in the manifest (N5/N4 unchanged until backfilled). <h3>Changed (N5/N4 grammar)</h3> <ul><li>All 20 N5 + 50 N4 grammar points now have a Japanese summary, formation rule and</li> </ul> 3 full example sentences (kanji / kana / English) — previously N5 had untranslated kana snippets and N4 only word-level hints. Shown on detail pages, printable worksheets and <code>/api/manifest.json</code>. Masters updated (<code>grammar_n5.yaml</code>, <code>n4/grammar_n4.yaml</code>). <h3>Added (kanji example words)</h3> <ul><li>All 354 N3 kanji now have a Japanese gloss (<code>meaning_ja</code>) and 2 example words</li> </ul> (word / reading / English), reviewed for readings and level. Kun readings trimmed to the 4 most useful, KANJIDIC dot notation → hyphen (こた-える). <ul><li>Example words from the N5/N4 masters (80 + 158 kanji) are now in the manifest</li> </ul> and shown on kanji detail pages and printable worksheets for all three levels. <ul><li>Fixed N4 前 / 後 which had empty readings, meanings and words.</li> </ul> <h2>[0.16.0] — 2026-07-12</h2> <h3>Changed (PR1 / 案A: single-URL worksheets)</h3> <ul><li><strong>Worksheets now live at a single URL per sheet</strong> (<code>/worksheets/{cat}/{id}/</code>, en canonical).</li> </ul> Instructions switch between all 50 languages client-side via a language selector, <code>?lang=</code> parameter, <code>localStorage</code>, or <code>navigator.language</code> (RTL supported for ar/fa/he/ur). <ul><li>New <code>/worksheet-i18n.json</code> endpoint serves the 50-locale instruction dictionary.</li> <li>Removed per-locale worksheet routes (<code>/{lang}/worksheets/<strong></code>) — build shrinks</li> </ul> </strong>13,558 → 1,089 pages (dist 13,917 → 1,449 files)<strong>. Headroom for N3/N2/N1 and vocabulary within the Cloudflare Pages 20,000-file free limit. <ul><li>Category pages, kanji/grammar detail pages, and the 50-language UI keep their</li> </ul> per-locale URLs (unchanged). <ul><li><code>DRAFT_LOCALES</code> page-generation split is obsolete (all 50 locales now share the</li> </ul> same worksheet pages via the client switcher). <h2>[0.15.0] — 2026-07-03</h2> <h3>Added</h3> <ul><li></strong>N4 kanji detail pages<strong> — <code>/kanji-n4/{id}/</code> × 158 with KanjiVG stroke-order SVGs</li> </ul> (downloaded via <code>content/scripts/fetch_kanjivg_n4.py</code>, CC BY-SA 3.0) <ul><li></strong>N4 grammar detail pages<strong> — <code>/grammar-n4/{id}/</code> × 50</li> <li></strong><code>/api/kanji-n4.json</code><strong> — public JSON endpoint for the 158 N4 kanji</li> <li>N4 category cards now link to detail pages; N4 detail URLs added to sitemap</li> </ul> <h3>Fixed</h3> <ul><li>Deployments were failing silently: Cloudflare Pages 20,000-file limit exceeded</li> </ul> (21,419 files after N4 grammar). Draft-UI locales (19) now share the root (en) printable sheets instead of per-locale pages → 13,916 files. <h2>[0.14.0] — 2026-07-03</h2> <h3>Added</h3> <ul><li></strong>JLPT N4 grammar worksheets<strong> (50 sheets) — <code>/grammar-n4/</code> category pages (en + 49 langs),</li> </ul> printable sheets at <code>/worksheets/grammar_n4/{id}/</code> + <code>/worksheets/grammar_n4/all/</code> <ul><li></strong>N5 ↔ N4 grammar cross-links<strong> on grammar category pages</li> <li><code>grammar_n4</code> added to manifest (from <code>content/master/n4/grammar_n4.yaml</code>) and worksheet sitemap</li> </ul> <h3>Build</h3> <ul><li>21,216 HTML pages</li> </ul> <h2>[0.13.0] — 2026-07-03</h2> <h3>Added</h3> <ul><li></strong>JLPT N4 kanji worksheets<strong> (158 sheets) — <code>/kanji-n4/</code> category pages (en + 49 langs),</li> </ul> printable sheets at <code>/worksheets/kanji_n4/{id}/</code> + <code>/worksheets/kanji_n4/all/</code> <ul><li></strong>/worksheets/ hub page<strong> (en + 49 langs) — one place to reach every printable category</li> <li></strong>N5 ↔ N4 cross-links<strong> on kanji category pages</li> <li></strong>🖨 Print link in nav<strong> (desktop + mobile)</li> <li></strong>UI translations for the last 19 languages<strong> (bn, sw, mr, te, ta, pa, ml, gu, kn, ur,</li> </ul> my, am, ha, ig, zu, su, qu, gn, haw) — status <code>machine_draft</code>, native review welcome. All 50 languages now have localized UI. <h3>SEO</h3> <ul><li><code>rel=canonical</code> on every page (BaseLayout + PrintLayout)</li> <li>hreflang × 50 + x-default and meta description on worksheet pages</li> <li>Sitemap restructured: <code>sitemap.xml</code> is now an index →</li> </ul> <code>sitemap-pages.xml</code> (site pages) + <code>sitemap-worksheets.xml</code> (18,250 worksheet URLs) <ul><li>Pagefind indexing scoped to <code><main></code> (<code>data-pagefind-body</code>)</li> </ul> <h3>CI</h3> <ul><li>GitHub Actions workflows enabled (<code>.github/workflows/</code>) — build-pdfs +</li> </ul> manual-fallback Pages deploy (auto-deploy stays on Cloudflare Pages Git integration) <h3>Build</h3> <ul><li>18,616 HTML pages</li> </ul> <h2>[0.12.0] — 2026-05-11 (later)</h2> <h3>Added</h3> <ul><li></strong>Public JSON API<strong> at /api/:</li> </ul> - /api/manifest.json — full sheet catalog (all categories) - /api/kanji.json — 80 N5 kanji with readings + SVG paths - /api/languages.json — Tier 1 50 languages metadata - CORS open, cacheable, no auth needed <ul><li></strong>/embed/ page<strong> — guide for educators to integrate worksheets:</li> </ul> - Hotlink stable URLs - Iframe detail pages - JSON API for dynamic use - Stable URL patterns documented (/kanji/{id}/, /grammar/{id}/, /kanji_svg/{code}.svg, /og/kanji/{id}.png) <ul><li></strong>Featured Kanji on homepage<strong> now baked at build time:</li> </ul> - Deterministic daily rotation (UTC day-of-year mod 80) - SVG stroke order, EN+JA meanings, on/kun readings, link to detail - No JS fetch — fully static, ships under 5KB extra <h3>Docs</h3> <ul><li>BOOTSTRAP_LOG.md fully refreshed: page list, i18n breakdown, remaining tasks</li> <li>CLAUDE.md Phase 1 progress section overhauled</li> </ul> <h3>Build</h3> <ul><li>366 HTML pages + 3 JSON endpoints</li> </ul> <h2>[0.11.0] — 2026-05-11 (later)</h2> <h3>Added</h3> <ul><li></strong>/roadmap/<strong> — Phase 1 → 2 → 3 → 4 timeline visualization</li> </ul> Each phase: status (in-progress/planned/future/vision), done list, remaining list <ul><li></strong>/jlpt/<strong> — JLPT N5 through N1 progression with progress bars</li> </ul> Shows kanji + grammar coverage per level (N5 done, N4 prepped, N3-N1 future) <ul><li></strong>/press-kit/<strong> — brand + media kit: one-liner, colors, logo downloads,</li> </ul> long-form description, quotable stats, contact <ul><li></strong>Featured kanji widget on homepage<strong> — daily-rotating kanji (deterministic</li> </ul> based on UTC day) with SVG stroke order, readings, link to detail <ul><li></strong>All 19 ui-pending languages now have native names in their lang_label<strong></li> </ul> (was 'BN', 'UR', etc. — now 'বাংলা', 'اردو', 'மிற்', 'மலையாளம்', 'Kiswahili', 'Igbo', 'Runa Simi', 'ʻŌlelo Hawaiʻi', etc.) <h3>Changed</h3> <ul><li>Mobile nav now includes Roadmap, JLPT, Languages</li> <li>Footer extended: Roadmap · JLPT · Press · Privacy · Stats links</li> <li>LOCALE_LABELS regenerated to use native names for all 50 langs</li> </ul> <h3>Build</h3> <ul><li>365 HTML pages (was 362 — adds /roadmap/, /jlpt/, /press-kit/)</li> </ul> <h2>[0.10.0] — 2026-05-11 (later)</h2> <h3>Added</h3> <ul><li></strong>N4 kanji COMPLETED<strong>: 156/158 N4 kanji now have stroke counts, on/kun</li> </ul> readings, English meanings, and 2 example words each (was 30/158 → 80/158 → now 156/158, near-complete) <ul><li></strong>N4 grammar 50 topics<strong> with examples (te-form variants, conditionals</li> </ul> たら/ば/と/なら, modal expressions, comparison より/ほうが, time relationships とき/まえに/あとで, concession のに/けれども, etc.) <ul><li></strong>20 grammar-specific OG images<strong> at /og/grammar/{grammar_id}.png</li> </ul> - Each /grammar/grammar_n5_NNN/ now has unique social card <ul><li></strong>Cmd+K / Ctrl+K shortcut<strong> → opens /search/ from any page</li> <li></strong>Search nav link with ⌘K hint<strong> (visible on lg+ viewports)</li> <li></strong>/contribute/ rewritten<strong> with task-list layout:</li> </ul> - 9 specific actionable tasks across Translation/Outreach/Content/Code - Each with badge (⭐ count), time estimate, difficulty - Direct links to the relevant GitHub files/pages <h3>Build</h3> <ul><li>362 HTML pages</li> <li>100 detail-page OG images (80 kanji + 20 grammar)</li> </ul> <h2>[0.9.0] — 2026-05-11 (later)</h2> <h3>Added</h3> <ul><li></strong>80 kanji-specific OG images<strong> at /og/kanji/{kanji_id}.png</li> </ul> - Each kanji detail page (/kanji/kanji_n5_NNN/) has a unique social card - Composited from KanjiVG stroke-order SVG + meaning text + JLPT badge - Sharing /kanji/kanji_n5_001/ on Slack now shows 一 with stroke order <ul><li></strong>/stats/ page<strong> — live numbers from the project:</li> </ul> - 200 worksheet definitions, 800 PDFs in pipeline, 50 languages, 80 kanji SVGs, 362 HTML pages, etc. - Progress bars for language coverage (4/50 full, 27/50 UI translated) - Per-category sheet count table <ul><li></strong>/privacy/ page<strong> — honest privacy policy: no tracking cookies, no marketing,</li> </ul> no fingerprinting; Cloudflare Web Analytics is the only beacon (anonymous, aggregated). Important for GDPR-conscious users in EU/UK regions. <ul><li></strong>Footer links<strong> to /privacy/ and /stats/</li> <li></strong>50 more N4 kanji filled with data<strong> (意, 不, 作, 用, 度, 強, 公, 持, 野,</li> </ul> 以, 思, 家, 世, 多, 正, 安, 院, 心, 界, 教, 文, 元, 重, 近, 考, 画, 海, 売, 知, 道, 集, 別, 物, 使, 品, 計, 死, 特, 私, 始, 朝, 運, 終, 台, 広, 住, 真, 有, 口, 少) - N4 kanji with data: </strong>80/158<strong> (was 30/158) <h3>Changed</h3> <ul><li>CategoryList li hover now adds background tint (visual feedback)</li> <li>Kanji detail pages use their unique OG image instead of the generic one</li> </ul> <h3>Build</h3> <ul><li>362 HTML pages (was 360 — added /stats/ + /privacy/)</li> <li>80 new kanji OG PNGs (~22KB each, ~1.8MB total)</li> </ul> <h2>[0.8.0] — 2026-05-11 (later)</h2> <h3>Added</h3> <ul><li></strong>Mobile hamburger menu<strong> — <code><800px</code> viewport shows ☰ toggle, full drawer</li> </ul> with all nav links (Hiragana, Katakana, Kanji, Grammar, Teachers, Learners, Resources, Languages, About, Contribute, Search) <ul><li></strong>Category-specific PNG OG images<strong> at /og/{category}.png</li> </ul> Each social card now matches the page topic (Hiragana shows あいうえお, Kanji shows 日 一 人 大, etc.) <ul><li></strong>"What's new" navigation strip<strong> on homepage linking /changelog/,</li> </ul> /languages/, /teachers/ <ul><li></strong>30 N4 kanji filled with readings + examples<strong> (会, 同, 事, 自, 社, 発, 者,</li> </ul> 地, 業, 方, 新, 場, 員, 立, 開, 手, 力, 問, 代, 明, 動, 京, 目, 通, 言, 理, 体, 田, 主, 題). Remaining 128 N4 kanji are Phase 2. <h3>Changed</h3> <ul><li></strong>PDF download buttons honor a real availability flag<strong>:</li> </ul> - manifest.json has <code>pdfs_available: false</code> while R2 isn't wired up - Category pages show "📅 PDF coming soon" instead of broken 404 links - Kanji and grammar detail pages show a disabled "Coming soon" pill - "Download all (ZIP)" buttons are conditionally rendered - When R2 is wired up and PDFs uploaded, flipping to <code>true</code> re-enables all download UIs everywhere <h3>Strategy</h3> <ul><li>Going honest: showing dead PDF links would erode trust. "Coming soon"</li> </ul> with a transparent banner explaining the build pipeline is better than silent 404s. <h2>[0.7.0] — 2026-05-11 (latest)</h2> <h3>Added</h3> <ul><li></strong>PNG OG image<strong> at /og-image.png (1200×630, rasterized from SVG via cairosvg)</li> </ul> - Twitter / Slack / LinkedIn social cards now render properly <ul><li></strong>PNG favicons<strong>: favicon.ico (32×32), apple-touch-icon (180×180),</li> </ul> icon-192, icon-512 <ul><li></strong>PWA manifest<strong> (manifest.webmanifest) — installable on mobile</li> <li></strong>/changelog/ page<strong> — renders this file as HTML on the site</li> <li></strong>A11y improvements<strong>:</li> </ul> - Skip-link for keyboard users (Tab on any page → "Skip to content") - <code>role="main"</code>, <code>role="contentinfo"</code>, <code>aria-label</code> on nav and language picker - <code>:focus-visible</code> ring (vermilion 3px outline) on all interactive elements <ul><li></strong>N4 master skeleton populated<strong>: 158 N4 kanji char + id (readings TODO)</li> </ul> <h3>Changed</h3> <ul><li>og-image.svg → og-image.png (PNG works on all social platforms)</li> </ul> <h3>Build</h3> <ul><li>360 HTML pages (was 359 — added /changelog/)</li> </ul> <h2>[0.6.0] — 2026-05-11 (later)</h2> <h3>Added</h3> <ul><li></strong>80 kanji detail pages<strong> at <code>/kanji/{kanji_id}/</code> (e.g. <code>/kanji/kanji_n5_001/</code>)</li> </ul> - Large stroke-order SVG, big kanji glyph, on/kun readings table - Meaning in EN + JA, PDF download button, Prev/Next nav - SEO-optimized title/description per kanji <ul><li></strong>20 grammar detail pages<strong> at <code>/grammar/{grammar_id}/</code></li> </ul> - Topic + summary + JLPT level + PDF download - Prev/Next nav between topics <ul><li>Kanji and grammar cards on category pages now link to detail pages</li> <li>4 more hand-translated UI languages (Hindi, Hebrew, Persian, Finnish)</li> </ul> → ui-ready languages: 27 (was 23) → ui-pending languages: 19 (was 23) <ul><li><code>content/scripts/translate_ui.py</code> — local script to Claude-translate</li> </ul> remaining 19 ui-pending UI files when run by the user with their key <h3>Changed</h3> <ul><li>Plausible Analytics replaced with </strong>Cloudflare Web Analytics<strong></li> </ul> (free, privacy-friendly, no cookies, no script bloat). User just needs to paste their CF Web Analytics token into BaseLayout (token placeholder in place). <h3>Build</h3> <ul><li>359 HTML pages (was 259) — adds 80 kanji + 20 grammar detail pages</li> <li>Sitemap needs regeneration for new pages (next push)</li> </ul> <h2>[0.5.0] — 2026-05-11</h2> <h3>Major: 50-language UI rollout</h3> <ul><li>All 50 Tier 1 languages now accessible at <code>/{code}/</code> URLs</li> </ul> (Mandarin, Hindi, Spanish, French, Arabic, Bengali, Russian, Portuguese, Urdu, German, Swahili, Marathi, Telugu, Turkish, Tamil, Vietnamese, Korean, Italian, Persian, Polish, Ukrainian, Punjabi, Malayalam, Hausa, Igbo, Burmese, Thai, Gujarati, Romanian, Dutch, Kannada, Sundanese, Tagalog, Malay, Hebrew, Greek, Czech, Hungarian, Swedish, Finnish, Norwegian, Amharic, Zulu, Quechua, Guarani, Hawaiian — plus existing en/id/yo/ja) <h3>Three-tier status system replacing the lock icon</h3> <ul><li>✅ </strong>Full content<strong> (4 langs): UI translated + all 200 worksheets</li> <li>🌐 </strong>UI translated<strong> (23 langs): hand-written UI strings, worksheets in</li> </ul> English/Indonesian/Yoruba/Japanese fallback <ul><li>⚙️ </strong>UI pending** (23 langs): English fallback UI, awaiting translation</li> </ul> <h3>Added</h3> <ul><li>50 i18n JSON files in <code>site/src/i18n/</code> (<code>gen_50lang_i18n.py</code> generator)</li> <li><code>RTL_LOCALES</code> set for Arabic, Hebrew, Urdu, Persian — <code>dir="rtl"</code></li> </ul> on <code><html></code> for these locales <ul><li><code>HREFLANG_MAP</code> with proper BCP47 codes per locale</li> <li>50-locale sitemap (~257 URLs)</li> <li>/languages/ rewritten with 3-tier badge system + region grouping</li> <li>Header language picker now scrollable (max-height + overflow)</li> </ul> <h3>Strategy</h3> <ul><li>We acknowledged that locking 46 languages behind 🔒 was overcautious.</li> </ul> Better: ship the UI in all 50, be transparent about what's hand-translated vs machine-pending, let learners browse + invite review contributions. <ul><li>Worksheet content (PDFs) still strict 4-language scope until native</li> </ul> reviewers commit. <h2>[0.4.0] — 2026-05-03 (later)</h2> <h3>Added</h3> <ul><li>50-language Tier 1 roadmap (site/src/data/languages.json)</li> </ul> - 4 live (en, id, yo, ja) + 46 on roadmap with 🔒 lock icon - Mix of high-population languages and linguistic diversity - Includes RTL languages (Arabic, Hebrew, Urdu, Persian) and minority langs (Quechua, Hawaiian, Guaraní) <ul><li>/languages/ page: full grid of 50 languages grouped by region</li> </ul> - Speakers, script, RTL flag per language - "Vote for your language" CTA → GitHub Discussions <ul><li>Language picker (header dropdown) now shows '🔒 + 46 more languages →' link</li> <li>Homepage now teases 50-language roadmap</li> <li>Languages link added to top nav</li> <li>/languages/ added to sitemap.xml</li> </ul> <h3>Strategy</h3> <ul><li>Phase 1 stays focused on 3 'live' languages — won't ship machine-translated</li> </ul> worksheets without native reviewer (trust > scale) <ul><li>Roadmap signals ambition without overpromising</li> <li>Native reviewer commitment is the explicit prioritization signal</li> </ul> <h2>[0.3.0] — 2026-05-03 (later)</h2> <h3>Added</h3> <ul><li>80 KanjiVG SVG files for all N5 kanji (CC BY-SA 3.0, attributed)</li> <li>Kanji cards on the site now show stroke order SVG inline (lazy-loaded)</li> <li>/donate/ — honest 'we want time, not money' page with Phase 2 plans</li> <li>/sitemap.xml — hand-rolled (28 URLs, since @astrojs/sitemap incompatible)</li> <li>robots.txt now references sitemap</li> <li>Plausible Analytics script enabled (needs account at plausible.io)</li> <li>JSON-LD structured data (EducationalOrganization) in BaseLayout</li> <li>Japanese explanations (meaning_ja_default) for all 80 N5 kanji</li> <li>N4 master skeletons (kanji_n4.yaml + grammar_n4.yaml) for Phase 2</li> <li>/learners/ — 30-day starter path for self-learners</li> <li>/resources/ — curated free Japanese-learning resources</li> <li>/faq/ — common questions answered</li> <li>README.md, CONTRIBUTING.md as proper repo entry points</li> </ul> <h2>[0.2.0] — 2026-05-03</h2> <h3>Added</h3> <ul><li>🌐 Site live at https://japaneseness.com (Cloudflare Pages, custom domain, SSL)</li> <li>4 languages: English, Bahasa Indonesia, Yorùbá, 日本語</li> <li>200 worksheets per language defined: 50 hiragana + 50 katakana + 80 N5 kanji + 20 N5 grammar</li> <li>80 N5 kanji with 163 example words + Japanese explanations</li> <li>6 XeLaTeX templates (base, hiragana_trace/recognize/write, kanji_sheet, grammar_sheet)</li> <li>New site pages: /teachers/, /learners/, /resources/, /faq/, /search/, /contribute/, /about/</li> <li>Pagefind full-text search across 4 languages (~330 indexed words)</li> <li>Cloudflare Pages auto-deploy from GitHub main branch</li> <li>public/_headers (security + cache rules), _redirects (www → apex)</li> <li>og-image.svg (1200×630 social card)</li> </ul> <h3>Changed</h3> <ul><li>Site converted to monorepo (<code>site/</code> + <code>content/</code>) under <code>toriiyu/japaneseness</code></li> <li>Manifest now lists all 200 sheets per category with rich per-sheet metadata</li> <li>CategoryList component groups by trace/recognize/write for kana, shows readings for kanji</li> <li>Removed Astro i18n fallback (was generating 60+ erroneous URL paths)</li> </ul> <h3>Known issues</h3> <ul><li>PDF download links 404 (R2 bucket on wrong account, full pipeline run pending)</li> <li>Sitemap not generated (@astrojs/sitemap incompatible with current Astro 4.16 + i18n combo)</li> <li>GitHub Actions workflows live in <code>_pending_workflows/</code> (PAT lacked <code>workflow</code> scope)</li> </ul> <h2>[0.1.0] — 2026-04-26</h2> <h3>Added</h3> <ul><li>Initial scaffold (CLAUDE.md project brief, site/, content/, R2 + Pages plan)</li> <li>5 starter hiragana sheets (あ-row only)</li> <li>bootstrap.sh + cf_bootstrap.sh helper scripts</li> </ul> <p class="text-xs text-ink/40 mt-12"> Live version: <a href="https://github.com/toriiyu/japaneseness/blob/main/CHANGELOG.md">github.com/toriiyu/japaneseness/blob/main/CHANGELOG.md</a> </p> </article> </main> <footer class="border-t border-ink/10 py-8 mt-12 text-sm text-ink/70" role="contentinfo"> <div class="container-wide flex flex-col md:flex-row md:items-center md:justify-between gap-2"> <span>© 2026 Japaneseness — Japanese learning worksheets — free, printable, in your language.</span> <span class="flex flex-wrap gap-x-2 gap-y-1"> <a href="/how-to-learn-japanese/" class="text-ink/70">Learn Japanese</a> <span class="text-ink/30">·</span> <a href="/hiragana-chart/" class="text-ink/70">Hiragana chart</a> <span class="text-ink/30">·</span> <a href="/katakana-chart/" class="text-ink/70">Katakana chart</a> <span class="text-ink/30">·</span> <a href="/japanese-stroke-order/" class="text-ink/70">Stroke order</a> <span class="text-ink/30">·</span> <a href="/workbook/" class="text-ink/70">Books</a> </span> <span> <a href="https://creativecommons.org/licenses/by-sa/4.0/" rel="license"> Licensed under CC BY-SA 4.0 </a> <span class="mx-2 text-ink/30">·</span> <a href="/privacy/" class="text-ink/70">Privacy</a> <span class="mx-2 text-ink/30">·</span> <a href="/stats/" class="text-ink/70">Stats</a> <span class="mx-2 text-ink/30">·</span> <a href="/roadmap/" class="text-ink/70">Roadmap</a> <span class="mx-2 text-ink/30">·</span> <a href="/jlpt/" class="text-ink/70">JLPT</a> <span class="mx-2 text-ink/30">·</span> <a href="/press-kit/" class="text-ink/70">Press</a> <span class="mx-2 text-ink/30">·</span> <a href="/embed/" class="text-ink/70">Embed/API</a> </span> </div> </footer> </body></html>