Halcyon Video — walk your media library
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.

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 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

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.

Rent it, return it, or take it home

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

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

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