UmlautAdaptarrEX

UmlautAdaptarrEX

Umlaut- und Deutsch-Titel-Proxy für Sonarr / Radarr / Lidarr / Readarr.

Sonarr   Radarr   Lidarr   Readarr   Prowlarr

Deutsch · English

# UmlautAdaptarrEX > **AI Disclaimer:** Das Projekt wurde mit Hilfe von AI erstellt, jedoch nicht "gevibt coded". Ich bin seit über 11 Jahren Software Entwickler und Security hat einen hohen Stellenwert. Vollständiger Rewrite des ursprünglichen .NET-Tools auf **Next.js + Fastify + Prisma + SQLite**. UmlautAdaptarrEX gibt sich gegenüber den *arrs als Indexer aus, schaltet sich zwischen *arrs und den echten Indexer und korrigiert Suchen wie Ergebnisse, damit Releases mit Umlauten oder deutschen Titeln zuverlässig gefunden, geladen und importiert werden. ## Welche Probleme löst es? - Releases mit Umlauten werden von den \*arrs sonst oft nicht korrekt gefunden oder importiert (Suche nach `o` statt `ö`, fehlende Zuordnung am Indexer). - Sonarr & Radarr erwarten den englischen Titel von TheTVDB / TMDB. Bei deutschen Produktionen oder Übersetzungen führt das zu Fehlern wie `Found matching series/movie via grab history, but release was matched to series by ID`. - Schlechtes Release-Naming (z. B. fehlendes `GERMAN`-Tag) wird optional korrigiert, sodass die \*arrs es korrekt erkennen. ## Features | Feature | Status | | -------------------------------------------------------------------------------------------------------------------------------------- | :----: | |   Sonarr Support | ✓ | |   Radarr Support (nativ, via `alternateTitles` + optional TMDB) | ✓ | |   Lidarr Support | ✓ | |   Readarr Support | ✓ | |   Prowlarr & NZB Hydra Support | ✓ | | **Prowlarr-Indexer-Patch-Dialog**: Indexer auswählen, automatisch taggen & von `https` auf `http` umstellen | ✓ | | Newznab (Usenet) & Torznab (Torrent) Support | ✓ | | Mehrere Instanzen je \*arr-Typ (z. B. 2× Sonarr) | ✓ | | Erkennung von Releases mit deutschem Titel & TVDB-Alias | ✓ | | Korrekte Suche und Erkennung von Titeln mit Umlauten | ✓ | | Umbenennung von Releases mit schlechtem Naming (optional) | ✓ | | **Web-UI** (Setup-Wizard, Login, Dashboard, Instanzen, Sync-Runs, Request- & Rename-History) | ✓ | | **Persistente SQLite-Datenbank**, kein Cache-Verlust nach Neustart | ✓ | | **Live-Logs** über WebSocket | ✓ | | **Mehrere Title-Provider** mit konfigurierbarer Reihenfolge: pcjones-API, TVDB, TMDB | ✓ | | **Sprach-Plugins**: Deutsche Umlaute (default), Schwedische Umlaute, Französische Akzente | ✓ | | **i18n**: Deutsch + Englisch | ✓ | > **Hinweis zu Radarr:** > > - TMDB / TVDB Key wird benötigt, damit Radarr funktioniert. > - TMDB / TVDB Key wird benötigt, damit die Plugins funktionieren. ## Sprach-Plugins Sprach-Plugins steuern, wie Titel normalisiert werden und welche Schreibvarianten gegen den Indexer gefahren werden. Sie können im Setup-Wizard (Schritt "Plugins") oder nachträglich unter **Settings → Plugins** einzeln aktiviert werden. Mehrere Plugins lassen sich gleichzeitig betreiben, z. B. wenn eine Bibliothek deutsche und französische Titel enthält. | Plugin | Sprache | Default | Verhalten | | ------------------------ | :-----: | :-----: | ------------------------------------------------------------------------------------------------------------------------------------------ | | **Deutsche Umlaute** | `de` | ✓ | Latin-Varianten (`ä → ae`, `ö → oe`, `ü → ue`, `ß → ss`) und ohne-Punkte-Varianten (`ä → a`, …); strippt Artikel `Der/Die/Das/The/An/A`. | | **Schwedische Umlaute** | `sv` | ◯ | Schwedische Romanisierung: `Å → A` oder `AA`, `Ä → A` oder `AE`, `Ö → O` oder `OE` (Groß-/Kleinschreibung bleibt erhalten). | | **Französische Akzente** | `fr` | ◯ | Entfernt Akzente (`é → e`, `à → a`, `ç → c`, …) und löst Ligaturen auf (`æ → ae`, `œ → oe`); strippt Artikel `Le/La/Les/Un/Une/Des/Du/De`. | Pro Plugin werden mehrere Variationsmaps generiert, sodass auch Releases mit gemischter Schreibweise (z. B. `Brueckenkopf` vs. `Brückenkopf` vs. `Brueckenkopf`) zuverlässig erkannt werden. Audio-Bibliotheken (Lidarr) verwenden zusätzlich einen "Strip-All"-Pfad, der den diakritischen Buchstaben komplett entfernt. ## Installation Drei Wege, das Image zu starten. Egal welche Variante du wählst: nach dem ersten Start öffnest du `http://:5007` und der Setup-Wizard führt durch Account-Anlage, Modus, Plugins, Prowlarr- und Proxy-Konfiguration. ### Variante 1: Docker Compose (empfohlen) Es liegen zwei Compose-Dateien im Repository: | Datei | Image-Quelle | Wann nutzen? | | ---------------------------- | -------------------------------------------- | ------------------------------------------------------------------ | | `docker-compose.yml` | Lokaler Build (`build: .`) | Du hast das Repository geklont und willst aus dem Quellcode bauen. | | `docker-compose.release.yml` | `lexfi/umlautadaptarrex:latest` (Docker Hub) | Schnellster Weg, kein Repo-Checkout nötig. | Hinweis: läuft der Container als root (Standard), korrigiert das Image die Rechte des `/data`-Volumes beim Start automatisch (Default `PUID=1000`, `PGID=1000`). Ein manueller `chown` ist nicht mehr nötig. root wird dabei **ausschließlich** für diesen einmaligen `chown` benötigt: der Entrypoint legt die Rechte zurecht und wechselt dann via `gosu` auf `PUID:PGID`. Der eigentliche App-Prozess (`node start.mjs`) läuft also nie als root. Wer Files unter `./data` mit einem anderen Host-User besitzen möchte, setzt `PUID`/`PGID` als Env-Variablen (siehe Kommentare in der jeweiligen Compose-Datei). Unprivilegierter Betrieb: das Image kann auch direkt als Nicht-root-User gestartet werden (`docker run --user 1000:1000`, ein `user:`-Eintrag in der Compose-Datei, Kubernetes `runAsUser` oder das `run_as`-Feld der TrueNAS-App). In diesem Fall überspringt der Entrypoint `chown`/`gosu` und läuft direkt unter der vorgegebenen UID/GID, ganz ohne `CHOWN`/`SETUID`/`SETGID`-Capabilities. Voraussetzung: das `/data`-Volume gehört dieser UID/GID bereits (manuell `chown` oder via TrueNAS-ACL). 1. Container starten. Entweder mit Image vom Docker Hub: ```sh curl -O https://raw.githubusercontent.com/xpsony/UmlautAdaptarrEX/main/docker-compose.release.yml docker compose -f docker-compose.release.yml up -d ``` oder als lokaler Build (Repo-Checkout vorausgesetzt): ```sh docker compose up -d ``` 2. Web-UI öffnen: [http://localhost:5007](http://localhost:5007). Ports anpassen: siehe Abschnitt „Ports" und `.env.example`. Logs verfolgen: `docker compose -f docker-compose.release.yml logs -f umlautadaptarrex` (bzw. ohne `-f docker-compose.release.yml` beim lokalen Build). Stop: `docker compose ... down`. Update vom Docker Hub: `docker compose -f docker-compose.release.yml pull && docker compose -f docker-compose.release.yml up -d`. Update bei lokalem Build: `docker compose build --pull && docker compose up -d`. ### Variante 2: `docker run` (ohne Compose) Reicht, wenn du das Repository nicht klonen möchtest und nur das fertige Image laufen lassen willst: ```sh docker run -d \ --name umlautadaptarrex \ --restart unless-stopped \ -p 5005:5005 \ -p 5006:5006 \ -p 5007:5007 \ -v /srv/umlautadaptarrex/data:/data \ -e TZ=Europe/Berlin \ lexfi/umlautadaptarrex:latest ``` Das Verzeichnis `/srv/umlautadaptarrex/data` wird beim ersten Start automatisch angelegt und vom Entrypoint auf `PUID:PGID` (Default `1000:1000`) gesetzt. Ein manueller `chown` ist nicht nötig. Optional als zusätzliche `-e`-Flags: - `PUID=1000` / `PGID=1000` (UID und GID, mit denen der App-Prozess läuft. Files unter `./data` bekommen diese Owner-IDs). Greift nur, wenn der Container als root startet; bei `--user` werden `PUID`/`PGID` ignoriert und die App läuft direkt unter der angegebenen UID/GID. - `LOG_LEVEL=info` (Pino-Level: `trace`, `debug`, `info`, `warn`, `error`, `fatal`). Update: `docker pull lexfi/umlautadaptarrex:latest && docker rm -f umlautadaptarrex` und Befehl oben erneut ausführen. Das `data/`-Volume bleibt dabei erhalten. ### Variante 3: Unraid Template Das Unraid-Template für UmlautAdaptarrEX ist jetzt offiziell im Community-Applications-Store (CA) verfügbar: In Unraid unter **Apps** einfach nach „UmlautAdaptarrEX" suchen und direkt installieren, ohne Template-URL. Das Template wird im separaten Repository [xpsony/UmlautAdaptarrEX-Unraid-Template](https://github.com/xpsony/UmlautAdaptarrEX-Unraid-Template) gepflegt. Installationsanleitung, Template-URL und Feld-Defaults (Ports, PUID/PGID, Appdata-Pfad) stehen im README des Template-Repos. ### Variante 4: TrueNAS App UmlautAdaptarrEX ist als Community-App im TrueNAS-App-Katalog verfügbar: [apps.truenas.com/catalog/umlautadaptarrex_community](https://apps.truenas.com/catalog/umlautadaptarrex_community/). In der TrueNAS-Oberfläche unter **Apps → Discover Apps** nach „UmlautAdaptarrEX" suchen und installieren. Die App wird von [xopez](https://github.com/xopez) gepflegt, vielen Dank dafür. ### Variante 5: Bare-Metal / ohne Docker Funktioniert auf jedem Linux- oder macOS-Host mit Node `>= 24` und `pnpm 11.11.0`. Der Supervisor in [`start.mjs`](start.mjs) übernimmt Migration, Fastify (Port 5005 + TCP-Proxy 5006) und Next.js (Port 5007), ein Reverse-Proxy ist nicht nötig. ```sh git clone https://github.com/xpsony/UmlautAdaptarrEX.git cd UmlautAdaptarrEX pnpm install --frozen-lockfile pnpm prod # build:prod -> prisma migrate deploy -> start:prod ``` Die einzelnen Schritte als separate Scripts (z. B. für CI): | Script | Was passiert | | -------------------- | ---------------------------------------------------------------------------- | | `pnpm build:prod` | Baut Next.js (Standalone) + Fastify-Bundle (tsup) mit `NODE_ENV=production`. | | `pnpm prisma:deploy` | Wendet Migrationen idempotent auf die SQLite-DB an. | | `pnpm start:prod` | Startet den Supervisor (Migration → Fastify → Next.js-Child) mit Prod-Env. | Persistenz: der `data/`-Ordner (SQLite) bleibt im Repo-Verzeichnis. Für „läuft nach Reboot" liegt eine systemd-Unit unter [`deploy/umlautadaptarrex.service`](deploy/umlautadaptarrex.service) bei, inklusive Beispielen für User, `WorkingDirectory` und Hardening (`ProtectSystem`, `ReadWritePaths`). Kurzfassung der Installation: ```sh sudo cp deploy/umlautadaptarrex.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now umlautadaptarrex journalctl -u umlautadaptarrex -f ``` ### Variante 6: Proxmox VE (LXC, Community-Script) > **Funktioniert, wird derzeit aber nicht bei den Proxmox Helper Scripts aufgenommen.** Das Skript folgt > dem [community-scripts](https://community-scripts.org/docs/ct/readme)-Format (ProxmoxVED) und ist > einsatzbereit. Aufgrund der aktuellen Regularien des Projekts kann es derzeit nicht in das offizielle > Proxmox-Helper-Scripts-Repo aufgenommen werden, daher wird es self-hosted aus diesem Fork bereitgestellt. Ein einzeiliger Befehl, direkt in der **Shell des Proxmox-VE-Hosts** ausgeführt, legt einen LXC-Container an und installiert UmlautAdaptarrEX darin (self-hosted aus diesem Fork, kein ProxmoxVED-Clone nötig): ```bash bash -c "$(curl -fsSL https://raw.githubusercontent.com/xpsony/UmlautAdaptarrEX/main/proxmox/community-scripts/ct/umlautadaptarrex.sh)" ``` Was das Skript tut: - Legt einen Debian-13-LXC an (2 vCPU, 2048 MB RAM für den Build, 6 GB Disk). - Installiert Node.js 26 + pnpm (via npm), holt das neueste Release von `xpsony/UmlautAdaptarrEX` und führt `pnpm build:prod` + `pnpm prisma:deploy` aus. - Fragt während der Installation die drei Service-Ports ab (vorbelegt mit den Defaults, Enter übernimmt): - **5007** — Web-UI + Setup-Wizard (`http://:5007/setup`) - **5005** — Public API + Indexer-Routen für die \*arrs - **5006** — Prowlarr-TCP-Proxy (Basic-Auth, wird im Setup gesetzt) - Startet die App als systemd-Dienst (`umlautadaptarrex`). Die SQLite-DB liegt unter `/opt/umlautadaptarrex/data/` und bleibt über Updates erhalten. Nach dem Lauf das Setup im Browser öffnen: `http://:5007/setup`. Ports später ändern: `/opt/umlautadaptarrex/.env` bearbeiten (`UMLAUTADAPTARREX_WEBUI_PORT` / `_LEGACYAPI_PORT` / `_PROXY_PORT`) und `systemctl restart umlautadaptarrex`. Ein LXC hat eine eigene IP, es gibt also kein Host-seitiges Port-Mapping. Details und Wartungshinweise stehen in [`proxmox/community-scripts/README.md`](proxmox/community-scripts/README.md). ## Ports | Port | Dienst | Zweck | | ---- | -------------- | ------------------------------------------------------------------------------- | | 5005 | Fastify | Public API, Legacy-Routen (`///api`), WebSocket-Logs (`/ws/logs`) | | 5006 | TCP HTTP-Proxy | Prowlarr-Indexer-Proxy mit HTTPS-CONNECT-Tunneling | | 5007 | Next.js | Web-UI | Die Ports lassen sich per Umgebungsvariable setzen (Priorität: gebrandete Variable > DB > Default): | Port | Umgebungsvariable | Fallback | | ---- | --------------------------------- | ------------------------ | | 5005 | `UMLAUTADAPTARREX_LEGACYAPI_PORT` | `5005` | | 5006 | `UMLAUTADAPTARREX_PROXY_PORT` | `Setting.proxyPort` (DB) | | 5007 | `UMLAUTADAPTARREX_WEBUI_PORT` | `5007` | `UMLAUTADAPTARREX_PROXY_PORT` überschreibt den in der Datenbank gespeicherten Wert bei jedem Start; ist die Variable gesetzt, wird das Proxy-Port-Feld unter Einstellungen → Erweitert schreibgeschützt angezeigt. Jede Variable setzt sowohl den Container-internen Bind-Port als auch den veröffentlichten Host-Port (das Compose-Mapping nutzt auf beiden Seiten denselben Wert). Vorlage siehe `.env.example`. Die `data/`-DB wird in den Container gemountet und enthält die gesamte Konfiguration. ## Architektur Wie UmlautAdaptarrEX zwischen den \*arrs, Prowlarr und den Indexern sitzt. ### Modus 1: Prowlarr-Indexer-Proxy (empfohlen, Port 5006) ``` ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ Sonarr │ │ Radarr │ │ Lidarr │ │ Readarr │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ Newznab/Torznab API (mit *arr-API-Key) │ └─────────────┼─────────────┼─────────────┘ ▼ ┌───────────┐ │ Prowlarr │ Indexer-Manager └─────┬─────┘ │ HTTP (Schema im Indexer von https → http) │ HTTP-Proxy: Indexer-Proxies → "UmlautAdaptarrEX" ▼ ┌──────────────────────────────────┐ │ UmlautAdaptarrEX │ │ ───────────────────────────── │ │ :5006 TCP-Proxy (Basic-Auth) │◀── HTTP-CONNECT-Tunnel für https-Targets │ :5005 Fastify-API + Legacy │ │ :5007 Web-UI (Next.js) │ │ │ │ Pipeline pro Request: │ │ 1. URL parsen (t=search/...) │ │ 2. Title-Lookup über Provider │ │ (pcjones │ TVDB │ TMDB │ │ │ db-cache, Reihenfolge │ │ konfigurierbar) │ │ 3. Query um Titelvarianten │ │ erweitern (Umlaute, Aliase, │ │ Sprach-Plugin-Maps) │ │ 4. Request an echten Indexer │ │ 5. XML-Response umschreiben │ │ (Title-Fix, Rename, Tags) │ │ │ │ Persistenz: SQLite (Prisma) │ │ • Settings, Instanzen, ApiKey │ │ • Title-Cache, Sync-Runs │ │ • Request- & Rename-History │ └──────────────┬───────────────────┘ │ HTTPS (ausgehend) ▼ ┌────────────┐ │ Indexer │ Newznab/Torznab, │ (Usenet/ │ NZB Hydra, ... │ Torrent) │ └────────────┘ ``` ### Modus 2: Direkt als Indexer (ohne Prowlarr-Proxy, Port 5005) ``` ┌──────────┐ ┌──────────┐ ┌──────────┐ │ Sonarr │ │ Radarr │ │ Lidarr │ ... └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ Indexer-URL eingetragen als: │ │ http://:5005// └───────────────┼───────────────┘ ▼ ┌──────────────────────────────────┐ │ UmlautAdaptarrEX │ │ Legacy-Route │ │ ///api?t=... │ │ (gleiche Pipeline wie oben) │ └──────────────┬───────────────────┘ │ HTTPS ▼ ┌────────────┐ │ Indexer │ └────────────┘ ``` Kernpunkte: - **5006** ist der einzige Port, den Prowlarr direkt anspricht (HTTP-Proxy mit Basic-Auth, Default-User `UmlautAdaptarr`). - **5005** trägt sowohl die Admin-API als auch die Legacy-Route `///api` für den Direktmodus. - **5007** ist nur die UI; sie reverse-proxyt `/api/*` zur Laufzeit an 5005 (`src/proxy.ts`). ## Konfiguration in Prowlarr (empfohlen) Empfohlene Methode, da bei mehreren Indexern kein Geschwindigkeitsverlust entsteht. 1. UmlautAdaptarrEX starten und im Web-UI Setup durchlaufen (Sonarr/Radarr/Lidarr/Readarr-Instanzen anlegen). 2. In Prowlarr: **Settings → Indexers → Indexer Proxies → Add (HTTP)** - Name: `UmlautAdaptarrEX HTTP Proxy` - Host: Containername (`umlautadaptarrex`) oder Host-IP - Port: `5006` - Tag: `umlautadaptarrex` - Username/Passwort: die im Setup-Wizard (Schritt "Proxy") gesetzten Zugangsdaten eintragen. Default-User ist `UmlautAdaptarr`, das Passwort wird automatisch generiert. Beide Werte stehen jederzeit unter **Settings → Proxy** in der Web-UI. Wenn UmlautAdaptarrEX die Prowlarr-Indexer-Proxy-Konfiguration automatisch anlegt (Setup-Wizard, Schritt "Prowlarr-Install"), werden die Credentials direkt mit hinterlegt. 3. Bei allen Indexern, die den Proxy nutzen sollen: - Tag `umlautadaptarrex` hinzufügen - **URL-Schema von `https` auf `http` ändern**, nur so kann UmlautAdaptarrEX die Anfragen lokal abfangen. Ausgehende Anfragen an den Indexer bleiben natürlich `https`. **Schneller geht es über den Indexer-Patch-Dialog:** Statt jeden Indexer in Prowlarr von Hand anzufassen, listet UmlautAdaptarrEX deine Prowlarr-Indexer auf und übernimmt beide Schritte (Tag setzen + `https`→`http`) für die ausgewählten Indexer. Der Dialog ist Teil des Setup-Wizards und jederzeit unter **Settings → Prowlarr → „Indexer patchen"** erreichbar. „Alle auswählen" ist Default; das Abwählen eines bereits gepatchten Indexers setzt Tag und Schema wieder zurück. Der Dialog erklärt außerdem, warum die Umstellung nötig ist und dass die Verbindung zum Indexer im Internet weiterhin `https` bleibt (es verlässt kein unverschlüsselter Datenverkehr dein System). 4. **Test All Indexers** ausführen. Bei verbliebenen `https`-URLs erscheint eine Warnung in den Live-Logs. ## Konfiguration ohne Prowlarr-Proxy > Anmerkung : Aktuell noch nicht getestet Bei wenigen Indexern oder ohne Prowlarr direkt in Sonarr/Radarr/Lidarr/Readarr je Indexer als API-URL eintragen: ``` http://:5005// ``` API-Key wird normal gesetzt. Den `apiKey` für UmlautAdaptarrEX erzeugst du im Web-UI. Die vollständige HTTP-API (Admin, Auth, Legacy, WebSocket, TCP-Proxy) ist in [docs/api.md](docs/api.md) dokumentiert. Die Release-Rename-Pipeline ist in [docs/renaming.md](docs/renaming.md) beschrieben. Wer das Projekt forken und auf eigenen GitHub-Owner / Docker-Hub-Namespace umflaggen will, findet die Anleitung in [docs/forking.md](docs/forking.md) — inkl. `scripts/rebrand.sh` für die statischen Defaults und der drei Runtime-Hebel (`DOCKERHUB_IMAGE`, `UMLAUTADAPTARREX_IMAGE`, `NEXT_PUBLIC_GITHUB_OWNER` / `NEXT_PUBLIC_GITHUB_REPO`). ## Local Development ```sh pnpm install cp .env.example .env pnpm prisma:migrate pnpm dev # Web-UI: http://localhost:5007 # Fastify API: http://localhost:5005 # Prowlarr-Proxy: tcp://localhost:5006 ``` ### Development Container (VS Code) Für eine reproduzierbare Dev-Umgebung kannst du den enthaltenen Devcontainer nutzen: 1. Repository in VS Code öffnen. 2. `Dev Containers: Reopen in Container` ausführen. 3. Nach dem Container-Start: `pnpm dev`. Der Container enthält Node 26 (Dev und Produktions-Image) + pnpm 11.11.0, leitet die Ports `5005/5006/5007` weiter und setzt empfohlene VS Code Extensions/Settings für TypeScript, Next.js, Prisma, Tailwind, ESLint/Prettier, Vitest und Playwright. Nach `pnpm dev` erreichst du die UI über Port `5007` und die API über Port `5005` (direkt oder über VS Code Port Forwarding). Der TCP-Proxy ist auf Port `5006` erreichbar. ### Tests ```sh pnpm test # vitest (unit + integration) pnpm test:e2e # playwright (baseURL = http://localhost:5005) pnpm typecheck pnpm lint ``` ## Projektstruktur ``` src/ ├─ app/ # Next.js App Router (Web-UI) ├─ components/ # React + shadcn UI ├─ server/ # Fastify-Gateway, TCP-Proxy, Sync-Worker, Logging ├─ domain/ # Framework-freier Kern │ ├─ normalization/ # Titelnormalisierung │ ├─ variations/ # Titelvarianten │ ├─ matching/ # Release-Matching │ ├─ plugins/ # Sprach-Plugins (DE-Umlaute, SE-Umlaute, FR-Akzente) │ └─ xml/ # Newznab/Torznab-XML-Rewriting ├─ providers/ # Externe Title-Provider (pcjones, TVDB, TMDB, db-cache) ├─ arr/ # Sonarr/Radarr/Lidarr/Readarr/Prowlarr-Clients ├─ schemas/ # Zod-Schemas (shared client/server) ├─ messages/ # i18n (de.json, en.json) └─ lib/ # db, auth, secrets, legacy-env, i18n, utils ``` ## Stack - Node 24+ (Produktions-Image: Node 26) / TypeScript / pnpm 11 - Next.js 16 / React 19 / Tailwind 4 / shadcn (new-york) - Fastify 5 / Prisma 7 / SQLite (better-sqlite3) - Zod 4 / next-intl / @tanstack/react-query - Vitest 4 / Playwright ## Kontakt & Support - GitHub Issues für Bugreports und Feature-Requests - [UsenetDE Discord](https://discord.gg/src6zcH4rr) → `#umlautadaptarr` ## Credits Basiert auf der Idee und Logik von [PCJones/UmlautAdaptarr](https://github.com/PCJones/UmlautAdaptarr). Danke an [xopez](https://github.com/xopez) für die TrueNAS-Community-App. ## Disclaimer UmlautAdaptarrEX ist ein technischer Kompatibilitäts-Proxy. Die Software lädt selbst keine Inhalte herunter, umgeht keine technischen Schutzmaßnahmen (DRM) und stellt keine Verbindung zu Indexern her, die nicht zuvor in den \*arrs oder in Prowlarr konfiguriert wurden. Das Projekt ist ausschließlich für die Nutzung mit legalen Quellen gedacht, etwa eigenen Sicherungskopien, regulär abonnierten Usenet- oder Tracker-Diensten, gemeinfreien Werken sowie Inhalten mit ausdrücklicher Lizenz des Rechteinhabers. Die Verantwortung für die rechtmäßige Nutzung der \*arrs und der angebundenen Indexer liegt vollständig beim jeweiligen Betreiber. Die Autoren übernehmen keine Haftung für eine zweckfremde oder rechtswidrige Verwendung. In Deutschland gilt insbesondere das Urheberrechtsgesetz (UrhG), vergleichbare Regelungen bestehen in anderen Ländern. Die Software wird "wie besehen" bereitgestellt, ohne jegliche Gewährleistung (siehe MIT-Lizenz). ## License MIT