# izznogooood/blip architecture

> Architecture diagram of the GitHub repository izznogooood/blip, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-26). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/izznogooood/blip
- Repository: https://github.com/izznogooood/blip

## Overview

Blip is a LAN-hosted movie discovery interface whose main workflow is browsing or searching TMDB, enriching results with Radarr library status, and adding a selected movie—with optional immediate search—to Radarr. Separate flows configure integrations and schedule recurring searches for available missing movies. The graph reflects documented features where implementation excerpts were unavailable; those links are limited to the explicit runtime entry point and documented responsibilities.

Main entry points: [`app/web/settings_routes.py`](https://github.com/izznogooood/blip/blob/master/app/web/settings_routes.py) (Settings routes), [`app/web/routes.py`](https://github.com/izznogooood/blip/blob/master/app/web/routes.py) (Movie routes), [`app/main.py`](https://github.com/izznogooood/blip/blob/master/app/main.py) (FastAPI app), [`app/services/radarr_service.py`](https://github.com/izznogooood/blip/blob/master/app/services/radarr_service.py) (Radarr service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_app["FastAPI app<br/>[main.py]"]
  node_movie_routes["Movie routes<br/>[routes.py]"]
  node_settings_routes["Settings routes<br/>[settings_routes.py]"]
  node_templates["HTML templates"]
  node_browser["Browser UI"]
end

subgraph group_discovery["Movie discovery"]
  node_movie_service["Movie service<br/>[movie_service.py]"]
  node_tmdb_client["TMDB client<br/>[tmdb_client.py]"]
  node_tmdb{{"TMDB API"}}
end

subgraph group_radarr["Radarr integration"]
  node_radarr_service["Radarr service<br/>[radarr_service.py]"]
  node_radarr_client["Radarr client<br/>[radarr_client.py]"]
  node_radarr_external{{"Radarr"}}
end

subgraph group_settings["Configuration"]
  node_settings_service["Settings service"]
  node_config["App configuration<br/>[config.py]"]
  node_schedule_routes["Schedule settings<br/>[settings_routes.py]"]
end

subgraph group_state["Persistence and scheduling"]
  node_database[("SQLite database<br/>[database.py]")]
  node_cache_service["Cache service<br/>[cache_service.py]"]
  node_cache_model["Cache model<br/>[cache.py]"]
  node_schedule_service["Schedule service"]
  node_schedule_model["Schedule model<br/>[search_schedule.py]"]
  node_scheduler["Background scheduler<br/>[scheduler.py]"]
end

node_user(("User"))

node_user -->|"uses"| node_browser
node_browser -->|"requests pages"| node_movie_routes
node_browser -->|"configures"| node_settings_routes
node_movie_routes -->|"renders results"| node_templates
node_settings_routes -->|"renders settings"| node_templates
node_app -->|"mounts router"| node_movie_routes
node_app -->|"mounts router"| node_settings_routes
node_app -->|"initializes"| node_database
node_app -->|"starts task"| node_scheduler
node_movie_routes -->|"fetches movies"| node_movie_service
node_movie_service -->|"requests lists, search, details"| node_tmdb_client
node_tmdb_client -->|"calls API"| node_tmdb
node_movie_routes -->|"annotates and adds"| node_radarr_service
node_radarr_service -->|"requests library actions"| node_radarr_client
node_radarr_client -->|"calls API"| node_radarr_external
node_movie_routes -->|"resolves settings"| node_settings_service
node_settings_routes -->|"reads and saves"| node_settings_service
node_settings_service -->|"persists settings"| node_database
node_config -->|"configures startup"| node_app
node_movie_service -->|"reads and updates cache"| node_cache_service
node_radarr_service -->|"caches statuses"| node_cache_service
node_cache_service -->|"persists entries"| node_database
node_cache_service -->|"stores records"| node_cache_model
node_settings_routes -->|"loads Radarr options"| node_radarr_service
node_settings_routes -->|"builds client"| node_radarr_client
node_settings_routes -->|"updates schedule and records runs"| node_schedule_service
node_schedule_service -->|"reads and writes"| node_schedule_model
node_schedule_service -->|"persists schedule"| node_database
node_scheduler -->|"tracks scheduled runs"| node_schedule_service
node_scheduler -->|"triggers backlog search"| node_radarr_service

click node_app "https://github.com/izznogooood/blip/blob/master/app/main.py"
click node_movie_routes "https://github.com/izznogooood/blip/blob/master/app/web/routes.py"
click node_settings_routes "https://github.com/izznogooood/blip/blob/master/app/web/settings_routes.py"
click node_templates "https://github.com/izznogooood/blip/tree/master/app/templates"
click node_browser "https://github.com/izznogooood/blip/tree/master/app/static"
click node_movie_service "https://github.com/izznogooood/blip/blob/master/app/services/movie_service.py"
click node_tmdb_client "https://github.com/izznogooood/blip/blob/master/app/clients/tmdb_client.py"
click node_radarr_service "https://github.com/izznogooood/blip/blob/master/app/services/radarr_service.py"
click node_radarr_client "https://github.com/izznogooood/blip/blob/master/app/clients/radarr_client.py"
click node_settings_service "https://github.com/izznogooood/blip/blob/master/app/services/settings_service.py"
click node_config "https://github.com/izznogooood/blip/blob/master/app/core/config.py"
click node_database "https://github.com/izznogooood/blip/blob/master/app/core/database.py"
click node_cache_service "https://github.com/izznogooood/blip/blob/master/app/services/cache_service.py"
click node_cache_model "https://github.com/izznogooood/blip/blob/master/app/models/cache.py"
click node_schedule_routes "https://github.com/izznogooood/blip/blob/master/app/web/settings_routes.py"
click node_schedule_service "https://github.com/izznogooood/blip/blob/master/app/services/search_schedule_service.py"
click node_schedule_model "https://github.com/izznogooood/blip/blob/master/app/models/search_schedule.py"
click node_scheduler "https://github.com/izznogooood/blip/blob/master/app/services/scheduler.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_movie_routes,node_settings_routes,node_templates,node_browser,node_user toneBlue
class node_movie_service,node_tmdb_client,node_tmdb toneAmber
class node_radarr_service,node_radarr_client,node_radarr_external toneMint
class node_settings_service,node_config,node_schedule_routes toneRose
class node_database,node_cache_service,node_cache_model,node_schedule_service,node_schedule_model,node_scheduler toneIndigo
```

## Components

### Web experience

- [FastAPI app](https://github.com/izznogooood/blip/blob/master/app/main.py): `app/main.py`
- [Movie routes](https://github.com/izznogooood/blip/blob/master/app/web/routes.py): `app/web/routes.py`
- [Settings routes](https://github.com/izznogooood/blip/blob/master/app/web/settings_routes.py): `app/web/settings_routes.py`
- [HTML templates](https://github.com/izznogooood/blip/tree/master/app/templates): `app/templates`
- [Browser UI](https://github.com/izznogooood/blip/tree/master/app/static): `app/static`

### Movie discovery

- [Movie service](https://github.com/izznogooood/blip/blob/master/app/services/movie_service.py): `app/services/movie_service.py`
- [TMDB client](https://github.com/izznogooood/blip/blob/master/app/clients/tmdb_client.py): `app/clients/tmdb_client.py`
- **TMDB API**

### Radarr integration

- [Radarr service](https://github.com/izznogooood/blip/blob/master/app/services/radarr_service.py): `app/services/radarr_service.py`
- [Radarr client](https://github.com/izznogooood/blip/blob/master/app/clients/radarr_client.py): `app/clients/radarr_client.py`
- **Radarr**

### Configuration

- [Settings service](https://github.com/izznogooood/blip/blob/master/app/services/settings_service.py): `app/services/settings_service.py`
- [App configuration](https://github.com/izznogooood/blip/blob/master/app/core/config.py): `app/core/config.py`
- [Schedule settings](https://github.com/izznogooood/blip/blob/master/app/web/settings_routes.py): `app/web/settings_routes.py`

### Persistence and scheduling

- [SQLite database](https://github.com/izznogooood/blip/blob/master/app/core/database.py): `app/core/database.py`
- [Cache service](https://github.com/izznogooood/blip/blob/master/app/services/cache_service.py): `app/services/cache_service.py`
- [Cache model](https://github.com/izznogooood/blip/blob/master/app/models/cache.py): `app/models/cache.py`
- [Schedule service](https://github.com/izznogooood/blip/blob/master/app/services/search_schedule_service.py): `app/services/search_schedule_service.py`
- [Schedule model](https://github.com/izznogooood/blip/blob/master/app/models/search_schedule.py): `app/models/search_schedule.py`
- [Background scheduler](https://github.com/izznogooood/blip/blob/master/app/services/scheduler.py): `app/services/scheduler.py`

### Other components

- **User**

## Connections

- User → Browser UI: uses
- Browser UI → Movie routes: requests pages
- Browser UI → Settings routes: configures
- Movie routes → HTML templates: renders results
- Settings routes → HTML templates: renders settings
- FastAPI app → Movie routes: mounts router
- FastAPI app → Settings routes: mounts router
- FastAPI app → SQLite database: initializes
- FastAPI app → Background scheduler: starts task
- Movie routes → Movie service: fetches movies
- Movie service → TMDB client: requests lists, search, details
- TMDB client → TMDB API: calls API
- Movie routes → Radarr service: annotates and adds
- Radarr service → Radarr client: requests library actions
- Radarr client → Radarr: calls API
- Movie routes → Settings service: resolves settings
- Settings routes → Settings service: reads and saves
- Settings service → SQLite database: persists settings
- App configuration → FastAPI app: configures startup
- Movie service → Cache service: reads and updates cache
- Radarr service → Cache service: caches statuses
- Cache service → SQLite database: persists entries
- Cache service → Cache model: stores records
- Settings routes → Radarr service: loads Radarr options
- Settings routes → Radarr client: builds client
- Settings routes → Schedule service: updates schedule and records runs
- Schedule service → Schedule model: reads and writes
- Schedule service → SQLite database: persists schedule
- Background scheduler → Schedule service: tracks scheduled runs
- Background scheduler → Radarr service: triggers backlog search
