Hey there! Thanks for checking out KanaDojo — we're genuinely glad you're here. Whether you're fixing a typo, adding new kanji, or building a brand-new feature, your time and effort matter a lot. This project exists to make learning Japanese beautiful and fun, and we’d love for you to be part of it.
There’s more than one way to help out here. Some folks code, some write, some test, and some just ask the right questions. All are welcome.
You can:
- 🐛 Report bugs (spelling mistakes count too!)
- 💬 Suggest new features or UI tweaks
- 🧠 Improve documentation (like this file!)
- 🎨 Add new themes or Japanese fonts
- ✏️ Expand vocabulary and kanji datasets
- 🧩 Help with accessibility or localization
- 🧰 Refactor small pieces of code for clarity
If you’re new to open source, this is a great place to start. We’ve tagged some issues as good first issue to help you find friendly entry points.
Before you jump in, make sure your environment is ready:
- Node.js 18+
- npm 10+ (comes with Node)
# 1. Fork the repo
https://github.com/lingdojo/kanadojo/fork
# 2. Clone your fork
git clone https://github.com/<your-username>/kanadojo.git
cd kanadojo
# 3. Add the original repo as upstream (to stay in sync)
git remote add upstream https://github.com/lingdojo/kanadojo.git
# 4. Install dependencies
npm install
# 5. Start the dev server
npm run devNow head to http://localhost:3000 and you should see KanaDojo running. You can explore the three main dojos — Kana, Kanji, and Vocabulary — and their game modes.
If you run into issues, try clearing the cache with:
rm -rf .next node_modules && npm installThat usually does the trick.
You’ll notice a clean layout when you open the codebase:
kanadojo/
├── app/ # Next.js App Router pages
├── components/ # Reusable UI & Dojo components
├── store/ # Zustand state management
├── static/ # Kana, Kanji, and Vocabulary data
├── lib/ # Custom hooks and utilities
├── public/ # Assets (sounds, wallpapers)
└── tailwind.config.js # Styling setup
If you're here to make code changes, focus on components/, store/, or lib/.
If you're here for content (themes, fonts, vocab, kanji), go straight to static/.
Here’s how to keep things tidy:
-
Create a new branch for your change:
git checkout -b feat/dark-mode-improvements
-
Code style:
- We use TypeScript for type safety.
- Keep components small and readable.
- Follow Tailwind conventions and use the helper
cn()fromlib/utils.ts.
-
Commit messages: Use Conventional Commits — it keeps the history neat.
feat(theme): add random theme shuffle fix(vocab): correct typo in N5 wordlist docs(readme): update setup instructions -
Run linting before pushing:
npm run lint
-
Test your feature manually. Make sure all four game modes still behave correctly: Pick, Reverse-Pick, Input, Reverse-Input.
If your change affects visuals (themes, fonts, UI), take a quick screenshot or GIF for your PR. Reviewers will love you for it.
When your change is ready:
-
Push your branch to your fork:
git push origin feat/dark-mode-improvements
-
Open a pull request against the
mainbranch oflingdojo/kanadojo. -
In your PR description:
- Explain what problem you solved and why it matters.
- Include screenshots for visual changes.
- Add reproduction steps if it’s a bug fix.
- Mention related issue numbers (e.g., “Fixes #123”).
We try to review PRs within a few days, but remember: this is a volunteer-driven project. If you don’t hear back quickly, a polite ping is totally fine.
If your PR isn’t accepted right away — don’t sweat it. We’ll help you refine it.
If you find something broken or confusing, open an issue!
Please include:
- What you were trying to do
- What you expected to happen
- What actually happened (screenshots help!)
- Your browser + OS info
Before opening a new issue, check if it already exists — we might already be on it.
For feature requests, be descriptive. Tell us why the feature helps learners. For example:
“Add keyboard hotkeys for fast input during Pick mode.”
That kind of detail makes it easier to prioritize.
KanaDojo follows the spirit of the Contributor Covenant. In short: be kind, be respectful, and make space for everyone to learn.
If you ever feel uncomfortable or see behavior that crosses the line, reach out privately to the maintainers through GitHub.
If you’re stuck or just want to talk about an idea:
- Open a GitHub Discussion or issue.
- Drop a comment on a related PR.
We’re friendly folks — promise. 🙂
Typical response time is within a few days. We’re doing this for the love of Japanese and clean code.
- Small PRs are easier to review than massive ones. Break things up when you can.
- Don’t worry about perfection. We’d rather have your ideas early than never.
- If something’s unclear, ask. That’s how we improve docs like this one.
- Be mindful that this repo is deployed on Vercel, so major changes may affect build times.
Seriously — thanks for taking the time to read this. Every contribution, big or small, keeps KanaDojo growing.
がんばって! (Ganbatte — do your best!)