Commit Graph
33 Commits
Author SHA1 Message Date
Abdessamad Derraz 957bf0f6c1 fix: keep the 404 parent link on this site
An address with an empty segment (//other.example/x) made the 404 page
fetch and link a page of another site. Empty and dot segments are
dropped, and a parent is fetched only on this site, under its base.
2026-11-09 06:05:36 +01:00
Abdessamad Derraz 29aeccba3c feat: guide a stale link and the first download
Readers reached the 404 page with a pasted command (/i.ps1%20%7C%20iex),
a file name, a GitHub path or a section below a page: the page now says
which it is and leads on. Beside "Start with", the first file's
download sits next to its name.
2026-11-09 06:04:42 +01:00
Abdessamad Derraz a7a27028ab feat: give assistants each page as markdown
The build writes <page>/index.md beside each page, named in its head,
and llms-full.txt. llms.txt and the setup skill say how to answer from
the site, not from memory, and the setup_bios_files WebMCP tool gives a
setup's folder and exact file names from the picker data.
2026-11-09 06:04:42 +01:00
Abdessamad Derraz cfc950b834 chore: merge origin/main 2026-11-06 21:09:17 +01:00
Abdessamad Derraz d10c037a86 fix: refuse a path that could escape the command
device_setup_command built a shell command from the agent's values: a
typographic quote ends a PowerShell string, and a path starting with -
reads as an option. Such values are refused, the options are written
attached to their values, and platform must be a setup name.
2026-11-06 20:01:03 +01:00
Abdessamad Derraz 24d7db0ab3 feat: guide AI agents to the fewest files
llms.txt and an ARD manifest name the pages and the JSON API, and lead
an agent setting up a device to --for-games --required-only. Every page
registers four read-only WebMCP tools: the setup command, a hash lookup,
an emulator's files and the site search.
2026-11-06 19:58:42 +01:00
Abdessamad Derraz 7a34c2ddec fix: align the privacy page with what is counted 2026-11-06 15:02:00 +01:00
Abdessamad Derraz b8d9b2a90c fix: send searched words only as file names
A search that found nothing sent any short text, which a name could be.
Its words now go out only as a file name or a hash, every other search
is counted as "other" without them.
2026-11-06 13:11:15 +01:00
Abdessamad Derraz c1b0149a81 chore: merge site insights 2026-11-06 12:56:13 +01:00
Abdessamad Derraz ebe9745e7f feat: count visits without cookies
Pages, referring domains and a few actions (searches that found
nothing, downloads, missing addresses, "Did this page help?") are sent
to GoatCounter. Nothing is stored on the device, and nothing is sent
under Do Not Track or Global Privacy Control. wiki/privacy.md says what
is sent.
2026-11-06 12:55:57 +01:00
Abdessamad Derraz 7876dc09e9 fix: send moved part cards to the emulator index
Adding one entry to mame.yml moves 938 cards from one part page to the
next, and a published emulators/mame-files-1/#file-... address landed
on a page without the card. A part page now sends a file- id it does
not hold to the emulator page, whose card index row opens the part that
holds it.
2026-11-06 08:21:30 +01:00
Abdessamad Derraz 4f930b5573 feat: find wanted dumps by hash on the files page
files/?hash= read the collection, platforms, emulators and retired files,
never the Wanted list: the SHA1 of Redump's ps2-dvd-212k.bin answered
that nothing the site knows has it. The lookup now carries a wanted
layer from the rows of provenance-wanted.csv, computed once for both,
and the page names the catalog that lists the dump.
2026-11-06 08:19:08 +01:00
Abdessamad Derraz 350cd6d600 feat: keep the address of a file that left
files/?sha1= of a file the collection no longer holds answered that no
file the site knows has the hash. generate_db.py now records each sha1 a
rebuild drops in retired.json, with the day and the file in its place,
backfilled from the history since 0d586ef6b (4,139 files). The lookup
answers with it and leads to the successor's card.
2026-11-06 04:24:44 +01:00
Abdessamad Derraz b23931e14d feat: find archive members by their CRC32
The lookup held a member only where a profile's contents: declares it,
so 26,014 of the 33,403 members of collection archives answered nothing.
Each member's CRC32 is now an archive-member record leading to its
archive's card, read from the central directory, and files/ names the
archive holding it.
2026-11-06 04:12:20 +01:00
Abdessamad Derraz 28d310d8bc fix: preselect RetroArch in a system's install box
The box showed the first setup by name, AmberELEC on 17 system pages,
under Windows tabs. It now selects RetroArch, which runs on every system
the box has a tab for, else a setup the release publishes a ZIP for.
2026-11-06 04:02:14 +01:00
Abdessamad Derraz 9c17943996 feat: read the hash out of a checksum tool's line 2026-11-05 12:09:55 +01:00
Abdessamad Derraz ea2e0b10c4 fix: find an archive by the ROM a list pins in it 2026-11-05 12:08:26 +01:00
Abdessamad Derraz 917ab7c94b chore: merge platform file rows 2026-10-27 21:46:44 +01:00
Abdessamad Derraz 793b16cf67 chore: merge folded cards and one install command 2026-10-27 21:45:48 +01:00
Abdessamad Derraz e7d33caa3f feat: platform file rows that open full width
Each file is a details whose summary is the row: name, folder when it is not the bare name, status chip. The short hash sits on one copy button beside it, since a summary is itself a control. Opened, the evidence runs across the list. A list with no folder drops the column. Code spans in the evidence are plain text.

The lists split by the share of a page they render to (elements against 10,000, bytes against 600,000) instead of Markdown length. With its parts, Batocera goes from 12 pages, 18,854 elements and 1.21 MB to 10 pages, 13,671 and 1.11 MB. A part that folds back into its platform page redirects there, from the record in website/src/data/platform-parts.json.
2026-10-27 21:41:00 +01:00
Abdessamad Derraz 1409a8db6a feat: list long file pages as filtered tables
MAME's card pages, GroovyMAME and yaps2 read 13,000 to 16,700 words of
cards. Each entry is now a table row (name, members, status, short
hash) that opens to its card in a details block, with the site's filter
box and row counter. Pages from 150 entries and every split part use it.
Visible words: mame-files-1 16,680 to 1,612, groovymame 14,396 to 1,876.

A row costs about five elements, so a part holds 180 cards: MAME goes
from 8 parts to 9, the largest at 567 KB and 8,989 elements.

Each wanted list (TOSEC, No-Intro, Redump) opens on its counts, then one
table folded under a filter box that opens it, in place of a block per
DAT. Only the names are searched: indexed descriptions and hashes put
the PlayStation page ahead of the PlayStation 2 one.

A filtered row stayed visible on a phone: a stacked row's display:block
outweighed the hidden attribute on every stacked table.
2026-10-27 21:14:04 +01:00
Abdessamad Derraz 8adb84696d feat: fold card hashes, one install command
System and emulator file cards show the name, size, download, a short
SHA1 with a copy button, the setups and the emulators. The full hashes
and the other facts sit in one closed fold, each hash with a copy button.

A system's install box shows one command under the OS tabs for the
setup picked in a list, remembered across pages. Without the script the
list of every command shows, open. The Markdown the page budgets are
measured on is unchanged, so no card moves.
2026-10-27 20:56:07 +01:00
Abdessamad Derraz 20dc488e41 feat: list platform files as table rows
Each file of a platform list is one row: name, folder, status chip, a short hash on a button that copies it whole, and a details cell. The details hold every declared hash, the size, the served copy and the readers. A reference's role is one word (glue, port, upstream, build) defined once in a legend instead of a phrase after every reference.

Visible words: Batocera 2,433 to 2,332, AmberELEC 1,301 to 1,299, RomM 1,607 to 1,596, RetroArch 2,207 to 2,088, RetroDECK arcade part 2 19,127 to 2,104. Rows weigh more Markdown, so 38 more systems move to pages of their own under the existing budgets.
2026-10-27 20:44:05 +01:00
Abdessamad Derraz 07f785cfd7 fix: rank a console first for its own name
The PlayStation 2 page holds every word of "playstation bios" and pagefind ignores the words a page has that the query lacks, so its own body matches put it first. A console whose every word another system page's consoles also hold is now written again in an `exact` field (weight 20). File names reach the `files` field as their parts: whole names let "ds" reach twelve dsi_* names on the DSi page. `consoles` weighs 100 so an emulator named after its console (Saturn.emu) comes second, and `aliases` 10 so the Nintendo page keeps "gba bios". The gate runs both directions of the PlayStation, Game Boy, DS and Wii pairs and Saturn.
2026-10-27 06:54:08 +01:00
Abdessamad Derraz b967cb8d04 fix: short stacked labels, declared lookup hash 2026-10-24 00:47:51 +02:00
Abdessamad Derraz 3566016189 fix: one lookup verdict, visitor's os tab
The lookup reads every hash of a matched file, so its MD5, SHA1, CRC32 and SHA256 give one answer. The OS tabs open on the visitor's system unless a choice is saved, and the sidebar shows the current page.
2026-10-23 19:06:03 +02:00
Abdessamad Derraz f0e7d87def fix: settle the round 3 site packages together 2026-10-23 11:12:12 +02:00
Abdessamad Derraz b239be4984 feat: hash verdict, built filters, unbroken flags
Tables of four columns stack on a phone, and a long table's filter box is written at build time, which ends the layout shift on gaps-files-to-source. Find a file names its counts, its emulators and accepts md5=, crc32= and sha256=, hashes a chosen file on the device and points an unknown hash to contributing. A hash typed in the search folds the pages that only mention it. Words holding a hyphen in command blocks no longer break across lines.
2026-10-23 10:47:05 +02:00
Abdessamad Derraz 60de1284d1 feat: give a hash lookup a verdict 2026-10-23 02:27:09 +02:00
Abdessamad Derraz abe240073c feat: pass the Starlight gate on dense pages
Pages of cards under one or two headings drop the table of contents,
whose script watched every block of a 400-card page: 2 x 430 ms of
main thread on a throttled phone. Tables are measured once the page is
idle, skipping those in closed blocks, so a scrolling table is a tab
stop anywhere on the page. The 12 heaviest pages score 97 to 100 in
Lighthouse mobile, axe reports nothing on 16 pages in both themes, and
the search answers the ten gate queries.
2026-10-22 17:21:14 +02:00
Abdessamad Derraz 5f3534bdf2 feat: tune search weights and heavy page loads
Status badges and hash-listing blocks leave the search index, card titles
weigh as page titles, and Pagefind ranking is set inside a range where
the ten gate queries all answer (search_gate.py: 10/10). Tables are set
up and measured when they near the screen, which relaid out a 3,800-row
page after its first paint, and console icons hold their box.
2026-10-22 16:49:27 +02:00
Abdessamad Derraz 294942afd0 feat: port the site ports and picker checks
Tables with a download link stack on phones, the browser check covers
the lookup, a hash typed in the search, breadcrumbs, previous and next
across tabs, glossary terms and the 404 hint. validate_site budgets the
Pagefind index pieces and takes the base path without mkdocs.yml. A
test holds the picker to install.narrow() on 180 selections.
2026-10-22 15:46:36 +02:00
Abdessamad Derraz 342d0f7271 feat: write the site for Starlight behind a flag
generate_site.py --engine starlight writes the pages, navigation and
data files of an Astro Starlight project in website/. Links resolve to
site addresses, every heading keeps its MkDocs id, and pages split by
size are measured in the MkDocs Markdown so both builds cut the same
files. The 839 pages and their 45,613 ids match the MkDocs build.
2026-10-22 15:41:39 +02:00