I like WaniKani, I hate Anki and the existing easy mining products never felt like they are worth the money. So now we have this - a simple, selfhosted, free helper app built around immersion into Japanese.
Goi uses WaniKani style lessons and reviews and comes with a browser extension for mining the content you consume.
It's not exactly polished, but it does the job good enough for the price you're paying.
This has all the features you'd want to enjoy japanese content and enough to learn the language. It has a video player, it supports youtube transcripts, easy subtitle word definition look up or mining.
In short it:
- Teaches new vocabulary through lessons and a simple, predictable review schedule.
- Mines words with their sentence, source, and media from webpages, YouTube, and local videos.
- Shows you comprehension for a given video, webpage or a subtitle line.
- Tracks words learned elsewhere and allows you to export them.
- Keeps everything on your machine and allows for simple backups.
The review system is intentionally fixed rather than FSRS-based. Predictable reviews are easier to plan around, and the goal is to get back to immersion rather than card solving.
The easiest way to run Goi is with Docker:
docker compose up -d --buildThen open http://127.0.0.1:8080. Application data and local backups live in separate Docker volumes.
Prebuilt images for linux/amd64 and linux/arm64 are published to
ghcr.io/tomasmik/goi on every release. latest tracks the newest stable
release, and each release is also tagged by version, such as v0.2.0.
Pre-releases only get their version tag. To use it instead of building
locally:
docker run -d --name goi -p 8080:8080 \
-e APP_BACKUP_DIR=/backups \
-v goi-data:/data -v goi-backups:/backups \
ghcr.io/tomasmik/goi:latestWith Compose, set image: ghcr.io/tomasmik/goi:latest in compose.yaml,
remove the build section, and run docker compose up -d.
To run from source, install Go 1.26.6 and use:
APP_DATA_DIR="$PWD/data" APP_AUTH_MODE=false go run ./cmd/serverThe first start creates the database and downloads the local dictionary.
Jiten Global and Novel frequency lists download in the background and are
checked weekly. Word badges show their original ranks as G 039 and N 036;
lower ranks mean more frequent word forms. — means no rank is available.
Frequency data is adapted from Jiten
under CC BY-SA 4.0. The local
jiten.sqlite cache can be downloaded again and is excluded from study backups.
Goi runs without a login by default. For a typical Docker installation, create
a .env file next to compose.yaml:
GOI_PORT=8080
APP_BASE_URL=http://localhost:8080
APP_TIME_ZONE=Europe/Vilnius
APP_AUTH_MODE=true
APP_AUTH_USERNAME=your-username
APP_AUTH_PASSWORD=use-a-long-unique-password
APP_BASE_URL must be the address you actually use to reach Goi, including
HTTPS when it sits behind a reverse proxy or tunnel.
Google Drive backups, translation, example generation, and the browser extension are configured from Settings inside the app.
Download the Chrome extension from Settings → Browser extension. It can analyze ordinary webpages, capture selected text, work with YouTube captions, and play local videos with SRT, WebVTT, ASS, or SSA subtitles.
See the extension guide for installation, shortcuts, privacy, and current limitations.
We provide multiple ways to do translations. Sadly Azure has the best free plan so that's what is implemented for non AI translations. Half the time I can't even login to Azure because it doesn't work, so sorry if you have to suffer to set it up.
There is also AI based translation though, so feel free to use that.
There is no frontend package install or extension build step. See CONTRIBUTING.md to run the project and TESTING.md for the checks that matter before a release.
Goi uses the Sustainable Use License. Third-party notices are listed in NOTICE.
