Ctrl K
ComunidadGuías…

ROADMAP.md

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Sublarr — Roadmap

> The current release line is **v1.9.x**. This page describes direction, not a
> commitment — items may shift, merge, or drop. The full release history lives
> in the [CHANGELOG](CHANGELOG.md).

---

## Where Sublarr stands

The core pipeline — search, scoring, download, *arr integration, standalone
mode, subtitle tooling — has been stable since 1.0 and has grown steadily
through the 1.x line. Sublarr is now leaving the pure "feature phase": the
most-requested capabilities either exist, or exist as open pull requests.

The next chapter is therefore **not 50 new features**. It is finishing,
surfacing, and documenting what is already built — with four themes:
**transparency, monitoring, extensibility, and developer experience** — on top
of an uncompromising reliability baseline.

## Guiding principles

1. **Reliability before features.** A subtitle manager must never damage a
   library. Data-integrity bugs preempt all feature work (see #156, #159).
2. **A deterministic, explainable core.** Scoring and selection stay
   rule-based and reproducible. Every automatic decision must be inspectable
   after the fact.
3. **Quality over quantity.** Prefer consolidating existing mechanisms over
   adding parallel ones. New configuration surface needs to earn its
   maintenance cost.
4. **AI assists, it never acts.** AI features explain, flag, and suggest —
   they never modify files or influence scores on their own (see
   [AI direction](#ai-direction) below).

---

## 🧱 Now — Consolidation

Roughly in priority order. Several items are open PRs that need review,
rebasing, and merge coordination rather than new code.

### Data integrity first

- **Ungated remux in the wanted search** (#159) and **hardlink-aware remux**
  (#160) — fixed by #171; the top-priority merge.
- **Repair tool for HI-removal damage** (#156) — promised, still open.
- **Migration discipline** — unify the diverged Alembic heads (a merge
  revision ships with the decision-log PR) so startup auto-upgrade works
  reliably again, and keep the chain linear from here on.

### Transparency: the decision log stack

Answering *"why was exactly this subtitle chosen?"* end-to-end:

- **Decision log** (#172) — record the full selection pipeline per search
  (provider skips/hits, filter funnel with per-candidate rejection reasons,
  download attempts, final pick) and expose it in History and Wanted.
- **Score breakdown everywhere** (#173) — persist the per-component breakdown
  and surface it consistently; no score points outside the breakdown.
- **History reasons, rollback & dry run** (#170) — "why is this entry here"
  column, one-click rollback, and a wanted **dry-run preview** (what *would*
  Sublarr do, without touching disk or DB).

Follow-ups once landed: retention/pruning for stored decision logs, docs.

### Profiles & scoring rules — then freeze

The "different strategies for anime / movies / TV" request, solved with
profile- and rule-mechanics in the proven *arr style rather than a generic
rule engine:

- **Per-profile provider selection + scoring presets** (#168)
- **Release-group tier ranking** (#164)
- **User-defined regex scoring rules** (#166) — Sonarr-release-profile-style
- **Per-series format requirement (ASS-only)** (#169)

After these land, rule mechanics are intentionally **frozen**: global weights,
presets, tiers, regex rules, fansub preferences and the penalty pipeline
already interact — the decision log exists precisely to keep that debuggable.
New rule surface only when decision logs demonstrate a real, recurring need.

### Monitoring in the app

- **Library & provider health dashboard** (#170) — missing/failed/unmatched
  totals plus per-provider health (circuit-breaker state ⋈ hit rate) as an
  in-app `/health` page; no Grafana required.
- Follow-up: surface queue depths (whisper, translation) on the same page.
- Historical trends (success rate over time, latency) stay in the bundled
  Grafana dashboards (`monitoring/grafana`) — the app shows *state*, Grafana
  shows *history*.

---

## 🔭 Next — Extensibility & developer experience

### Integrations & API

Outgoing webhooks (HMAC-signed, retried), a machine-readable event catalog,
WebSockets, health/statistics endpoints and OpenAPI already exist. Remaining:

- **Generated event reference** — the event catalog
  (`backend/events/catalog.py`) is the single source of truth; generate the
  public event/payload documentation from it instead of writing it by hand.
- **Wanted list export** (#175) — CSV/JSON export for external tooling.
- Explicit non-goal: **SSE**. WebSockets already cover live updates; a second
  streaming channel is maintenance without benefit.

### Extensibility

- **Custom HTTP/JSON provider** (#165) — connect private subtitle servers or
  any REST API through pure configuration, no plugin code required. Expected
  to absorb much of the raw "provider plugin" demand.
- **Plugin system: prove it before growing it.** Loader, manifest validation,
  hot reload, template and marketplace routes exist — but the official
  registry is empty. Before extending plugins to translators/notifiers/sync
  modules: publish real provider plugins, write the tutorial, fill the
  registry. If the custom HTTP provider satisfies the demand instead, keep
  the plugin surface deliberately small.
- Plugins run unsandboxed (same trust model as Bazarr) — any marketplace
  promotion must state this prominently. This is a security posture, not a
  feature gap.

### Developer experience

- Generated event reference (above) and the documented custom-provider
  contract (`docs/CUSTOM_PROVIDER_API.md`, #165).
- A plugin tutorial that goes beyond the bundled template.
- An architecture overview diagram for contributors.
- Explicit non-goal: hand-maintained **SDKs** — the OpenAPI spec is the
  contract; client code can be generated from it.

---

## 🤖 AI direction

AI stays a complement, never the core. The role that fits Sublarr is an
**explanation and suggestion layer on top of the deterministic pipeline** —
making the app more understandable and the tools more accessible, without
ever touching files or scores on its own.

### Guardrails (non-negotiable)

1. **AI reads, AI never writes.** Output is a badge, a hint, or a diff
   proposal the user applies — never an automatic file modification. (#156 is
   the standing reminder of why.)
2. **Local-first.** Ollama by default; cloud backends opt-in, routed through
   the existing cost tracker and prompt-safety layer.
3. **Advisory, never blocking.** A negative AI verdict flags, it never
   discards — the `dubtitle_verify` pattern.
4. **No chatbot.** AI results surface in existing UI patterns (badges,
   tooltips, diff views, modals).

### Candidate features, in order

1. **"Explain this" on the decision log** — turn the structured decision log
   (#172) into a localized plain-language explanation on demand. Read-only,
   zero risk, the single best synergy between transparency and AI.
2. **Subtitle quality badge** — sample ~30 cues per downloaded file; a local
   LLM rates MT likelihood, OCR artifacts, grammar density, encoding damage →
   green/yellow/red badge next to the existing MT/trust badges. The upgrade
   system keeps deciding by its own rules; at most, a red verdict marks the
   item as wanting an upgrade (the `mt_provisional` pattern: keep + keep
   seeking).
3. **OCR review as diffs** — after batch OCR, an LLM pass proposes
   corrections for suspect lines, shown in the editor's existing diff view;
   the user applies them.
4. **Glossary bootstrap** — propose per-series glossary entries (character
   names, honorifics, recurring terms) for the user to confirm; the most
   direct lever for graduating LLM translation from "experimental".
5. **Sync plausibility** — Whisper spot-checks at a few points of the file,
   flag "likely wrong cut / offset ~1.2 s" with a one-click ffsubsync/alass
   action.
6. **Title-match assistant** — LLM as a tie-breaker for ambiguous provider
   matches (romaji/alternate titles, season collapse) — in **manual search
   only**, never in the automatic path.

### Explicit AI non-goals

- AI-adjusted scoring — it would destroy the explainability the decision log
  provides; the score stays deterministic.
- Fully automatic AI correction pipelines — advisory diffs only.
- LLM-generated dashboard summaries — the health statistics speak for
  themselves.

---

## Ongoing

- **Provider maintenance** — keep the 21+ providers working as upstream APIs
  and sites change; add high-value providers on request.
- **Performance at scale** — smooth behaviour on very large libraries,
  faster scans, leaner resource use.
- **Translation maturity** — improve quality and reliability (glossaries,
  context windows) until LLM translation can graduate from "experimental".
- **Quality-of-life UI** — accessibility, mobile, waveform-editor polish,
  organic migration of legacy styles to the design-token system.
- **Community-requested features** — prioritised from GitHub
  Issues/Discussions and Discord feedback.

Have an idea? Open a
[Discussion](https://github.com/Abrechen2/sublarr/discussions) or
[Issue](https://github.com/Abrechen2/sublarr/issues).

---

## How to Contribute

See [sublarr.de/docs/development/contributing](https://sublarr.de/docs/development/contributing/)
for how to submit features, bug reports, and pull requests.

- **Trusted hosts (DNS-rebinding hardening)** — optional `SUBLARR_ALLOWED_HOSTS`: reject requests whose `Host` is not listed (HTTP and Socket.IO). Matters for installs without a password, whose API is otherwise reachable from a rebinding page. Raised by the security review of the Socket.IO same-origin fix (Forgejo #60).