Skip to content
Self-hosted

One image, on your infrastructure

The dashboard ships as a single Docker image and runs on hardware you control. Three database engines, no product telemetry by default (nothing is sent to PostHog unless you set your own key), and no account required to pull it.

Container to run
1
Database engines
3
CPU architectures
2
Product telemetry by default
0

Pull the image

A project dashboard: 18 keys, 76.39% coverage, 4 languages, and coverage per language.A project dashboard: 18 keys, 76.39% coverage, 4 languages, and coverage per language.
Demo data · local mode

No account, no registry login — the image is public on Docker Hub. Pin a version →linux/amd64linux/arm64

The decision

What self-hosting gives you, and what it costs

There is no hosted dashboard to compare against — self-hosting is how the product runs. The honest question is not whether it is worth it, but what you take on.

Stays on your side

  • Your source code. The scanner reads your repository from inside your own network. Nothing is uploaded to have its keys extracted.
  • Your translations. They live in the database you pointed the container at — a SQLite file in a volume, or a Postgres/MySQL server you already operate.
  • Your provider keys. DeepL, Google, LibreTranslate: the calls leave your instance, encrypted at rest with your own session secret.
  • Your network boundary. The published port binds to 127.0.0.1 by default. Nothing is reachable from another machine until you decide it is.

Becomes your job

  • TLS and the reverse proxy. Nothing in the image terminates TLS. Exposing it beyond localhost means putting Caddy, nginx or Traefik in front.
  • Backups, and testing them. One volume or one database dump. The bundled CLI exports everything as JSON; restoring it is still on you.
  • Upgrades. Pull the new tag and restart. Migrations run themselves at boot, and a failed one is not recorded, so the next boot retries it.
  • Sign-in, in server mode. Several accounts on one instance sign in through the central account service we operate; you cannot run your own today.
What your instance contacts

Comes in

  • Your team
  • TLS and the reverse proxy.

Your instance

127.0.0.1:6001

Database · SQLite / PostgreSQL / MySQL

Goes out

  • Our central account
    • Sign-in
    • Your plan: at most every 15 min, once a deployment secret is set
    • First automatic translation: account ID only
  • Your translation provider, with your key
  • Our site: UI language files, fetched by the browser

Your instance does contact the central account: for sign-in (always in server mode; in local mode, only for an account with no local password); and, once a deployment secret is set, for your plan (at most every 15 minutes, while the dashboard is in use) and your first automatic translation (account ID only). The browser downloads non-English UI language files from our site.

Choose

How you want to run it

Three modes, one image. The mode decides who signs in and what the instance depends on — it does not change the product.

  • Server
    Multi-team

    Pick this if several people need their own account on the same instance.

    • Sign-in, roles, and the Draft → Reviewed → Approved workflow.
    • A networked database — PostgreSQL or MySQL.
    • Sign-in goes through the central account service we operate; you cannot run your own today.
  • Desktop
    No Docker

    Pick this if you would rather not run a server at all.

    • Native macOS, Windows and Linux build with the server embedded.
    • Translations are stored in local SQLite and leave the machine only when you send them to a service you set up, such as a translation provider or a Git remote.
    • Signing in still goes through your account online.
    Download the app →

Pick an engine

Your database, your compose file

All three carry the same 27 tables, so the choice is not about correctness. It is about how you back the instance up and who else needs to reach it.

docker-compose.yml

One file, one container

What the published image ships and what the desktop app uses. No second service, no credentials to manage. The whole instance is this file plus one Docker volume.

The port binds to 127.0.0.1 on purpose: reachable from this machine, from nowhere else. Local mode is built for one person or one small team, so widen it only behind a proxy, a firewall or a VPN you already trust.

The published port binds to 127.0.0.1 by default. Nothing is reachable from another machine until you decide it is.

Desktop vs self-hosted

What changes when you self-host

CriterionDesktop appSelf-hosted
SetupDownload and opendocker compose up -d
DatabaseSQLite, bundledSQLite, PostgreSQL or MySQL
Where data livesYour machineYour infrastructure
UpdatesAutomaticdocker compose pull && docker compose up -d
Team accessJust you, on that machineYour whole team — server mode signs in through our central account service

What depends on Elysera today

What still depends on Elysera

This project is operated by Elysera, which holds the rights to the code. Here is what still depends on Elysera today.

  • Local

    Your data, the server and your sign-in all run on your machine: the account you create at first launch signs in with a local password, and the session renews itself without contacting Elysera. One thing still goes through Elysera: the non-English interface files, which your browser downloads from its site (if it cannot, the interface falls back to the instance's own copy, in English where it has none). An account that signed in through the central account can set a local backup password to do without it.

  • Server

    Sign-in goes through the central account service Elysera operates. You cannot run your own today: its code is not published, and the dashboard uses its sign-in protocol, so a standard OIDC provider is not a drop-in replacement. If it is unreachable, sign-in stops within minutes. Your plan does not change: the instance keeps the last one it saw and never lowers it on its own, except for a trial that has ended.

  • Desktop

    Your translations are stored in a SQLite file on your machine. Signing in goes through the central account.

Leaving

Leaving with your data

Exporting runs on your own instance, with a token you set. It needs no Elysera account and no permission.

  • JSON, in your project's shape

    One language or all of them. The file follows the shape your files had when the dashboard scanned them, flat or nested; if they were mixed, or never scanned, it is nested. Keys that have no translation yet are left out.

  • A full backup

    One JSON file with the whole instance, restorable on another one. It needs the separate admin token.

  • Your locale files

    They live in your own repository. The dashboard reads them and writes back through sync; stopping it leaves them where they are.

  • From the command line

    In the Docker image, with the tokens set in the environment:

    • docker exec -it i18n-dashboard i18nd export
    • docker exec -it i18n-dashboard i18nd backup

What is not promised

A byte-identical round trip. The export follows your files' shape, but key order and formatting can differ from your originals, so a diff against them may not be clean.

Let's start

Translating your app in four steps.

  1. Create your account

    Free to start: 30 days of any plan, no card. Stays free for 1 project.

  2. Install it

    How do you want to install it?

    On your own server. Then open localhost:6001.

    docker compose pull && docker compose up -d

    Self-hosting guide

    macOS, Windows or Linux. It runs its own local server.

    Download the app
  3. Connect your project

    Point it at a folder or a Git repository. It finds your framework and your locale files.

  4. Translate

    Pick one of 8 providers and translate a whole language at once. Google Translate works without a key.