[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1723":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":23,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":42,"readmeContent":43,"aiSummary":44,"trendingCount":16,"starSnapshotCount":16,"syncStatus":14,"lastSyncTime":45,"discoverSource":46},1723,"Prismarr","Shoshuo\u002FPrismarr","Shoshuo","A self-hosted media dashboard unifying Radarr, Sonarr, Prowlarr, Jellyseerr, qBittorrent and TMDb in a single Symfony 8 interface. One search bar across the local library and TMDb, one calendar merging movie and episode releases, one dashboard, one settings page. Single Docker container, embedded SQLite, multi-arch. AGPL-3.0.","https:\u002F\u002Fhub.docker.com\u002Fr\u002Fshoshuo\u002Fprismarr",null,"Twig",316,4,2,15,0,112,118,137,336,2.1,"GNU Affero General Public License v3.0",false,"main",[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"dashboard","docker-compose","frankenphp","homelab","jellyseerr","media-station","php","prowlarr","qbittorent","radarr","self-hosted","sonarr","sqlite","symfony","tabler","tmdb","2026-06-12 02:00:32","\u003Cp align=\"center\">\n  \u003Cimg src=\"symfony\u002Fpublic\u002Fimg\u002Fprismarr\u002Fprismarr-logo-horizontal.png\" alt=\"Prismarr\" width=\"420\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>One dashboard for your self-hosted media stack.\u003C\u002Fstrong>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FShoshuo\u002FPrismarr\u002Freleases\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002FShoshuo\u002FPrismarr?label=release&color=6366f1\" alt=\"Latest release\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FShoshuo\u002FPrismarr\u002Factions\u002Fworkflows\u002Fci.yml\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002FShoshuo\u002FPrismarr\u002Fci.yml?branch=main&label=CI\" alt=\"CI\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fhub.docker.com\u002Fr\u002Fshoshuo\u002Fprismarr\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fdocker\u002Fpulls\u002Fshoshuo\u002Fprismarr?color=2496ED&logo=docker&logoColor=white\" alt=\"Docker pulls\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fhub.docker.com\u002Fr\u002Fshoshuo\u002Fprismarr\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fdocker\u002Fimage-size\u002Fshoshuo\u002Fprismarr\u002Flatest?color=2496ED&logo=docker&logoColor=white\" alt=\"Image size\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FShoshuo\u002FPrismarr\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002FShoshuo\u002FPrismarr?style=flat&color=f59e0b\" alt=\"Stars\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FShoshuo\u002FPrismarr\u002Fcommits\u002Fmain\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flast-commit\u002FShoshuo\u002FPrismarr?color=6366f1\" alt=\"Last commit\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FShoshuo\u002FPrismarr\u002Fblob\u002Fmain\u002FLICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-AGPL--3.0-blue\" alt=\"AGPL-3.0\">\u003C\u002Fa>\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPHP-8.4-777BB4?logo=php&logoColor=white\" alt=\"PHP 8.4\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSymfony-8-000000?logo=symfony&logoColor=white\" alt=\"Symfony 8\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FFrankenPHP-1.3-orange\" alt=\"FrankenPHP 1.3\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSQLite-zero--config-003B57?logo=sqlite&logoColor=white\" alt=\"SQLite\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"#features\">Features\u003C\u002Fa> ·\n  \u003Ca href=\"#quick-start\">Quick start\u003C\u002Fa> ·\n  \u003Ca href=\"#configuration\">Configuration\u003C\u002Fa> ·\n  \u003Ca href=\"#upgrade\">Upgrade\u003C\u002Fa> ·\n  \u003Ca href=\"#troubleshooting\">Troubleshooting\u003C\u002Fa> ·\n  \u003Ca href=\"#whats-next\">What's next\u003C\u002Fa> ·\n  \u003Ca href=\"#license\">License\u003C\u002Fa> ·\n  \u003Ca href=\"#note-on-ai-usage\">AI\u003C\u002Fa>\n\u003C\u002Fp>\n\n---\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Fshowcase.gif\" alt=\"Prismarr showcase\" width=\"100%\">\n\u003C\u002Fp>\n\n\u003Cdetails>\n\u003Csummary>\u003Cstrong>Static screenshots\u003C\u002Fstrong> (click to expand)\u003C\u002Fsummary>\n\u003Cbr>\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Fdashboard.png\" width=\"49%\" alt=\"Dashboard\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Fdiscover.png\" width=\"49%\" alt=\"Discover\">\n\u003C\u002Fp>\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Fcalendar.png\" width=\"49%\" alt=\"Calendar\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Fradarr.png\" width=\"49%\" alt=\"Movies (Radarr)\">\n\u003C\u002Fp>\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Fseries-detail.png\" width=\"49%\" alt=\"Series detail (Sonarr)\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Fdownloads.png\" width=\"49%\" alt=\"Downloads (qBittorrent)\">\n\u003C\u002Fp>\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Fsettings.png\" width=\"49%\" alt=\"Settings (custom theme)\">\n\u003C\u002Fp>\n\n\u003C\u002Fdetails>\n\n---\n\n## About\n\n**Prismarr** brings qBittorrent, Radarr, Sonarr, Prowlarr, Seerr and\nTMDb together in a single modern Symfony interface. No more juggling six\ntabs to manage your library.\n\nIt's not a replacement for Radarr or Sonarr - those run side by side and\nkeep doing what they do best. Prismarr is the unified control surface:\none search bar that hits the local library and TMDb, one calendar that\nmerges movie releases and episode airs, one dashboard that surfaces what\nmatters today (a recent download, a pending request, a trending pick),\nand one settings page where every API key lives - never on disk in plain\ntext and never in environment variables.\n\nThe whole thing ships as a single Docker container with SQLite inside.\nFirst boot opens a 7-step wizard: create the admin, plug your services in,\ndone. No external database, no Redis, no per-service `.env` files. Pull\nthe image, mount one volume, you're up.\n\n---\n\n## Project status\n\nPrismarr is maintained by a single developer (for now) in spare time.\nThe codebase is production-ready - I run it on my own homelab daily - but\nsupport, bug fixes and new features land when I have the bandwidth. There\nis no SLA, no commercial backing and no team behind this.\n\nThat said, I actively welcome and encourage feedback. **Feature requests,\nbug reports, code reviews, UI critiques, design ideas, translations** - if\nyou take the time to write something, I'll take the time to read it\ncarefully and reply. Open an issue, drop a PR, or just tell me what's\nmissing or what could be better. Outside contributors are exactly how a\nsolo project becomes a real one, and I'd love that to happen.\n\nThe [CHANGELOG](CHANGELOG.md) is kept up to date, and the [public Kanban](https:\u002F\u002Fgithub.com\u002Fusers\u002FShoshuo\u002Fprojects\u002F3)\nshows what's in progress, what's planned for the next release and what's\nqueued for later.\n\n---\n\n## Why Prismarr?\n\nThe selfhosted dashboard space is crowded. Here's where Prismarr fits and\nwhere the others might suit you better:\n\n- **[Organizr](https:\u002F\u002Forganizr.app\u002F)** - HTPC-focused, iframes the\n  underlying services into tabs. Excellent if you want each service's\n  full UI inside one page; less so if you want a unified library view\n  rather than six side-by-side dashboards.\n- **[Heimdall](https:\u002F\u002Fheimdall.site\u002F)**, **[Homer](https:\u002F\u002Fgithub.com\u002Fbastienwirtz\u002Fhomer)**,\n  **[Homepage](https:\u002F\u002Fgethomepage.dev\u002F)** - bookmark-style launchers\n  with widgets. Lightweight and fast; they don't *understand* your\n  library, they just link to other apps.\n- **[Homarr](https:\u002F\u002Fhomarr.dev\u002F)** - drag-and-drop launcher with rich\n  widgets. Closer to Prismarr in spirit but still a launcher: Radarr is\n  a tile, not a page.\n- **[Seerr](https:\u002F\u002Fdocs.seerr.dev\u002F)** (the unified successor of the\n  archived Overseerr \u002F Seerr) - request frontend. Prismarr embeds\n  Seerr as one component among others; if requests are *all* you need,\n  Seerr alone is enough.\n- **Servarr web UIs themselves** - the most powerful option. Prismarr\n  doesn't replace them; it sits on top and gives you a unified search,\n  calendar, dashboard and download view.\n\n**Pick Prismarr if** you want a single Symfony app that *consumes* the\nAPIs of your existing stack, gives you one search box across the local\nlibrary and TMDb, one calendar that merges movie and episode releases,\none dashboard that surfaces what matters today, and one settings page\nwhere every API key lives - all in one Docker container with SQLite, no\nexternal dependencies.\n\n**Pick something else if** you want iframes (Organizr), pure bookmarks\n(Heimdall \u002F Homer \u002F Homepage), drag-and-drop dashboards (Homarr) or just\na request UI (Seerr).\n\n---\n\n## Features\n\n### Unified media management\n- Movies (Radarr) and Series (Sonarr) with five view modes\n- **Multiple Radarr \u002F Sonarr instances side by side** (e.g. Radarr 1080p\n  + Radarr 4K + Radarr Anime). Each instance is first-class in the UI:\n  per-instance pages, per-instance health badge, per-instance Ctrl+K\n  search results. Add, rename, reorder and toggle instances from\n  `\u002Fadmin\u002Fsettings` without leaving Prismarr\n- Global `Ctrl+K` search across every enabled instance + TMDb \u002F TheTVDB\n- Quick-add modal with a per-instance target picker — when a film is\n  already on Radarr 1080p you can still push it to Radarr 4K from one click\n- Unified calendar (movie + episode releases) merged across every\n  instance and deduped by `tmdbId` \u002F `tvdbId`, with month \u002F week \u002F day\n  views and an iCal export\n\n### Dashboard\n- Hero spotlight with a random pick from your library\n- Upcoming releases (seven-day mini-calendar)\n- Pending Seerr requests enriched with TMDb metadata\n- Live health of all six services\n- Personal watchlist, weekly TMDb trending, latest library additions\n\n### Downloads\n- Full qBittorrent dashboard: server-side pagination, sorting and filters\n- Drag-and-drop `.torrent` upload (multi-file)\n- Pipeline badges: clicking a torrent jumps to its movie \u002F series\n- Cross-tab toasts when a download finishes\n- Optional Gluetun integration: public IP, country, port forwarding sync\n\n### Discovery\n- TMDb landing page with hero, personalised recommendations, trending\n- Personal watchlist, Explorer with filters (genre \u002F decade \u002F cast)\n- Countdown for upcoming releases\n- Deep-links into your existing library\n\n### Profile and preferences\n- `\u002Fprofil` page: edit display name, password and avatar (JPG \u002F PNG \u002F WebP \u002F GIF, 2 MB max)\n- Display preferences: theme colour, UI density, toasts, timezone,\n  date \u002F time format, qBit auto-refresh, default home page\n- English \u002F French UI (EN-first, FR fully translated, ICU plural support)\n- Settings export \u002F import (credentials are always stripped)\n\n### Security\n- Symfony authentication with login rate-limiter (5 attempts per IP+username \u002F 15 min)\n- Container runs as non-root, dynamic Content-Security-Policy\n- SSRF protection on user-provided URLs (protocol allowlist, cloud-metadata blocklist)\n- CSRF tokens on every mutation, branded error pages that never leak exception data\n- Profiler routes return 403 for non-RFC1918 clients in dev\n\n---\n\n## Quick start\n\n### Requirements\n\n- Docker and Docker Compose\n- At least one of: qBittorrent, Radarr, Sonarr, Prowlarr, Seerr\n- Optional: Gluetun if qBittorrent runs behind a VPN\n- Optional: a TMDb API key (free) to enable the Discovery page\n\n### Install\n\n**Step 1.** Get a `docker-compose.yml` file. Pick one of the two options below.\n\n#### Option A — Copy-paste\n\nCreate a file named `docker-compose.yml` with the following content:\n\n```yaml\nservices:\n  prismarr:\n    image: shoshuo\u002Fprismarr:latest\n    container_name: prismarr\n    restart: unless-stopped\n    stop_grace_period: 30s\n    ports:\n      - \"7070:7070\"\n    volumes:\n      - prismarr_data:\u002Fvar\u002Fwww\u002Fhtml\u002Fvar\u002Fdata\n\nvolumes:\n  prismarr_data:\n```\n\n#### Option B — Download\n\n```bash\nwget -O docker-compose.yml https:\u002F\u002Fraw.githubusercontent.com\u002FShoshuo\u002FPrismarr\u002Fmain\u002Fdocker-compose.example.yml\n```\n\n(or `curl -O https:\u002F\u002Fraw.githubusercontent.com\u002FShoshuo\u002FPrismarr\u002Fmain\u002Fdocker-compose.example.yml && mv docker-compose.example.yml docker-compose.yml`)\n\n#### Option C: Bind-mount (Servarr-style layout)\n\nIf you prefer host folders next to your other Servarr containers (Radarr, Sonarr, etc.) for easy browsing, replace the named volume with a bind-mount. The container target must stay at `\u002Fvar\u002Fwww\u002Fhtml\u002Fvar\u002Fdata`:\n\n```yaml\n    volumes:\n      - .\u002Fprismarr-config:\u002Fvar\u002Fwww\u002Fhtml\u002Fvar\u002Fdata\n```\n\nDrop the top-level `volumes:` block from Option A, and create the host folder before first start: `mkdir -p .\u002Fprismarr-config`.\n\n> [!warning]\n> If you write your own compose instead of using a template above, the container target for the data volume must be `\u002Fvar\u002Fwww\u002Fhtml\u002Fvar\u002Fdata`. Prismarr does not use the Servarr `\u002Fconfig` or `\u002Fapp\u002Fconfig` convention. A bind-mount on the wrong path silently creates an anonymous volume that resets on every redeploy, with no error in the logs.\n\n---\n\n**Step 2.** Start the container:\n\n```bash\ndocker compose up -d\n```\n\n**Step 3.** Open `http:\u002F\u002Flocalhost:7070` in your browser. The setup wizard\nwill guide you through:\n\n- admin account creation\n- TMDb API key (optional)\n- Radarr \u002F Sonarr \u002F Prowlarr \u002F Seerr URLs and keys\n- qBittorrent + Gluetun (optional)\n\n`APP_SECRET` and `MERCURE_JWT_SECRET` are auto-generated on first boot and\npersisted in the `prismarr_data` volume. No `.env` editing required.\n\n### Default port\n\nPrismarr listens on `7070`. To use a different port, change the left side of\nthe mapping in `docker-compose.yml`:\n\n```yaml\nports:\n  - \"8080:7070\"  # access on http:\u002F\u002Flocalhost:8080\n```\n\n---\n\n## Configuration\n\nEverything is configured from the UI:\n\n- **First boot**: the 7-step setup wizard at `\u002Fsetup`\n- **Later**: the Settings page at `\u002Fadmin\u002Fsettings` (admin only)\n\nExternal service credentials (TMDb \u002F Radarr \u002F Sonarr \u002F Prowlarr \u002F Seerr\nAPI keys, qBittorrent password, service URLs), display preferences and\nlanguage are stored in the SQLite database (`setting` table). They never\nappear in environment variables or in any committable file.\n\nTwo framework-level secrets - `APP_SECRET` and `MERCURE_JWT_SECRET` - are\nauto-generated on first boot and persisted inside the volume at\n`var\u002Fdata\u002F.env.local`. They never leave the volume; you don't have to set,\nrotate or back them up manually.\n\n### Environment variables (optional)\n\n| Variable | Default | Purpose |\n|---|---|---|\n| `APP_ENV` | `prod` | Switch to `dev` for local development only |\n| `PRISMARR_PORT` | `7070` | Internal listening port |\n| `TRUSTED_PROXIES` | `127.0.0.1,REMOTE_ADDR` | Adjust if running behind Traefik \u002F nginx \u002F Caddy \u002F Cloudflare Tunnel |\n| `TZ` | `UTC` | Container time zone (e.g. `Europe\u002FParis`, `Pacific\u002FHonolulu`). Drives both the OS clock and the PHP date helpers — see issue [#12](https:\u002F\u002Fgithub.com\u002FShoshuo\u002FPrismarr\u002Fissues\u002F12) |\n| `PHP_MEMORY_LIMIT` | `1024M` | PHP memory ceiling per request. Bump (e.g. `2048M`, `-1` for unlimited) if you have a very large Radarr \u002F Sonarr library — see issue [#13](https:\u002F\u002Fgithub.com\u002FShoshuo\u002FPrismarr\u002Fissues\u002F13) |\n| `PHP_MAX_EXECUTION_TIME` | `120` | PHP wall-time ceiling per request, in seconds. Bump alongside `PHP_MEMORY_LIMIT` if the films \u002F series page times out |\n\n### Persistent data\n\nEverything lives in the `prismarr_data` Docker volume:\n\n- `prismarr.db` (SQLite database)\n- `.env.local` (auto-generated secrets)\n- `sessions\u002F` (login sessions)\n- `cache\u002F` (TMDb \u002F cover thumbnails)\n- `avatars\u002F` (uploaded user avatars)\n\nA standard backup is `docker run --rm -v prismarr_data:\u002Fdata -v $(pwd):\u002Fbackup alpine tar czf \u002Fbackup\u002Fprismarr-data.tgz -C \u002Fdata .`.\n\n### Reverse proxy\n\nPrismarr handles HSTS and Permissions-Policy headers itself. When sitting\nbehind a reverse proxy that terminates TLS (Traefik, nginx, Caddy,\nCloudflare Tunnel), set `TRUSTED_PROXIES` to your proxy network so that\nSymfony reads the right `X-Forwarded-*` headers.\n\n---\n\n## Upgrade\n\n```bash\ndocker compose pull\ndocker compose up -d\n```\n\nSQLite migrations run automatically on container start. The `prismarr_data`\nvolume is preserved.\n\nTo pin a specific version instead of `latest`:\n\n```yaml\nservices:\n  prismarr:\n    image: shoshuo\u002Fprismarr:1.0.0\n```\n\n### Testing pre-release builds\n\n`shoshuo\u002Fprismarr:beta` is the unreleased work-in-progress build of `main`.\n\n> ### \u002F!\\ No stability guarantee \u002F!\\\n>\n> **`:beta` can be broken, regress features, or lose data.** It is not held to\n> the quality bar of `:latest`, and there is no promise it works as well, or at\n> all. **Do not run it on an instance you care about.**\n\nYou only ever get `:beta` if you explicitly set `image: shoshuo\u002Fprismarr:beta`\nin your compose file. The `:beta` tag is built separately and never touches\n`:latest`, so users on `:latest` (including with Watchtower or other auto-pull\nsetups) stay on stable. If you *do* opt into `:beta`, auto-pull will keep\nfetching fresh pre-release builds, which is usually what a tester wants.\n\nIf you still want to help test it:\n\n- Back up your `prismarr_data` volume before switching, and again before each\n  `:beta` pull. A pre-release database migration may not be safely reversible,\n  so going back to `:latest` can require restoring that backup.\n- Report problems on the issue tracker with a `[beta]` prefix in the title,\n  including the version shown on **Settings → Updates** and `docker logs prismarr`.\n\n---\n\n## Troubleshooting\n\n### Forgot the admin password\n\n```bash\ndocker exec -it prismarr php bin\u002Fconsole app:user:reset-password \u003Cemail>\n```\n\n### Setup wizard loops forever\n\nThe wizard finishes when the `setup_completed` flag is set. To force it\nback to step 1:\n\n```bash\ndocker exec -it prismarr php bin\u002Fconsole doctrine:query:sql \\\n  \"DELETE FROM setting WHERE key = 'setup_completed'\"\n```\n\n### Health check returns 503\n\n`GET \u002Fapi\u002Fhealth` returns 503 when SQLite is unreachable. Inspect the\ncontainer logs:\n\n```bash\ndocker logs prismarr --tail 200\n```\n\nThe most common cause is a corrupted volume after a host-level disk full\nevent. Restoring the latest backup is the fastest path.\n\n### Container won't start\n\n```bash\ndocker logs prismarr\n```\n\nIf the error mentions `permission denied` on the volume, your host\nfilesystem is preventing the container's `www-data` user (UID 33 by\ndefault) from writing. Make sure the volume is a Docker-managed volume\nand not a bind mount onto a directory owned by root.\n\n---\n\n## What's next\n\nEverything lives on the [public Kanban](https:\u002F\u002Fgithub.com\u002Fusers\u002FShoshuo\u002Fprojects\u002F3): what's in progress, what's planned for the next release, and what's parked for later.\n\n---\n\n## Tech stack\n\n- **Backend**: PHP 8.4 \u002F Symfony 8 \u002F Doctrine ORM\n- **Server**: FrankenPHP (Caddy + PHP embed, worker mode) supervised by s6-overlay\n- **Frontend**: Tabler UI + Alpine.js + Turbo (Hotwire) via Symfony AssetMapper\n- **Database**: SQLite (zero-config, automatic Doctrine migrations)\n- **Cache + sessions**: filesystem (no Redis required)\n- **Queue**: Symfony Messenger (Doctrine transport)\n- **Real-time**: Mercure SSE built into Caddy\n\nA single Docker container ships everything. The image is `~282 MB` and runs\non `amd64` and `arm64`.\n\n---\n\n## FAQ\n\n**Why PHP \u002F Symfony?**\nBecause the developer (me) is comfortable with it and Symfony 8 lets a\nsolo dev ship a polished, testable, batteries-included web app fast.\nThe runtime is FrankenPHP in worker mode, so the per-request overhead\nis small. Performance is a non-issue at homelab scale.\n\n**ARM \u002F Raspberry Pi support?**\nYes. The image is built for `linux\u002Famd64` and `linux\u002Farm64`. It runs\non a Raspberry Pi 4\u002F5, an Apple Silicon Mac, or any arm64 NAS.\n\n**Does Prismarr need internet access?**\nOnly for TMDb (cover art, metadata, discovery) and the Servarr\nservices you point it at. The app itself works fully on a LAN; if\nyou don't configure TMDb, the Discovery page is the only feature\nthat goes dark.\n\n**Can I run it behind a reverse proxy?**\nYes. Set `TRUSTED_PROXIES` to your proxy network (see Configuration).\nHSTS and Permissions-Policy headers are emitted by the embedded\nCaddy.\n\n**Where are my API keys stored? Is it safe?**\nIn the SQLite database (table `setting`). The database lives in the\n`prismarr_data` Docker volume, never in environment variables, never\nin any file under version control. The export feature strips every\nkey matching `api_key`, `password` or `secret` so accidentally\nsharing your config is safe.\n\n**How do I back up my install?**\nSnapshot the `prismarr_data` Docker volume (one-liner in the\nConfiguration section). It contains the SQLite DB, the auto-generated\nsecrets, sessions, cache and avatars - everything needed to restore.\n\n**Can I contribute a translation in another language?**\nYes - duplicate `symfony\u002Ftranslations\u002Fmessages+intl-icu.en.yaml` to\nyour locale (e.g. `messages+intl-icu.de.yaml`), translate, and open\na PR. The setup wizard will pick up the new locale automatically.\n\n---\n\n## Contributing\n\nContributions are welcome - please open an issue first to discuss the scope\nbefore submitting a PR.\n\n- **Contributor guide**: [CONTRIBUTING.md](CONTRIBUTING.md) (Definition of Done + golden rules)\n- **Code of conduct**: [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) (Contributor Covenant 2.1)\n- **Security vulnerability**: [SECURITY.md](SECURITY.md) - please **do not** open a public issue, contact by email\n- **Changelog**: [CHANGELOG.md](CHANGELOG.md)\n\nBefore any commit: `make check` (PHP lint + Twig lint + full PHPUnit suite).\n\n---\n\n## License\n\n[AGPL-3.0](LICENSE) - you may use, modify and redistribute Prismarr freely,\nincluding in self-hosted production. Derivatives must remain open source\nunder the same license.\n\n---\n\n## Acknowledgements\n\nInspired by the remarkable work of:\n\n- [Overseerr \u002F Seerr](https:\u002F\u002Fgithub.com\u002FFallenbagel\u002Fjellyseerr)\n- The [Servarr](https:\u002F\u002Fwiki.servarr.com\u002F) family (Radarr, Sonarr, Prowlarr, Bazarr…)\n- [Tabler](https:\u002F\u002Ftabler.io\u002F) for the UI kit\n\nAnd, on a more personal note: thank you to my friends and family for the\npatience, the encouragement, and for asking \"so when does it ship?\" often\nenough to keep me going. This release is for you.\n\n---\n\n## Star history\n\n[![Star history](https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=Shoshuo\u002FPrismarr&type=Date)](https:\u002F\u002Fstar-history.com\u002F#Shoshuo\u002FPrismarr&Date)\n\n---\n\n> ## Note on AI usage\n>\n> Prismarr is a solo project. I make the calls on what to ship, what to drop, how things plug together. The bugs are on me too. [Claude Code](https:\u002F\u002Fclaude.com\u002Fclaude-code) (Anthropic) helped me move faster on the chunks listed below; the rest is mine.\n>\n> To stay transparent, here are the concrete areas where it was actively helpful:\n>\n> **Primary uses**\n>\n> - **i18n translation and key wiring** - English isn't my native language; Claude handled the bulk of the EN\u002FFR YAML files (4 188 keys on each side, kept in exact parity) and the `trans()` call sites in PHP and Twig.\n> - **Log and JavaScript debugging** - faster triage of stack traces, Turbo\u002FAlpine quirks, and front-end edge cases I couldn't reproduce locally.\n> - **API endpoint cataloguing** - mapping the ~600 endpoints across Radarr v3, Sonarr v3, Prowlarr v1, Seerr, qBittorrent v2 and TMDb v3 from their OpenAPI specs.\n> - **Code audits** - flagging missed translations, forgotten edge cases and bugs in my own code.\n> - **SVG icons and illustrations** - generating and tweaking inline SVGs (logo variants, empty-state illustrations, status icons) when no off-the-shelf asset matched.\n>\n> **Secondary uses**\n>\n> - **PHPUnit test debugging** - turning failing assertions into readable diffs.\n> - **Mobile responsive design** - tightening the calendar week\u002Fday views, sidebar collapse and dashboard widget grids on phones.\n> - **Security review and hardening** - second-opinion checks on SSRF guards, CSP, CSRF tokens, XSS, SQL\u002FXML injection patterns, profiler exposure.\n> - **Documentation translation and polish** - README, CHANGELOG, CONTRIBUTING, SECURITY, CODE_OF_CONDUCT in both English and French.\n> - **Local commit messages and the private PROGRESSION.md log** - keeping the per-session journal readable. That file lives only on my machine and is never pushed to GitHub.\n> - **Single-container Docker design** - the FrankenPHP + s6-overlay layout that supervises the web server and the messenger worker.\n>\n> Nothing landed without me reading it, running it, and watching `make check` go green (PHP lint + Twig lint + full PHPUnit). Claude is a tool I leaned on, not a co-author.\n","Prismarr 是一个自托管的媒体仪表盘，整合了Radarr、Sonarr、Prowlarr、Jellyseerr、qBittorrent 和 TMDb 在一个基于Symfony 8的界面中。其核心功能包括通过单一搜索栏访问本地库和TMDb，合并电影和剧集发布的统一日历，以及统一的设置页面。项目采用单个Docker容器部署，内置SQLite数据库支持多架构，并遵循AGPL-3.0许可协议。Prismarr适合需要集中管理个人媒体服务器资源的家庭实验室或个人用户使用。","2026-06-11 02:45:41","CREATED_QUERY"]