Everything inside Comvi.
The editor your translators open in your live app. The delivery that skips your release path. The types that catch broken keys at build time. And the rest of what makes a TMS actually work.
Hover. Edit. Done.
Translators install the Comvi Chrome extension, open your live app, and every string becomes editable. They see the actual layout, the actual button width, the actual line break — not a CSV row out of context.
- hover any string to highlight
- click to open the editor with all locales side-by-side
- statuses per locale: not translated needs review translated
- save once — your production cdn updates within seconds
The extension is for translators, not for your app. Your production code stays clean: no in-context sdk, nothing extra in your bundle, nothing to ship. Translators install it once and use it across every project they work on.
Get the extension → Chrome Web Store COMING SOONTranslations skip your release path.
Translation changes don't go through your build, your CI, or your deploy pipeline. They go through Comvi — saved in the editor, propagated to a global CDN, served to your users.
- cdn-first delivery — translations served from the edge, not your servers
- debounced auto-deploy — saves are batched and pushed to cdn within seconds
- global distribution — cloudflare cdn, 300+ regions
- no infra to manage — no redis, no s3, no edge worker to write
- your sdk fetches translations on app load
Drafts that respect your terminology.
Comvi's AI translation injects your glossary into the prompt — so the draft uses your terms, in the right form, instead of guessing. You pick the engine, you review the result before it ships.
- choose the engine — openai, anthropic, deepl, google
- glossary in the prompt for llm providers — handles declension and grammar
- glossary as editor hint for deepl/google — visible to reviewers
- translate one key, one locale, or batch the whole project
- drafts land in needs review — never published without you
Translations type themselves.
Comvi generates TypeScript types from your translation keys. Autocomplete every key in your IDE. Wrong params, missing tag handlers, typos in keys — all caught at build time, not at runtime in production.
- autocomplete every key in your IDE
- typed parameters — wrong types fail to compile
- typed tag handlers — missing handlers fail to compile
- framework-aware — react, vue, svelte, solid, next, nuxt
Same string, translated once.
Comvi indexes every translation you've approved and suggests fuzzy matches when something similar shows up again. "Add to cart" and "Add to basket" — 87% match, suggested in one click.
Saves the inconsistency.
Saves the work.
- suggestions ranked by similarity, with diff highlighting
- per-project memory, populated as your team translates
- tmx export
Your terminology, in every translation.
A glossary entry isn't a note for translators to remember — it's a rule. When the AI translates, your glossary lands in the prompt and the model uses your exact term. When DeepL or Google translates, glossary terms highlight in the editor as hints.
- per-project terminology with definitions and translations
-
two execution modes:
- – with llm provider: glossary injected into prompt
- – with deepl/google: glossary highlighted as editor hint
- brand names with do not translate flag
Real i18n. Not key-value.
Comvi messages are full ICU — plurals, select for gender and formality, rich-text tags with typed handlers, nested parameters. The same syntax works in @comvi/i18n standalone (MIT-licensed).
1// "cart.summary":2// "{count, plural,3// one {<b>#</b> item from <link>store</link>}4// other {<b>#</b> items from <link>store</link>}}"56import { T } from '@comvi/react'78<T id="cart.summary" values={{ count: 3 }}9 components={{10 b: ({ children }) => <strong>{children}</strong>,11 link: ({ children }) => <a href="/store">{children}</a>,12 }}13/>
1// "greeting.welcome":2// "{tone, select,3// formal {Welcome, {name}.}4// informal {Hey {name}!}5// other {Hi, {name}.}}"67import { T } from '@comvi/react'89<T id="greeting.welcome"10 values={{ tone: user.preferences.tone, name: user.name }}11/>
1// "legal.tos":2// "By <b>continuing</b>, you agree to our3// <link>terms</link> and <link2>privacy policy</link2>."45import { T } from '@comvi/react'67<T id="legal.tos" components={{8 b: ({ children }) => <strong>{children}</strong>,9 link: ({ children }) => <a href="/terms">{children}</a>,10 link2:({ children }) => <a href="/privacy">{children}</a>,11}}/>
1<!-- "cart.summary":2 "{count, plural,3 one {<b>#</b> item from <link>store</link>}4 other {<b>#</b> items from <link>store</link>}}" -->56<script setup lang="ts">7import { T } from '@comvi/vue'8</script>910<template>11 <T id="cart.summary" :values="{ count: 3 }">12 <template #b="{ children }"><strong>{{ children }}</strong></template>13 <template #link="{ children }"><a href="/store">{{ children }}</a></template>14 </T>15</template>
1<!-- "greeting.welcome":2 "{tone, select,3 formal {Welcome, {name}.}4 informal {Hey {name}!}5 other {Hi, {name}.}}" -->67<script setup lang="ts">8import { T } from '@comvi/vue'9</script>1011<template>12 <T id="greeting.welcome"13 :values="{ tone: user.tone, name: user.name }"/>14</template>
1<!-- "legal.tos":2 "By <b>continuing</b>, you agree to our3 <link>terms</link> and <link2>privacy policy</link2>." -->45<script setup lang="ts">6import { T } from '@comvi/vue'7</script>89<template>10 <T id="legal.tos">11 <template #b="{ children }"><strong>{{ children }}</strong></template>12 <template #link="{ children }"><a href="/terms">{{ children }}</a></template>13 <template #link2="{ children }"><a href="/privacy">{{ children }}</a></template>14 </T>15</template>
Plug Comvi into your CI/CD.
Every meaningful event in Comvi can trigger a webhook — your build pipeline, your Slack channel, your custom script. Translations published? Rebuild static pages. Key created? Open a PR with extracted strings.
1{2 "event": "translation.published",3 "project": "acme-store",4 "key": "cart.summary",5 "locale": "de",6 "value": "{count, plural, one {...} other {...}}",7 "actor": { "id": "u_42", "email": "anna@acme.com" },8 "timestamp": "2026-04-26T14:21:08Z"9}
1name: rebuild-on-translation2on:3 repository_dispatch:4 types: [comvi-translation-published]5jobs:6 build:7 runs-on: ubuntu-latest8 steps:9 - uses: actions/checkout@v410 - run: npm ci && npm run build11 - run: npm run deploy
- hmac-signed payloads — verify with your secret
- retry with exponential backoff — up to 24h
- delivery log in dashboard — replay any event
Roles that match how localization actually works.
Five roles, copied verbatim from the in-product role picker. Per-project membership. Translators can be scoped to specific locales — they only see what they need.
- per-project membership
- per-locale assignment for translators — work only on de/fr, not the whole language list
Bring what you already have.
Comvi detects the format and preserves your structure. No manual key remapping. Round-trip safe — export, re-import, no drift.
- no manual key remapping — comvi detects format and preserves structure
- round-trip safe — export → re-import doesn't drift