Yomiアプリ is a local-first Japanese reading application for EPUB, PDF, and plain-text novels. It combines a paged or scrolling reader with dictionary lookup, furigana, Word Bank tracking, Anki export, local search, learning analytics, optional Supabase sync, and an optional local AI assistant.
The core reading workflow runs on the local machine. SQLite is the canonical local store for application data. SQLite FTS5 with BM25 ranking is the derived text-search index for exact Japanese phrases and vocabulary.
The reader and local search continue to work without Anki, Supabase, or the local AI runtime.
Clone the repository and install dependencies:
git clone https://github.com/corneliuschee/yomiapuri.git
cd yomiapuri
npm install
Start the development server:
npm run dev
Open http://localhost:3000 in a browser.
For a normal non-watch run:
npm start
Create a local environment file from the example:
Copy-Item .env.example .env
The .env file is ignored by Git. Use it for local model paths and runtime settings.
The reader assistant uses a llama.cpp-compatible runtime and local GGUF models. The example configuration uses Sugoi 14B Ultra Q4 and Q3 models:
LLAMA_SERVER_PATH=D:\YomiApuriModels\llama-tools\...\llama-server.exe
SUGOI_Q4_MODEL_PATH=D:\YomiApuriModels\Sugoi-14B-Ultra-GGUF\Sugoi-14B-Ultra-Q4_K_M.gguf
SUGOI_Q3_MODEL_PATH=D:\YomiApuriModels\Sugoi-14B-Ultra-GGUF\Sugoi-14B-Ultra-Q3_K_M.gguf
LLAMA_GPU_LAYERS=24
LLAMA_IDLE_TIMEOUT_SECONDS=600
Suggested starting points:
The assistant starts when a message is sent and can stop after the configured idle timeout. Assistant messages are kept in the current browser session and are not written to the application database.
The assistant accepts the current reader message, the selected page context, and a short rolling conversation history. Translation, explanation, recap, and question handling use the same selected model.
On Windows, the app can open Anki Desktop automatically when AnkiConnect is unavailable. Exports use AnkiConnect so custom note types, fields, media, and note IDs are preserved.
The dictionary manager supports:
Enabled term dictionaries appear in reader lookup in their configured order. Frequency dictionaries provide frequency badges. The Word Bank dictionary selector chooses the dictionary used for Word Bank meanings. Full dictionary details are loaded only for matching lookup entries.
The Insights page provides the local text-search index controls:
Text search uses the same Japanese normalization inputs as the reader, including surfaces, dictionary forms, readings, compounds, and protected author-ruby readings. Raw book text remains available for exact substring matching.
Refresh the text index after importing books or after a tokenizer, dictionary, or normalization change. Deleted books are removed from the active search index; restored books are added after the next refresh.
Supabase sync is optional and does not replace the local SQLite store.
Syncable source data includes books when the original file is available, progress, highlights, bookmarks, Word Bank terms, cards, settings, and learning events. Local dictionaries, generated media, SQLite files, search indexes, and model files stay on each device.
Do not commit Supabase keys in .env or source files.
Important local paths:
These paths are ignored by Git.
Run the full test suite:
npm test
Useful syntax checks:
node --check public/app.js
node --check server/index.js
node --check server/ml-service.js
node --check server/fts-search-service.js
The test suite covers Anki field mapping and export, dictionary parsing and lookup, local media providers, AI runtime contracts, SQLite FTS5 search, SQLite state storage, Supabase mapping, analytics, and API smoke behavior.
Before pushing, inspect the worktree:
git status --short
git ls-files .env data models
The second command should return no sensitive local environment, database, model, or generated data files.
35 commits
JavaScript
88.3%
CSS
7.0%
HTML
4.1%
Yomiアプリ is a local-first Japanese reading application for EPUB, PDF, and plain-text novels. It combines a paged or scrolling reader with dictionary lookup, furigana, Word Bank tracking, Anki export, local search, learning analytics, optional Supabase sync, and an optional local AI assistant.
The core reading workflow runs on the local machine. SQLite is the canonical local store for application data. SQLite FTS5 with BM25 ranking is the derived text-search index for exact Japanese phrases and vocabulary.
The reader and local search continue to work without Anki, Supabase, or the local AI runtime.
Clone the repository and install dependencies:
git clone https://github.com/corneliuschee/yomiapuri.git
cd yomiapuri
npm install
Start the development server:
npm run dev
Open http://localhost:3000 in a browser.
For a normal non-watch run:
npm start
Create a local environment file from the example:
Copy-Item .env.example .env
The .env file is ignored by Git. Use it for local model paths and runtime settings.
The reader assistant uses a llama.cpp-compatible runtime and local GGUF models. The example configuration uses Sugoi 14B Ultra Q4 and Q3 models:
LLAMA_SERVER_PATH=D:\YomiApuriModels\llama-tools\...\llama-server.exe
SUGOI_Q4_MODEL_PATH=D:\YomiApuriModels\Sugoi-14B-Ultra-GGUF\Sugoi-14B-Ultra-Q4_K_M.gguf
SUGOI_Q3_MODEL_PATH=D:\YomiApuriModels\Sugoi-14B-Ultra-GGUF\Sugoi-14B-Ultra-Q3_K_M.gguf
LLAMA_GPU_LAYERS=24
LLAMA_IDLE_TIMEOUT_SECONDS=600
Suggested starting points:
The assistant starts when a message is sent and can stop after the configured idle timeout. Assistant messages are kept in the current browser session and are not written to the application database.
The assistant accepts the current reader message, the selected page context, and a short rolling conversation history. Translation, explanation, recap, and question handling use the same selected model.
On Windows, the app can open Anki Desktop automatically when AnkiConnect is unavailable. Exports use AnkiConnect so custom note types, fields, media, and note IDs are preserved.
The dictionary manager supports:
Enabled term dictionaries appear in reader lookup in their configured order. Frequency dictionaries provide frequency badges. The Word Bank dictionary selector chooses the dictionary used for Word Bank meanings. Full dictionary details are loaded only for matching lookup entries.
The Insights page provides the local text-search index controls:
Text search uses the same Japanese normalization inputs as the reader, including surfaces, dictionary forms, readings, compounds, and protected author-ruby readings. Raw book text remains available for exact substring matching.
Refresh the text index after importing books or after a tokenizer, dictionary, or normalization change. Deleted books are removed from the active search index; restored books are added after the next refresh.
Supabase sync is optional and does not replace the local SQLite store.
Syncable source data includes books when the original file is available, progress, highlights, bookmarks, Word Bank terms, cards, settings, and learning events. Local dictionaries, generated media, SQLite files, search indexes, and model files stay on each device.
Do not commit Supabase keys in .env or source files.
Important local paths:
These paths are ignored by Git.
Run the full test suite:
npm test
Useful syntax checks:
node --check public/app.js
node --check server/index.js
node --check server/ml-service.js
node --check server/fts-search-service.js
The test suite covers Anki field mapping and export, dictionary parsing and lookup, local media providers, AI runtime contracts, SQLite FTS5 search, SQLite state storage, Supabase mapping, analytics, and API smoke behavior.
Before pushing, inspect the worktree:
git status --short
git ls-files .env data models
The second command should return no sensitive local environment, database, model, or generated data files.
35 commits
JavaScript
88.3%
CSS
7.0%
HTML
4.1%