# samukadev/offlinet architecture

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

- Interactive diagram: https://gitdiagram.com/samukadev/offlinet
- Repository: https://github.com/samukadev/offlinet

## Overview

OffliNet is a LAN-hosted media streaming and private file-cloud application. Users connect from a browser, configure storage roots, and browse indexed files; they can then stream films or audio, preview and manage files, or manage torrent downloads. The server scans roots, exposes API routes, streams media, and persists catalog and application state. The README documents broader capabilities than the sampled source excerpts, so some feature-to-route connections are omitted where exact wiring could not be verified.

Main entry points: [`src/server/index.ts`](https://github.com/samukadev/offlinet/blob/main/src/server/index.ts) (Bun HTTP Server), [`src/client/App.tsx`](https://github.com/samukadev/offlinet/blob/main/src/client/App.tsx) (App Router), [`src/server/db.ts`](https://github.com/samukadev/offlinet/blob/main/src/server/db.ts) (SQLite Repositories), [`src/server/routes/media.ts`](https://github.com/samukadev/offlinet/blob/main/src/server/routes/media.ts) (Media Routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["LAN Client"]
  node_app["App Router<br/>[App.tsx]"]
end

subgraph group_media["Media Experience"]
  node_movie["Movie Catalog<br/>[MovieMode.tsx]"]
  node_video["Video Player<br/>[VideoPlayer.tsx]"]
  node_audio["Audio Player<br/>[AudioPlayer.tsx]"]
  node_audioctx["Audio Queue<br/>[AudioContext.tsx]"]
end

subgraph group_files["Files And Storage"]
  node_preview["Media Preview"]
  node_explorer["File Explorer<br/>[FileExplorer.tsx]"]
  node_storageui["Storage Settings"]
end

subgraph group_server["Server Runtime"]
  node_server["Bun HTTP Server<br/>[index.ts]"]
  node_storageapi["Storage Routes<br/>[storage.ts]"]
  node_filesapi["File Routes<br/>[files.ts]"]
  node_mediaapi["Media Routes<br/>[media.ts]"]
  node_playlistapi["Playlist Routes<br/>[playlists.ts]"]
  node_systemapi["System Routes<br/>[system.ts]"]
  node_scanner["Library Scanner<br/>[scanner.ts]"]
  node_streamer["Range Streaming<br/>[streamer.ts]"]
  node_thumbnail["Thumbnail Service<br/>[thumbnail.ts]"]
  node_db[("SQLite Repositories<br/>[db.ts]")]
  node_network["LAN Discovery<br/>[network.ts]"]
end

subgraph group_downloads["Torrent Downloads"]
  node_torrentui["Torrent Manager UI<br/>[TorrentManager.tsx]"]
  node_torrentapi["Torrent Routes<br/>[torrents.ts]"]
  node_torrentmgr["Torrent Engine<br/>[torrentManager.ts]"]
end

node_viewer(("LAN Devices"))
node_disk[("Configured Disks")]

node_viewer -->|"opens"| node_app
node_app -->|"shows"| node_movie
node_app -->|"routes to"| node_explorer
node_app -->|"routes to"| node_storageui
node_app -->|"routes to"| node_torrentui
node_movie -->|"starts playback"| node_video
node_app -->|"renders"| node_audio
node_audio -->|"uses queue"| node_audioctx
node_explorer -->|"opens item"| node_preview
node_storageui -->|"configures roots"| node_storageapi
node_app -->|"requests API"| node_server
node_server -->|"dispatches"| node_storageapi
node_server -->|"dispatches"| node_filesapi
node_server -->|"dispatches"| node_mediaapi
node_server -->|"dispatches"| node_playlistapi
node_server -->|"dispatches"| node_systemapi
node_server -->|"dispatches"| node_torrentapi
node_storageapi -->|"reads/writes roots"| node_db
node_storageapi -->|"starts scans"| node_scanner
node_scanner -->|"indexes files"| node_disk
node_scanner -->|"stores catalog"| node_db
node_filesapi -->|"reads catalog"| node_db
node_filesapi -->|"manages files"| node_disk
node_mediaapi -->|"looks up media"| node_db
node_mediaapi -->|"streams ranges"| node_streamer
node_mediaapi -->|"serves thumbnails"| node_thumbnail
node_video -->|"requests stream"| node_server
node_preview -->|"loads content"| node_server
node_playlistapi -->|"stores playlists"| node_db
node_systemapi -->|"gets LAN addresses"| node_network
node_systemapi -->|"reads system state"| node_db
node_torrentui -->|"controls downloads"| node_torrentapi
node_torrentapi -->|"delegates control"| node_torrentmgr
node_torrentmgr -->|"persists status"| node_db
node_torrentmgr -->|"writes downloads"| node_disk
node_torrentmgr -->|"indexes completed files"| node_scanner

click node_app "https://github.com/samukadev/offlinet/blob/main/src/client/App.tsx"
click node_movie "https://github.com/samukadev/offlinet/blob/main/src/client/components/MovieMode.tsx"
click node_video "https://github.com/samukadev/offlinet/blob/main/src/client/components/VideoPlayer.tsx"
click node_audio "https://github.com/samukadev/offlinet/blob/main/src/client/components/AudioPlayer.tsx"
click node_audioctx "https://github.com/samukadev/offlinet/blob/main/src/client/context/AudioContext.tsx"
click node_preview "https://github.com/samukadev/offlinet/blob/main/src/client/components/MediaPreviewModal.tsx"
click node_explorer "https://github.com/samukadev/offlinet/blob/main/src/client/components/FileExplorer.tsx"
click node_storageui "https://github.com/samukadev/offlinet/blob/main/src/client/components/StorageSettings.tsx"
click node_server "https://github.com/samukadev/offlinet/blob/main/src/server/index.ts"
click node_storageapi "https://github.com/samukadev/offlinet/blob/main/src/server/routes/storage.ts"
click node_filesapi "https://github.com/samukadev/offlinet/blob/main/src/server/routes/files.ts"
click node_mediaapi "https://github.com/samukadev/offlinet/blob/main/src/server/routes/media.ts"
click node_playlistapi "https://github.com/samukadev/offlinet/blob/main/src/server/routes/playlists.ts"
click node_systemapi "https://github.com/samukadev/offlinet/blob/main/src/server/routes/system.ts"
click node_scanner "https://github.com/samukadev/offlinet/blob/main/src/server/scanner.ts"
click node_streamer "https://github.com/samukadev/offlinet/blob/main/src/server/streamer.ts"
click node_thumbnail "https://github.com/samukadev/offlinet/blob/main/src/server/thumbnail.ts"
click node_db "https://github.com/samukadev/offlinet/blob/main/src/server/db.ts"
click node_torrentui "https://github.com/samukadev/offlinet/blob/main/src/client/components/TorrentManager.tsx"
click node_torrentapi "https://github.com/samukadev/offlinet/blob/main/src/server/routes/torrents.ts"
click node_torrentmgr "https://github.com/samukadev/offlinet/blob/main/src/server/torrentManager.ts"
click node_network "https://github.com/samukadev/offlinet/blob/main/src/server/network.ts"

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 toneBlue
class node_movie,node_video,node_audio,node_audioctx,node_disk toneAmber
class node_preview,node_explorer,node_storageui toneMint
class node_server,node_storageapi,node_filesapi,node_mediaapi,node_playlistapi,node_systemapi,node_scanner,node_streamer,node_thumbnail,node_db,node_network toneRose
class node_torrentui,node_torrentapi,node_torrentmgr,node_viewer toneIndigo
```

## Components

### LAN Client

- [App Router](https://github.com/samukadev/offlinet/blob/main/src/client/App.tsx): `src/client/App.tsx`

### Media Experience

- [Movie Catalog](https://github.com/samukadev/offlinet/blob/main/src/client/components/MovieMode.tsx): `src/client/components/MovieMode.tsx`
- [Video Player](https://github.com/samukadev/offlinet/blob/main/src/client/components/VideoPlayer.tsx): `src/client/components/VideoPlayer.tsx`
- [Audio Player](https://github.com/samukadev/offlinet/blob/main/src/client/components/AudioPlayer.tsx): `src/client/components/AudioPlayer.tsx`
- [Audio Queue](https://github.com/samukadev/offlinet/blob/main/src/client/context/AudioContext.tsx): `src/client/context/AudioContext.tsx`

### Files And Storage

- [Media Preview](https://github.com/samukadev/offlinet/blob/main/src/client/components/MediaPreviewModal.tsx): `src/client/components/MediaPreviewModal.tsx`
- [File Explorer](https://github.com/samukadev/offlinet/blob/main/src/client/components/FileExplorer.tsx): `src/client/components/FileExplorer.tsx`
- [Storage Settings](https://github.com/samukadev/offlinet/blob/main/src/client/components/StorageSettings.tsx): `src/client/components/StorageSettings.tsx`

### Server Runtime

- [Bun HTTP Server](https://github.com/samukadev/offlinet/blob/main/src/server/index.ts): `src/server/index.ts`
- [Storage Routes](https://github.com/samukadev/offlinet/blob/main/src/server/routes/storage.ts): `src/server/routes/storage.ts`
- [File Routes](https://github.com/samukadev/offlinet/blob/main/src/server/routes/files.ts): `src/server/routes/files.ts`
- [Media Routes](https://github.com/samukadev/offlinet/blob/main/src/server/routes/media.ts): `src/server/routes/media.ts`
- [Playlist Routes](https://github.com/samukadev/offlinet/blob/main/src/server/routes/playlists.ts): `src/server/routes/playlists.ts`
- [System Routes](https://github.com/samukadev/offlinet/blob/main/src/server/routes/system.ts): `src/server/routes/system.ts`
- [Library Scanner](https://github.com/samukadev/offlinet/blob/main/src/server/scanner.ts): `src/server/scanner.ts`
- [Range Streaming](https://github.com/samukadev/offlinet/blob/main/src/server/streamer.ts): `src/server/streamer.ts`
- [Thumbnail Service](https://github.com/samukadev/offlinet/blob/main/src/server/thumbnail.ts): `src/server/thumbnail.ts`
- [SQLite Repositories](https://github.com/samukadev/offlinet/blob/main/src/server/db.ts): `src/server/db.ts`
- [LAN Discovery](https://github.com/samukadev/offlinet/blob/main/src/server/network.ts): `src/server/network.ts`

### Torrent Downloads

- [Torrent Manager UI](https://github.com/samukadev/offlinet/blob/main/src/client/components/TorrentManager.tsx): `src/client/components/TorrentManager.tsx`
- [Torrent Routes](https://github.com/samukadev/offlinet/blob/main/src/server/routes/torrents.ts): `src/server/routes/torrents.ts`
- [Torrent Engine](https://github.com/samukadev/offlinet/blob/main/src/server/torrentManager.ts): `src/server/torrentManager.ts`

### Other components

- **LAN Devices**
- **Configured Disks**

## Connections

- LAN Devices → App Router: opens
- App Router → Movie Catalog: shows
- App Router → File Explorer: routes to
- App Router → Storage Settings: routes to
- App Router → Torrent Manager UI: routes to
- Movie Catalog → Video Player: starts playback
- App Router → Audio Player: renders
- Audio Player → Audio Queue: uses queue
- File Explorer → Media Preview: opens item
- Storage Settings → Storage Routes: configures roots
- App Router → Bun HTTP Server: requests API
- Bun HTTP Server → Storage Routes: dispatches
- Bun HTTP Server → File Routes: dispatches
- Bun HTTP Server → Media Routes: dispatches
- Bun HTTP Server → Playlist Routes: dispatches
- Bun HTTP Server → System Routes: dispatches
- Bun HTTP Server → Torrent Routes: dispatches
- Storage Routes → SQLite Repositories: reads/writes roots
- Storage Routes → Library Scanner: starts scans
- Library Scanner → Configured Disks: indexes files
- Library Scanner → SQLite Repositories: stores catalog
- File Routes → SQLite Repositories: reads catalog
- File Routes → Configured Disks: manages files
- Media Routes → SQLite Repositories: looks up media
- Media Routes → Range Streaming: streams ranges
- Media Routes → Thumbnail Service: serves thumbnails
- Video Player → Bun HTTP Server: requests stream
- Media Preview → Bun HTTP Server: loads content
- Playlist Routes → SQLite Repositories: stores playlists
- System Routes → LAN Discovery: gets LAN addresses
- System Routes → SQLite Repositories: reads system state
- Torrent Manager UI → Torrent Routes: controls downloads
- Torrent Routes → Torrent Engine: delegates control
- Torrent Engine → SQLite Repositories: persists status
- Torrent Engine → Configured Disks: writes downloads
- Torrent Engine → Library Scanner: indexes completed files
