English | 한국어
Dodari 2 is a multilingual AI translator that translates
EPUB, PDF, and TXT documents with genre-aware, context-sensitive accuracy.
-------
*Successor to Dodari 1 (released March 2024)
- Required app: Codex or Claude Code
- Minimum plan: ChatGPT Plus or higher, or Claude Pro or higher
- Enter this prompt
https://github.com/vEduardovich/dodari install Dodari- If the AI asks for permission, "Allow"
- When the login window opens, sign in, then "Continue"
- When the Dodari window opens, installation is complete
- Translates
EPUB (e-books),PDF, andTXTfiles. - Note: To preserve layout,
PDFtranslation output is saved asEPUBrather thanPDF. Complex formulas and tables are embedded as images. - Outputs two files:
Translation (Original)andTranslation only— allowing sentence-by-sentence comparison with the source. - Automatic language detection.
- Cross-translation between
Korean·English·Japanese·Chinese·French·Italian·Dutch·Danish·Swedish·Norwegian·Arabic·Persian. - Automatic book genre detection.
- Selectable translation tone/style.
- Glossary — extract key terms (names, etc.) with AI and apply them consistently throughout.
- No file size limit.
- Claude and ChatGPT (Codex) subscribers can translate with their own subscription via the official CLI, and pick the model and reasoning effort in the UI. The defaults are built in; you can change them in your own
dodari_config.json.
| AI Model | Gemma4 e4b 8bit | Gemma4 31b 4bit | |
|---|---|---|---|
| Recommendation | Minimum (standard quality) | Recommended (high quality) | |
| Model description | Fast and comfortable translation | Deep context, rich vocabulary | |
| Subjective quality | Feels better than DeepL | Close to Gemini quality | |
| Storage | 10 GB free space | 35 GB SSD or more | |
| Python | 3.11 or higher | — | |
| Mac | Chip | Apple Silicon M1 or later | M3 Pro / M4 Max or later |
| Unified Memory | 8 GB – 16 GB | 32 GB | |
| OS | macOS Ventura 13.0 or later | Latest version recommended | |
| Windows | GPU | Not required | 24 GB VRAM or more |
| RAM | 8 GB | 64 GB | |
| Windows | Windows 10 (22H2) or later | Windows 11 | |
For beginners:
- Click Download ZIP
- Extract the archive, then:
- Windows: double-click
start_windows.bat - Mac: run
sh start_mac.shin a terminal window - Ubuntu/Linux: run
sh start_ubuntu.shin a terminal window
- Open
http://127.0.0.1:7860in your browser — Dodari 2 will be ready.
On first run, setup and AI model download will take a long time. Please be patient!
If you encounter an error, delete the dodari_env folder and run the script again.
For advanced users:
git clone https://github.com/vEduardovich/dodari.git
cd dodari- Windows: run
start_windows.bat - Mac: run
sh start_mac.sh - Ubuntu/Linux: run
sh start_ubuntu.sh
The Claude (subscription CLI) engine translates with the Haiku model (claude-haiku-5-5) at reasoning effort max. Pick another model or reasoning effort in the UI to translate with that instead. If your claude CLI is too old for Haiku, Dodari updates it automatically.
dodari/
├── dodari_env # Folder where runtime dependencies are installed
├── dodari.py # Main application
├── start_mac.sh # Mac launch script
├── start_ubuntu.sh # Ubuntu(vLLM) launch script
├── start_windows.bat # Windows launch script
├── dodari_config.json # (optional, you create it) your settings over the built-in defaults (subscription CLI models/reasoning effort, Ubuntu vLLM options) — not tracked by git
├── ui_config.local.json # Last UI choices (language, engine, CLI model/effort) — written automatically, not tracked by git
├── ui_config.json # Kept only so older installs update cleanly — do not edit
└── requirements.txt # Dependency list
For beginners:
- Download the ZIP again and extract it.
- Overwrite the existing Dodari folder with the new files.
For advanced users:
git pull
Your settings are kept. Dodari saves your UI choices in ui_config.local.json. To change a setting such as the Ubuntu vLLM memory options, create dodari_config.json in the Dodari folder and put in only the values you change (keys and defaults: DODARI_CONFIG_DEFAULTS in dodari.py):
{"vllm": {"gpu_memory_utilization": 0.85}}Git does not track these two files, so updates never overwrite them and git pull is not blocked. Do not edit ui_config.json.
If git pull stops because untracked files such as AGENTS.md or CLAUDE.md would be overwritten (an AI assistant may have created them in the folder), rename or delete those files and run git pull again.
- The M5 Max is a very high-end machine — the M1 Pro numbers are more representative for most users.
- Novels are text-only, so EPUB and PDF translation speeds are similar.
- Books with many images or code blocks translate faster as PDF — PDFs skip translating images entirely and embed them as-is, while EPUB translates tables and detailed flags too.
- Running ChatGPT Plus's Luna model at max, a 900-page programming book took about 10 hours and used about 28% of the 5-hour limit and about 5% of the weekly limit. That's close to free.
| Book | MacBook | epub | |||
|---|---|---|---|---|---|
| e4b (standard) | 31b (high quality) | e4b (standard) | 31b (high quality) | ||
| 1984 (novel) | M1 Pro 16 GB | 133 min | — | 133 min | — |
| M5 Max 128 GB | 40 min | 135 min | 41 min | 136 min | |
| Pro Git (IT book) | M1 Pro 16 GB | 137 min | — | 65 min | — |
| M5 Max 128 GB | 45 min | 159 min | 21 min | 81 min | |
- Windows is considerably slower.
- On a 2020 LG Gram laptop, translating one page of the novel 1984 took 15 minutes for EPUB and 18 minutes for PDF (the first PDF load can take up to 20 minutes)
- So on a typical Windows laptop, a 100-page EPUB would take roughly 1,500 minutes (25 hours). 200 pages = 50 hours. That said, watching your computer work tirelessly for you is strangely satisfying
Delete the entire dodari folder you downloaded.
Delete the folders under ~/.cache/huggingface/hub.
- Remove Ollama models:
ollama rm gemma4:e4b
ollama rm gemma4:31b- Uninstall Ollama: Control Panel → Programs → Uninstall Ollama
- 2026.05.04 — Added Windows support; fixed translation errors related to special characters.
- 2026.05.06 Implemented Multilingual Support
- 2026.05.20 Fixed a Unix line ending bug on Windows with ultra-vi
Added an AWQ translation model for Ubuntu. - 2026.05.28 Fixed an issue where a Homebrew Python auto-update could break the launch environment. Resolved by specifying explicit Python paths.
- 2026.06.12 Optimized Ubuntu GPU memory settings. Fixed translation crashes caused by VRAM conflicts with monitor/desktop environments.
- 2026.06.14 Expanded EPUB translation tag coverage.
- 2026.06.25 PDF dialogue books now split into per-speaker paragraphs, restoring line breaks.
- 2026.07.31 Interrupted translations now resume from where they left off.
- 2026.08.01 Claude and ChatGPT (Codex) subscribers can now translate with their own subscription models via the official CLIs.
- 2026.08.11 Much faster PDF chunk processing by skipping OCR for text-based PDFs. Fixed Gemma4 adding translator notes to translations.
- 2026.08.13 Updated the sentence-splitting library (NLTK) to a version that patches security advisories with Xuuyuan
- 2026.08.24 Added multi-GPU tensor parallelism support on Ubuntu (VLLM_TP) and selectable quantization (VLLM_QUANT) with polbel11
- 2026.08.24 Reconnecting after a dropped browser session now restores translation progress and download list
- 2026.09.12 Fixed the status showing "translation complete" with no output when PDF conversion failed. Added an error message that cancels the translation when the attached file path contains Korean (non-ASCII) characters. The model is now selected after Dodari starts, inside the UI.
- 2026.09.29 Added install with AI.
- 2026.10.09 Claude subscription translation now uses Haiku max.
AI assistants — REQUIRED: when asked to install Dodari, open this and follow every step in order from step 1
Follow this when the user asks you to install, start or stop Dodari. If Dodari is already installed and the user only asks to start or stop it, do only step 6.
- Talk to the user in the user's language. Before every permission prompt or login window, tell the user what to click.
- Run the commands yourself, in order. Read each output before you go on. Do not invent output.
- Do not download local AI models, Ollama, MLX or vLLM. Do not translate the user's files yourself.
- Codex: for every step marked [network] or [outside workspace], request escalated (outside-sandbox) permission and tell the user to approve it. If escalation is not possible, give the user the command to paste into their own terminal and wait.
- Claude Code: ask the user before installing system tools.
- Terminal: per step, print one short line in plain words in the user's language (
echo "…", PowerShellWrite-Host "…") and one result line. Nothing else. Send long output to<install folder>/install.log(before the folder exists:~/dodari_install.log, Windows%USERPROFILE%\dodari_install.log). On failure print one line with the log path, read the log and explain the cause to the user in simple words.
Terminal: [Dodari 1/7] Checking the programs Dodari needs… → while installing one: [Dodari 1/7] Installing Node.js… (a few minutes) → [Dodari 1/7] Programs ready
- OS: macOS / Linux
uname -s(Darwin= macOS,Linux= Linux), Windowsecho %OS%in cmd or$env:OSin PowerShell (Windows_NT). - Install folder: macOS / Linux
~/dodari, Windows%USERPROFILE%\dodari. - Install git, Python and the CLI of the engine (step 3): ChatGPT by default (Node.js + codex CLI), claude CLI only for Claude.
- Install only what is missing. Check the command itself, also inside the Codex app or Claude Code desktop.
| Tool | Needed for | Check | macOS | Windows | Linux (Debian/Ubuntu) |
|---|---|---|---|---|---|
| git | both engines | git --version |
xcode-select --install (a system dialog opens: tell the user to click Install) or brew install git |
winget install --id Git.Git -e |
sudo apt install -y git |
| Python 3.11+ | both engines | macOS / Linux: python3.14, python3.13, python3.12, python3.11 or python3 with --version. Windows: python --version or py --version |
brew install python@3.12 (Homebrew: https://brew.sh) or the installer from https://www.python.org/downloads/ |
winget install --id Python.Python.3.12 -e |
Ubuntu 24.04+: sudo apt install -y python3.12 python3.12-venv, Ubuntu 22.04: sudo apt install -y python3.11 python3.11-venv |
| Node.js + npm | codex-cli |
node --version and npm --version |
brew install node |
winget install --id OpenJS.NodeJS.LTS -e |
the current LTS from https://nodejs.org/en/download |
| codex CLI | codex-cli |
codex --version |
npm install -g @openai/codex |
npm install -g @openai/codex |
npm install -g @openai/codex |
| claude CLI | claude-cli |
claude --version |
curl -fsSL https://claude.ai/install.sh | bash |
powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://claude.ai/install.ps1 | iex" |
curl -fsSL https://claude.ai/install.sh | bash |
- Apple Silicon Mac: use a native (arm64) Python, such as Homebrew's in
/opt/homebrew. - Windows: if a User Account Control prompt appears, tell the user to click Yes. After installing, open a new terminal and check again.
- Add
>> ~/dodari_install.log 2>&1to each install command (Windows cmd>> "%USERPROFILE%\dodari_install.log" 2>&1). Add--accept-source-agreements --accept-package-agreementsto winget.
Terminal: [Dodari 2/7] Downloading Dodari… → [Dodari 2/7] Download complete (already there: [Dodari 2/7] Dodari is already here)
- If the install folder already contains
dodari.py, skip this step. - macOS / Linux:
git clone https://github.com/vEduardovich/dodari.git ~/dodari >> ~/dodari_install.log 2>&1 - Windows:
git clone https://github.com/vEduardovich/dodari.git "%USERPROFILE%\dodari" >> "%USERPROFILE%\dodari_install.log" 2>&1
Terminal: [Dodari 3/7] Saving settings… → [Dodari 3/7] Settings saved
Write ui_config.local.json in the install folder before running any start script (create it if it does not exist; git does not track it). If it exists, keep its other keys and set only ui_lang, engine and cli_models. Do not edit ui_config.json.
- Engine: ChatGPT (
codex-cli,gpt-6-luna,max) by default. Use Claude (claude-cli,claude-haiku-5-5,max) if the user asked for Claude or has only a Claude subscription. ui_lang: the user's language, one ofko,en,ja,zh,fr,it,nl,da,sv,no,ar,fa(anything else:en).
ChatGPT (codex-cli):
{"ui_lang": "en", "engine": "codex-cli", "cli_models": {"codex-cli": {"model": "gpt-6-luna", "effort": "max"}}}Claude (claude-cli):
{"ui_lang": "en", "engine": "claude-cli", "cli_models": {"claude-cli": {"model": "claude-haiku-5-5", "effort": "max"}}}Terminal: [Dodari 4/7] Installing the files Dodari needs… (about 2 minutes) → [Dodari 4/7] Install complete (failed: [Dodari 4/7] Install failed. Details: ~/dodari/install.log)
| OS | Command |
|---|---|
| macOS | cd ~/dodari && DODARI_SETUP_ONLY=1 bash start_mac.sh > install.log 2>&1 |
| Linux | cd ~/dodari && DODARI_SETUP_ONLY=1 bash start_ubuntu.sh > install.log 2>&1 |
| Windows (cmd) | cd /d "%USERPROFILE%\dodari" && set "DODARI_SETUP_ONLY=1" && start_windows.bat > install.log 2>&1 |
| Windows (PowerShell) | $env:DODARI_SETUP_ONLY="1"; & "$env:USERPROFILE\dodari\start_windows.bat" > "$env:USERPROFILE\dodari\install.log" 2>&1; Remove-Item Env:DODARI_SETUP_ONLY |
- Success: the last line of
install.logisSetup complete (DODARI_SETUP_ONLY=1): Dodari was not started.(check withtail -n 1 ~/dodari/install.log, PowerShellGet-Content "$env:USERPROFILE\dodari\install.log" -Tail 1). - "Python 3.11 or higher is required": go back to step 1.
- Failed: delete the
dodari_envfolder if it is still there and run the command again.
Terminal: [Dodari 5/7] Checking your ChatGPT login… → login needed: [Dodari 5/7] Sign in in the login window that just opened and click 'Continue' (allow) there. You are done when the page says you are signed in. and [Dodari 5/7] If you don't see the window, open this address: <address> → [Dodari 5/7] Login complete (already logged in: [Dodari 5/7] Already logged in; Claude: Claude and 'Authorize')
ChatGPT (codex-cli): CODEX_HOME is codex.home in dodari_config.json in the install folder if that file exists and sets it (default ~/.dodari/codex-home; ~ is the home folder, %USERPROFILE% on Windows). The commands below use the default.
- Create the folder: macOS / Linux
mkdir -p "$HOME/.dodari/codex-home", Windows cmdif not exist "%USERPROFILE%\.dodari\codex-home" mkdir "%USERPROFILE%\.dodari\codex-home". - Check: macOS / Linux
CODEX_HOME="$HOME/.dodari/codex-home" codex login status, Windows cmdset "CODEX_HOME=%USERPROFILE%\.dodari\codex-home" && codex login status, PowerShell$env:CODEX_HOME="$env:USERPROFILE\.dodari\codex-home"; codex login status. Exit code 0 (Logged in …): go to step 6. - Log in: run the same command with
codex logininstead ofcodex login status, in the background with its output in<install folder>/login.log, for exampleCODEX_HOME="$HOME/.dodari/codex-home" nohup codex login > ~/dodari/login.log 2>&1 &. If you cannot run it in the background, run it normally.
Claude (claude-cli):
- Check:
claude auth status --json."loggedIn": true: go to step 6. - Log in:
nohup claude auth login > ~/dodari/login.log 2>&1 &(if not possible in the background,claude auth login).
Both engines:
- Right after the login window opens, print
[Dodari 5/7] Sign in in the login window that just opened and click 'Continue' (allow) there. You are done when the page says you are signed in.(Claude:[Dodari 5/7] Sign in in the login window that just opened and click 'Authorize' there. You are done when the page says you are signed in.). - Tell the user: "In the login window that just opened, sign in with the ChatGPT account that has the subscription and click 'Continue' (allow) there. When the page says you are signed in, come back here. Signing in only on the chatgpt.com site or in an older login window does not connect Dodari." (Claude: the Claude account, Authorize, claude.ai.)
- Find the login address (
https://…) inlogin.logand print it once:[Dodari 5/7] If you don't see the window, open this address: <address>. - The user cannot find the login window: open the address yourself with macOS
open "<address>", Windowsstart "" "<address>"(PowerShellStart-Process "<address>"), Linuxxdg-open "<address>". - Run the check again until it succeeds, then print
[Dodari 5/7] Login complete. - The user says they signed in but the check still fails: ask them to close the old login windows, open the newest address in
login.log(the lasthttps://…line) again withopen(Windowsstart "", Linuxxdg-open), and sign in and allow in that window. If the login command has already exited (check withpgrep -fl "codex login"orpgrep -fl "claude auth login"), run it again. - The login cannot run from your session (sandbox): skip this step. The Dodari app opens a login terminal window on its first start.
Terminal: [Dodari 6/7] Starting Dodari… (about 1 minute) → [Dodari 6/7] Dodari is open in your browser (failed: [Dodari 6/7] Dodari did not start. Details: ~/dodari/dodari.log)
Run it from the install folder in the background. The output goes to dodari.log in the install folder. DODARI_SETUP_ONLY must not be set. Other install folder: use it instead of ~/dodari (%USERPROFILE%\dodari).
| OS | Command |
|---|---|
| macOS | cd ~/dodari && PYTHONUNBUFFERED=1 nohup bash start_mac.sh > dodari.log 2>&1 & |
| Linux | cd ~/dodari && PYTHONUNBUFFERED=1 nohup bash start_ubuntu.sh > dodari.log 2>&1 & |
| Windows (PowerShell) | Start-Process cmd -WindowStyle Hidden -ArgumentList '/c cd /d "%USERPROFILE%\dodari" && set "PYTHONUNBUFFERED=1" && set "PYTHONIOENCODING=utf-8" && start_windows.bat < nul > dodari.log 2>&1' |
- Claude Code: start it so it is not tied to your session (the forms above).
- Codex: request escalated permission for the command. If escalation is not possible, give the user the command for their OS to paste into their own terminal.
- The browser opens Dodari at http://127.0.0.1:7860 by itself (about a minute). If not, open that address. If port 7860 is taken, use the address after
Running on local URL:indodari.log. - Started: the port is listening (macOS
lsof -nP -iTCP:7860 -sTCP:LISTEN, Linuxss -ltn | grep :7860, Windowsnetstat -ano | findstr :7860) anddodari.loghas theRunning on local URL:line. Otherwise readdodari.logand explain the cause to the user in simple words. - Ready: the screen shows
✅ codex is ready(✅ claude is ready; Korean UI✅ codex 준비 완료) or✔ CLI subscription translation engine active(Korean UI✔ CLI 구독 번역 엔진 사용 중), and no 🔐 login required. If 🔐 login required appears, guide the user through the login terminal window the app opened, as in step 5. - Stop (when the user asks): macOS / Linux
kill $(lsof -t -iTCP:7860 -sTCP:LISTEN), Windows PowerShellStop-Process -Id (Get-NetTCPConnection -LocalPort 7860 -State Listen).OwningProcess(use the real port fromdodari.logif it is not 7860).
Terminal: [Dodari 7/7] All done! Next time, ask your AI "Start Dodari".
Give this summary in the user's language, with the real folder and the button name of the user's UI language (English Start Translation, Korean 번역 실행하기). Other install folder: replace ~/dodari/outputs (Windows %USERPROFILE%\dodari\outputs) with the outputs folder inside it.
Dodari is installed and connected to your ChatGPT (or Claude) subscription.
1. Open Dodari: ask your AI "Start Dodari". To open it yourself, do as in "Installation & Setup" in the README, in the dodari folder: Windows: double-click start_windows.bat. Mac: run sh start_mac.sh in a terminal window. Ubuntu/Linux: run sh start_ubuntu.sh in a terminal window. The browser shows Dodari at http://127.0.0.1:7860.
2. Upload: drag an EPUB, PDF or TXT file into the "1. Select files to translate" box (Step 1).
3. Check the target language (Step 2). Genre and bilingual layout are optional (Step 3).
4. Click "Start Translation" (Step 4). Progress appears in the Status box.
5. Results: the download list under the Status box, and the folder ~/dodari/outputs (Windows: %USERPROFILE%\dodari\outputs).
To quit: ask your AI "Turn off Dodari", or press Ctrl+C in the terminal window where you started it yourself.
© 2026 Dodari Project. All rights reserved.
