Lingarr is an application that supports both local and SaaS translation services to translate subtitle files into a specified target language. With automated translation options, Lingarr simplifies translating subtitles.
  • C# 67.3%
  • Vue 23.4%
  • TypeScript 8.6%
  • CSS 0.4%
  • JavaScript 0.2%
  • Other 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-05 12:31:27 +02:00
.githooks Updated CONTRIBUTING.md docs and added pre commit hook (#336) 2026-02-21 16:46:23 +01:00
.github prevent duplicate job by checking request id (#527) 2026-09-04 09:52:51 +02:00
.run replaced Lingarr.Client esproj with njsproj with needed changes to add the client properly (#401) 2026-05-09 14:02:50 +02:00
Lingarr.Client added job timeout configuration (#529) 2026-09-05 12:31:27 +02:00
Lingarr.Contracts adds proofreading (#492) 2026-08-10 18:45:23 +02:00
Lingarr.Core refactored date and time handling (#514) 2026-08-22 14:08:25 +02:00
Lingarr.Docs added job timeout configuration (#529) 2026-09-05 12:31:27 +02:00
Lingarr.Migrations refactored date and time handling (#514) 2026-08-22 14:08:25 +02:00
Lingarr.Migrations.Tests refactored date and time handling (#514) 2026-08-22 14:08:25 +02:00
Lingarr.Server added job timeout configuration (#529) 2026-09-05 12:31:27 +02:00
Lingarr.Server.Tests refactored date and time handling (#514) 2026-08-22 14:08:25 +02:00
samples/CloudflarePlugin Feat/xai provider (#497) 2026-08-11 13:13:42 +02:00
.dockerignore testing multi arch build improvements 2025-12-27 11:03:28 +01:00
.gitignore feat: added Github Actions and Gemini batch repair 2025-12-06 10:14:30 +01:00
CONTRIBUTING.md improved ai services docs and fixed several other inconsistencies (#487) 2026-08-09 21:44:52 +02:00
Directory.Packages.props Bump the nuget-minor-and-patch group with 17 updates (#520) 2026-09-02 10:22:25 +02:00
docker-compose.dcproj feat: added Github Actions and Gemini batch repair 2025-12-06 10:14:30 +01:00
docker-compose.dev.yml initial iteration of in depth docs (#467) 2026-07-17 10:45:53 +02:00
global.json upgrade to .NET 10 and migrate Pomelo to Microting MySQL provider (#397) 2026-05-07 10:06:01 +02:00
launchSettings.json update to current implementation 2024-09-14 22:03:46 +02:00
LICENSE Update GitHub LICENSE 2024-10-16 08:52:50 +02:00
Lingarr.slnx removed old scripts 2026-08-11 21:16:37 +02:00
Readme.MD added job timeout configuration (#529) 2026-09-05 12:31:27 +02:00
Settings.MD added job timeout configuration (#529) 2026-09-05 12:31:27 +02:00

Lingarr: Subtitle Translation Made Easy

Version Docker Pulls License Discord

Lingarr is an application that leverages translation technologies to automatically translate subtitle files to your desired target language. With support for multiple translation services including LibreTranslate, DeepL, and various AI providers, Lingarr offers a flexible solution for all your subtitle translation needs.

https://github.com/user-attachments/assets/be753d77-ca53-4867-adea-363145613d2b

🌟 Multiple Translation Service Support

Lingarr now offers multiple services for automated translation:

Choose the service that best fits your needs.

Usage

Docker Image Tags

Lingarr provides multi-architecture Docker images that automatically select the correct platform:

Tag Description Architectures
latest Latest stable release amd64 arm64
1.2.3 Specific version amd64 arm64
main ⚠️ Development build from main branch amd64 arm64

Note: As of 1.0.3 all images support both AMD64 (Intel/AMD) and ARM64 (Raspberry Pi, Apple Silicon) architectures. Docker will automatically pull the correct architecture for your system.

Available Registries

Lingarr Docker images are available from multiple registries:

Registry Image
GitHub Container Registry ghcr.io/lingarr-translate/lingarr:latest
Docker Hub docker.io/lingarr/lingarr:latest

Setting up Lingarr

By default, Lingarr uses MySQL however, PostgreSQL and SQLite are also supported. Note that Lingarr starts quickly, if migrations fail, using a healthcheck combined with depends_on is recommended.

services:
  lingarr:
    image: ghcr.io/lingarr-translate/lingarr:latest # or lingarr/lingarr:latest
    container_name: lingarr
    restart: unless-stopped
    environment:
      - ASPNETCORE_URLS=http://+:9876
      - DB_CONNECTION=mysql
      - DB_HOST=lingarr-db
      - DB_PORT=3306
      - DB_DATABASE=lingarr
      - DB_USERNAME=lingarr
      - DB_PASSWORD=your-password # provide a password
    ports:
      - "9876:9876"
    volumes:
      - /path/to/media/movies:/movies
      - /path/to/media/tv:/tv
      - /path/to/config:/app/config
    networks:
      - lingarr
    depends_on:
      lingarr-db:
        condition: service_healthy

  lingarr-db:
    image: mariadb:latest
    container_name: lingarr-db
    restart: unless-stopped
    environment:
      - MYSQL_DATABASE=lingarr
      - MYSQL_USER=lingarr
      - MYSQL_PASSWORD=your-password # provide a password
      - MYSQL_ROOT_PASSWORD=your-password # provide a root password
    volumes:
      - /path/to/db:/var/lib/mysql # define a volume to persist the database
    networks:
      - lingarr
    healthcheck:
      test: "mariadb $$MYSQL_DATABASE -u$$MYSQL_USER -p$$MYSQL_PASSWORD -e 'SELECT 1;'"
      interval: 10s
      timeout: 5s
      retries: 5

networks:
  lingarr:
    external: true

Setting up Lingarr using Docker CLI

Follow the following steps to set up Lingarr via Docker CLI

# Create the network
docker network create lingarr

# Start MariaDB
docker run -d \
  --name lingarr-db \
  --restart unless-stopped \
  -e MYSQL_DATABASE=lingarr \
  -e MYSQL_USER=lingarr \
  -e MYSQL_PASSWORD=your-password \
  -e MYSQL_ROOT_PASSWORD=your-root-password \
  -v /path/to/db:/var/lib/mysql \
  --network lingarr \
  mariadb:latest

# Start Lingarr
docker run -d \
  --name lingarr \
  --restart unless-stopped \
  -p 9876:9876 \
  -e ASPNETCORE_URLS=http://+:9876 \
  -e DB_CONNECTION=mysql \
  -e DB_HOST=lingarr-db \
  -e DB_PORT=3306 \
  -e DB_DATABASE=lingarr \
  -e DB_USERNAME=lingarr \
  -e DB_PASSWORD=your-password \ # provide a password
  -v /path/to/media/movies:/movies \
  -v /path/to/media/tv:/tv \
  -v /path/to/config:/app/config \
  --network lingarr \
  ghcr.io/lingarr-translate/lingarr:latest # or use: lingarr/lingarr:latest

Lingarr environment variables

These variables can be used

Environment Variable Description
ASPNETCORE_URLS=http://+:9876 The internal port that Lingarr will listen on inside the container.
MAX_CONCURRENT_JOBS=1 Sets the amount of jobs that can run concurrently, defaults to 1.
JOB_TIMEOUT_MINUTES=30 Minutes of silence before Hangfire retries a job. sqlite only, defaults to 30.
DB_CONNECTION=mysql Specifies the database connection type. Options are mysql, postgresql or sqlite.
DB_HOST=Lingarr.Mysql The hostname for the MySQL database (required when using mysql or postgresql).
DB_PORT=3306 The port for the MySQL database (required when using mysql or postgresql).
DB_DATABASE=Lingarr The name of the database (required when using mysql or postgresql).
DB_USERNAME=Lingarr The username for the database (required when using mysql or postgresql).
DB_PASSWORD=Secret1234 The password for the database (required when using mysql or postgresql).
DB_HANGFIRE_SQLITE_PATH=/app/config/Hangfire.db The path of the sqlite database file for Hangfire, when sqlite connection is used

Additional settings can be found here that can be set as environment variables to persist settings for each reinstall

Setting up LibreTranslate

This step is optional if you are using a translation service other than LibreTranslate.

  LibreTranslate:
    container_name: LibreTranslate
    image: libretranslate/libretranslate:latest
    restart: unless-stopped
    environment:
      - LT_LOAD_ONLY=en,nl  # Important, replace with your preferred languages
    ports:
      - 5000:5000
    volumes:
      - /path/to/config:/home/libretranslate/.local/share/argos-translate
    networks:
      - lingarr
    healthcheck:
      test: ["CMD-SHELL", "./venv/bin/python scripts/healthcheck.py"]

Setting up LibreTranslate using Docker CLI

Create necessary directories and set permissions:

mkdir -p /apps/libretranslate/{local,db}
chmod -R 777 /apps/libretranslate

Run LibreTranslate Docker container:

docker run -d \
  --name LibreTranslate \
  -p 5000:5000 \
  -v /path/to/libretranslate/db:/app/db \[Settings.MD](Settings.MD)
  -v /path/to/libretranslate/local:/home/libretranslate/.local \
  libretranslate/libretranslate \
  --disable-web-ui \
  --load-only=en,nl     # Important, replace with your preferred languages

LibreTranslate environment variables

Parameter Function
LT_LOAD_ONLY Allows you to add source languages by their iso code
LT_DISABLE_WEB_UI Enables or disables a Google translate like web ui

Running Lingarr as non-root

When running Docker containers, you can optionally specify which user should run the container process using the user flag. This is useful for:

  • Security: Running containers as non-root users
  • Permissions: Ensuring files created by the container have the correct ownership on your host system

Docker Compose syntax:

user: "1000:1000"  # UID:GID

Docker CLI syntax:

--user 1000:1000  # UID:GID

API Integration

Lingarr provides a RESTful API that allows you to integrate subtitle translation capabilities into your applications. You can find the complete API documentation, including a Swagger definition of all available endpoints at the Lingarr API Documentation

🤝 Contributing:

We welcome contributions to Lingarr! Whether it's bug reports, feature requests, or code contributions, please feel free to help out.

Please read our Contributing Guidelines for development setup, coding standards, and requirements for submit pull requests.

🙏 Credits:

Icons: Lucide
Subtitle Parsing: AlexPoint
Translation Services: libretranslate
GTranslate: GTranslate

🙏 Special thanks:

For supporting open source:
selfh.st by Ethan
r/selfhosted
FrankieBBBB