halcyon-video is a free, open source digital asset management (dam) project written in TypeScript and released under GPL-3.0. It has 869 GitHub stars, 39 forks and 80 open issues, and was last pushed 24 hours ago. On this registry it ranks #20 of 25 tracked projects in Digital Asset Management (DAM), with 5 head-to-head comparisons available. It gained 8 stars over the last 3 tracked days.

What is halcyon-video?

Halcyon Video is a self-hosted, GPL-3.0 licensed TypeScript application that turns a Jellyfin, Plex, or Emby library into a walkable 3D 1990s video rental store, built for people who want to browse their own collection from the couch with a keyboard, gamepad, TV remote, or phone.

What it is

Halcyon Video renders a media catalog as a physical video rental store built with three.js. Libraries become aisles, genres become sections, popular titles receive deeper stock, and multiple quality versions of the same film collapse into a single box on the shelf. The storefront, shelves, counter, and checkout ritual are all generated from the library underneath, so the collection remains the same even as the presentation changes.

It lives in the self-hosted media server ecosystem alongside Jellyfin, Plex, and Emby, and it does not replace any of them. What it replaces is the flat, grid-based browse screen those servers present by default. Instead of scrolling thumbnails, a user glides down real aisles, lifts a VHS or DVD case off the shelf, flips it to read the synopsis, cast, runtime, ratings, and a technical table generated from the file's media streams, then carries the selection to the counter. The intent is to give an existing catalog a place worth spending time in rather than a list to scroll past.

Key capabilities

  • Walks a real 3D store built from a Jellyfin, Plex, or Emby catalog, with libraries as aisles and genres as sections.
  • Renders titles as VHS or DVD cases with correct proportions, real cover art, and a flip side carrying synopsis, cast, runtime, and ratings.
  • Generates a technical table for each title from the underlying file's media streams.
  • Offers three shelf arrangements, four period fit-outs, several modeled storefronts, and day, sunset, or night lighting without altering the library.
  • Provides a clerk's CRT search across title, director, and genre.
  • Runs an attract mode that tours from the storefront through the aisles and across the sales floor, returning to browsing on any control input.
  • Adds optional rental mode with period due dates and a lockout until tapes are returned through the counter chute, plus a soft-body plastic rental bag at checkout.
  • Supports first-person walk mode with mouse look and WebXR when a headset is present, and can add a games department through RomM.

Who uses it and how

  • Home theater PC owners who drive the interface from a couch with a keyboard, gamepad, TV remote, or phone.
  • Households already running Jellyfin, Plex, or Emby that want a browse layer over the library they have.
  • Users with a RomM installation who want games shelved beside films.
  • Headset owners who switch into first-person walk mode with WebXR for a full stroll through the store.
  • Self-hosters who share their builds in the Discord #your-store gallery and ask for setup help in the same community.

Getting started

The fastest path is the hosted demo at https://halcyon-video.github.io/halcyon-video/, which opens with no signup, no media server, and no API key, though playback stays disabled there. Running it against a real collection means self-hosting it and pointing it at an existing Jellyfin, Plex, or Emby library.

How it compares

The tools named in the facts are Jellyfin, Plex, Emby, and RomM, and Halcyon Video complements rather than substitutes for them: it consumes their catalogs and presents them as a walkable store. Jellyfin and Emby are open-source media servers, Plex is a commercial one, and RomM covers games; Halcyon sits above that layer and is itself GPL-3.0. It is not a streaming service and not a replacement for the server that holds the files.

When to use it — and when not to

A self-hoster still needs a working media server, its own library files, and the storage and hardware to serve both, because Halcyon adds a presentation layer rather than hosting media itself. Anyone who wants a fast, text-dense list view of a library, or who has no Jellyfin, Plex, or Emby instance and no interest in running one, should look elsewhere. The project shows an active but busy tracker at 80 open issues, and WebXR features depend on hardware that many users will not have.

Shorter than 450? Let me estimate roughly: it's around 560-600 words. Good.

project readme (upstream, from github) — read inline

Halcyon Video — walk your media library

Discord Live demo Version License Stars

The video store you remember, stocked with what you can watch.

Halcyon Video turns movie night into a visit to the video store. Glide down real 3D aisles, pick up a VHS or DVD case, flip it to read the back, and take your choice to the counter — right down to the glossy rental bag.

Start with streaming services, or bring your own Jellyfin, Plex, or Emby library. Add RomM for a games department. Halcyon gives those catalogs a place you can explore with a keyboard, gamepad, TV remote, or phone.

Halcyon Video at sunset

Launch the hosted demo — no signup, media server, or API key required. It opens directly into a stocked store; streaming titles link out to their services, while playback stays disabled in the public demo.

Need help or want to show your store? Join the Discord community for setup help, release notes, and the #your-store gallery.

A media library you can walk through

The sales floor from the entrance

The room is built from your catalog. Libraries become aisles, genres become sections, popular titles get deeper stock, and multiple quality versions collapse into one box. Choose VHS or DVD cases, three shelf arrangements, four period fit-outs, day through night lighting, and one of several modeled storefronts without changing the library underneath.

Halcyon is meant to be used from the couch. A keyboard, gamepad, TV remote, or phone can drive the same remote-first interface. First-person walk mode adds mouse look and WebXR when a headset is available.

A store worth spending time in

Let it take you on a tour. Attract mode moves from the storefront into the aisles, past the counter, and across the sales floor. Touch a control to return to browsing. The store remains a working place throughout the tour.

Choose the store you remember. Build a spacious chain-style store or a compact independent shop with wood shelves and a lower ceiling. Switch between modeled building facades, and see the windows and exterior in daylight, at sunset, or after dark.

Choose when it is. The manager terminal's media release-date pin limits the shelves to titles released by your chosen store date. That date advances with real time; an optional setting also matches the store's era to it. Your underlying media library stays intact.

The parts that make it feel like a store

Browse, inspect, and search

Browsing a section

Shelf browsing moves case by case without duplicate dead ends. Pick up a title to see its real cover on a correctly proportioned rental shell, then flip it for synopsis, cast, runtime, ratings, and a technical table generated from the file's media streams. TV seasons use box sets, and the clerk's CRT searches by title, director, or genre.

Inspecting a rental case

Rent it, return it, or take it home

The rental bag waiting at checkout

Carry several tapes to the counter and the clerk bags them in soft-body plastic that deforms around the cases. The checkout sequence ends in a living room with the rentals and receipt on the coffee table, ready for the VCR. Optional rental mode adds period due dates and a lockout until the tapes are returned through the counter chute.

A clerk who knows the shelves

The clerk is rendered from an original Blender character model into a directional sprite atlas. She walks the actual floor plan, restocks, works the terminal, and comes to recommendation clasps around the store. Her reasons come from the catalog and watch history — collections, directors, actors, studios, and genres — rather than generated copy.

Connect Jellyseerr or Overseerr and she can also surface gaps in a collection, shelve discovery titles as request cases, and place an order without leaving the store.

A real games department

The RomM games department

Point Halcyon at RomM and enabled platforms become a dedicated department. Cardboard cartons, clamshells, and jewel cases use platform-specific proportions; native builds can hand a selected game to an emulator.

Make the store yours

A store in custom livery

The fictional Halcyon identity is data, not hard-coded scenery. Build an emblem from editable layers in Emblem Studio, then see that same mark on the storefront, cases, aisle signs, counters, and checkout bags. Change the name, colors, and typeface in the live Brand Editor to repaint the store's livery together — from burgundy and cream to green and gold. The carpet can follow either brand color through Store Look's Carpet Colour setting.

The default Halcyon identity uses white lettering and trim on a blue, rounded rectangle, with the board and lettering level across the store.

An SVG or transparent PNG can replace the emblem entirely. The store name and subtitle are editable too: make it your video shop, entertainment store, or games destination.

For a larger conversion, a brand pack can supply per-era palettes, fonts, surfaces, and scanned wraps. Local assets live in the git-ignored public/user-assets/ directory, so a private store identity cannot wander into a commit.

What can stock the shelves?

Source What Halcyon does with it
Jellyfin Movies, series, art, versions, playback, resume points, and watch history
Plex The same core store through Plex code sign-in and server discovery
Emby Direct server sign-in, member cards, movies, series, artwork, playback, resume points, and saved store settings
Streaming services Zero-setup browsing, service choice at checkout, and a link to that service
Jellyseerr / Overseerr Collection gaps, discovery stock, requests, and staff picks
RomM Platform bays, game packaging, cover scans, and optional emulator launch
Nothing yet A working opening-day store locally, or the stocked hosted demo

Streaming aisles do not require Jellyfin, Plex, Jellyseerr, or a TMDB key. The setup terminal asks which services you use and stocks the store from a bundled snapshot. Browse the films first; checkout reveals the available services so you can choose one before the handoff. A configured TMDB or Jellyseerr source can refresh that data later. There is no built-in folder scanner; shelving personal files requires Jellyfin, Plex, or Emby.

Watching something

Three routes cover three kinds of deployment:

  • Browser player: direct streams when the browser can decode the file, HLS fallback when it cannot, audio and subtitle selection, resume points, and automatic next episodes.
  • HTPC with mpv: a server running on the same machine can launch the local file in mpv for HDR, lossless audio, and native display handling.
  • Streaming aisle: titles hand off to the provider's search or watch page; Halcyon does not impersonate a streaming player.

Quick start

Try it before installing

Open the hosted demo. It scales the demo catalog to the browser's measured GPU headroom, from a smaller phone store to the full layout on a discrete GPU.

Local launchers

Clone the repository, then run the launcher for your platform. It checks Node, installs dependencies on first use, builds the app, serves it on port 1420, and opens a browser.

Platform Launcher
Windows start.cmd
macOS start.command
Linux ./start.sh

Pass demo to open the bundled catalog or dev for hot reload. The manual equivalent is:

git clone https://github.com/halcyon-video/halcyon-video
cd halcyon-video
npm install
npm run dev

The opening-day terminal can connect Jellyfin, Plex, or Emby, select streaming services, or open the store empty and configure it later at the manager CRT.

Docker

Use the published image:

docker run -d --name halcyon --network host --restart unless-stopped \
  ghcr.io/halcyon-video/halcyon-video

Or build from a clone with docker compose up -d --build. Host net

readme truncated — read the full docs on github

Frequently asked questions

Is halcyon-video free to use?

halcyon-video is open source under the GPL-3.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does halcyon-video do?

Your Jellyfin or Plex library as a walkable 1990s video rental store, self-hosted

What is halcyon-video written in?

halcyon-video is primarily written in TypeScript. Its source is publicly available at https://github.com/halcyon-video/halcyon-video, and it has 869 GitHub stars.