Skip to content
Velle Sinclair edited this page Jul 27, 2026 · 1 revision

TEPRIS

An arcade Tetris remix — CRT/VHS post-processing, gamepad support, screen shake, and a fake BIOS boot sequence.

Upstream: velle999/tepris. Packaged for SynapseOS as tepris, and on the ISO.

Running it

tepris

Or TEPRIS in the start menu, under Games.

It is a browser game, but not one you open in a browser: the launcher runs it as a dedicated app window through Firefox in app mode, against a private profile at ~/.local/share/tepris/profile. Your high score lives in that profile's localStorage.

Gamepads work — SynapseOS ships the udev rules, and the game reads the Gamepad API directly. See Gaming for controller notes.

Why it is a Firefox window and not a browser tab

Three details make the difference, and each one was a bug first.

It is not --kiosk. The obvious way to get a chrome-free game window is kiosk mode, and it is the wrong one: kiosk is permanently fullscreen with no way out, which left the game with no working windowed state and no way to quit. The launcher runs an ordinary window and hides the tab strip and nav bar with userChrome.css instead — so the game's own buttons control fullscreen and quitting, and synui gives it a normal titlebar like any other app.

The URL ends in #app. That fragment is how the page knows it is running as a dedicated window rather than a tab, which is what enables its quit button. Open index.html without it and the button is correctly absent.

MOZ_APP_REMOTINGNAME=tepris sets Firefox's Wayland app_id. Without it every Firefox-backed app on the system would report firefox, and synui's dock — which matches <app_id>.desktop by basename — would give them all the same icon.

Sound

The game was silent for a release, and the cause was not the game. A fresh Firefox profile blocks audible autoplay until a user gesture, so every sound effect and the background music were rejected before they played. The launcher now sets media.autoplay.default=0 and media.autoplay.blocking_policy=0, which is safe here precisely because it is a dedicated single-app profile rather than a browser.

There is deliberately no music on the attract screen — the BGM starts at game start. That is the game's design, not a leftover of the autoplay bug.

The launcher regenerates user.js on every launch rather than seeding it once. It holds no user data (your high score is in localStorage), so rewriting it means new prefs self-heal onto profiles created by an older launcher instead of being stuck with whatever they were first given.

Packaging

The PKGBUILD pulls a pinned commit from the upstream repo rather than vendoring sources — roll the app by bumping _commit and pkgrel, which means the build needs network. The repo's Electron wrapper is Windows-only and deliberately not packaged.

See also: Nexus P2P, Gaming, Building and Packaging.

Clone this wiki locally