omavn

How it works

What happens between "omavn install" and the title screen.

1. Unwrap

Downloads come wrapped in layers. Dies irae from JAST is three zips, each holding one volume of a split RAR whose first volume is a self-extracting .exe. omavn peels layers until it reaches something playable:

  • groups multi-volume sets (.part1.exe/.part2.rar, .rar/.r00, .7z.001)
  • opens ISO disc images (via bsdtar)
  • detects RAR self-extractors by content, not name
  • decodes Shift-JIS file names in zips, which most Japanese releases use
  • drops __MACOSX and other packer junk

It stops as soon as it finds a real .exe, so data archives that belong to an installer (Yumina's yumina1.dat is secretly a zip) are left alone. Your download is never modified; staging uses symlinks and only extracted layers take disk space.

2. Classify

The unwrapped folder is either a game or an installer.

  • Installers are fingerprinted (NSIS, Inno Setup, MSI, InstallShield, WiX) and run unattended under Proton when the framework supports it. Chained DirectX redist wizards are skipped, since Proton already provides those DLLs.
  • Games get an engine fingerprint (Ren'Py, KiriKiri, Malie, Siglus, BGI, NScripter, Artemis, CatSystem2, QLIE, YU-RIS, Unity, RPG Maker, TyranoScript) and a ranked list of entry points, with uninstallers, redists, and helper binaries filtered out.

3. Catalog

Some things heuristics can't know: that malie_fabula.exe is Acta est Fabula and malie.exe is the all-ages Amantes amentes. The catalog fills those gaps per title.

4. Pick a runner

RunnerUsed forHow
native Ren'PyRen'Py 7.4+ and 8.xruns the official Linux Ren'Py runtime of the same version against the game's files
Protoneverything elseGE-Proton through umu-launcher, one Wine prefix per game

Native Ren'Py runs faster, uses your real audio and GPU stack, and touches nothing in the game folder.

5. Display

Most VNs render at a fixed resolution (800x600, 1280x720) and read mouse positions in those pixels. When a tiling window manager resizes the window, the picture stretches but the game's idea of where you clicked does not, so buttons stop lining up with the cursor.

With display = "auto" (the default), Proton games run inside a fullscreen gamescope at your monitor's resolution: the game keeps its native size, gamescope scales it up with the aspect ratio intact, and maps the mouse to match. Without gamescope installed, games run in a plain window. Change it per game:

omavn set <game> display window      # or gamescope, or auto
omavn run <game> --window            # just this once

6. Art

After installing, omavn looks the game up on VNDB and downloads its cover and a screenshot, using only images VNDB rates as safe. It composes them into a 16:9 card for launchers and an icon for the app menu. Pin the right entry with omavn meta <game> --vndb <id> if the guess is wrong, or skip it all with --offline.

7. Library

Each game gets ~/.local/share/omavn/games/<id>/game.toml, a plain manifest you can read or edit:

id = "dies-irae"
title = "Dies irae"
engine = "malie"
runner = "proton"
files = "files"
default_target = "fabula"
vndb = "v548"

[[targets]]
id = "fabula"
name = "Dies irae ~Acta est Fabula~ HD"
exe = "malie_fabula.exe"

Per-game environment variables live in an [env] table; omavn set <game> locale ja writes the Japanese locale there for untranslated releases.

On this page