English
Get started

← All templates · Developer tools

Deploy Weblate in one click

A localization platform: translate apps and docs with your team, in sync with Git

A self-hosted alternative to Crowdin, Transifex, and Lokalise.

What is Weblate?

Weblate is an open-source, web-based localization platform. Developers, professional translators and volunteers translate software, websites and documentation in one place, with roles for who may translate, review and manage. Michal Čihař started it in 2012; it is copylefted libre software under the GNU GPL, and its developers also run it for others as Hosted Weblate.

Weblate is built for continuous localization. It keeps a clone of your Git repository, takes in new strings when you push, and commits the translations back with each translator credited, to push to your branch or to open a pull request. It reads and writes the files your project already has: GNU gettext, XLIFF, JSON for i18next, Vue I18n or go-i18n, Android and Apple strings, Java properties, YAML, Markdown and dozens more. Translators get context, screenshots, a glossary, translation memory and quality checks; machine translation and LLMs are optional, as suggestions or drafts that people review.

This template runs Weblate's official image, the 2026.10 line, with a Postgres 18 database and a Valkey 9 database that New project makes beside it, linked before Weblate first starts; for Postgres you may pick one of yours instead. That start makes the admin from the email and password you give, before Weblate answers anyone, and sign-up stays closed. Celery, which runs Weblate's background work, runs in one process, Weblate's documented way to save memory. Its email, for invitations, notifications and password resets, goes through Resend, SendGrid or Amazon SES, whichever you pick in New project, or nowhere until you pick one.

Hosting Weblate on Pethost

  1. You sign in to Pethost with a passkey, GitHub or Google. No machine yet? You pick a plan, and the link waits until it is ready.
  2. New project opens at Weblate. You fill in what it asks for and click Create project: Email, Admin password.
  3. Email is optional: for Weblate to send it, you pick Resend, SendGrid, or Amazon SES in New project and paste in what it gives you.
  4. New project also makes new databases for Weblate, and links them before the app first starts: Postgres (512 MB) and Valkey (256 MB). Or you pick one of your Postgres databases: Weblate gets a user and a database of its own in it, which the other apps there cannot read, and the apps in it are backed up and restored together.
  5. In a minute or two Weblate is live at its own address with HTTPS. Its secrets are made at random, and its data is in the nightly backup.
  6. It is a project like any other: you or your agent can change it, roll it back or restore it.

Questions about Weblate

Is Weblate free and open source?

Yes. Weblate is libre software under the GNU GPL, version 3 or later, so you can run, study, change and self-host it at no cost. Hosted Weblate is its developers' paid service, with a 14-day trial, and public libre projects can ask for its Libre plan gratis.

How does Weblate work with Git?

Weblate keeps a clone of each repository you add. It pulls new strings when your code host notifies it of a push, and commits translations back, crediting each translator, then pushes them or opens a pull request. For a private repository, add the public key from Manage → SSH keys to it, or connect GitHub, GitLab and other hosts under Manage → Code-hosting connections.

Which file formats does Weblate support?

Dozens: GNU gettext PO, XLIFF, JSON (i18next, Vue I18n, go-i18n, Format.JS and plain), Android string resources, Apple .strings and .stringsdict, ARB, Java and GWT properties, .NET RESX, Qt Linguist, YAML, TOML, PHP and Laravel strings, CSV, Markdown, HTML, subtitles and more. Weblate's documentation lists each format's variants and limits.

Can Weblate use machine translation or AI?

Yes, if you want it. Weblate can ask DeepL, Google Cloud Translation, Azure AI Translator, Amazon Translate, LibreTranslate, OpenAI, Anthropic, Ollama and other services for suggestions, each set up under Automatic suggestions. Its own translation memory needs no outside service, and generated text can stay a suggestion until a person accepts it.

How much memory does Weblate need?

Weblate's documentation names 3 GB of memory and 2 CPU cores as the least for Weblate, its database and a web server on one host, and 4 GB for hundreds of components. This template runs Weblate's background tasks in one process, its documented way to save memory: on our test machine Weblate took about 1 GB at rest and up to 1.5 GB while it imported a project, beside about 70 MB for Postgres and 12 MB for Valkey.

How much memory and disk does Weblate need?

Weblate is moderate: about 1 GB of memory at rest and up to 1.5 GB while it imports a project, beside its Postgres of 512 MB and its Valkey of 256 MB; its disk holds a clone of each repository it translates. New project gives each of its databases the memory the template recommends, unless you change it: Postgres (512 MB) and Valkey (256 MB). On Pethost the Starter plan is enough for it, with room for other apps beside it.

Weblate Docker Compose file

The template is this compose.yaml and the variables written into the project’s .env as it is created. Pethost runs the file as it is written. The machine writes how the app signs in to its databases there, as it links them. New project writes the email settings picked in it, or leaves them empty when the app sends none.

Containers: weblate (weblate/weblate:2026.10).

Databases, each a project of its own: Postgres (512 MB), Valkey (256 MB).

Volumes, in the nightly backup: data, cache.

services:
  weblate:
    image: weblate/weblate:2026.10
    restart: unless-stopped
    environment:
      WEBLATE_SITE_DOMAIN: ${HOST}
      # The admin account, made at the first start before Weblate answers anyone. Weblate sets
      # its email and password again from these at every start.
      WEBLATE_ADMIN_EMAIL: ${ADMIN_EMAIL}
      WEBLATE_ADMIN_PASSWORD: ${ADMIN_PASSWORD}
      WEBLATE_REGISTRATION_OPEN: "0"
      # TLS ends at the machine's proxy, which says so in X-Forwarded-Proto and gives the
      # visitor's address in X-Forwarded-For. It reaches the project from the machine's networks,
      # 10.192.0.0/10, the one source Weblate's nginx takes that header from.
      WEBLATE_ENABLE_HTTPS: "1"
      WEBLATE_SECURE_PROXY_SSL_HEADER: HTTP_X_FORWARDED_PROTO,https
      WEBLATE_IP_PROXY_HEADER: HTTP_X_FORWARDED_FOR
      WEBLATE_TRUSTED_PROXY_ADDRESSES: 10.192.0.0/10
      # Celery's queues in one process: Weblate's documented way to save memory on a small
      # machine.
      CELERY_WORKER_MODE: single
      # Its translations, users and history, in the Postgres database linked to the project.
      POSTGRES_HOST: ${DATABASE_HOST:?reload New project to link a Postgres database, or send link_databases with env_prefix DATABASE}
      POSTGRES_PORT: ${DATABASE_PORT:?reload New project to link a Postgres database, or send link_databases with env_prefix DATABASE}
      POSTGRES_DB: ${DATABASE_NAME:?reload New project to link a Postgres database, or send link_databases with env_prefix DATABASE}
      POSTGRES_USER: ${DATABASE_USER:?reload New project to link a Postgres database, or send link_databases with env_prefix DATABASE}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD:?reload New project to link a Postgres database, or send link_databases with env_prefix DATABASE}
      # Its task queue and cache, in the Valkey database linked to the project.
      REDIS_HOST: ${REDIS_HOST:?reload New project to link a Valkey database, or send link_databases with env_prefix REDIS}
      REDIS_PORT: ${REDIS_PORT:?reload New project to link a Valkey database, or send link_databases with env_prefix REDIS}
      REDIS_PASSWORD: ${REDIS_PASSWORD:?reload New project to link a Valkey database, or send link_databases with env_prefix REDIS}
      REDIS_DB: "0"
      # The mail provider picked in New project, by STARTTLS on its port. With none, Weblate's
      # mail goes nowhere, and its host stays set, which Weblate requires.
      WEBLATE_EMAIL_BACKEND: ${SMTP_BACKEND:-django.core.mail.backends.dummy.EmailBackend}
      WEBLATE_EMAIL_HOST: ${SMTP_HOST:-localhost}
      WEBLATE_EMAIL_PORT: ${SMTP_PORT:-25}
      WEBLATE_EMAIL_HOST_USER: ${SMTP_USER}
      WEBLATE_EMAIL_HOST_PASSWORD: ${SMTP_PASSWORD}
      WEBLATE_EMAIL_USE_TLS: "1"
      WEBLATE_EMAIL_USE_SSL: "0"
      WEBLATE_SERVER_EMAIL: ${SMTP_FROM}
      WEBLATE_DEFAULT_FROM_EMAIL: ${SMTP_FROM_HEADER}
    volumes:
      # The repositories Weblate translates, its settings and media.
      - data:/app/data
      - cache:/app/cache
    tmpfs:
      - /run
      - /tmp

volumes:
  data:
  cache:

More in Developer tools