games as data
  • Rust 74.5%
  • Nix 17%
  • Python 4.2%
  • CSS 3.5%
  • JavaScript 0.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
JMARyA d806aba289
Some checks are pending
moira/threads moira/threads — definitions compiled
moira/flake/env.path.135a6a2682c24e2b@x86_64-linux env.path.135a6a2682c24e2b — built
moira/flake/env.path.dc5e920ffc613cd1@x86_64-linux env.path.dc5e920ffc613cd1 — built
moira/flake/packages.gamenix-server-image@x86_64-linux packages.gamenix-server-image — queued
moira/flake/packages.site@x86_64-linux packages.site — queued
moira/flake/checks.accounts@x86_64-linux checks.accounts — queued
moira/flake/checks.catalog-lint@x86_64-linux checks.catalog-lint — queued
moira/flake/checks.console@x86_64-linux checks.console — queued
moira/flake/checks.console-browser@x86_64-linux checks.console-browser — queued
moira/flake/checks.environments@x86_64-linux checks.environments — queued
moira/flake/checks.environments-sandbox@x86_64-linux checks.environments-sandbox — queued
moira/flake/checks.frontends@x86_64-linux checks.frontends — built
moira/flake/checks.gamenix-manager@x86_64-linux checks.gamenix-manager — already in the cache
moira/flake/checks.gamenix-server@x86_64-linux checks.gamenix-server — queued
moira/flake/checks.gamenix-server-image@x86_64-linux checks.gamenix-server-image — queued
moira/flake/checks.gamenix-ui@x86_64-linux checks.gamenix-ui — queued
moira/flake/checks.gamenix-web@x86_64-linux checks.gamenix-web — already in the cache
moira/flake/checks.home-manager-firmware@x86_64-linux checks.home-manager-firmware — built
moira/flake/checks.manifest@x86_64-linux checks.manifest — built
moira/flake/checks.object-store@x86_64-linux checks.object-store — queued
moira/flake/checks.saves@x86_64-linux checks.saves — built
moira/flake/checks.saves-hub@x86_64-linux checks.saves-hub — queued
moira/flake/checks.server-config@x86_64-linux checks.server-config — built
moira/flake/checks.server-module@x86_64-linux checks.server-module — built
moira/flake/checks.session@x86_64-linux checks.session — queued
moira/flake/checks.site@x86_64-linux checks.site — queued
moira/flake/checks.sources@x86_64-linux checks.sources — queued
moira/flake/checks.streaming@x86_64-linux checks.streaming — built
moira/flake/checks.windows-saves@x86_64-linux checks.windows-saves — queued
moira/check moira/check — succeeded
moira/deploy moira/deploy — succeeded
moira/container moira/container — succeeded
feat(console): quick menu over games, MangoHud performance overlay
The Steam Deck's quick access button opens a quick menu: over a running
game the shell's own window floats in as a panel at the right edge of the
game's workspace while the game stays fullscreen behind it, with Resume,
the performance overlay level, volume, brightness, Switch apps and Stop
game. B or the button again returns to the game; the panel closes by
itself when the game's window goes away.

The performance overlay is MangoHud's Vulkan layer, shipped with the
session and enabled for every game the app launches. Its level (Off, FPS,
Basic, Full) lives in one configuration file in the runtime directory that
MangoHud reloads while games run; the manager's sandbox passes MANGOHUD*
and binds that directory read-only.

add-console-overlay is rewritten for this design: the shell's window is
the overlay, replacing the planned second overlay process, fallback page
and socket.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 08:36:18 +01:00
.claude docs: adopt openspec with baseline specs 2026-10-27 20:46:47 +01:00
.moira Publish the site to S3 with moira, replacing Woodpecker 2026-08-18 21:58:12 +02:00
app feat(console): quick menu over games, MangoHud performance overlay 2026-11-08 08:36:18 +01:00
docs feat(console): quick menu over games, MangoHud performance overlay 2026-11-08 08:36:18 +01:00
games feat: Windows save locations from the Ludusavi manifest 2026-11-01 21:07:44 +01:00
lib feat(console): quick menu over games, MangoHud performance overlay 2026-11-08 08:36:18 +01:00
modules feat: general settings every runner follows (language, resolution) 2026-11-08 03:18:17 +01:00
openspec feat(console): quick menu over games, MangoHud performance overlay 2026-11-08 08:36:18 +01:00
schema feat: general settings every runner follows (language, resolution) 2026-11-08 03:18:17 +01:00
scripts feat: Windows save locations from the Ludusavi manifest 2026-11-01 21:07:44 +01:00
site Fix URL slugs, pluralisation and nav markup in the site 2026-08-18 22:30:04 +02:00
tests feat(console): quick menu over games, MangoHud performance overlay 2026-11-08 08:36:18 +01:00
.gitignore chore: ignore Syncthing conflict copies 2026-10-31 20:20:37 +01:00
flake.lock chore(nix): nixpkgs 2026-10-27 2026-10-28 21:36:01 +01:00
flake.nix feat(console): run the console session on Hyprland, with Resume 2026-11-08 01:32:14 +01:00
justfile feat: Windows save locations from the Ludusavi manifest 2026-11-01 21:07:44 +01:00
README.md feat(console): run the console session on Hyprland, with Resume 2026-11-08 01:32:14 +01:00

gamenix

Games as Data.

gamenix is a structured catalog of games. Each game is a TOML file describing its identity, platform, metadata, and artwork — nothing more. No game files, no emulator config, no distro-specific packaging.

The actual game files come from you. gamenix supplies the structure.


Philosophy

Games are cultural artifacts. Their metadata — name, platform, description, artwork — is stable and should be expressible in a format that outlasts any specific tool, distro, or packaging convention.

gamenix separates four things that are usually conflated:

Layer What Who owns it
Catalog What the game is (metadata, platform, assets) gamenix
Runner How to run it (emulator, Wine, native) your system
Source The actual game file you
Host Where it runs (local, home server, stream) your hardware

Each layer can change independently, and the same game record works at every scale — one laptop, a home server, a stream to the couch. Emulators come and go (citra → lime3ds → azahar). Package managers come and go. The fact that Yoshi's New Island is a Nintendo 3DS game from 2014 does not.

See docs/PHILOSOPHY.md for the full design rationale.


What You Can Build With This

  • Declarative game library — your whole gaming setup expressed as reproducible NixOS/home-manager config
  • Frontend configs — included: your declared library in Pegasus and ES-DE, every game started through its gamenix launcher (docs/FRONTENDS.md)
  • Static catalog site — included: nix run .#site renders the whole catalog as a browsable website (docs/SITE.md)
  • CLI tooling — add games, list your library, export to any format
  • ROM integrity checker — pair the catalog with known-good hashes to verify dumps

See docs/FUTURE.md for more directions.


Using the Catalog

Add gamenix to your flake:

inputs.gamenix.url = "git+https://git.hydrar.de/jmarya/gamenix";

Install a game

gamenix.enable = true;
gamenix.games.yoshis-new-island = {
  game = inputs.gamenix.lib.games.nintendo."3ds".yoshis-new-island;
  src  = "/home/you/roms/yoshis.new.island.3ds";
};

This installs a launcher script, desktop entry, and icons. The game file stays where you put it.

src is a string, not a Nix path literal. A path literal is rejected in a flake's pure evaluation, and would copy the game file into the Nix store if it resolved.

Or directly via mkGame without the module:

home.packages = [
  (inputs.gamenix.lib.mkGame pkgs {
    game = inputs.gamenix.lib.games.nintendo."3ds".yoshis-new-island;
    src  = "/home/you/roms/yoshis.new.island.3ds";
  })
];

Override the runner

gamenix.games.yoshis-new-island = {
  game   = inputs.gamenix.lib.games.nintendo."3ds".yoshis-new-island;
  src    = "/home/you/roms/yoshis.new.island.3ds";
  runner = "azahar";
};

Inspect the resolved game library (NixOS)

The NixOS module exposes the fully resolved game records during evaluation at
config.gamenix.resolvedGames. This is derived from gamenix.games; it adds
runtime details such as the selected runner, source path, launcher, and icon:

config.gamenix.resolvedGames."yoshis-new-island"

It also writes the same records as a versioned TOML manifest at
/etc/gamenix.toml. Tools can read that file at runtime instead of evaluating
Nix configuration:

format_version = 1

[[games]]
id = "yoshis-new-island"
name = "yoshis.new.island"
display_name = "Yoshi's New Island"
platform = "3ds"
runner = "azahar"
source = "/home/you/roms/yoshis.new.island.3ds"
launcher = "/nix/store/.../bin/yoshis.new.island"

The manifest also lists each game's save locations. The Home Manager module
writes the same format to ~/.config/gamenix/games.toml, with save paths
expanded for that user. See Save data.

The manifest is generated and must not be edited by hand.

Provision emulator prerequisites

The Home Manager module can provision runner requirements, such as emulator
keys or firmware, from user-controlled runtime paths or permitted Nix packages.
See Runner resources for the security model and Ryujinx
example.

Serve them to other devices

imports = [ inputs.gamenix.nixosModules.server ];
services.gamenix-server.enable = true;

# Optional: games kept in S3-compatible storage, streamed by the server.
gamenix.games.carrion = {
  game = inputs.gamenix.lib.games.pc.windows.carrion;
  src  = "s3://games/pc/carrion.tar.zst";
};
services.gamenix-server.objectStore = {
  endpoint        = "http://minio.lan:9000";
  credentialsFile = "/run/secrets/gamenix-s3";
};

A library server with a web UI and a native app that installs, launches and
streams games, navigable with a controller. Sources can be files, directories
or archives on its disks or in an object store; clients only ever see the
server. See docs/SERVER.md.

Keep their saves

Games run through the game manager by default: each plays sandboxed in its own
session home, and its saves are committed to git after every session —
independent save lines you can branch, restore and mix:

super.mario.sunshine                  # play
super.mario.sunshine saves list       # save lines
super.mario.sunshine saves new alex   # another, independent save

With a saves hub — a gamenix server — save lines follow you between devices;
progress made on two devices at once becomes a fork you settle, never an
overwrite:

gamenix.saves.hub.url = "http://server.lan:8090/api/v1/saves";
gamenix.saves.hub.tokenFile = "/run/secrets/gamenix-token";

Set gamenix.games.<id>.managed = false to run a game directly in your home
instead. See docs/MANAGER.md.

Use Gamenix as a local console

imports = [ inputs.gamenix.nixosModules.default inputs.gamenix.nixosModules.console ];
gamenix.enable = true;
gamenix.console.enable = true;

Select Gamenix in your existing session selector: Hyprland starts the native
UI fullscreen, with controller-first Settings and quick audio/brightness/power
controls where supported. This is opt-in: it preserves Steam/desktop sessions
and does not change your login manager, autologin or default session.
For explicit boot-to-Gamenix adoption with an existing SDDM/GDM login manager,
optionally set gamenix.console.autoLogin = { enable = true; user = "player"; };
using your existing normal user. This bypasses the login password prompt;
SDDM relogin is disabled so exit or a UI crash loop can return to its greeter (a single UI crash only restarts the shell).
See docs/CONSOLE.md for capabilities, recovery and Deck testing.

Stream them

services.sunshine.enable = true;
gamenix.streaming.sunshine.enable = true;

Every declared game becomes a Sunshine application with its box art, playable
from any Moonlight client. See docs/STREAMING.md.

Put them in your Steam library

gamenix.steam.enable = true;

Every game becomes a non-Steam shortcut carrying its catalog artwork, grouped
into a collection per platform. Built for the Steam Deck, where the games then
appear in Gaming Mode. See docs/STEAM.md.

Browse the catalog

The catalog also renders as a website — every entry, platform, genre and series,
generated from the same TOML files:

nix run .#site   # → http://127.0.0.1:8080

See docs/SITE.md. Artwork is linked at its origin, never
rehosted.

From the command line:

nix eval .#lib.games --apply builtins.attrNames       # list vendors
nix eval .#lib.games.nintendo."3ds"                   # list 3DS games
nix eval .#lib.games.nintendo."3ds".yoshis-new-island # inspect a game
nix eval .#lib.platforms."3ds"                        # inspect a platform
nix eval .#lib.games --json                           # full catalog as JSON

Repo Structure

flake.nix                        — entry point
lib/
  default.nix                    — lib exports (games, platforms, mkGame)
  mkGame.nix                     — derivation builder
  steam.nix                      — Steam shortcut manifest builder
  frontends.nix                  — Pegasus and ES-DE config generators
  platforms/
    default.nix                  — merges all platform files
    nintendo.toml
    sony.toml
    pc.toml
games/
  nintendo/
    3ds/
      yoshis.new.island/
        game.toml                — game definition (TOML)
    gba/ gc/ n64/ nds/ nes/ switch/ wii/ wiiu/
  sony/
    ps2/ ps3/ ps4/
  pc/
    pc/ windows/
modules/
  nixos.nix                      — NixOS module
  home-manager.nix               — home-manager module (+ Steam integration)
  options.nix                    — game options shared by both modules
  server.nix                     — services.gamenix-server
  console.nix                    — opt-in Gamenix (Hyprland) session
site/
  conf.nix                       — site identity and artwork mode
  site.nix                       — page list and data wiring
  lib/catalog.nix                — catalog → site records
  themes/gamenix/                — templates and static files
app/
  core/ manager/ server/ ui/     — the game manager, gamenix-server and its web/native client (Rust)
scripts/
  gamenix-add                    — interactive catalog entry creator
  gamenix-validate               — schema validation
  gamenix-steam-sync             — merge games into Steam's shortcuts.vdf
tests/
  nixos.nix                      — end-to-end test module
  saves.nix                      — save resolution and manifest checks
  streaming.nix                  — Sunshine application checks
  frontends.nix                  — Pegasus and ES-DE generated text and files
  session.nix                    — session specs and managed launchers
  sources.nix                    — source options, formats and object-store launchers
  server.nix                     — gamenix-server module options
  object-store.nix               — VM test: large object-store downloads under a memory limit
  home-manager.nix               — firmware provisioning and save checks
docs/
  PHILOSOPHY.md                  — why gamenix exists
  VISION.md                      — where gamenix is going: the hub
  MANAGER.md                     — the game manager and save lines in git
  PLATFORMS.md                   — supported platforms and runners
  STEAM.md                       — Steam library integration
  FRONTENDS.md                   — Pegasus and ES-DE configs
  SAVES.md                       — save locations and the runtime manifest
  STREAMING.md                   — Sunshine streaming and the server roadmap
  SERVER.md                      — gamenix-server and its clients
  CONTRIBUTING.md                — how to add games
  FUTURE.md                      — use cases and roadmap
schema/
  game.json                      — JSON Schema for game.toml
  platform.json                  — JSON Schema for platform entries

Documentation

  • Philosophy — the ideas behind gamenix
  • Vision — the app as the hub where declared and lived state meet
  • Console — controller-first shell, local console foundation and acceptance boundaries
  • Game manager — sandboxed sessions and save lines in git
  • Schema — game.toml structure (machine-validated JSON Schema)
  • Platforms — supported platforms and runners
  • Steam — Steam library and Steam Deck integration
  • Frontends — Pegasus and ES-DE configs generated from the declared library
  • Runner resources — declarative emulator keys and firmware
  • Save data — where each game keeps its saves, for backup and sync
  • Server and clients — gamenix-server, the web UI and the native app
  • Streaming — play declared games from a server via Sunshine and Moonlight
  • Site — the catalog website
  • Contributing — adding games to the catalog
  • Future — use cases and what gamenix could become