Self-hosted media platform — Flood torrent UI + Jellyfin + smart prefetch engine with geographic seed diversity scoring
  • TypeScript 77.1%
  • HTML 13.9%
  • Shell 4.7%
  • JavaScript 1.8%
  • C# 1.3%
  • Other 1.2%
Find a file
JellyShip 55ba0c0a5f
Some checks failed
CI / quality (push) Has been cancelled
ansible playbook, plugin fixes, auth cookie bridge
- Add ansible/site.yml: full idempotent system playbook (Phases 1-5)
  - Reordered: system services (AutoUpdate, UFW, Samba, CredSync) before Jellyfin auto-config
  - Wizard safety net: detect wizard-done-but-no-users via SQLite, auto-reset
  - Plugin build+deploy: dotnet 9 SDK install, DLL build, meta.json
- Fix plugin csproj: target net9.0, Jellyfin 10.11.0 packages (was net8.0/10.10)
- Fix plugin JS: extract Jellyfin auth token from ApiClient/localStorage,
  set as jellyfin_token cookie so auth proxy passes without Basic auth prompt
- Fix plugin JS: iframe src /jellyship/ not /JellyShip/dashboard/ (double path 404)
- Add system scripts: auth proxy, credential sync, PAM hook, TTY dashboard
2026-05-25 23:15:36 +00:00
.claude-code fix: getTorrentName resolves folder name from file paths, fix lint errors 2026-05-24 16:32:39 -07:00
.forgejo/workflows feat: per-torrent UI sub-items, copy magnet fix, maxPeersSeen 2026-05-24 15:58:16 -07:00
.husky feat: per-torrent UI sub-items, copy magnet fix, maxPeersSeen 2026-05-24 15:58:16 -07:00
ansible ansible playbook, plugin fixes, auth cookie bridge 2026-05-25 23:15:36 +00:00
configs fix: installer completeness — tmpfs, logrotate, service config, build deps 2026-05-24 23:14:47 -07:00
docs feat: add full content management system 2026-05-23 21:39:05 -07:00
jellyfin-plugin ansible playbook, plugin fixes, auth cookie bridge 2026-05-25 23:15:36 +00:00
public feat: mobile responsive dashboard - 600px/400px breakpoints, stickyRoleWidth guard 2026-05-24 23:45:44 -07:00
scripts Replace NeDB with SQLite (better-sqlite3) 2026-05-24 18:51:46 -07:00
src fix: torrent lifecycle - proper content linking, full cleanup on delete, tracked count 2026-05-24 23:43:17 -07:00
tests feat: torrent quality selection, dedup, and acquisition settings UI 2026-05-24 17:22:17 -07:00
.gitignore fix: marker enrichment with DB fallback, remove junk auto-track, Jellyfin library cleanup 2026-05-24 23:14:47 -07:00
.prettierrc feat: per-torrent UI sub-items, copy magnet fix, maxPeersSeen 2026-05-24 15:58:16 -07:00
= fix: make applySnapshot async — await in non-async killed entire script 2026-05-24 21:03:55 -07:00
eslint.config.js feat: per-torrent UI sub-items, copy magnet fix, maxPeersSeen 2026-05-24 15:58:16 -07:00
install.sh fix: installer completeness — tmpfs, logrotate, service config, build deps 2026-05-24 23:14:47 -07:00
jellyfin-auth-proxy.py ansible playbook, plugin fixes, auth cookie bridge 2026-05-25 23:15:36 +00:00
jellyship-credential-sync.py ansible playbook, plugin fixes, auth cookie bridge 2026-05-25 23:15:36 +00:00
jellyship-passwd-hook.sh ansible playbook, plugin fixes, auth cookie bridge 2026-05-25 23:15:36 +00:00
LICENSE feat: initial project scaffold 2026-05-23 17:59:17 -07:00
package-lock.json Replace NeDB with SQLite (better-sqlite3) 2026-05-24 18:51:46 -07:00
package.json Replace NeDB with SQLite (better-sqlite3) 2026-05-24 18:51:46 -07:00
pnpm-lock.yaml feat: implement all phases (1-6) for first dev deploy 2026-05-23 18:22:56 -07:00
pnpm-workspace.yaml feat: implement all phases (1-6) for first dev deploy 2026-05-23 18:22:56 -07:00
README.md feat: initial project scaffold 2026-05-23 17:59:17 -07:00
tsconfig.json Replace NeDB with SQLite (better-sqlite3) 2026-05-24 18:51:46 -07:00
tty-status.sh ansible playbook, plugin fixes, auth cookie bridge 2026-05-25 23:15:36 +00:00
vitest.config.ts feat: per-torrent UI sub-items, copy magnet fix, maxPeersSeen 2026-05-24 15:58:16 -07:00

JellyShip

Self-hosted media platform — Flood torrent UI fork + Jellyfin + smart prefetch engine with FUSE mount and geographic seed diversity scoring.

What is JellyShip?

JellyShip bridges the gap between torrent clients and media servers. Traditional torrent clients download pieces randomly; media servers need sequential, predictable access. JellyShip sits between them with an intelligent prefetch engine that prioritizes downloads based on what you're watching — or about to watch.

Key Features

  • Interest Marker System — Unified priority model based on playback state (active, paused, unwatched). Each marker projects a 20-minute preallocation window with gradient priority chunks.
  • FUSE Mount — Torrents appear as regular files in a Jellyfin-compatible directory structure. Partial files are streamable; unavailable byte ranges trigger automatic priority boosts.
  • Cross-Episode Preloading — When you're 7 minutes from the end of an episode, JellyShip is already downloading the start of the next one.
  • Automatic Eviction with Deletion Score — Every file gets a 0-99 score based on demand, seed health, and data freshness. When disk is full, the most expendable content goes first.
  • Geographic Seed Diversity — Measures seeder distribution across countries, continents, and autonomous systems. Content with poor diversity scores low for deletion — it resists eviction because the network needs it.
  • Peer Observation Database — Tracks all peer interactions with 128-day TTL, freshness-weighted scoring, and background swarm refresh to keep health data current.

Installation

curl -sSL https://raw.githubusercontent.com/bradcarnage/jellyship/main/install.sh | bash

Or manually:

git clone https://forgejo.brads.computer/brad/jellyship.git
cd jellyship
pnpm install
pnpm build
sudo cp configs/jellyship.service /etc/systemd/system/
sudo systemctl enable --now jellyship

Requirements

  • Debian 12+ (or any Linux with FUSE support)
  • Node.js 22+
  • pnpm
  • libfuse3-dev
  • Jellyfin (optional, for playback integration)

Configuration

Copy the default config and edit:

sudo mkdir -p /etc/jellyship
sudo cp configs/jellyship.default.yaml /etc/jellyship/config.yaml

See docs/preallocation-strategy.md for full configuration reference.

Architecture

Jellyfin Webhooks → Prefetch Engine → torrent-stream → FUSE Mount → Jellyfin Scanner
                         │
                    Eviction Engine
                    ├── Diversity Scorer (GeoIP)
                    ├── Swarm Refresh Scheduler
                    └── Peer Observation DB (NeDB)

Documentation

Tech Stack

Component Library
Torrent engine torrent-stream
FUSE mount fuse-native
GeoIP MaxMind GeoLite2 + maxmind (npm)
Database NeDB
Webhook server Fastify
Config YAML

License

MIT