Skip to main content

Self-host it (free, one project)

i18n-keyless is one product, and you can run it yourself: the same API, the same dashboard, the same MCP server as i18n-keyless.com — it is the very Docker image we run — on your own machine, with your own database and your own AI provider.

The source is public, under the Elastic License 2.0: github.com/ambroselli-io/i18n-keyless-server. Read it, build the image yourself, or send a pull request.

Installing is free, and one project is free forever: all 48 languages, unlimited translations, the dashboard, the MCP server, every SDK, no expiry. Nothing to buy, nothing to enter but your own AI key.

A €30 lifetime licence unlocks unlimited projects — one payment, no subscription, no usage cap, every update for life. Buy it at https://i18n-keyless.com/self-hosted the day you need a second project. The key (it starts with ik1.) arrives by email and on the page you land on after the payment; you paste it into the dashboard's Settings screen, and the next project is yours.

ONCE is 37signals' open source tool for running Docker apps on your own server: one line to install, then a terminal console for the domain, the TLS certificate, updates and backups. i18n-keyless follows its conventions, so it is a first-class app there.

On a fresh Linux server:

curl -fsSL https://get.once.com | sh
once

In the console, add an app, enter the image path, and the host name you want it on:

ghcr.io/ambroselli-io/i18n-keyless:latest

ONCE pulls the image, starts it, and takes care of DNS and TLS. Open the host name in your browser:

  1. Create your account. The first account of an instance is its admin: it creates projects and invites people.
  2. Choose the AI provider and paste your key at that provider, on the Settings screen you land on. Test the key asks the provider once before you save.
  3. Create your project. No licence is needed for the first one.

That is the whole install. The dashboard says when the instance is ready, and what is still missing until then. The same Settings screen takes the licence, whenever you buy one: it is checked on the spot, offline.

With docker compose

No ONCE? One file and Docker:

mkdir i18n-keyless && cd i18n-keyless
curl -fsSL https://i18n-keyless.com/self-hosted/docker-compose.yml -o docker-compose.yml
docker compose up -d
open http://localhost:1800

Then the same steps in the browser: the admin account, the AI key, your project. The licence only when you want a second project.

Put your usual reverse proxy (Caddy, nginx, Traefik) with TLS in front of port 1800 first if you can: the instance learns its public URL from your first sign-in. Moved it later? The Settings screen has the URL too.

Settings: the dashboard, or the environment

The licence, the AI provider and the public URL live on the dashboard's Settings screen (admins only), and are kept in /storage/settings.json, next to the database and inside the backup. A change applies at once, no restart.

Each of them can also be set in the environment — an .env next to docker-compose.yml (the example), or ONCE's Settings → Environment form. A value from the environment wins, and the Settings screen shows it read-only with the variable's name. Use that to lock a setting, or to script an install; leave it out and the dashboard is enough.

The AI provider

Translations are made by the model you choose, on your own account. Any provider the Vercel AI SDK knows — pick it on the Settings screen, or name it in the environment:

AI_PROVIDERAI_MODEL (default)Note
mistralmistral-small-latestWhat i18n-keyless.com runs on.
openaigpt-4o-mini
anthropicclaude-haiku-4-5-20251001
googlegemini-2.0-flash
openai-compatiblellama3.1Ollama, Groq, Together, a proxy… set AI_BASE_URL (default http://localhost:11434/v1).

AI_API_KEY is the key at that provider. A whole app costs cents.

Accounts and projects

  • The first account created on an empty instance is the admin. Admins create projects and can make other users admin (PUT /user/admin).
  • Everyone else uses the projects they are invited to. When you add a member, the dashboard shows the invitation message to send them yourself (with the set-password link); the instance sends no email, so there is no mail provider to configure.
  • Pausing a project (admins) stops its key; nothing is deleted.

Point your app at your server

Every SDK takes an API_URL. Add it next to the key:

import * as I18nKeyless from 'i18n-keyless-react';

I18nKeyless.init({
API_KEY: 'your-project-key',
API_URL: 'https://i18n.example.com', // your APP_URL
storage: window.localStorage,
languages: { primary: 'en', supported: ['en', 'fr', 'es'] },
});

The dashboard's snippets already carry it. Node, Vue, Angular and the browser package take the same option; Laravel, Rails and Flutter read it from their own config. The MCP server is at https://i18n.example.com/mcp, and the onboarding screen prints the claude mcp add line.

Upgrade, back up

ONCE updates and backs up from its console. With compose: docker compose pull && docker compose up -d; the schema is applied at boot and the volume is kept. The data lives in /storage: i18n-keyless.db (SQLite: users, projects, translations), settings.json (the AI key, the URL, the licence if you bought one) and secret (signs the sessions). Copy the volume and you have everything.

Prefer Postgres? Set DATABASE_URL=postgresql://…; the image ships both drivers.

What is different from the hosted product

Nothing in the software: it is the same image. What differs is who operates it.

HostedSelf-hosted
PricePer project, per monthFree, then €30 once
Machine, database, AI accountOursYours
ProjectsOne per subscription, created from the websiteOne free, unlimited with the licence, created by your admin
SupportEmailEmail, best effort

Environment reference

Nothing is required: the first five are the Settings screen's, and a variable only locks the value. The instance boots and answers its health check (GET /up) with none of them.

VariableOn the Settings screenDefaultWhat it does
LICENSE_KEYyesYour lifetime licence, and it is optional. Verified offline. Without one the instance runs one project, with no other limit; creating a second one answers 402 and says where to add the licence.
AI_PROVIDERyesmistralSee the table above.
AI_MODELyesthe provider's default
AI_API_KEYyesYour key at the provider.
AI_BASE_URLyesFor openai-compatible, or a proxy.
APP_URLyeslearnt from the first sign-inThe public URL: cookie security, OAuth issuer, invitation links.
DATA_DIR/storageWhere settings.json, secret and the SQLite file live.
DATABASE_URLfile:/storage/i18n-keyless.dbSQLite file, or a Postgres URL.
SECRETgenerated once, kept in /storage (ONCE's SECRET_KEY_BASE is honoured)JWT secret of the dashboard sessions.
SENTRY_KEYthe maintainer'sWhere errors are reported. By default they reach us, the maintainers — that is how bugs get fixed. off disables it; your own DSN redirects it.

Lost your licence key?

Write to us with the email you bought it with. There is nothing to revoke or renew: a licence is bound to that email and is valid forever.