DVD-style menus for the video you stream today.

Open Video Menu puts DVD-style menus (motion backgrounds, scene selection, special features, audio and subtitle choices) on top of modern video: the MP4 and MKV files Plex and Jellyfin stream to your TV. A menu is one small file next to the video, and the video itself is never changed. It's an open, royalty-free format any app can play.

# A film folder, as Plex and Jellyfin expect it
Sintel (2010)/
  Sintel (2010).mp4
  Sintel (2010).ovmz          ← the menu and its art
  Trailers/Sintel Trailer.mp4
The Sintel main menu on a TV: a desert landscape with the title and the buttons Play Movie, Scene Selection and Special Features
Sintel's menu in ovmplayer, from a Plex library.

From the simplest menu to a full DVD

One format covers all of it. A menu says which level it needs; a player says which it supports, and below that it shows the plain list.

  • Level 0, Basic: a plain list of the film and its extras. Every player can do this.
  • Level 1, Menus: artwork, buttons, highlights, scene selection and special features.
  • Level 2, Enhanced: motion menus with music, transitions, angles, and buttons over the film while it plays.
  • Level 3, Disc logic: everything a DVD's own programming does: variables and conditions, random play, parental control, resume, timers. Tested on 954 real DVDs: each one's menus translate to it and behave like the disc in automated checks.

1. See it

  1. Install ovmplayer on your TV (step 2).
  2. Choose Jellyfin, then Type an address, and enter https://demo.openvideomenu.org.
  3. Choose Use username and password: demo, password demo.
  4. Open Sintel in the Menus row.
Demo video

2. Get the players

The players are proof-of-concept apps that show the format working today, with your Plex or Jellyfin library. Titles without a menu just play.

On your TV

  • Google TV and Android TV: Google Play Download APK
  • Roku: Add the Roku channel

On your server

  • Jellyfin: in Dashboard → Plugins → Repositories, add Repository URL, install Open Video Menu, and restart Jellyfin.
  • Plex: run the menu server beside Plex. Give it a Plex token and it follows your libraries by itself; it only answers people signed in to your Plex server.
    • Windows: download the installer, which sets it up as a service. Windows may warn about an unknown publisher: choose More info, then Run anyway.
    • Linux: curl -fsSL https://openvideomenu.org/install/menu-server.sh | sudo sh
    • Docker (Unraid, Synology): docker run -d --network host -v /mnt/media:/mnt/media:ro -e PLEX_URL=http://127.0.0.1:32400 -e PLEX_TOKEN=… ghcr.io/tyson133-prog/openvideomenu-menu-server
    More in the setup guide.

3. Make menus

  1. From your DVDs: DVD Tamer turns your DVDs into video files for your library and brings their original menus along (DVD Tamer link). Or use ovm-dvd: dotnet tool install -g OpenVideoMenu.Dvd.Tool, then ovm-dvd export Film.iso "Film (Year).ovmz" --files "Film - title {n}.mkv".
  2. Put the menu next to the film, as Title.ovmz (or Title.openvideomenu.json with its art), then rescan the library.
  3. Try the examples: download Sintel and the Example Show (about 250 MB) and copy the Movies and TV folders into your libraries.

4. Implement it

Free to implement in any software, with no fees and no permission needed.

In a player

  1. Start with the implementer's guide, then the specification and its JSON Schema.
  2. Start at Level 0: show the manifest's plain list of titles and play them. It takes about an afternoon. Menus (Level 1) and the rest build on the same file.
  3. Use a library, or write your own: npm install @openvideomenu/core (TypeScript) or dotnet add package OpenVideoMenu (.NET). Navigation is a state machine; your player supplies three things: playing a URL from a time, turning remote presses into up, down, left, right, enter and back, and finding the file a menu names.
  4. Run the conformance suite. When it passes, your player is compatible.

In a media server

  1. Serve the read-only server API: a list of the library's menus, and their manifests and art, with byte ranges.
  2. Announce it on the network as _openvideomenu._tcp. The Jellyfin plugin and the Plex menu server are working examples.

In an importer

  1. Follow the DVD profile, or build on OpenVideoMenu.Dvd.
  2. Check your output: openvideomenu validate and openvideomenu preview (npm install -g @openvideomenu/cli).

Say your software "supports Open Video Menu" any time, and "compatible" once it passes the conformance suite. Please don't name a product "Open Video Menu".