OmaCRT

15 kHz CRT televisions

Play retro games on a CRT from your Linux desktop.

OmaCRT runs games, music and video on your CRT while your other screens keep working.

Requires Hyprland and a compatible HDMI-to-RGB converter.

Read how it was built Watch the 90-second demo

The video shows games filmed on my television.

on air 240p NTSC · 60.04 Hz

Sega Rally, Super Metroid, Super Mario 64, Marvel vs Capcom 2

What this is

OmaCRT includes a launcher, a display process that controls the television’s output, and a command line. It runs on an existing Hyprland installation without patching the kernel or replacing the desktop.

On Omarchy, two Quickshell plugins add a bar panel and a game library overlay. A Television entry appears in the desktop menu. These integrations are optional.

A personal project by one user. Not a distribution, not a version of Omarchy, not affiliated with Omarchy or with the Omacom Foundation, not endorsed by either, and it speaks for neither. Omarchy is at omarchy.org.

Beside the others

A CRT alongside your desktop.

I wanted to play on the television using the PC I already had. OmaCRT uses DRM leasing to control one display output while Hyprland manages the rest.

The Flyback article compares this approach with GroovyArcade, Batocera and MiSTer.

with an AI
I use Claude for design, code, tests and documentation.
measured
The Flyback article describes the latency measurements, test setup and limitations.
open
MIT licensed. Source code and measurement tools on GitHub.
experimental
Tested on one Radeon RX 7700 XT, an RGB-Pi 2 converter and a Bang & Olufsen BeoCenter 1.

Why a CRT

This is how I like to play them.

I had been playing on this BeoCenter 1 through a Raspberry Pi for two years. OmaCRT lets me use the same television from my desktop PC.

Super Mario 64 running on a cathode ray tube television.
Super Mario 64. Photographed on the BeoCenter 1.
Sega Rally running on a cathode ray tube television.
Sega Rally. Photographed on the BeoCenter 1.

Inside the television

Behind the picture.

A glass tube, copper coils and an electron beam. Explore the parts that turn a video signal into light.

See how a CRT works →
The OmaCRT launcher on a CRT television.

What we draw, what you see

The television adds the scanlines.

The launcher draws at 320 by 240. Here is the same menu captured directly and photographed on the television.

The launcher home menu as the launcher draws it: hard square pixels, no scanlines.
The framebuffer Captured from the launcher with omacrt shot.
The same home menu photographed on the television, with real scanlines and phosphor glow.
The glass Photographed on the CRT, with scanlines and glow around the letters.

How it works

How the signal reaches the CRT.

Hyprland lends one display connector to Flyback, OmaCRT’s display process. Flyback sets the video timing; the converter turns HDMI into analogue RGB for the television.

OmaCRT  /  the signal path

Try leasing the connector, then change the line count.

Omarchy desktopstays put

  • Hyprland 0.56
  • bar plugin, library overlay
  • omacrt, one CLI
  • the connector, given up HDMI-A-1, the connector

Hyprland continues to manage your other screens.

DRM lease

Leased awayowns it outright

  • waiting for a connector HDMI-A-1, held
  • omacrt-display
  • DRM modeset, by hand
  • launcher, RetroArch, mpv

Flyback displays the launcher, games and video on this output.

The television1998

no signal 240224288 lines 60.04 Hz  NTSC60.04 Hz  NTSC50.08 Hz  PAL

The active line count changes to match the selected system.

  1. drawn 320x240
  2. handed over 1 connector
  3. programmed 15.731 kHz
  4. on the glass 240224288 lines
the lease
line count
This diagram illustrates the handover and three line counts. A real mode change briefly interrupts the picture while the television locks onto the signal.

A wide video mode keeps the HDMI clock high enough.

The NTSC mode uses a 72 MHz pixel clock and 4577 pixels per total line. That gives 15.731 kHz and, over 262 lines, 60.04 Hz. The converter passes that timing to the television.

The modeline

NTSC  72 3520 3781 4119 4577  240 242 245 262
PAL   72 3520 3740 4078 4608  288 291 294 312

A modeline defines the signal timing. These presets use 240 active lines for NTSC and 288 for PAL.

Read the signal guide for timing details and the current limits on interlaced output.

What it does

Games, music and an idle screen.

Browse games with cover art, and arcade boards with their flyers and records. Play music, or watch video. When you leave it idle, the launcher can show your Immich photos, the weather, a system monitor or a small gallery of paintings. The images below are launcher captures.

  • Box art standing on a shelf that reflects it.
    Games. Covers on a shelf that reflects them.
  • A turntable whose platter turns with the track, with two VU meters beside it.
    Music. A player with animated VU meters.
  • Dawn over a drawn skyline, every gradient a chequerboard dither.
    The weather. A sky drawn from the local forecast.
  • An arcade list with Double Dragon selected, its flyer on a lit stage and HI 20000 under it.
    Arcade. The flyer, and the record the board keeps.

See the features

Before you buy anything

Check your setup.

Run the diagnostic tool before buying hardware. It checks the software requirements; the converter and television still need testing together.

omacrt doctor

After installing OmaCRT, you can check these requirements without a television connected:

  • which driver the card is on amdgpu is the one this is known to work on
  • whether DRM leasing is available lists connectors offered by the compositor
  • whether systemd is there for the override that hands the tube over at boot
  • whether debugfs is mounted because that override is a write to it

With the hardware connected, the report also shows the video timing, display outputs and converter status.

The command reference also covers playback, audio routing, screenshots and recordings.

A recorded diagnostic run on my setup.

Open the report at full size.

Get started

Install.

Build from source with the commands below. The installer places the programs in your home directory; a separate system service enables DRM leasing at boot.

You need Hyprland 0.56 or later, systemd, mounted debugfs, a Rust toolchain, RetroArch with your chosen cores, mpv, ffmpeg and curl. omacrt setup helps you select the television’s connector.

Reboot after installing the system service, then scan your games and start the launcher. The installation guide covers configuration and removal.

git clone https://github.com/stefanomainardi/omacrt
cd omacrt

# build and install; add plugins if Omarchy is present
bin/omacrt-install

# find the converter's connector, write crt.toml
omacrt setup

# install the boot service
sudo bin/omacrt-install --system

Reboot, then continue in a new terminal:

# index your games
omacrt library scan ~/Games

# start the television output and launcher
omacrt on

Where it came from

A 90-second demo.

Footage of the television alongside captures from the launcher.

This started with a Bang & Olufsen BeoCenter 1 from 1998.

I had been using it with a Raspberry Pi for two years. My desktop PC was three metres away, with a Radeon card in it. I wanted to use that machine for the television too. Read the project’s history.

This early recording uses the project’s previous name and logo.

Before you try it

  • Tested on one setup

    Other graphics cards, converters and televisions are untested here. The hardware guide explains the requirements and alternatives.

  • Interlaced output is not working

    480i and 576i do not work on the tested stock-kernel setup. See the signal guide before choosing this for games that need those modes.

  • Bring your own games

    OmaCRT includes no games or BIOS files. Point the library scanner at your existing collection.

If you try another setup, include the graphics card, converter and television model when reporting what worked or failed.

Credits.

  • Omarchy and its icon and wordmark: the Omacom Foundation, MIT, with the licence shipped beside the copy. Used here as the theme of a fan project. OmaCRT is not part of Omarchy.
  • The converter that turns HDMI into a signal a television understands is the RGB-Pi 2. The launcher's flow through systems and games is after the GPL front end of RGB-Pi OS.
  • Box art from the libretro thumbnails; console pictures from RetroArch's own systematic assets, CC BY.
  • The self test is drawn with ratatui and crossterm.
  • Music through cliamp by bjarneo, stations from the Radio Browser directory.
  • The 8x8 font is Daniel Hepper's font8x8, public domain, after the IBM VGA fonts. The laser that etches the wordmark is after TerminalTextEffects by ChrisBuilds.
  • The 15 kHz work stands on Calamity and D0023R's kernel patches, on Switchres and GroovyMAME by Antonio Giner and the GroovyArcade community, and on the RetroRGB and shmups communities.