Skip to content

koto

Ship your app in every language. One command, any LLM.

npx koto init
koto v0.1.0 Detected Framework: Next.js 14 i18n library: next-intl Source: src/messages/en.json (214 keys) Which LLM provider? OpenAI (gpt-4o-mini — fast & cheap) Anthropic (claude-sonnet — high quality) Google (gemini-2.5-flash) Ollama (local, free, private) Target locales? 🇪🇸 es 🇫🇷 fr 🇩🇪 de 🇯🇵 ja Created koto.config.ts Created koto.lock
npx koto translate
koto v0.1.0 Translating🇪🇸 🇫🇷 🇩🇪 🇯🇵 (4 locales) 🇪🇸 es ████████████████████████████████ 214/214 🇫🇷 fr ████████████████████████████████ 214/214 🇩🇪 de ██████████████████████████░░░░░░ 176/214 🇯🇵 ja █████████████████░░░░░░░░░░░░░░░ 118/214 Cache: 189 🔤 Translated: 25 3.1s 💰 Estimated cost: $0.02 (gpt-4o-mini) Translation complete 🇪🇸 es 25 translated, 189 cached 🇫🇷 fr 18 translated, 196 cached 🇩🇪 de 214 translated, 0 cached 🇯🇵 ja 214 translated, 0 cached 4 locale files updated. Run koto types to update TypeScript types.

The problem

You add a button. You change a heading. Your source locale is done in seconds — but your 6 target locales are now stale. AI translation tools exist, but they treat a payment confirmation the same as a marketing headline.


Why koto?

Context Profiles

Different parts of your app need different tones. Marketing copy sounds energetic. Legal text stays precise. One command handles all of it.

Bring Your Own LLM

OpenAI, Anthropic, Google Gemini, Ollama, or any compatible endpoint. Switch providers with one config line.

Type-Safe Keys

Generate TypeScript types from your locale files. Typos and missing keys fail at build time, not in production.

Smart Cache

SHA-256 content hashing + lockfile. Unchanged strings are never re-translated. Incremental runs take seconds.

Quality Scoring

Placeholder integrity, length ratio, untranslated detection. Gate your CI pipeline on translation quality.

CI/CD Ready

GitHub Action included. Translations run in your pipeline. Use --fail-on-error to block bad releases.


Minimal config

koto.config.ts
/** @type {import('koto').KotoConfig} */
export default {
sourceLocale: 'en',
targetLocales: ['es', 'fr', 'de', 'ja'],
files: ['src/locales/[locale].json'],
provider: { name: 'openai', model: 'gpt-4o-mini' },
};

That’s it. Run npx koto and your locale files are ready.


Translate any OSS repo in one command

Contribute translations to open-source projects without cloning, configuring, or setting up anything. koto forks the repo, detects the i18n setup, translates, and opens a PR — automatically.

Terminal window
npx koto contribute calcom/cal.com --locale ko
npx koto contribute calcom/cal.com --locale ko
koto v0.1.0 Contributing Korean (ko) translations to calcom/cal.com Forking calcom/cal.com... Cloning fork... Detecting i18n setup... Source locale: en Locale dir: packages/i18n/locales Translating... Translated 155 keys (score: 100/100) Creating branch and committing... Pushing... Opening pull request... Pull request created! https://github.com/calcom/cal.com/pull/28427

The PR includes a quality report with scores, flagged translations, and a “Powered by koto” footer. See a real example →