Skip to content

Arclight Roadmap

Phase 1 is partway through. The foundations and the data layer are built and tested: metadata (TMDB), library, profiles, indexers, download clients, the naming and notification packages, and the web shell. The release pipeline is the gap: the decision engine, grab, import, history, blocklist, calendar and notifications api modules do not exist yet (shared contracts for them are being written), and most web pages are placeholders. The parser package is being finished. Phase 0 is complete except authentication.

Phase 1 item Status
metadata (package, routes, refresh jobs) done
library module done, except disk scan
parser in progress
profiles module done, except separate language profiles
indexers module + package done, except interactive-search UI and auto search
releases / decision engine not started (contracts in progress)
downloads + download-clients package in progress
organizer in progress
history, blocklist, calendar, notifications in progress
web in progress

Status markers below: [done], [in progress], [not started]. Tests: 778 passing across the workspace.

Clean-room build. Each phase ends with something that runs in Docker on the NAS and does real work. Functionality first; the Tron theme is a layer in Phase 5 and does not block anything before it. Behaviour specs for each area are written to docs/spec/ before the code, derived from how the upstream apps behave.

  • [done] pnpm monorepo, apps/api (Fastify + Drizzle/SQLite), apps/web (React + Vite), packages/shared (Zod contract).
  • [not started] Auth (first-run setup, sessions, API key). The api has no auth module and is unauthenticated today.
  • [done] Settings store, system info, health, structured logging, in-process scheduler with a persistent job table, WebSocket feed (all present; the auth line above is the exception).
  • [done] Multi-stage Dockerfile + compose with qBittorrent; PUID/PGID entrypoint. (The Dockerfile’s install layer copies only the api, web and shared manifests; verify the image still builds now that more packages exist.)

Done when: docker compose up on the NAS → setup wizard → dashboard, jobs visible.

Phase 1 — Library, metadata, parser, download pipeline (TV + movies)

Section titled “Phase 1 — Library, metadata, parser, download pipeline (TV + movies)”

The core loop, for both media types from day one:

  • [done] packages/metadata: TMDB search/lookup for series and movies, images, refresh jobs.
  • [done] library module: root folders, series/seasons/episodes, movies, monitored flags, media files, disk scan, free-space.
  • [in progress] packages/parser: release-name parser (title, year, season/episode/daily/anime/absolute numbering, quality source + resolution, codecs, HDR, audio, release group, proper/repack, languages, edition for movies, hash/scene checks). Fixture suite built from the documented upstream parser test cases (as data, not code).
  • [done] profiles module: quality definitions and profiles, custom formats (spec engine), language profiles, delay profiles, release profiles (must/must-not contain, preferred).
  • [in progress] indexers module + packages/indexers: Torznab/Newznab clients, categories, per-indexer settings, RSS sync, interactive + automatic search, indexer health/backoff.
  • [not started] releases module: decision engine (quality cutoff/upgrade, custom-format score, language, size limits, seeders, blocklist, already-grabbed, delay, protocol priority).
  • [in progress] downloads module (api module is named download-clients) + packages/download-clients: qBittorrent client (add/track/remove, categories, seed limits, path mapping), queue, completed-download handling, import with episode/movie matching, failed-download handling and auto re-search.
  • [in progress] organizer module (the package exists with tests; no api module yet): naming tokens, rename preview, file moves/hardlinks, media management settings.
  • [in progress] history, blocklist, calendar, notifications (Discord, Telegram, webhook, email, custom script, Jellyfin/Emby/Plex library refresh).
  • [in progress] Web: Library (one grid, TV + movies), item pages, add-new, Activity (queue/history/ blocklist), Calendar, Settings for everything above, interactive search modal.

Notes on partial items:

  • metadata: image URL building only, no image caching yet.
  • library: root-folder free space is reported; there is no disk scan.
  • parser: 2910 of 2932 fixture cases pass (99.2%); package is uncommitted.
  • profiles: language lives on the quality profile; no separate language-profile entity.
  • indexers: Torznab/Newznab, caps, rate limit, backoff, RSS sync and manual search (GET /search) work. Automatic search needs the releases module.
  • downloads: qBittorrent client, remote path mappings, tracked downloads, queue and refresh job work. Completed-download handling, import and failed-download re-search need the imports module (in progress).
  • history/blocklist/calendar/notifications: the notifications package (agents for Discord, Telegram, webhook, email, script, push, media servers) is tested; the four api modules have no folders yet and only shared contracts exist.
  • web: shell, dashboard, search and the System pages are real; Library, Activity, Calendar, Wanted and all Settings pages are ComingSoon placeholders.

Done when: add a series and a movie, both get searched, grabbed through qBittorrent, imported, renamed, and the media server is refreshed, with no other *arr installed.

Phase 2 — Indexer depth (Prowlarr parity)

Section titled “Phase 2 — Indexer depth (Prowlarr parity)”
  • YAML-defined site indexers (public and private trackers that lack Torznab), with login flows, search templates, result parsing. Definition format designed for Arclight, informed by Cardigann/Prowlarr’s catalogue.
  • Indexer proxies (FlareSolverr, HTTP/SOCKS), per-indexer stats, rate limits, category mapping per media type, cross-indexer manual search page.
  • Additional download clients: Transmission, Deluge, SABnzbd, NZBGet, rTorrent.
  • Import lists (Trakt, TMDB lists, Plex watchlist, IMDb lists).
  • subtitles module: language profiles (forced/HI/cutoff), wanted list, per-file subtitle state, history, blacklist, upgrade logic, scoring with ranked matches.
  • packages/subtitles: provider abstraction; OpenSubtitles.com, Subdl, Addic7ed, Podnapisi, Gestdown, Subf2m, Napisy24, Animetosho, embedded-subtitle extraction first; more by usage. Whisper (optional, external endpoint) last.
  • Post-processing: sync (ffsubsync/alass), encoding, custom scripts.
  • Web: Subtitles pages — wanted, history, blacklist, profiles, providers, per-item manual search/upload.

Done when: subtitles arrive automatically after import for every configured language.

Phase 4 — Requests and discover (Seerr parity)

Section titled “Phase 4 — Requests and discover (Seerr parity)”
  • Users with roles, permission flags, quotas; local and media-server (Jellyfin/Emby/ Plex) sign-in.
  • requests module: movie/series/season requests, approval flow and auto-approve, 4K/alternate-profile targets, override rules, issues + comments, watchlist sync, availability tracking against the library and the media server.
  • Discover: TMDB trending/popular/upcoming/genres/networks/people, configurable sliders.
  • Notifications for request events; per-user notification agents (push, email, Discord DM, Telegram, webhook).
  • Web: Discover pages, request flow, Requests admin, Issues, per-user settings.

Done when: a non-admin user requests a show, an admin approves, it is grabbed, imported, subtitled, and the user is notified it is available.

Phase 5 — neon light-grid theme and polish

Section titled “Phase 5 — neon light-grid theme and polish”
  • Theme tokens (neon cyan / orange on near-black, grid, glow), motion, typography.
  • Dashboard as a live grid of activity; mobile layout; PWA.
  • Importer that reads existing Sonarr / Radarr / Prowlarr / Bazarr / Seerr databases and configs to adopt a running stack in place.
  • Optional Sonarr/Radarr-shaped compatibility API for third-party tools.
  • Backup/restore, update channel, docs, GHCR image, release process.
  • Remove the pre-rename compatibility shims: the deprecated MEDIATRON_* env fallback in apps/api/src/config.ts, the one-time media-tron.db -> arclight.db file move in apps/api/src/db/index.ts, and acceptance of media-tron_*.zip backups in the backup module.