Wenbun is an open-source app for learning Chinese characters through interactive writing practice and spaced repetition. It combines flashcard-style review with stroke-by-stroke training and will be available on desktop, web, and mobile (Android, iOS).
"Wenbun" combines the Mandarin (wén) and Japanese (bun) readings of 文, meaning "character" or "writing."
Naming it Wenbun might be shooting ourselves in the foot. It pretty much commits us to supporting Japanese too.
- Character Writing Practice: Practice stroke order with real-time feedback using hanzi-writer.
- Spaced Repetition Scheduling: Uses the FSRS algorithm to optimize review timing.
- Preloaded Vocabulary Decks: Includes HSK vocabulary lists.
- Previously Studied Cards: Tag and prioritize cards you've already studied in another system for faster integration.
- Add support for Japanese Kanji (JLPT levels)
- Add Chinese dictionary lookup
- Manual/Freeform stroke input (no guidance)
- Join us on Discord
- Backend server repo: wenbun-server — currently only used for profile data sync.
- Core functionality (learning, reviews, writing practice, and scheduling) is client-side and does not require the backend.
-
hanzi-writer — stroke animation and writing feedback
-
hanzi-writer-data — Chinese stroke data
-
makemeahanzi — Free, open-source Chinese character data
-
Open FSRS — scheduling algorithm
-
complete-hsk-vocabulary — Chinese vocabulary data
-
opencc-js — Chinese character conversion
-
pinyin-zhuyin — pinyin to zhuyin/bopomofo conversion
-
PyJyutping — Cantonese romanization conversion
-
audio-cmn — Mandarin pronounciation recording data
-
Lingua Libre — Mandarin and Cantonese pronounciation recording data
- Web: Svelte
- Desktop/Mobile: Tauri
- Stay Connected: Follow updates, join discussions, give feedback, and report bugs on our Discord server.
- Develop:
Clone with submodules
git clone --recurse-submodules https://github.com/ray-pH/wenbun.git
Install dependencies:
npm installWeb version:
npm run devDesktop/Mobile (Tauri):
npm run tauri devnpm run dev fails with ENOSPC: System limit for number of file watchers reached, watch <SOME_DIR>
You can either increase the number of watchers
or ignore the directory in vite (example with static/wenbun-assets):
diff --git a/vite.config.js b/vite.config.js
index ddedcb4d..ae269c02 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -50,7 +50,7 @@ export default defineConfig(async () => ({
: undefined,
watch: {
// 3. tell vite to ignore watching `src-tauri`
- ignored: ["**/src-tauri/**"],
+ ignored: ["**/src-tauri/**", "**/static/wenbun-assets/**"],
},
},
}));For Android builds, ensure the correct version name is set in src-tauri/gen/android/app/tauri.properties. You may need to update this file manually before deployment.