GitLab refused the hundred raw reads per IP. A GitLab directory is now
read from one archive request, else a shallow sparse git fetch, and the
cache keeps its file list so offline runs know what is absent.
Each board builds system.ini against its defconfig: a core whose package
the board does not enable is dropped (pisnes was the SNES default
everywhere), and a system with no core is not built. The row names the
default most boards share, board_defaults the others. A files: list
names whole files and is carried as files through the index and the
installer.
A folder no name resolves, run by a core of several machines, now holds
those machines: thomson, multivision and pcv2 had no fallback, so their
games got no file. Arcade-indexed cores keep naming files per set.
The games importers wrote through fixed .part names, the new options had
no help text, and romfolders stopped on the first setup the offline cache
lacked. RetroArch's rom folder map is regenerated from its source spec
(path null, as the schema says). The installer's Python 3.8 job imports
the games tests without pyyaml, so the region rules load lazily.
In a console folder an FBNeo set is looked up under its driver name
(msx_1942), the bare name being the arcade set's. A run given its list as
a file reads the games index from beside it or the cache only when
--for-games was not asked. The installer keeps to Python 3.8 syntax, and
the testing guide names test_install_games.
Same files per platform. The manifests catch up with the per-system MAME
filing, the platform system join and declared_in, and name sfiii2a.zip as
missing. The games index fallback sets and the installer page samples
follow.
--for-games reads the card's rom folders through install/games/ and keeps
what the games need: per system what its default core reads, one region
where the content proves it (crc32 and size, a disc serial, a header the
core reads), an arcade set's BIOS parents. A game not recognised gets
every BIOS of its system and is named. --required-only keeps only what
starts. The plan and the line menu open on it when the card holds games,
everything one press away. A cache keeps what reading a card found.
mame2000, mame2003 and mame2003-plus carry a DAT their code moved past. Their parents and BIOS sets now come from src/driver.c and src/drivers/ at the pin, named by the src tree sha. The DAT is still read to report gaps. FBNeo DATs are read one namespace each, console sets keyed by driver. A BIOS with no dumped ROM is no longer listed.
The games index now names, per arcade core, the game sets that load no
BIOS set and every BIOS set, so a set on a card the DAT does not know is
told apart from one that needs nothing. Each board default core of a rom
folder gets its own fallback set, and index.json maps every folder name
a setup uses to its systems, for a games folder on a computer.
Cores drew every box empty when no core narrows the run, read as nothing
chosen. Every core is now drawn ticked, an untick keeps the others, All
and None work as on Choose systems, and the plan, Options and line mode
say all cores or N of M cores. A run with failures counts once, the
failed files said as failed.
Closes every finding of code_audit_23 and tui_audit_16: AmberELEC and
EmuELEC cards found as theirs, ArkOS cards told by bgmusic or
launchimages, counts that agree and read a copy of the right size before
calling it in place, one terminal width, line mode in the screen's order
and words, a tap shown armed, and which-pack naming the first screen.
The site, the README and the wiki take the screen's row names and the
--check pass line from install.py, and the wiki's line menu example is
written by generate_installer_doc from the function line mode runs.
which-pack describes the full screen the one-liner opens instead of a line
menu typed by hand. The systems question lays out in 80 columns under
Python 3.8, whose pty reports no width, and a test no longer reads the
host's drives.
Line mode says the screen's words for the files in place, missing or to
replace, counts the data files in its last line, names what the --from
folders hold before Enter, says Copying and the result's count once, and ends
every result with the same-choice command. Each data tree is hashed once per
run. A wrapped command reads one rule for PowerShell, a pack path keeps its
file name, folder lines keep one indent, and the systems question fits its
terminal. On the screen a tap on the focused Install row arms it, the Game
data row keeps the focus, a choice in place opens on Choose systems, a pack
holding none of the files offers no Install, and the 40x12 plan keeps its
version note.
A drive is a handheld's games part only when it holds the folders ArkOS,
AmberELEC or EmuELEC write there, and never a disk Windows or Linux calls
fixed. A data drive or a stick with a bios folder is listed with a note,
never taken under Enter. Two cards are named in the plural, and the
settle of a new screen runs from when it is drawn.
Commands break between shell words with a continuation the shell reads,
an option kept with its value. The 40x12 setup and plan keep a note or a
folder whole. Line mode counts files in place and missing, and names the
BIOS folder, as the screen does. The systems question fits its terminal.
An ArkOS or AmberELEC games part is named on the first screen and comes
first at the folder question. Packs that lack files are said so before
any plan. The served bootstrap gives advice that fits it, and the site
build refuses a copy whose pin is not its installer.
A press within 400 ms of a new screen belongs to a double tap on the
screen before and is dropped. A second tap is asked only of entries that
write files with nothing after them. The game data toggle keeps hidden
ticks, a choice in place offers no Install, and one total per plan.
Answers code_audit_20 and tui_audit_13. A tap acts on the frame it was
made on, bar entries that install, quit or open Confirm take two taps,
and Preferred regions keep their rows while open. Every check of a list
keeps the systems ticked, the plan's counts read the list the check
read, line mode leaves game data out of the choice alone, Confirm counts
copies, a pack's missing files are said before a size, and paths break
after a separator only.
The site serves install.sh at /retrobios/i and install.ps1 at
/retrobios/i.ps1. generate_site.py writes both copies with the
installer address set to install.py at the commit the site is built
from (GITHUB_SHA in CI, HEAD locally), so the pinned SHA-256 and the
downloaded installer always come from one commit, including while a
deploy is still running.
Every command a user copies names the short address. The raw form
stays on the installer page as the fallback. Deploy Site now runs on
changes to install.sh and install.ps1. The install box weight keeps
the address length its ratio was fitted on, so no console page moves.
code_audit_19 and tui_audit_12. A tap ticks a box and opens a choice on a
second tap of the row the screen saw tapped. One list drives the plan's game
data row, save line and data files. The version note, --offline in shown
commands, exit 2 for a chosen quit, legacy mouse reports read from bytes,
colour roles that read their words, the setup list's device column, the
copy browser, a drive two systems fit, WSL's Windows folder, and line mode
wording.
Pins and launcher index recomputed for the merged install.py. Mouse modes are now written before the frame, so a screen read back already takes clicks.
The installer reads the version the system states in its own file,
without running anything: batocera.version, recalbox.version (a release
only), RetroBat's system/version.info, VERSION_ID in os-release on Lakka
and EmuELEC. When it differs from the version the list was built for, a
line says so before the install and again with the result, and the new
version event carries it for the screen. An unknown version says
nothing, and the install never stops on it.
install/<platform>.json wrote the constant "1.0" as the version of the
list it was built from. The manifest now carries the version the platform
YAML records, and generate_pack refuses a YAML without one.
inherits: no longer passes a parent's version to a child: Lakka was
published as RetroArch v1.22.2 in its manifest, pack name and site page.
lakka.yml records v6.1, the Lakka-LibreELEC tag its target list is read
at. The MiSTer scraper refuses a BiosDB without a timestamp instead of
writing an empty version.
A pack's manifest.json records list_version, so an install from the pack
alone knows it too. Manifests regenerated twice and compared: only
version and generated changed.
Modes 1000 and 1006 only, SGR and legacy reports decoded, a hit map built from each drawn frame, action on release. Off on every way out, on the screens whose text is copied, with a pad route or RETROBIOS_NO_MOUSE.
The run header, the menu, its game data split and g, the plan, the
screen's plan and game data row and both results now divide one tally
of the list the run keeps. Case variants were counted on the run and
missing from the screen's split, g counted the whole list under a head
narrowed by c, and the result left out the data tree files. The wiki
examples come from real runs of 2026-10-27.
One table of roles from the 16 basic colours (accent, success,
warning, failure, muted, strong, selected) read by the full screen and
by the end of a line-mode run. Status words take their role from one
pattern table, the text never changes, and colour is off with NO_COLOR,
TERM dumb or unset, a terminfo entry naming fewer than 8 colours, or an
output that is not a terminal.
Colour goldens keep the escape codes, and a test strips them back to
the text goldens.
--offline given with the variable set is named as the option, and the
runs the screen starts get it only when the user gave it. The first
install page stays under its 400 words, the 3.8 runs skip only the
pack test that needs generate_pack.
Long messages scroll with their position, a small window says why the
questions come line by line, one bar rule per width, the folder a
config names sits under it and wraps whole, the help while typing a
filter lists what does not type, the plan names --core and --region,
pc finds the computer setups, rows keep sizes near their names, a
partial result counts once, a quit is said as one, the WSL browser
names drives by letter and No connection names the pack.