RepoPilotOpen in app →

Ombi-app/Ombi

Want a Movie or TV Show on Plex/Emby/Jellyfin? Use Ombi!

Mixed

Mixed signals — read the receipts

worst of 4 axes
Use as dependencyConcerns

copyleft license (GPL-2.0) — review compatibility

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit 1w ago
  • 4 active contributors
  • GPL-2.0 licensed
Show 5 more →
  • CI configured
  • Tests present
  • Small team — 4 contributors active in recent commits
  • Concentrated ownership — top contributor handles 70% of recent commits
  • GPL-2.0 is copyleft — check downstream compatibility
What would change the summary?
  • Use as dependency ConcernsMixed if: relicense under MIT/Apache-2.0 (rare for established libs)

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/ombi-app/ombi?axis=fork)](https://repopilot.app/r/ombi-app/ombi)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/ombi-app/ombi on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: Ombi-app/Ombi

Generated by RepoPilot · 2026-05-10 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/Ombi-app/Ombi shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

WAIT — Mixed signals — read the receipts

  • Last commit 1w ago
  • 4 active contributors
  • GPL-2.0 licensed
  • CI configured
  • Tests present
  • ⚠ Small team — 4 contributors active in recent commits
  • ⚠ Concentrated ownership — top contributor handles 70% of recent commits
  • ⚠ GPL-2.0 is copyleft — check downstream compatibility

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live Ombi-app/Ombi repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/Ombi-app/Ombi.

What it runs against: a local clone of Ombi-app/Ombi — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in Ombi-app/Ombi | Confirms the artifact applies here, not a fork | | 2 | License is still GPL-2.0 | Catches relicense before you depend on it | | 3 | Default branch develop exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 37 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>Ombi-app/Ombi</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Ombi-app/Ombi. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/Ombi-app/Ombi.git
#   cd Ombi
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of Ombi-app/Ombi and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Ombi-app/Ombi(\\.git)?\\b" \\
  && ok "origin remote is Ombi-app/Ombi" \\
  || miss "origin remote is not Ombi-app/Ombi (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(GPL-2\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"GPL-2\\.0\"" package.json 2>/dev/null) \\
  && ok "license is GPL-2.0" \\
  || miss "license drift — was GPL-2.0 at generation time"

# 3. Default branch
git rev-parse --verify develop >/dev/null 2>&1 \\
  && ok "default branch develop exists" \\
  || miss "default branch develop no longer exists"

# 4. Critical files exist
test -f "src/Ombi.Api.External/ExternalApis/Radarr" \\
  && ok "src/Ombi.Api.External/ExternalApis/Radarr" \\
  || miss "missing critical file: src/Ombi.Api.External/ExternalApis/Radarr"
test -f ".github/workflows/build.yml" \\
  && ok ".github/workflows/build.yml" \\
  || miss "missing critical file: .github/workflows/build.yml"
test -f "CONTRIBUTING.md" \\
  && ok "CONTRIBUTING.md" \\
  || miss "missing critical file: CONTRIBUTING.md"
test -f "src/.vscode/src.code-workspace" \\
  && ok "src/.vscode/src.code-workspace" \\
  || miss "missing critical file: src/.vscode/src.code-workspace"
test -f "global.json" \\
  && ok "global.json" \\
  || miss "missing critical file: global.json"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 37 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~7d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/Ombi-app/Ombi"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

Ombi is a self-hosted media request application that acts as a friendly interface for users to request movies and TV shows, automatically syncing with Plex, Emby, and Jellyfin servers. It eliminates the need for users to directly manage media server access while allowing admins to curate content requests before they're added to the library. Monolithic architecture: src/ contains both C# backend and TypeScript/Angular frontend side-by-side; .github/workflows orchestrate automated testing and builds across master/develop branches; scripts/setup-dev.sh provides local environment initialization. Database schema and API models are tightly coupled rather than separated by domain layers.

👥Who it's for

Home media server administrators (Plex/Emby/Jellyfin users) who want to give family and friends a simple request system, and developers maintaining the full-stack application (C# backend, TypeScript/Angular frontend, Docker deployment).

🌱Maturity & risk

Production-ready and actively maintained. The project has 3.3M+ lines of C# code, established CI/CD via GitHub Actions (build.yml, automation-tests.yml, CodeQL), Crowdin translation infrastructure, and Docker Hub distribution (100K+ pulls visible in badges). Regular releases on master and develop branches indicate continuous development.

Moderate architectural risk: the codebase is a large monolith (~3.3M C# LOC + 1.2M TypeScript LOC) with heavy coupling between frontend and backend, making targeted changes difficult. Single primary maintainer (tidusjar) visible in Azure DevOps pipeline, though GitHub Actions suggest team contributions. External dependencies on Plex/Emby/Jellyfin APIs introduce integration brittleness.

Active areas of work

Active development on master and develop branches with GitHub Actions running automated tests on every PR (automation-tests.yml, build.yml). Feature requests managed via Feature Upvote external system. Crowdin integration shows i18n work in progress. STANDALONE_MIGRATION_PROGRESS.md suggests ongoing refactoring effort.

🚀Get running

Clone the repository, navigate to src/, use setup-dev.sh to initialize the dev environment: git clone https://github.com/Ombi-app/Ombi.git && cd Ombi/src && bash setup-dev.sh. Then examine .vscode/src.code-workspace for launch configurations (ui.code-workspace for frontend, src.code-workspace for backend).

Daily commands: Run bash scripts/setup-dev.sh from project root to initialize dependencies. Backend likely via dotnet run from src/Ombi.Server or similar C# project; frontend via npm start or ng serve from TypeScript directories. See .vscode launch configs (launch.json) for exact debug configurations.

🗺️Map of the codebase

  • src/Ombi.Api.External/ExternalApis/Radarr — Entry point for Radarr integration—core external API adapter that all movie request workflows depend on
  • .github/workflows/build.yml — CI/CD pipeline definition; all PRs flow through this for testing and release automation
  • CONTRIBUTING.md — Primary contributor onboarding guide; establishes coding standards and PR expectations
  • src/.vscode/src.code-workspace — Workspace configuration; ensures consistent IDE setup across the distributed team
  • global.json — Defines .NET SDK version and build tooling; breaking changes ripple across all modules
  • makefile — Development build automation; local setup and test commands all route through this
  • crowdin.yml — Localization pipeline config; manages translations for multi-language UI support

🛠️How to make changes

Add a new external API integration (e.g., Sonarr)

  1. Create interface contract following existing pattern (src/Ombi.Api.External/ExternalApis/{NewService}/I{NewService}Api.cs)
  2. Implement HTTP client adapter with error handling (src/Ombi.Api.External/ExternalApis/{NewService}/{NewService}Api.cs)
  3. Define strongly-typed response models in Models folder (src/Ombi.Api.External/ExternalApis/{NewService}/Models/{ResponseType}.cs)
  4. Register service in dependency injection container (typically in Startup or Module) (src/{ProjectName}/Startup.cs or DependencyInjection.cs)
  5. Add unit tests following xUnit patterns (tests/Ombi.Api.External.Tests/{NewService}.Tests.cs)

Add a new request type (Movie/TV/Music)

  1. Create domain model inheriting from RequestBase (src/Ombi.Core/Models/{RequestType}Request.cs)
  2. Add database entity and DbSet mapping (src/Ombi.Store/Context/OmbiContext.cs)
  3. Create request service with business logic (src/Ombi.Core/Services/{RequestType}RequestService.cs)
  4. Expose via REST API controller (src/Ombi.Api/Controllers/{RequestType}Controller.cs)
  5. Add UI components (Vue/React component if applicable) (src/Ombi.UI/src/components/requests/{RequestType}RequestForm.vue)

Add a new feature flag or configuration setting

  1. Define configuration model with documentation (src/Ombi.Settings/Models/{FeatureSettings}.cs)
  2. Add database migration if schema change required (src/Ombi.Store/Migrations/{timestamp}_{MigrationName}.cs)
  3. Inject into service via ISettingsService (src/Ombi.Core/Services/{FeatureService}.cs)
  4. Expose management endpoint in admin controller (src/Ombi.Api/Controllers/AdminController.cs)

🔧Why these technologies

  • .NET Core / C# — Cross-platform runtime enabling single codebase to run on Windows, Linux, Docker; strong typing prevents entire classes of bugs in request processing
  • REST API (asp.net core) — Standard architectural pattern; decouples frontend UI from backend services and external integrations
  • Entity Framework Core — ORM abstraction over SQL databases; migrations manage schema evolution without manual DDL; LINQ queries reduce boilerplate
  • Dependency Injection Container — Loose coupling between API adapters and services; enables easy substitution for testing and multi-backend support
  • Crowdin — Decouples translation workflow from code; community can contribute i18n without touching codebase

⚖️Trade-offs already made

  • Multiple external API adapters (Radarr, Sonarr, CouchPotato, Lidarr) in single service

    • Why: User may have multiple *arr services running simultaneously; Ombi must coordinate requests across all of them
    • Consequence: Increased complexity in request routing logic; higher failure surface area if one adapter breaks; requires careful transaction handling
  • Database-first state management (no event sourcing)

    • Why: Simpler consistency model; requests must immediately persist to prevent race conditions when multiple admins approve simultaneously
    • Consequence: Audit trail requires explicit logging layer; cannot easily replay request history; harder to scale horizontally without distributed locking
  • Synchronous request approval flow

    • Why: Users expect immediate feedback after clicking 'Request'; reduces operational complexity vs. async queue-based approval
    • Consequence: Request creation latency depends on slowest external API response; no built-in retry mechanism for transient failures; blocks HTTP threads during external calls

🚫Non-goals (don't propose these)

  • Does not manage the Plex/Emby/Jellyfin media libraries directly—only hooks into them to check availability
  • Not a torrent or newsgroup downloader—delegates to external services (Radarr, Sonarr, Lidarr) for actual media acquisition
  • Does not provide media streaming—only request intake and routing
  • Not a real-time notification system—relies on webhook callbacks or polling to detect request status changes

🪤Traps & gotchas

Setup-dev.sh script existence implies complex initialization—do not skip it or run manual npm/dotnet install. .idea and .vscode config directories checked in suggest IDE-specific settings are version-controlled (watch for merge conflicts). Multiple code-workspace files (.vscode/src.code-workspace vs ui.code-workspace) require opening correct workspace for backend vs frontend work. STANDALONE_MIGRATION_PROGRESS.md indicates architectural debt; breaking changes likely in-flight. Plex/Emby/Jellyfin API changes can silently break sync features without compilation errors—integration tests are essential. Docker setup required for some features (see .dockerignore in src/); local SQLite/SQL Server must be configured via setup-dev.sh variables.

🏗️Architecture

💡Concepts to learn

  • Request Approval Workflow — Core business logic of Ombi: users request content, admins approve/deny, then it's added to media server. Understanding this state machine is essential for any feature modification.
  • Media Server API Integration Pattern — Ombi abstracts three different APIs (Plex REST, Emby/Jellyfin) into a unified interface; contributors must understand adapter pattern and API versioning to avoid breaking existing integrations.
  • Monolithic Full-Stack Coupling — 3.3M C# LOC tightly coupled with 1.2M TypeScript LOC in single repo; refactoring requires coordinating backend and frontend simultaneously, increasing risk of integration bugs.
  • Entity Framework ORM Migrations — C# backend uses EF (inferred from codebase size and patterns); database schema changes require migration files, which are tracked in version control but not documented in file list—contributors must read EF code to understand schema.
  • Docker Multi-Stage Build & Container Orchestration — src/.dockerignore and CI workflow (build.yml) show containerized deployment; contributors must understand how C# backend and TypeScript frontend are compiled into a single Docker image.
  • GitHub Actions Workflow Orchestration — CI/CD fully implemented in .github/workflows/ with branching logic (master vs develop); understanding workflow files is critical for debugging test failures and adding new checks.
  • Crowdin i18n Pipeline — crowdin.yml shows translations managed externally; string changes in code trigger Crowdin sync, and contributors must be aware that UI text is not simply hardcoded.
  • linuxserver/docker-ombi — Official Docker image packaging for Ombi; directly used for production deployments visible in Docker Pulls badge on README
  • Fallenbagel/jellyseerr — Active fork of earlier request tool (Overseerr) focused on Jellyfin; shares same problem domain and overlapping architecture
  • Prowlarr/Prowlarr — Sibling Servarr project (same ecosystem); similar architecture for indexer/API management, relevant for understanding community patterns
  • Sonarr/Sonarr — Canonical example in Servarr ecosystem for automatic TV show management; Ombi integrates with Sonarr for post-approval automation

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add unit tests for Ombi.Api.External providers (CouchPotato, DogNzb, FanartTv)

The src/Ombi.Api.External directory contains multiple external API integrations (CouchPotato, DogNzb, FanartTv) with model classes and API clients, but there's no visible test coverage in the file structure. These are critical integration points that deserve comprehensive unit tests to prevent regressions when APIs change or new features are added.

  • [ ] Create test project structure: src/Ombi.Api.External.Tests
  • [ ] Add unit tests for CouchPotatoApi.cs covering API key retrieval, movie fetching, and profile management
  • [ ] Add unit tests for DogNzbApi.cs covering movie and TV show search with mocked HTTP responses
  • [ ] Add tests for model deserialization (CouchPotatoMovies, DogNzbMovies, etc.) to ensure API responses parse correctly
  • [ ] Include mock implementations or use a mocking library (Moq) to avoid real API calls during testing

Create CodeQL analysis workflow for C# security scanning

While .github/workflows/codeql-analysis.yml exists, the Ombi codebase is a C# .NET application. The current CodeQL setup may not be optimized for C# static analysis. A dedicated workflow should be created to scan for security vulnerabilities specific to .NET (SQL injection via Entity Framework, exposed credentials, unsafe deserialization, etc.).

  • [ ] Enhance .github/workflows/codeql-analysis.yml to include C# language configuration
  • [ ] Add language matrix supporting both JavaScript (UI) and C# (backend) analysis
  • [ ] Configure CodeQL to scan src/ directory with C# linting rules
  • [ ] Set up automatic PR comments reporting security findings
  • [ ] Document security scanning requirements in CONTRIBUTING.md

Add integration test workflow for external API providers

The repo has automation-tests.yml but there's no visible workflow for testing the external API integrations (Plex, Emby, Jellyfin, CouchPotato, etc.) with real or mock server instances. This is critical since Ombi's core value is integrating with these platforms, and failures here directly impact users.

  • [ ] Create .github/workflows/integration-tests.yml that runs before merges to main
  • [ ] Add test containers or Docker Compose setup for testing against mock Plex/Emby/Jellyfin instances
  • [ ] Create integration test suite in src/Ombi.Integration.Tests for API client methods
  • [ ] Test OAuth flows for Plex authentication in PlexApi integration
  • [ ] Document how to run integration tests locally in CONTRIBUTING.md for contributors

🌿Good first issues

  • Add TypeScript/HTML unit tests for request form validation components (src/ frontend) — currently only 1.2M TypeScript LOC with minimal test visibility in file list, making UI regression detection weak
  • Document the Plex/Emby/Jellyfin API integration points in a new INTEGRATION.md file — README lists these three services but no src/ file structure shows where API adapters live; newcomers struggle to find sync logic
  • Extract database schema documentation from Entity Framework migrations — C# codebase size suggests complex ORM but no schema.md visible; migrations likely exist but are undocumented, blocking contributor understanding of request/user data flow

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 86c179c — chore(release): :rocket: v4.59.3 [skip ci] (invalid-email-address)
  • 32d5d02 — refactor(notifications): extract shared base class + shell (#5406) (tidusjar)
  • f71c27b — chore(release): :rocket: v4.59.2 [skip ci] (invalid-email-address)
  • 6219fba — chore(ci): clean up workflows (#5404) (tidusjar)
  • 16d0532 — chore(release): :rocket: v4.59.1 [skip ci] (invalid-email-address)
  • 90b386a — fix(plex): skip watchlist target when username collision is detected (#5403) (tidusjar)
  • fa6d304 — fix(plex): migrate legacy numeric provider ids during watchlist import (#5400) (tidusjar)
  • dea6f4f — chore(release): :rocket: v4.59.0 [skip ci] (invalid-email-address)
  • de5cea5 — chore: :busts_in_silhouette: Updated Contributors [skip ci] (contrib-readme-bot)
  • ba9f972 — feat: add auto-update settings UI and improve updater configuration (#1460) (#5394) (bommerts)

🔒Security observations

The Ombi codebase shows moderate security maturity with established infrastructure for managing external API integrations and CI/CD pipelines. However, several gaps exist: (1) absence of visible dependency vulnerability scanning, (2) lack of explicit security header configuration, (3) IDE configuration files tracked in version control, and (4) potential credential exposure risks in API key handling. The application would benefit from implementing comprehensive security header configuration, automated dependency scanning, credential management best practices, and a formal security policy. No critical vulnerabilities were identified in the visible file structure, but a full security audit including source code review, SAST analysis, and dependency scanning is recommended.

  • Medium · Potential API Key Exposure in External API Integrations — src/Ombi.Api.External/ExternalApis/*/Models/ (CouchPotatoApiKey.cs and similar). The codebase contains multiple external API integrations (CouchPotato, DogNzb, Lidarr, FanartTv, Github) with model classes for API keys and credentials. Without explicit code review, there's a risk of API keys being logged, cached, or exposed in error messages. Fix: Implement secure credential storage patterns: use IConfiguration with user secrets, encrypt sensitive data at rest, implement proper logging filters to exclude credentials, use short-lived tokens where possible, and implement credential rotation mechanisms.
  • Medium · Missing Security Headers Configuration — src/ (Startup/Program configuration files not visible in provided structure). No visible explicit security header configuration (.csproj, Startup.cs, or middleware files). Common security headers like CSP, X-Frame-Options, X-Content-Type-Options, HSTS may be missing. Fix: Configure security headers in the ASP.NET Core middleware: implement Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Strict-Transport-Security, and X-XSS-Protection headers.
  • Medium · Docker Configuration Best Practices Not Visible — src/.dockerignore and Dockerfile (not included in analysis). A .dockerignore file exists (.src/.dockerignore) but Docker image hardening details are unclear. No visible evidence of non-root user configuration, minimal base images, or security scanning in the provided file structure. Fix: Use minimal base images (Alpine), run container as non-root user, implement multi-stage builds, scan Docker images for vulnerabilities, implement image signing, and use read-only root filesystem where possible.
  • Low · Dependency Visibility Lacking — Package management files (not provided). No package dependency file (.csproj, packages.config, NuGet.config) was provided for analysis. Cannot verify for known vulnerabilities, outdated packages, or transitive dependencies. Fix: Provide and regularly audit .csproj and related dependency files. Implement automated dependency scanning using tools like Snyk, OWASP Dependency-Check, or GitHub's Dependabot. Establish a process for regular updates and security patches.
  • Low · Configuration Files in Version Control — src/.idea/, src/.vscode/ (config files present in repo). IDE configuration directories (.idea, .vscode) are tracked in the repository. These may contain sensitive information like API endpoints, environment variables, or development credentials. Fix: Add IDE configuration directories to .gitignore: '/.idea/', '/.vscode/', '.vscode/', '.idea/'. Create example config files (settings.example.json) instead. Remove sensitive IDE configs from git history using 'git filter-branch' or 'BFG Repo-Cleaner'.
  • Low · Missing SECURITY.md File — Repository root (SECURITY.md missing). No SECURITY.md file found in the repository to define security policy, vulnerability reporting procedures, or supported versions for security updates. Fix: Create a SECURITY.md file following GitHub's guidelines that includes: how to report vulnerabilities responsibly, supported versions receiving security updates, security contact information, and expected response times for security reports.

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Mixed signals · Ombi-app/Ombi — RepoPilot