silo pre-1.0 AGPL-3.0-or-later
Silo · Release Definition · Revision: September 2026

Silo v1.0

This is the definition of the first public release: the library types, the core experience every client must deliver, the feature set and its acceptance criteria, the release gates, and what is held for later.

Originally published · June 20, 2026. This is the baseline release definition.

September 2026 revision. This update focuses 1.0 on movies and series. Audiobooks and ebooks move to a consolidated Books effort after 1.0, with no release date assigned. It moves unfinished surfaces to post-1.0, makes release blockers and validation gates explicit work, and sets the first-release compatibility rule: controlled client/server version skew now, with an additive Silo 1.x contract going forward.

September 2026 revision: content added or substantively revised from the June 20, 2026 baseline.

1Release summary

September 2026 revision: Silo v1.0 is a self-hosted media server for movies and series, delivered with native clients on iPhone, iPad, Apple TV, Android phone, Android tablet, and Android TV, plus a web app for both viewing and server administration. Every client must deliver the full browse → metadata → play experience. The server supports multi-profile households with access control, personalization, distributed and hardware-accelerated transcoding, casting, offline downloads, a self-contained request system, plugins, and migration from Plex, Jellyfin, and Emby, including drop-in compatibility for existing Jellyfin clients.

September 2026 revision: What changed. The original definition predates most of the implementation. Where shipped code goes further, including requests in the apps and collection authoring on mobile, the scope follows the code. A library type ships only when every first-party client supports it, and audiobooks and ebooks are deferred together for a consolidated Books effort. Their existing players and readers stay available as labeled beta features, unchanged, but that does not make them part of 1.0. Beta labeling is tracked work (section 8). Where the code falls short, including backup & restore and chapter-preview thumbnails on clients, the item is a release blocker or moves to section 7. Capabilities that exist but still need hardware or third-party certification, including HDR→SDR tone-mapping, remain release work until their RC matrix passes. Each feature’s surface tags remain its parity contract.

2September 2026 revision: Platforms & clients

v1.0 ships four native clients plus a web app. Together they cover seven consumption form factors: iPhone, iPad, Apple TV, Android phone, Android tablet, Android TV, and web. The web app is also the server’s administration surface.

Web appBrowse and play in the browser, plus the full admin surface: user management, metadata editing, plugin marketplace, migration tools.
iPhone (iOS)Full mobile client. Includes offline downloads and casting.
Android phoneFull client. Includes offline downloads.
iPad (iOS)Full tablet client. Includes offline downloads and casting.
Android tabletFull tablet client. Includes offline downloads.
Apple TV (tvOS)Full 10-foot client, remote-driven.
Android TVFull 10-foot client, remote-driven.

What “parity” means. Core-experience parity (browse → metadata → play, section 4) is mandatory on every form factor. Beyond that, parity is per-feature: each feature’s surface tags are its parity contract. iOS tags include both iPhone and iPad; Android tags include both phone and tablet. Deliberate asymmetry, such as web-only admin and mobile-only downloads, is by design; a platform lacking a feature it isn’t tagged for is not a gap.

3September 2026 revision: Library types

Two library types ship in v1.0, each at full parity across all seven form factors. Each must clear the Core Experience bar in section 4.

Movies

TMDB metadata. Extras and edition labels where present.

Series

TMDB + TVDB metadata. Season/episode hierarchy, Next Up, specials, watched roll-up.

September 2026 revision: The library-type rule. Features may ship on a declared subset of surfaces (section 2), but a library type ships only when every first-party client supports it, including iPhone, iPad, Android phone, and Android tablet. A library that exists on the server but is unavailable on a household’s TV does not meet that bar. Audiobooks and ebooks are outside 1.0 so they can be developed together as a consolidated Books effort. That effort has no assigned release version or date. Until it lands, the current audiobook and ebook surfaces remain reachable as labeled beta features (sections 7 and 8).

September 2026 revision: Sports content is supported as a series library via the Sportarr metadata plugin. It is supported as a plugin, but not part of the first-party validation matrix. Audiobooks, ebooks, manga, music, and podcasts are not v1.0 library types; see section 7.

September 2026 revision: Plugin contract. Library and marker support is delivered through plugins. Metadata: a library type counts as first-party-supported only once at least one first-party metadata plugin validates against it (Movies → TMDB, Series → TMDB + TVDB). Marker: Movie/Series libraries only. Request: the request system is first-party and extensible; community-maintained plugins can automate how requests are sourced. Autoscan: Silo owns the scan intake API; community-maintained adapters connect specific automation stacks or file-change sources.

4September 2026 revision: Core experience: Library-user acceptance

The Core Experience describes what a person must be able to do with any shipping library type on every client. A separate admin acceptance group covers server-side guarantees users do not touch directly. Budgets are p95 ranges on stated reference hardware. Each item also states relevant limits, including forward-only progress, single-quality transcode sessions, and a transcode restart after a mid-stream track switch.

Library-user acceptance: every form factor (iPhone / iPad / Apple TV / Android phone / Android tablet / Android TV / web)
  • Find: the library appears in nav with an artwork grid/list, sort + filter, lazy-load, and a defined empty state; its items and people are searchable, results-as-you-type, filterable by type.
  • Understand: a detail screen shows full metadata, artwork, and related/cast where applicable.
  • Play: starts from detail and from resume; direct-play when codecs allow, remux/transcode fallback otherwise; HDR plays correctly on capable displays and tone-maps/transcodes to SDR elsewhere rather than failing. Cold-start transcode reaches first frame within a stated budget; seeking past the buffered region works; switching audio or subtitle tracks, where available, resumes at position (a brief rebuffer is expected). Adaptive bitrate is out of scope; manual quality selection is provided.
  • Keep my place: resume position is monotonic-forward across devices and profiles; two devices converge to the furthest position; mark watched/unwatched works and series roll-up updates; Continue Watching reflects it.
  • Recover: server unreachable mid-browse → non-destructive error + retry, no crash; token expiry → silent refresh, re-login only when the refresh token is dead; mid-stream drop → pause and auto-resume on reconnect. A no-metadata item still appears (filename title, placeholder art) and plays; a corrupt / 0-byte file gives a clear error without crashing the player or list; mixed-codec libraries work.
  • Accessibility: core browse and detail screens honor the system text-size setting. Full screen-reader support and advanced caption styling are post-1.0.
  • Video-library subtitles and captions (Movies and Series): a selected subtitle or caption track renders legibly and stays in sync during playback. Detailed subtitle behavior is defined by the Subtitle playback & appearance feature.
  • App lifecycle: backgrounding/resuming during browse and playback restores state without crash or forced re-login; rotate/resize does not crash the player.
  • In-player controls: play/pause/seek/scrub, audio + subtitle selection, next-item/autoplay where relevant.
Phone and tablet acceptance (iPhone / iPad / Android phone / Android tablet)
  • Every feature tagged iOS is validated on both iPhone and iPad; every feature tagged Android is validated on both an Android phone and an Android tablet.
  • Browse, detail, search, settings, and playback adapt to the supported phone and tablet layouts. In the intended portrait and landscape orientations, no primary control is clipped, obscured, or unreachable.
TV-specific acceptance (tvOS / Android TV)
  • Every control in browse, detail, and player is reachable and operable by D-pad / remote alone; focus is always visible and never trapped.
  • Play/resume is reachable within a bounded number of D-pad moves from a focused tile; search uses the on-screen keyboard.
  • Mark watched / favorite is a focusable control on the detail screen, not a gesture.
Admin acceptance: server (validated by an admin, not a library user)
  • A configured folder scans to completion; rescans reflect added / changed / removed files, are idempotent (no dupes), and preserve existing watch progress & history.
  • Every item is matched to metadata; unmatched items stay visible and are manually fixable (identify, match-search, field + artwork edit).
  • Browse endpoints paginate; the first page of a large reference library (state the size, e.g. ~10k items) returns within a p95 budget (e.g. ≤1 s) while transcodes run.
  • Profile library access and content rating are enforced server-side on both browse and stream endpoints; the access resolver is the boundary, not UI hiding.
  • Release-gate criteria (first-run, upgrade safety, play-path security, observability) live in section 6.

Type-specific add-ons. Series: season/episode hierarchy, Next Up, specials, watched roll-up.   Movies: an edition label is shown where present; where a title has multiple versions, the server resolves a preferred version that plays by default.

5Features in v1.0

Everything below is in scope for v1.0. Each feature lists its acceptance criteria and the surfaces where it ships. An iOS tag covers iPhone and iPad; an Android tag covers phone and tablet. Use the filter to narrow the list by platform or scope.

Filter 35 features

Discovery & browsing

September 2026 revision: Collections

iOStvOSAndroidAndroid TVWebWeb admin

Named sets of titles: shared (everyone sees) or private (owner only), hand-picked or rule-filled. Shared/smart authoring is web-admin; private authoring on web and Android; every client browses.

  • Browse a Collections section and open one to list its members on every client.
  • Shared collections show for everyone; private ones only for their owner.
  • Smart/rule collections auto-populate and stay current; an empty one renders an empty state.
  • A collection spanning a restricted library shows only the allowed members.
  • Shared and smart/rule collections are created and managed by an admin in web admin: members, rules, ordering, artwork.
  • Any user creates and manages their own private collections on web and Android; private collections respect profile access, so a kids profile cannot add restricted content.
  • Shared/smart authoring stays web-admin only; TV clients consume collections with no create/manage entry point in release builds.

Calendar

iOStvOSAndroidAndroid TVWeb

A release schedule of upcoming episodes, movies, and seasons, a week at a time.

  • Week view lists upcoming episodes + movie/season releases; season premieres are distinguished.
  • Shows only libraries the active profile can access; dates correct across time zones.
  • An empty range renders a defined empty state.

September 2026 revision: Curated home sections

iOStvOSAndroidAndroid TVWebWeb admin

Server-assembled home rows, including trending, seasonal, editorial, and mood rows, are authored centrally in web admin.

  • An admin builds and reorders home rows in a web-admin builder; no config-file editing is required. Scheduled publication is post-1.0.
  • A change to the row set updates the home screen without an app update; every client renders the same available rows.
  • Each user reorders their own profile’s section order manually; the personalized order persists per profile while the available rows stay centrally defined. The order is a profile-level edit, visible and settable by an admin in the device & override audit.
  • On Apple and Android, "featured" content appears as a media row (these platforms have no hero concept).
  • A profile never sees rows/tiles for content it can’t open; a row resolving to zero accessible items is omitted.

Person / cast & crew browsing

iOStvOSAndroidAndroid TVWeb

Tap an actor or director to browse their other in-library work.

  • A person page lists their other in-library work, with photo and a missing-photo fallback, on every client.
  • People are searchable; search returns matching cast/crew, not only titles.
  • Person metadata is backfilled proactively: a person’s photo/bio is present without a user having to open the page first, and entries that are missing or stale beyond a threshold are refreshed within a bounded window.

Recommendations

iOStvOSAndroidAndroid TVWebServer

Personalized "For You" suggestions with enough variety to avoid repeating the same titles, plus useful choices for a new profile. Produced server-side and shown everywhere.

  • The server produces a personalized, varied set per profile, refreshed in the background, with sensible picks for a new profile.
  • Clients render it where present; if the recommender has no output, clients fall back to a default row rather than an empty shelf.

Playback

Intro/recap/credits segments with a Skip button. The server detects markers locally or obtains them from enabled marker-provider plugins; every client consumes the resolved markers.

  • The server detects intro/recap/credits locally or retrieves them from an enabled marker provider on the reference test set, within an accuracy target; no manual tagging required.
  • Marker data is extensible through marker-provider plugins. TheIntroDB is one marker provider; additional providers use the same server-managed interface to supply or accept intro, recap, credits, and preview markers.
  • Every client shows a Skip control at the right time with a countdown.
  • Manual seek always works; a wrong or missed detection never blocks playback.

Admins and authorized users create, adjust, and remove intro/recap/credits markers in the web app, including markers supplied by a provider. Movie & Series libraries only.

  • From the web app, an admin or an authorized user adds, edits the in/out points of, or deletes a marker on a Movie or Series item; the change takes effect on every client without a rescan.
  • Marker-edit permission is grantable to an authorized (non-admin) user and enforced server-side.
  • Manual edits win over and survive re-detection and rescans (lock-on-edit); audiobook and other library types expose no marker editor.

The server generates thumbnails at chapter and marker positions, and the web app displays them. Native clients support chapter navigation without preview images; native preview rendering is post-1.0.

  • The server generates chapter/marker thumbnails (per-library setting) including on hardware-accelerated paths; absence degrades silently.
  • Web shows the preview image at chapter/marker points; native clients ship chapter navigation without preview images.
  • Full timeline scrubbing-trickplay is out of scope.

Subtitle playback & appearance

iOStvOSAndroidAndroid TVWebServer

Per-profile subtitle behavior and appearance, auto-selected by audio language and customizable, with series-level overrides that sync across every client.

  • Subtitle display settings (font, size, color, background, position, timing) are a profile-level preference, applied automatically and carried across devices for that profile.
  • Subtitles auto-select based on the detected audio language; e.g. foreign or partially-foreign audio surfaces the matching/forced subtitle track without the user choosing each time.
  • A manual subtitle override (track choice or on/off) applies to the entire series, not a single episode, and persists.
  • Changes to subtitle preferences or overrides are reflected on every client; the preference is server-synced per profile.
  • Appearance renders consistently across clients; selected captions stay legible and on time, per the section 4 accessibility bar.

Find and download human subtitles from providers on every first-party player, or upload your own from the web app.

  • Upload is available to any user; the search button is hidden until a provider is configured.
  • Subtitle actions live in the subtitles panel, not the overflow menu.
  • Search and download are available during playback on web, iPhone, iPad, Apple TV, Android phone, Android tablet, and Android TV. Upload remains web-only.
  • A downloaded or uploaded subtitle is attached to the item and immediately selectable for every profile, on every account, that can access it. Adding a subtitle never changes another profile’s current selection or subtitle preferences. A malformed upload is rejected with a clear message.

September 2026 revision: AI generated subtitles

iOStvOSAndroidAndroid TVWebWeb adminServer

During playback, a user can translate an existing text subtitle or generate subtitles from an audio track when the server enables AI subtitles. The completed track is saved on the item and consumed like any other subtitle.

  • Every first-party player exposes the AI subtitle action when the server reports translation or transcription available. A user can translate a compatible text subtitle, transcribe an audio track, or transcribe and translate it.
  • The server enforces configured per-account transcription quotas for non-admin users. The player shows the remaining allowance and reports quota exhaustion without interrupting playback.
  • A completed track is saved on the item, immediately selectable for every profile on every account that can access it, and labeled as AI-translated or AI-transcribed.
  • Generation is rate- and cost-guarded and the provider path complies with the section 6 provider-compliance gate; a failed generation reports a clear reason and never blocks playback.

Download titles to watch offline on a phone or tablet, under server-enforced limits. iOS and Android only.

  • On a mobile client: download a title, manage downloads, and play with no connection, under the server’s bandwidth/storage limits.
  • An interrupted download resumes or fails cleanly; no corrupt half-file is presented as playable.
  • The offline copy respects profile access and any server-enforced expiry. tvOS and Android TV are out of scope.

From the Silo mobile app on a phone or tablet, send a title to the Silo TV app on the same network and use the mobile device as a full remote. The TV app plays it directly from the server; the mobile device hands off and controls playback, and does not relay or cast the video. This works across platforms on the same LAN.

  • Any signed-in first-party mobile app on iPhone, iPad, Android phone, or Android tablet can discover and control either Apple TV or Android TV on the same LAN. Selecting the TV or sending a title completes the secure profile handoff automatically in the normal flow; the user is not asked to pair or confirm the connection. Platform pairing does not matter.
  • After handoff the mobile device acts as a full remote (play/pause, seek, audio/subtitle, quality, volume) and stays in sync; it never transcodes or relays the stream.
  • Same-LAN only. If the TV app drops, the phone surfaces a disconnect and recovers rather than hanging.

GPU-accelerated transcoding (NVENC / QSV / VAAPI / VideoToolbox) with tone-mapping.

  • On a host with a supported GPU, hardware encode/decode is auto-detected and used, with config to force or disable it; falls back to software cleanly.
  • HDR → SDR tone-mapping produces correct color on the hardware path.

Transcoding spread across multiple worker nodes with per-node caps and live monitoring.

  • An admin can register a node, place it in a co-location group, set job + bandwidth caps, and see live node sessions; a node going away fails over without orphaning a stream.
  • Single-node is the zero-config default; multi-node is opt-in.

Personalization & accounts

Multiple profiles per account, each with its own progress, optional PIN, and library limits.

  • Switch profiles on every client; each has independent progress and preferences.
  • Profile startup behavior is set per device. Phones, tablets, and web remember the last active profile by default; TV clients show the profile picker on launch by default. After a TV profile is selected for the first time, the TV offers to remember it for future launches. On any client, the user can choose to remember a profile or ask who is watching at launch.
  • A remembered profile opens without asking for its PIN on every launch. Selecting a different PIN-protected profile, or using a device that does not remember the profile, requires that profile’s PIN.
  • PIN gate enforced; kids mode hides restricted libraries and content.
  • Library restrictions are enforced server-side; a restricted profile cannot reach content via deep link, search, person page, or stream URL.

Watchlist / Favorites / Ratings

iOStvOSAndroidAndroid TVWeb

Save for later, mark favorites, and rate titles per profile, synced across devices.

  • Toggle watchlist/favorite/rating from a title page on every client; state is per-profile and syncs across devices.
  • Dedicated lists are easily discoverable in nav and fully browsable.
  • Toggling while offline queues and syncs on reconnect, or fails visibly; never a false "saved".

Users manage their own signed-in clients on the web, and server admins can invalidate a client session for any user. Mobile and TV apps do not surface session management in v1.0.

  • A user lists active sessions with device/last-seen and revokes one; the revoked session loses access on its next request.
  • A server admin can inspect a user’s active sessions, invalidate one client, or sign that user out everywhere without changing the user’s password or affecting other accounts.

Server admins create scoped API keys for server automation and integrations. Regular users and mobile/TV clients do not manage API keys in v1.0.

  • Only a server admin can create, view metadata for, rotate, or revoke API keys. Each key has a defined scope and its secret is shown only when it is created.
  • Regular users cannot create API keys.

TV client sign-in & onboarding

iOStvOSAndroidAndroid TVWeb

Set up a TV without typing credentials by approving its device code in a browser or handing over signed-in servers from a phone or tablet on the same LAN.

  • A TV client shows a device code; approving it in a browser signs the TV in within the code’s validity.
  • When a signed-in Silo app opens on a phone or tablet, it discovers Silo TV apps awaiting setup on the same LAN and offers to sign them in. After code confirmation, it hands over its signed-in servers. An iPhone, iPad, Android phone, or Android tablet can set up either Apple TV or Android TV.
  • Manual fallbacks, such as typing the server URL or signing in with credentials, are always present and offered.
  • An expired or mismatched browser, mobile, or TV code fails closed and can be retried.

Server, admin & operations

Create accounts, set up household or guest access groups, and invite people with the right library access and limits from the start.

  • From web admin, an admin creates accounts, access groups, and invitations.
  • An access group sets the inherited policy for its members: library access, playback-quality and stream/transcode limits, download and request permissions, and the permissions members may receive.
  • A member account inherits its access group’s policy unless an admin sets a specific account-level override. All effective limits are enforced server-side, not only hidden in the UI.
  • Admin accounts never belong to an access group. An invitation can assign a recipient to an access group so its policy applies when the account is created.
  • User management is web-admin only; mobile and TV clients do not expose it.

Admin impersonation

Web adminServer

An admin acts as a non-admin user to reproduce and diagnose what that user sees.

  • From web admin, an admin starts an impersonation session for a non-admin user and sees the experience as that user.
  • Impersonation cannot target another admin or escalate privileges; it ends cleanly and returns the admin to their own identity.

September 2026 revision: Requests

iOStvOSAndroidAndroid TVWebWeb admin

A self-contained request system: a user asks for a movie or show the server doesn’t have, an admin approves it, and when the content is later scanned in and identified it’s marked available and the requester is notified.

  • From the web app, a user searches for and requests a movie or show the server doesn’t have; a request for content that already exists is prevented, and if the title is already requested the user can add themselves to be notified when it becomes available instead of requesting it again.
  • A request moves through a status lifecycle (pending → approved/declined → available); an admin can approve or decline, and per-user request permissions/limits are enforced.
  • A user can be set to auto-approve on a per-user basis; their requests skip the pending state and go straight to approved.
  • When matching content is scanned in and identified, the server marks the request available; no external service is required.
  • Everyone who requested or followed the title is notified when it becomes available.
  • The request system is extensible through a request-router plugin interface; community-maintained extensions can be installed to automate how requests are sourced.
  • Requests ship in every first-party client, gated by the server’s requests_enabled capability; a server with requests off shows no request entry point anywhere. Request administration (approve/decline, limits, auto-approve) stays web-admin only.

See every active stream and remotely stop/pause/resume or broadcast a message.

  • Web admin lists active sessions (who, what, transcode vs direct, node); admin can stop/pause/resume one and send a message clients surface.
  • A stopped session ends cleanly on the client. No mobile/TV admin surface.

Re-identify, fix fields, and choose artwork for mismatched items.

  • Re-identify an item against providers, apply a match, edit core fields, and pick from available artwork.
  • Changes persist and survive rescans (lock-on-edit where supported).

AI metadata translation

WebWeb adminServer

Auto-translate titles, overviews, and other metadata into a user or profile’s primary language. Translations can be generated while browsing and cached; admins can still prewarm translations from web admin.

  • A user/profile primary language controls the preferred metadata language on every client; clients render localized fields where present and fall back to the source language otherwise.
  • While browsing, the server can generate missing metadata translations on demand and cache them so v1.0 does not require pre-translating every item in the library.
  • From web admin, translating an item or library can prewarm missing localized fields for a selected language.
  • Machine-translated fields are marked as such and do not overwrite human- or provider-supplied translations.
  • The provider path is rate- and cost-guarded and complies with the section 6 provider-compliance gate.

Bandwidth/quota limits, API rate limiting, and a filterable audit log.

  • Admin sets global + per-user bandwidth/quota limits and they are enforced; rate limits throttle abuse.
  • An audit log records user and permission actions and is filterable, with live streaming.

September 2026 revision: Device & override auditing

iOStvOSAndroidAndroid TVWebWeb adminServer

The server tracks devices and resolves settings per device and per profile. In web admin, an operator can inspect the effective setting for a device/profile combination, see where it came from, and correct an override when needed. The layout of that control surface is not prescribed.

  • The server registers each device a profile uses (id, name, platform, last-seen) and records each login as a session with device + IP. Web admin provides a practical way to find a device and inspect its settings and overrides.
  • Settings resolve by precedence: device override → profile/user value → default. The effective value reports its source (device / user / default).
  • A user sets and clears overrides for their own device (e.g. preferred quality, audio language, auto-skip intro/recap/credits, HDR, playback speed, subtitle sync) for the active profile; overrides are profile-scoped, so switching profiles on the same device sees its own values.
  • An admin can inspect and correct the relevant device-level override or profile-level setting for any user, including a profile’s home section order.
  • Boundary: device tracking is automatic from client-reported headers and enforced server-side; v1.0 has no device blocking/approval and no trusted/blocked device state.

Install metadata and marker plugins from the first-party catalog, and request/source-adapter plugins from the community catalog once enabled; they auto-update.

  • From web admin, install a plugin from the catalog; it loads and is usable.
  • Catalog installs and updates are SHA-256 checksum-verified against the selected catalog; an incompatible or failed plugin degrades gracefully. Publisher-signature verification is post-1.0.
  • The first-party catalog is enabled by default; the community catalog is off until an admin explicitly enables it.
  • Every plugin displays its tier (first-party, community-vetted, or external), and community/external plugins show their disclaimer notice.
  • A plugin installed outside the configured catalogs is marked Unverified and is not eligible for unattended auto-update.
  • No plugin-management UI in mobile/TV clients.

Brand the server: name, logo, favicon, login background, and accent color.

  • Server stores and serves name/logo/favicon/login-background/accent and applies them on its web surfaces.
  • First-party clients do not adopt server branding.

A self-contained scan intake system: an external source tells Silo that files changed, Silo maps the signal to a library/path, and the server performs a targeted rescan without waiting for the schedule.

  • Silo exposes an authenticated scan intake path that accepts a library/path change signal; when matching content is scanned in and identified, it appears in the library without waiting for the scheduled scan.
  • The server owns signal intake, path mapping, debouncing, scan queueing, and result reconciliation; no external media-server refresh endpoint is required.
  • Signals are debounced so bursts of changes do not hammer the scanner.
  • The scan intake system is extensible through a source-adapter plugin interface; community-maintained extensions can be installed to connect automation tools, download clients, or other file-change sources.
  • Web-admin configuration: admins configure sources, connections, path mappings, and inspect activity in web admin. Mobile and TV clients expose no autoscan configuration.

Alerts for opted-in events through the web inbox, Discord, email/digests, web push, webhooks, and native push to phones and tablets.

  • Delivery: the server delivers opted-in events (e.g. requested content arrived) through every supported channel.
  • User control: a user chooses which event types use push and registers or unregisters a device; tokens are revoked server-side on sign-out or session revoke.
  • Web inbox: the web app includes a notification inbox with read state and preferences.
  • Mobile push: an opted-in event (e.g. a request was fulfilled) wakes iOS and Android through APNs/FCM.
  • Privacy: the push payload contains no media title, server URL, user name, or notification body. A first-party maintained relay receives only an opaque device/registration target and never learns the server identity, notification contents, or library contents.
  • Resolution: after wake, the client connects directly to its own Silo server to fetch pending notification contents and deep-link context; tapping the notification opens the relevant item once fetched.
  • Boundary: tvOS and Android TV push are out of scope, and no native mobile or TV notification inbox ships in v1.0.

Reconcile watched-status from Plex/Jellyfin webhooks.

  • Plex/Jellyfin webhooks keep watched-status in agreement. Server-side only.

Migration & interoperability

Bring watch history in when moving from another server. Users can import their own history, and an admin can assist with household-wide migration and repair.

  • A signed-in user connects their own Plex, Jellyfin, or Emby account and imports watched status, play counts, last-watched, and resume positions into one of their own Silo profiles, matched by IMDb/TMDB/TVDB IDs.
  • A user can see only their own import runs and results; an import cannot target another account or profile.
  • For an admin-assisted household migration, an admin pulls the external user list, maps each person to an existing Silo profile, and can run or repair watch-history imports for those mappings. The mappings persist for later imports.
  • Admin-assisted import does not create Silo accounts or profiles and does not copy library permissions from the source server.
  • Emby imports can use Emby Connect to discover a server, then import from the selected source server; Plex and Jellyfin use their own source-server sign-in/token flows.
  • Live progress shown; unmatched items reported; re-running doesn’t double-count; a partial import can be re-run safely.

Silo exposes a Jellyfin-compatible API so existing third-party clients can connect, browse, and play movies and series. Audiobookshelf compatibility remains beta and is deferred with Books.

  • A representative third-party Jellyfin client can authenticate, browse, and play against Silo, covered by an explicit smoke-test matrix.
  • The compatibility surface respects the same profile access and content rating as the native API.
  • Documented boundary: which client features are in or out of the compatibility promise.

6September 2026 revision: Release-readiness gates

Cross-cutting criteria a public, self-hosted 1.0 must clear, independent of any single feature.

Tracking model. These gates are separate from the 35 feature parents and from Movies / Series certification. A feature may be deferred and made unreachable; an applicable release gate may not be waived. Track the criteria below as nine gate issues, each closed only against an identified release-candidate build with a named validator, procedure, evidence, and pass/fail result. The full tracking and validation process lives in the server repo at docs/release/1.0-readiness.md.

  • First-run: a fresh install reaches usable (create admin → add a library → scan → browse → play) via documented steps, with no manual DB or config-file editing on the happy path.
  • PostgreSQL durability: the default Docker Compose stack provisions PostgreSQL, and a documented external PostgreSQL deployment works with operator-supplied credentials and connection details. Core state survives application restarts and container replacement; connection or migration failure is visible and blocks ready status.
  • Redis coordination: the default Docker Compose stack provisions Redis, and a documented external Redis deployment works. Modes and features that require Redis fail visibly and report not ready during an outage; integrated deployments document which functions fall back in-process. Restarting Redis may interrupt transient work but never corrupt durable library, user, or playback-history data.
  • Upgrade, rollback, backup & restore: because 1.0 is the first official release, the release owner names one supported prerelease baseline (normally the final public beta or RC). Upgrading that baseline to 1.0 runs migrations automatically and non-destructively; a failed migration aborts without leaving a partially upgraded database; a documented rollback path exists. A documented backup/restore path covers the database, object storage, server config, and the secret-encryption key; restoring onto a clean host reproduces a working server. Redis is disposable cache/session state, not a backup target. Historical development builds outside the named baseline carry no upgrade guarantee.
  • Security & secret handling: provider tokens, SMTP credentials, S3 keys, watch-sync OAuth tokens, and plugin credentials are encrypted at rest, redacted in logs and API responses, and survive migration. Stream/media URLs require a valid, expiring, per-profile token; unauthenticated or wrong-profile segment requests are rejected; no shared or compiled-in secret grants playback or cast control across servers.
  • Observability: a failed scan / transcode / metadata match is visible to the admin (item identity + reason), not a silent no-op; /health and /ready reflect dependency outages.
  • 1.0 compatibility contract, version-skew validation & public API reference: the client↔server API, plugin SDK, and DB migration path are versioned with a published minimum-version policy. Stable public HTTP APIs are major-versioned by path; /api/v2 is Silo 1.0’s stable native API. Silo 1.x preserves v2 compatibility, additive changes remain in v2, and breaking changes require a new major path. Before 1.0 ships, siloserver.org serves the canonical versioned reference for /api/v2 at a stable public URL, generated from the frozen OpenAPI contract for the released server tag. It includes a human-readable reference and downloadable OpenAPI document, covering authentication, errors, pagination, version/capability negotiation, supported public endpoints, and compatibility boundaries. For 1.0, test every 1.0 client against the 1.0 server, the final supported prerelease clients against the 1.0 server, and 1.0 clients against the named prerelease server baseline. The server exposes version/capabilities; unsupported API majors or below-minimum servers fail with a clear upgrade message; missing same-major capabilities hide or degrade the affected feature without a crash. This establishes the future 1.x contract. It does not claim that 1.0 has been tested against versions that do not yet exist.
  • Scope enforcement: a release build exposes no deferred surface except those explicitly retained as beta (section 7). Deferred routes are feature-flag-off or report capability unsupported, carry no client entry point, and are excluded from supported 1.0 documentation. Retained beta surfaces are labeled beta wherever they appear in clients and docs. An automated release-build check enforces this (see section 7).
  • Public-release compliance: first-party metadata/subtitle plugins comply with provider ToS and rate limits at public scale; bundled keys are audited. Dates/times display in the device locale and timezone; non-ASCII titles and paths scan, browse, and play correctly. Full UI translation is post-1.0.

7Not in v1.0

Explicitly held for later. A feature is out of v1.0 only when no release build can reach or advertise it. Code existing behind that boundary does not make the feature part of the release.

The gate tiers below apply to surfaces deferred across all release builds. A feature that is in-scope on one platform but absent on another is not a gating concern; that asymmetry is governed by each feature's surface tags (see section 2), enforced per-platform, not by these gates.

Release-gate policy for deferred surfaces
  • Default gate: no client entry point, removed from supported 1.0 documentation (clearly labeled beta/reference guides may remain), the capability probe reports unsupported, and the route stays authenticated: mounted but inert and unadvertised.
  • Strict gate: the above plus a release feature-flag off, so the route returns 404/501 in release builds. Used where a stray reachable surface is a reputational, legal, or maturity risk, e.g. Watch Party.
  • Retained beta: the surface stays reachable exactly as it works today, with no gate, and is labeled beta in clients and docs. It is outside the 1.0 support promise and certification. Used for audiobooks, ebooks, manga, and Audiobookshelf compatibility, which the Books effort will later replace.
  • Removed: genuinely abandoned, no-roadmap, or misleading code is deleted rather than gated, e.g. client music shells.
  • Verified: a release-build check asserts deferred routes are flag-off / capability-unsupported / unlinked, so the boundary cannot silently drift (the section 6 scope-enforcement gate).
September 2026 revision: Books (audiobooks & ebooks) Audiobooks and ebooks are deferred together for a consolidated Books effort after 1.0, with no assigned release version or date. The existing players, readers, metadata integrations, and Audiobookshelf compatibility are retained beta: they keep working as they do today, labeled beta, with no gate. They are outside 1.0 acceptance and certification. Existing libraries and progress are untouched by upgrades.
September 2026 revision: Manga Scanner and reader plumbing exist, but the metadata story is immature. Retained beta alongside ebooks; folded into the Books effort.
Music No music library kind, scanner, or metadata agent. Client "music" shells (dead tabs) are removed for v1.0, and the server README stops advertising music until it exists.
September 2026 revision: Podcasts The server scans and serves them, but no first-party client has a browse experience. Creating a podcast library is gated in release builds so no user can build a library no client can open.
September 2026 revision: Native notification inboxes Server delivery, the web notification inbox, and native mobile push (iOS / Android) ship in v1.0. Inbox UI inside the native mobile and TV clients is post-1.0.
September 2026 revision: Scheduled home-section publication Admins build and reorder home sections in web admin for v1.0. Time-windowed or scheduled publication is post-1.0.
September 2026 revision: Plugin publisher signatures v1.0 verifies catalog artifacts with mandatory SHA-256 checksums and labels catalog trust. Cryptographic publisher-signature verification is post-1.0.
In-client admin Administration happens on the web admin; no in-app admin entry point ships.
Watch Party Real-time synced viewing. Built server-side but no client entry point ships.
Trakt two-way sync Outbound scrobble may exist; reliable two-way sync is not finished.
AI Audio Tracks / dubbing Not built; only normal audio-track switching exists.
Multi-version / edition switching An edition label is displayed; selectable variant switching is post-1.0.
September 2026 revision: Chapter thumbnails on native clients Server generation and web rendering ship (section 5); iOS/tvOS/Android rendering of preview images is post-1.0. Absence degrades silently; chapter navigation still works everywhere.
Timeline scrubbing-trickplay Full BIF-style timeline previews are post-1.0 on every surface.
September 2026 revision: Automatic account/profile creation during watch-history import v1.0 maps external Plex/Jellyfin/Emby users onto existing Silo profiles; bulk creation of Silo accounts or profiles from an external user list is post-1.0. The boundary is documented on the import screen.
Native macOS app The iOS app on Apple Silicon is the v1.0 Mac story; a native SiloMac app is post-1.0.
Full UI localization Beyond the timezone + non-ASCII floor in section 6.

8September 2026 revision: Release blockers

Added in the September 2026 revision. These are the known gaps between this document and the shipped code, in priority order. Nothing ships until every item is closed. The Silo v1 project board holds sequencing, epics, and day-to-day tracking; the server repo’s docs/release/1.0-readiness.md defines the release process.

  • 1. No in-app account creation: strip signup from the iOS and Android apps; invite-claim hands off to web signup or attaches an existing identity. Accounts are provisioned on the server/web by design.
  • 2. Backup & restore: absent today. Must cover PostgreSQL, per-user stores, object storage, config, and the secret-encryption key; restore onto a clean host reproduces a working server (section 6 gate).
  • 3. HDR→SDR tone-mapping certification: hardware and software tone-mapping implementations exist. Before release, validate correct SDR color and fallback behavior on the supported GPU/backend matrix against the release candidate.
  • 4. Scope lock: formally lock the published 1.0 release definition, record that lock in v1-scope.md, classify remaining candidate work as 1.0, 1.1, or closed, and activate the amendment rule.
  • 5. API contract snapshot and public reference: freeze the OpenAPI description of the stable /api/v2 surface, publish its generated human-readable reference and downloadable document on siloserver.org at a stable versioned URL, and add a CI check that fails on breaking change (section 6 gate).
  • 6. First-run & upgrade validation: the upgrade-safety gate exercised against the named supported prerelease baseline (normally the final public beta or RC); the TV-only first-run path clearly routes to phone, tablet, or web setup. There is no requirement to support every historical development build.
  • 7. Scope-enforcement check: the automated release-build check from section 7 on the server and every client.
  • 8. Beta labeling for Books surfaces: label audiobook, ebook, manga, and Audiobookshelf surfaces as beta wherever they appear in clients, the web app, and docs. Nothing is gated or removed. Apple clients must not open ebook/manga files in the video player. Existing libraries and progress are untouched by the upgrade.
  • 9. Compatibility certification: publish and execute the named-client smoke-test matrix for Jellyfin authentication, browse, and playback, including the supported-feature boundary.

Bug bar. A bug blocks v1.0 only when it violates a section 4 acceptance item or a section 6 gate. Everything else moves to 1.0.x. Triage follows those criteria.