pre-1.0 AGPL-3.0-or-later

datasheet SS-001 · Go · Postgres · gRPC

a self-hosted media server, on modern infra.

Go 1.26 on the backend. PostgreSQL 18 with pgvector. gRPC plugins. Hardware-accelerated transcode, and worker nodes when one box is not enough. Native apps for iOS, tvOS, macOS, Android, Android TV, and the web. It also speaks the Jellyfin protocol, so clients like Infuse, Findroid, and VidHub work out of the box.

  • backend Go 1.26
  • store postgres 18 + pgvector
  • media ffmpeg · qsv · vaapi · nvenc
  • deploy docker compose · ghcr
fig. 01 first boot — single host, integrated mode

sec. 01 — what's underneath

Built like
infrastructure.

Most self-hosted media servers were designed around a single binary and a SQLite file. Silo bets on a stack that is typed, concurrent, scalable across hosts, and boring in all the right places.

/* storage */ 01/04

PostgreSQL 18 + pgvector

Your catalog is a relational database you can back up, migrate, replicate, and query, not an opaque blob inside an application directory. pgvector stores the embeddings that power recommendations, so there is no second datastore to run.

primary
postgres 18
vectors
pgvector
cache
redis
objects
S3-compatible
/* runtime */ 02/04

Go 1.26, end to end

Predictable memory, fast cold start, real concurrency. Transcode sessions, scanner walks, and the realtime hub are goroutines, not a thread pool you tune by hand. One static binary in one container image.

backend
go 1.26
frontend
react 19 + vite
tooling
pnpm · vitest
media
ffmpeg
/* plugins */ 03/04

gRPC, out of process

Plugins are self-contained Go binaries that speak protobuf to the host over a local gRPC socket. Out of process means a misbehaving plugin can crash without taking the server down. Capability types cover metadata, images, markers, analyzers, scheduled tasks, HTTP routes, auth, scan sources, and watch sync.

wire
gRPC + protobuf
SDK
silo-plugin-sdk
capabilities
13 types
1st-party
11 in the catalog
/* scale */ 04/04

One image, five modes

Run everything in a single container on a mini PC, or run proxy and transcode workers on other hosts that share the same Postgres and Redis. Register each node once in the admin panel and the pool balances streams across whichever nodes are healthy.

modes
integrated · api · proxy · transcode · frontend
transcode
least-connections
proxy
round-robin
health
periodic node sweep

sec. 02 — what it does

Eleven things that
matter.

What the stack actually buys you: smarter playback, profiles that fit a household, recommendations that learn, and a server that grows past one box when you need it to.

FEAT_01

Plays smarter, transcodes less

Silo picks the lightest playback path your device can handle: direct play when it can, a remux when only the container is the problem, a full transcode only when nothing else works. Hardware encoding on Intel, AMD, NVIDIA, and Apple Silicon, with HDR tone mapping when the screen needs it.

  • Direct play
  • QSV · VAAPI · NVENC
  • HDR tone mapping
FEAT_02

Built for households

One login, many viewing profiles. Each profile gets its own watch history, content rating limit, PIN, language preferences, and library access. Child profiles are locked down by default.

  • Multi-profile
  • Parental controls
  • Per-profile libraries
FEAT_03

Grows past one box

When a single host runs out of headroom, run transcode and proxy workers on other machines, point them at the shared database, and register them in the admin panel. Silo sends each new stream to the transcode node with the fewest active sessions.

  • Worker nodes
  • Least-connections
  • One image
FEAT_04

Subtitles your library deserves

Styled ASS and SSA subtitles render in the browser with their original fonts and positioning intact instead of being flattened to plain text. SRT and VTT are covered too, and missing tracks can be searched across three providers.

  • ASS · SSA
  • SRT · VTT
  • OpenSubtitles · SubDL · SubSource
FEAT_05

Recommendations that learn

Rows built from pgvector embeddings and what similar viewers on your server liked, not a “same genre” lookup. They surface things you'll like without burying the thing you came for.

  • Recommended for you
  • Because you watched
  • Similar users liked
FEAT_06

Watch together, properly

Synchronized playback rooms for movie night over the internet. Invite guests with a link, vote on what plays next, and stay in sync without paying for the privilege. Web app today.

  • Sync rooms
  • Vote queue
  • Guest invites
FEAT_07

Extensible without forking

First-party plugins handle TMDB and TVDB metadata, TheIntroDB markers, autoscan from your downloaders, and media requests. The SDK lets anyone add providers, analyzers, scheduled tasks, and HTTP routes without touching the core server.

FEAT_08

Skip the intro for real

Intros and credits are found by audio fingerprinting across a season's episodes, not by trusting whatever chapter tags happen to be in the file. Chapter thumbnails are generated as the player needs them.

  • Chromaprint
  • Chapter thumbs
  • Season-wide
FEAT_09

Audiobooks and ebooks, same shelf

Audiobook libraries with chapters, series, and resume, plus an Audiobookshelf-compatible endpoint so apps like Plappa and the official app connect as-is. Podcast feeds sync on a schedule. Ebooks get a built-in reader for EPUB, PDF, and comics with synced progress.

  • ABS protocol
  • EPUB · PDF · CBZ
  • Podcast feeds
FEAT_10

Knows when your show is back

New episode of something you watch? Silo tells you: in-app, browser push, iOS push, email digest, Discord, or your own webhook. A freshly seeded library never floods, season packs get batched, and you choose per episode or a daily digest.

  • Web · iOS push
  • Email · Discord
  • Webhooks
FEAT_11

Bring your watch history

Don't lose what you've watched when you switch servers. Import from Jellyfin, Emby, or Plex on day one, then keep everything in sync with Trakt, Simkl, or MDBList going forward.

  • Plex · Emby · Jellyfin
  • Trakt · Simkl
  • MDBList

sec. 03 — deployment shapes

One box, or your
whole cluster.

Start with everything in a single container on a mini PC. When the homelab grows up, whether that is three Proxmox nodes, a couple of NUCs, or whatever the rack looks like, run a transcode and proxy worker on each host against the same database. Register each node once in the admin panel and the server routes streams across them.

fig. 02 — single-host integrated DEFAULT
┌──────────────────────────────────────────────┐
│  silo (MODE=integrated)                      │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐      │
│  │  api     │ │ scanner  │ │transcode │      │
│  └──────────┘ └──────────┘ └──────────┘      │
│       └─────────────┬───────────┘            │
│                     ▼                        │
│           ┌─────────────────────┐            │
│           │ postgres + pgvector │            │
│           │ redis               │            │
│           └─────────────────────┘            │
└──────────────────────────────────────────────┘
fig. 03 — three-node homelab MULTI-NODE
┌─ homelab ────────────────────────────────────────────┐
│                                                      │
│  node01             node02             node03        │
│  ┌──────────────┐   ┌──────────────┐   ┌──────────┐  │
│  │ silo (api)   │   │ silo:        │   │ silo:    │  │
│  │ postgres     │   │  transcode   │ ● │  trans.  │● │
│  │ redis        │   │  +proxy      │   │  +proxy  │  │
│  │ +transcode   │   └──────┬───────┘   └────┬─────┘  │
│  └──────┬───────┘          │                │        │
│         └──────────────────┴────────────────┘        │
│                            ▼                         │
│              shared postgres + redis                 │
│                                                      │
│   transcode: least-connections · proxy: round-robin  │
└──────────────────────────────────────────────────────┘

sec. 04 — clients

First-party where it counts.
Open everywhere else.

The web app ships with the server. Native apps cover every other screen worth shipping on: SwiftUI on Apple, Compose on Android. All of them are in beta and nearly feature-complete, with Dolby Vision, lossless audio, and offline downloads where the platform allows. If you would rather keep the app you already use, the Jellyfin-protocol compatibility layer means it just works.

first-party clients

Silo for Web

React · TypeScript · Vite

The viewing and admin UI that ships with the server, and the reference client: every feature lands here first.

Silo for iOS

SwiftUI · AetherEngine

Native iPhone and iPad app. Direct play and HLS, Picture in Picture, offline downloads, and Now Playing on the lock screen.

Silo for tvOS

SwiftUI · AetherEngine · Top Shelf

Built for the Siri Remote, with Top Shelf and focus-engine navigation. An FFmpeg-based player handles Dolby Vision profiles 5, 7, and 8 and lossless multichannel audio.

Silo for macOS

SwiftUI · AetherEngine

Native Mac app with the same playback core as iOS, including Dolby Vision and lossless multichannel audio.

Silo for Android

Compose · Media3

Phone and tablet. Built on Media3 with a bundled FFmpeg audio decoder for TrueHD, DTS, and other tracks the platform won't decode, plus refresh-rate matching.

Silo for Android TV

Compose for TV · Media3

Designed for the remote: D-pad first, big posters, fast resume. HDR and Dolby Vision output, audio passthrough, and refresh-rate matching.

jellyfin-compatible third-party clients

Silo speaks the Jellyfin protocol on port :8096: auth, items, sessions, and websockets, plus the Jellyfin web app if you install it from the admin panel. Point any of these at http://silo:8096 and sign in as usual.

Infuse iOS · tvOS · macOS verified firecore.com ↗ app store ↗
Findroid Android verified github ↗ play store ↗
VidHub iOS · tvOS · macOS verified okaapps.com ↗ app store ↗
JellyCon Kodi verified github ↗
Streamyfin iOS · Android verified github ↗ app store ↗ play store ↗
Wholphin Android TV verified · recommended github ↗ play store ↗
Jellyfin Web browser optional · served at /web/ github ↗
mpv (libmpv) any verified mpv.io ↗ github ↗

audiobookshelf-compatible clients

Audiobook and podcast libraries are also served over the Audiobookshelf protocol on port :13378. Point any of these at http://silo:13378, sign in with your Silo credentials, and listen. Progress and chapters sync.

Audiobookshelf app iOS · Android verified github ↗
Plappa iOS verified app store ↗
AudioBooth iOS verified app store ↗
AudiobookshelfFully Android verified

sec. 05 — questions

Worth asking up front.

Is this ready for my production media library?

Define “production.” It runs full-time on real hardware for the people building it: transcoding, remembering what you watched, surviving restarts. But it is still pre-1.0 for a reason. Run it. Tell us what breaks.

How does this relate to Jellyfin?

Silo speaks the Jellyfin protocol on :8096, so the Jellyfin-compatible clients you already use (Infuse, Findroid, VidHub, JellyCon, Streamyfin) talk to Silo without changes. You can install the Jellyfin web app from the admin panel and it is served at /web/. Silo is its own server with its own internals; the protocol is just the shared language for the clients.

Can I migrate from Jellyfin? From Plex? From Emby?

Yes to all three. Watch history import works against Jellyfin, Emby, and Plex (with the Plex OAuth PIN flow). Because Silo speaks the Jellyfin protocol, your existing client apps keep working through the migration. Trakt, Simkl, and MDBList sync in both directions on top of that.

What's the catch on the license?

AGPL-3.0-or-later. If you fork it and run it as a service, you publish your changes. That's the deal. No CLA. No relicense rug-pull. No paywalled features. The Silo name and logo are trademarks and sit outside the license.

Who pays for this?

Nobody. It is an unfunded open-source project built by maintainers and community contributors, with no company or investors behind it. If that ever changes you'll hear about it here first. Sponsor on GitHub ↗ if you want it to keep going.

What's broken right now?

Audiobooks, ebooks, and podcasts are newer than movies and TV, so expect rough edges there. The native apps are in beta and close to feature parity with the web app; Watch Together, subtitle search, and the admin tools are still web-only. Anything not in the feature list above is probably not yet a thing.

Run it. Read it.
Tell us what's broken.

A self-hosted media server, built in the open. The best feedback you can send is a commit hash, a stack trace, and an opinion. The Discord is where the maintainers actually are: ask questions, report what broke, and see what is shipping next.