# nassih-yassine/mediamanager architecture

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

- Interactive diagram: https://gitdiagram.com/nassih-yassine/mediamanager
- Repository: https://github.com/nassih-yassine/mediamanager

## Overview

MediaManager is a self-hosted, account-scoped media library: users add or upload media, workers process downloads, and the web UI organizes and plays the resulting library. The web and Tauri desktop share the same frontend; the Rust API owns persistence, authorization, media files, and background jobs. The README documents key capabilities and proxying; sampled API excerpts confirm routing, startup, and worker behavior. Several frontend and API modules were not sampled, so their internal links are omitted where evidence is unavailable.

Main entry points: [`apps/web/src/app/layout.tsx`](https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/app/layout.tsx) (Web application), [`crates/api/src/routes.rs`](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/routes.rs) (HTTP routes), [`crates/api/src/worker.rs`](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/worker.rs) (Download worker), [`crates/api/src/media.rs`](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/media.rs) (Media management)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_clients["Client applications"]
  node_desktop["Desktop shell<br/>[main.rs]"]
  node_webapp["Web application<br/>[layout.tsx]"]
end

subgraph group_web["Library experience"]
  node_library["Library and galleries<br/>[Library.tsx]"]
  node_add["Add media<br/>[AddForm.tsx]"]
  node_player["Persistent player<br/>[player.tsx]"]
  node_collections["Playlists<br/>[PlaylistView.tsx]"]
  node_viewers["Media viewers<br/>[ReadView.tsx]"]
  node_account["Account and admin<br/>[page.tsx]"]
  node_notifications_ui["Notifications UI<br/>[notifications.tsx]"]
  node_web_api["API client<br/>[api.ts]"]
  node_realtime["Live updates<br/>[route.ts]"]
end

subgraph group_api["API and domain"]
  node_routes["HTTP routes<br/>[routes.rs]"]
  node_auth["Accounts and sessions<br/>[auth.rs]"]
  node_state["Application state<br/>[state.rs]"]
  node_models["Media and job models<br/>[models.rs]"]
  node_notifications["Notification service<br/>[notifications.rs]"]
  node_config["Runtime configuration<br/>[config.rs]"]
end

subgraph group_processing["Media processing"]
  node_worker["Download worker<br/>[worker.rs]"]
  node_media["Media management<br/>[media.rs]"]
end

subgraph group_storage["Persistent storage"]
  node_database[("SQLite database<br/>[db.rs]")]
  node_library_files[("Media files<br/>[media.rs]")]
end

node_user(("Library user"))
node_tools["yt-dlp and ffmpeg"]

node_user -->|"uses"| node_webapp
node_desktop -->|"loads shared UI"| node_webapp
node_webapp -.->|"renders"| node_library
node_webapp -.->|"offers"| node_add
node_webapp -->|"hosts"| node_player
node_webapp -->|"offers"| node_collections
node_webapp -->|"offers"| node_viewers
node_webapp -->|"offers"| node_account
node_webapp -->|"offers"| node_notifications_ui
node_library -.->|"requests data"| node_web_api
node_add -.->|"submits media"| node_web_api
node_web_api -->|"proxies API requests"| node_routes
node_realtime -.->|"proxies events"| node_routes
node_routes -->|"authenticates"| node_auth
node_routes -->|"queries"| node_database
node_routes -->|"manages media"| node_media
node_routes -->|"serves notifications"| node_notifications
node_routes -->|"uses"| node_state
node_worker -->|"claims jobs"| node_database
node_worker -->|"finalizes media"| node_media
node_worker -->|"notifies completion"| node_notifications
node_worker -->|"runs download tools"| node_tools
node_media -->|"stores metadata"| node_database
node_media -->|"writes media files"| node_library_files
node_notifications -->|"persists notices"| node_database
node_state -->|"holds settings"| node_config
node_routes -->|"serializes results"| node_models
node_worker -->|"uses job and item types"| node_models
node_user -.->|"opens"| node_desktop

click node_desktop "https://github.com/nassih-yassine/mediamanager/blob/main/apps/desktop/src-tauri/src/main.rs"
click node_webapp "https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/app/layout.tsx"
click node_library "https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/components/Library.tsx"
click node_add "https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/components/AddForm.tsx"
click node_player "https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/lib/player.tsx"
click node_collections "https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/components/PlaylistView.tsx"
click node_viewers "https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/components/ReadView.tsx"
click node_account "https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/app/(app)/profile/page.tsx"
click node_notifications_ui "https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/lib/notifications.tsx"
click node_web_api "https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/lib/api.ts"
click node_realtime "https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/app/api/events/route.ts"
click node_routes "https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/routes.rs"
click node_auth "https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/auth.rs"
click node_state "https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/state.rs"
click node_models "https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/models.rs"
click node_worker "https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/worker.rs"
click node_media "https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/media.rs"
click node_notifications "https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/notifications.rs"
click node_config "https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/config.rs"
click node_database "https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/db.rs"
click node_library_files "https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/media.rs"

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_desktop,node_webapp,node_user toneBlue
class node_library,node_add,node_player,node_collections,node_viewers,node_account,node_notifications_ui,node_web_api,node_realtime toneAmber
class node_routes,node_auth,node_state,node_models,node_notifications,node_config toneMint
class node_worker,node_media toneRose
class node_database,node_library_files,node_tools toneIndigo
```

## Components

### Client applications

- [Desktop shell](https://github.com/nassih-yassine/mediamanager/blob/main/apps/desktop/src-tauri/src/main.rs): `apps/desktop/src-tauri/src/main.rs`
- [Web application](https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/app/layout.tsx): `apps/web/src/app/layout.tsx`

### Library experience

- [Library and galleries](https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/components/Library.tsx): `apps/web/src/components/Library.tsx`
- [Add media](https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/components/AddForm.tsx): `apps/web/src/components/AddForm.tsx`
- [Persistent player](https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/lib/player.tsx): `apps/web/src/lib/player.tsx`
- [Playlists](https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/components/PlaylistView.tsx): `apps/web/src/components/PlaylistView.tsx`
- [Media viewers](https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/components/ReadView.tsx): `apps/web/src/components/ReadView.tsx`
- [Account and admin](https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/app/(app)/profile/page.tsx): `apps/web/src/app/(app)/profile/page.tsx`
- [Notifications UI](https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/lib/notifications.tsx): `apps/web/src/lib/notifications.tsx`
- [API client](https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/lib/api.ts): `apps/web/src/lib/api.ts`
- [Live updates](https://github.com/nassih-yassine/mediamanager/blob/main/apps/web/src/app/api/events/route.ts): `apps/web/src/app/api/events/route.ts`

### API and domain

- [HTTP routes](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/routes.rs): `crates/api/src/routes.rs`
- [Accounts and sessions](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/auth.rs): `crates/api/src/auth.rs`
- [Application state](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/state.rs): `crates/api/src/state.rs`
- [Media and job models](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/models.rs): `crates/api/src/models.rs`
- [Notification service](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/notifications.rs): `crates/api/src/notifications.rs`
- [Runtime configuration](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/config.rs): `crates/api/src/config.rs`

### Media processing

- [Download worker](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/worker.rs): `crates/api/src/worker.rs`
- [Media management](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/media.rs): `crates/api/src/media.rs`

### Persistent storage

- [SQLite database](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/db.rs): `crates/api/src/db.rs`
- [Media files](https://github.com/nassih-yassine/mediamanager/blob/main/crates/api/src/media.rs): `crates/api/src/media.rs`

### Other components

- **Library user**
- **yt-dlp and ffmpeg**

## Connections

- Library user → Web application: uses (evidence: `README.md`)
- Desktop shell → Web application: loads shared UI (evidence: `README.md`)
- Web application → Library and galleries: renders
- Web application → Add media: offers
- Web application → Persistent player: hosts (evidence: `README.md`)
- Web application → Playlists: offers (evidence: `README.md`)
- Web application → Media viewers: offers (evidence: `README.md`)
- Web application → Account and admin: offers (evidence: `README.md`)
- Web application → Notifications UI: offers (evidence: `README.md`)
- Library and galleries → API client: requests data
- Add media → API client: submits media
- API client → HTTP routes: proxies API requests (evidence: `README.md`)
- Live updates → HTTP routes: proxies events
- HTTP routes → Accounts and sessions: authenticates (evidence: `crates/api/src/routes.rs`)
- HTTP routes → SQLite database: queries (evidence: `crates/api/src/routes.rs`)
- HTTP routes → Media management: manages media (evidence: `crates/api/src/routes.rs`)
- HTTP routes → Notification service: serves notifications (evidence: `crates/api/src/routes.rs`)
- HTTP routes → Application state: uses (evidence: `crates/api/src/routes.rs`)
- Download worker → SQLite database: claims jobs (evidence: `crates/api/src/worker.rs`)
- Download worker → Media management: finalizes media (evidence: `crates/api/src/worker.rs`)
- Download worker → Notification service: notifies completion (evidence: `crates/api/src/worker.rs`)
- Download worker → yt-dlp and ffmpeg: runs download tools (evidence: `crates/api/src/worker.rs`)
- Media management → SQLite database: stores metadata (evidence: `crates/api/src/media.rs`)
- Media management → Media files: writes media files (evidence: `README.md`)
- Notification service → SQLite database: persists notices (evidence: `crates/api/src/notifications.rs`)
- Application state → Runtime configuration: holds settings (evidence: `crates/api/src/state.rs`)
- HTTP routes → Media and job models: serializes results (evidence: `crates/api/src/main.rs`)
- Download worker → Media and job models: uses job and item types (evidence: `crates/api/src/worker.rs`)
- Library user → Desktop shell: opens
