{"id":47740597,"url":"https://github.com/featurequest/practice-japanese","last_synced_at":"2026-04-07T20:01:27.700Z","repository":{"id":348570355,"uuid":"1181155830","full_name":"featurequest/practice-japanese","owner":"featurequest","description":"Practice japanese resources","archived":false,"fork":false,"pushed_at":"2026-04-02T19:21:24.000Z","size":7670,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-03T08:32:34.850Z","etag":null,"topics":["japanese","kana","studying","studying-tool"],"latest_commit_sha":null,"homepage":"https://featurequest.github.io/practice-japanese/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/featurequest.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-13T20:09:23.000Z","updated_at":"2026-04-02T19:20:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/featurequest/practice-japanese","commit_stats":null,"previous_names":["featurequest/practice-japanese"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/featurequest/practice-japanese","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featurequest%2Fpractice-japanese","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featurequest%2Fpractice-japanese/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featurequest%2Fpractice-japanese/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featurequest%2Fpractice-japanese/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/featurequest","download_url":"https://codeload.github.com/featurequest/practice-japanese/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featurequest%2Fpractice-japanese/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31526666,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["japanese","kana","studying","studying-tool"],"created_at":"2026-04-02T23:43:13.995Z","updated_at":"2026-04-07T20:01:27.694Z","avatar_url":"https://github.com/featurequest.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Japanese Practice\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Data: CC BY-SA 3.0](https://img.shields.io/badge/Data-CC%20BY--SA%203.0-lightblue.svg)](https://creativecommons.org/licenses/by-sa/3.0/)\n\nGenerate printable flash cards, handwriting practice sheets, reference charts, and stroke order guides for all hiragana and katakana characters. Also includes a web-based vocabulary builder for creating custom JLPT vocabulary PDFs.\n\n\u003e **Educational use only.** All materials are intended for personal study and practice. Vocabulary data is sourced from community-maintained dictionaries and may contain errors or omissions. Always verify with authoritative references when accuracy matters.\n\nProduces five types of PDF:\n- **Flash cards** — 208 double-sided cards (104 hiragana + 104 katakana) arranged in a 3×3 grid on A4 pages, designed for duplex printing and cutting.\n- **Practice sheets** — Landscape A4 pages with 2cm grid boxes. Each character gets 3 rows: the first box shows the KanjiVG stroke-order character, the rest are empty for handwriting practice. Boxes include dashed cross guides for centering.\n- **Reference charts** — Landscape A4 pages with the standard gojūon table layout: basic characters, dakuten/handakuten, and yōon combinations with romaji labels.\n- **Stroke order** — Portrait A4 pages with KanjiVG stroke diagrams and numbered indicators for each character, split into basic, dakuten, and combination sections for readability.\n- **Vocabulary reference** — Per-JLPT-level (N5–N1) vocabulary PDFs in English and Swedish, sourced from JMdict. Each level contains all words for that level with meanings, POS, register tags, and antonyms.\n\n## Quick Start\n\n```bash\npip install -r requirements.txt\npython generate.py --setup      # verify prerequisites\npython generate.py --kana       # generate flash cards → output/kana_flashcards.pdf\n```\n\nRequires Python 3.10+ and [ReportLab](https://www.reportlab.com/). The Klee One font is bundled.\n\n## Downloads\n\nDownload the latest pre-built PDFs:\n\n- [Flash cards 55×82mm](https://github.com/featurequest/practice-japanese/releases/latest/download/flashcards-55x82.pdf)\n- [Flash cards 63×88mm](https://github.com/featurequest/practice-japanese/releases/latest/download/flashcards-63x88.pdf)\n- [Flash cards 74×105mm](https://github.com/featurequest/practice-japanese/releases/latest/download/flashcards-74x105.pdf)\n- [Practice sheets — Hiragana](https://github.com/featurequest/practice-japanese/releases/latest/download/practice-hiragana.pdf)\n- [Practice sheets — Katakana](https://github.com/featurequest/practice-japanese/releases/latest/download/practice-katakana.pdf)\n- [Reference chart](https://github.com/featurequest/practice-japanese/releases/latest/download/chart.pdf)\n- [Reference chart — Hiragana](https://github.com/featurequest/practice-japanese/releases/latest/download/chart-hiragana.pdf)\n- [Reference chart — Katakana](https://github.com/featurequest/practice-japanese/releases/latest/download/chart-katakana.pdf)\n- [Stroke order](https://github.com/featurequest/practice-japanese/releases/latest/download/stroke-order.pdf)\n- [Stroke order — Hiragana](https://github.com/featurequest/practice-japanese/releases/latest/download/stroke-order-hiragana.pdf)\n- [Stroke order — Katakana](https://github.com/featurequest/practice-japanese/releases/latest/download/stroke-order-katakana.pdf)\n- [Vocabulary N5 (EN)](https://github.com/featurequest/practice-japanese/releases/latest/download/vocabulary_n5.pdf)\n- [Vocabulary N5 (SV)](https://github.com/featurequest/practice-japanese/releases/latest/download/vocabulary_sv_n5.pdf)\n- [Vocabulary N4 (EN)](https://github.com/featurequest/practice-japanese/releases/latest/download/vocabulary_n4.pdf)\n- [Vocabulary N4 (SV)](https://github.com/featurequest/practice-japanese/releases/latest/download/vocabulary_sv_n4.pdf)\n- [Vocabulary N3 (EN)](https://github.com/featurequest/practice-japanese/releases/latest/download/vocabulary_n3.pdf)\n- [Vocabulary N3 (SV)](https://github.com/featurequest/practice-japanese/releases/latest/download/vocabulary_sv_n3.pdf)\n- [Vocabulary N2 (EN)](https://github.com/featurequest/practice-japanese/releases/latest/download/vocabulary_n2.pdf)\n- [Vocabulary N2 (SV)](https://github.com/featurequest/practice-japanese/releases/latest/download/vocabulary_sv_n2.pdf)\n- [Vocabulary N1 (EN)](https://github.com/featurequest/practice-japanese/releases/latest/download/vocabulary_n1.pdf)\n- [Vocabulary N1 (SV)](https://github.com/featurequest/practice-japanese/releases/latest/download/vocabulary_sv_n1.pdf)\n\n### Reading practice\n\n- [Momotarō](https://github.com/featurequest/practice-japanese/releases/latest/download/story_momotaro.pdf)\n- [Urashima Tarō](https://github.com/featurequest/practice-japanese/releases/latest/download/story_urashima.pdf)\n- [Kaguya-hime](https://github.com/featurequest/practice-japanese/releases/latest/download/story_kaguya.pdf)\n- [Tsuru no Ongaeshi](https://github.com/featurequest/practice-japanese/releases/latest/download/story_tsuru.pdf)\n- [Issun Bōshi](https://github.com/featurequest/practice-japanese/releases/latest/download/story_issunboshi.pdf)\n\n## Web App — Vocabulary Builder\n\nThe site at [featurequest.github.io/practice-japanese](https://featurequest.github.io/practice-japanese/) includes an interactive vocabulary builder. Search 7,500+ JLPT words (N5–N1), select the ones you want, and download a custom vocabulary PDF — client-side, no server required.\n\n### Running locally\n\n```bash\ncd web-src\nnpm install\nnpm run dev        # starts Vite dev server at http://localhost:5173\n```\n\n`npm run dev` uses the pre-built `public/vocab.json`. If `data/vocabulary.json` has been updated and you want the web app to reflect the latest data, regenerate it first:\n\n```bash\ncd web-src\nnode scripts/build-vocab-data.js   # reads ../../data/vocabulary.json, writes public/vocab.json\n```\n\n`npm run build` runs this script automatically as a `prebuild` step before compiling the site.\n\n### Running tests\n\n```bash\ncd web-src\nnpm test\n```\n\n## Examples\n\n**Flash cards — front (character) and back (romaji + stroke order):**\n\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"docs/example_flashcards_front.jpg\" width=\"45%\" /\u003e\n  \u003cimg src=\"docs/example_flashcards_back.jpg\" width=\"45%\" /\u003e\n\u003c/p\u003e\n\n**Practice sheet:**\n\n\u003cimg src=\"docs/example_practice.jpg\" width=\"90%\" /\u003e\n\n**Reference chart:**\n\n\u003cimg src=\"docs/example_chart.jpg\" width=\"90%\" /\u003e\n\n**Stroke order:**\n\n\u003cimg src=\"docs/example_stroke_order.jpg\" width=\"45%\" /\u003e\n\n**Vocabulary reference:**\n\n\u003cimg src=\"docs/example_vocabulary.jpg\" width=\"90%\" /\u003e\n\n## Coverage\n\nEach script includes:\n- 46 basic gojūon (あ→ん / ア→ン)\n- 20 dakuten variants (が, ざ, だ, ば / ガ, ザ, ダ, バ)\n- 5 handakuten variants (ぱ行 / パ行)\n- 33 yōon combinations (きゃ, しゅ, ちょ, etc.)\n\n## Card Layout\n\n| Front | Back |\n|-------|------|\n| Large kana character | Romaji reading |\n| Type label (hiragana/katakana) | Stroke order diagram |\n\nCards are 55×82mm (roughly A7), printed 9 per A4 sheet with cut lines.\n\n## Usage\n\nAll commands go through `python generate.py`. Run without arguments to see help.\n\n### Kana\n\n```bash\npython generate.py --kana                              # Flash cards (208 cards)\npython generate.py --kana --hiragana-only              # Hiragana only\npython generate.py --kana --katakana-only              # Katakana only\npython generate.py --kana -o my_cards.pdf              # Custom output path\n\npython generate.py --kana --practice                   # Practice sheets\npython generate.py --kana --practice --hiragana-only\n\npython generate.py --kana --chart                      # Reference chart\npython generate.py --kana --chart --hiragana-only\n\npython generate.py --kana --stroke-order               # Stroke order guide\npython generate.py --kana --stroke-order --hiragana-only\n\npython generate.py --kana --card-width 63 --card-height 88   # Custom card size (mm)\n```\n\n### Vocabulary\n\n```bash\npython generate.py --vocabulary --jlpt n5              # N5 English  → output/vocabulary_n5.pdf\npython generate.py --vocabulary --jlpt n5 --lang sv    # N5 Swedish  → output/vocabulary_sv_n5.pdf\npython generate.py --vocabulary --jlpt n3              # N3 English  → output/vocabulary_n3.pdf\npython generate.py --anki --jlpt n5                    # N5 Anki deck  → output/anki_n5.apkg\npython generate.py --anki                              # All levels     → output/anki_n5.apkg … anki_n1.apkg + anki_all.apkg\n```\n\n### Stories\n\n```bash\n# Generate story PDFs\npython generate.py --stories                           # All folk tales → output/story_*.pdf\n```\n\n### Maintenance\n\n```bash\npython generate.py --setup                             # Check prerequisites; auto-build vocabulary data if missing\npython generate.py --build-vocabulary                  # Force rebuild data/vocabulary.json (~50MB download)\n```\n\n### Developer\n\n```bash\npython generate.py --update-strokes     # Re-download KanjiVG and regenerate stroke data\npython generate.py --generate-examples  # Regenerate example images in docs/ (requires poppler-utils)\n```\n\n## Printing\n\n1. Print the PDF double-sided with **long-edge flip**\n2. Cut along the gray grid lines\n3. Each card's front (character) aligns with its back (romaji + strokes)\n\nAdjust `BACK_PAGE_OFFSET_Y` in `config.py` if your printer's duplex alignment is off.\n\n## Configuration\n\nAll tunables are in `config.py`. Values use ReportLab's `mm` unit.\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `CARD_WIDTH` | 55mm | Card width (also settable via `--card-width`) |\n| `CARD_HEIGHT` | 82mm | Card height (also settable via `--card-height`) |\n| `BACK_PAGE_OFFSET_Y` | -2.0mm | Vertical shift for back page content to compensate for duplex misalignment. Positive = up, negative = down |\n| `KANA_FONT_SIZE` | 34mm | Large character size on card front |\n| `ROMAJI_FONT_SIZE` | 8mm | Romaji text size on card back |\n| `LABEL_FONT_SIZE` | 3mm | \"hiragana\"/\"katakana\" label size on card front |\n| `STROKE_LINE_WIDTH` | 0.8mm | Stroke diagram line thickness |\n| `STROKE_DOT_RADIUS` | 1.0mm | Stroke start-point dot size |\n| `STROKE_COLORS` | list of 6 RGB tuples | Per-stroke colors cycling indigo→emerald→red→amber→violet→cyan |\n| `CUT_LINE_WIDTH` | 0.2mm | Cut guide line thickness |\n| `CUT_LINE_COLOR` | (0.7, 0.7, 0.7) | Cut guide line color (light gray) |\n\nGrid layout (`COLS`, `ROWS`, `MARGIN_X`, `MARGIN_Y`) is auto-computed from the card and page sizes so cards are always centered on A4.\n\n## Licenses and Attribution\n\n### Stroke Data — KanjiVG\n\nStroke order data derived from [KanjiVG](https://kanjivg.tagaini.net/) by Ulrich Apel, licensed under [Creative Commons Attribution-ShareAlike 3.0](https://creativecommons.org/licenses/by-sa/3.0/).\n\nAdaptations: SVG stroke paths extracted, dakuten/handakuten/yōon variants composed from base characters for flash card and practice sheet rendering.\n\n### Vocabulary Data\n\n`data/vocabulary.json` is built from two sources:\n\n**JLPT word lists** by Jonathan Waller (https://www.tanos.co.uk/jlpt/), used with permission. Lists cover N5–N1 vocabulary.\n\n**JMdict** by the Electronic Dictionary Research and Development Group (https://www.edrdg.org/), licensed under [Creative Commons Attribution-ShareAlike 3.0](https://creativecommons.org/licenses/by-sa/3.0/). Provides multilingual meanings, part of speech, register tags, and antonyms.\n\n### Fonts\n\n- **[Klee One SemiBold](https://github.com/fontworks-fonts/Klee)** by Fontworks — used for all Japanese text and labels. Licensed under the [SIL Open Font License 1.1](fonts/OFL-KleeOne.txt).\n\n### Python Dependencies\n\n| Package | License | Use |\n|---------|---------|-----|\n| [ReportLab](https://www.reportlab.com/) | BSD | PDF generation |\n| [pykakasi](https://github.com/miurahr/pykakasi) | GPL-3.0-or-later | Romaji generation (build-time only) |\n| [genanki](https://github.com/kerrickstaley/genanki) | MIT | Anki deck export |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeaturequest%2Fpractice-japanese","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffeaturequest%2Fpractice-japanese","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeaturequest%2Fpractice-japanese/lists"}