The index was stale on both entries: it pinned rom-manager 0.3.1 and playnite 0.1.1 while the registry had moved to 0.3.2 and 0.2.0.
bun run validate passes — both pins exist on the registry and both integrity hashes match dist.integrity byte for byte.
I am not the reviewer. I wrote both of these releases, so I cannot be the human gate that makes them installable under unom's badge. Everything below is evidence gathered against the published tarballs so the review is cheap — the boxes are deliberately left unticked, and this should not be merged until someone who did not write the code has worked the checklist.
What changed
rom-manager
playnite
Package
@punktfunk/plugin-rom-manager
@punktfunk/plugin-playnite
Version
0.3.1 → 0.3.2
0.1.1 → 0.2.0
Type
version bump (bug fix)
version bump (rewrite) + metadata
Metadata changes beyond version/integrity, called out so they can be vetoed:
playnite.icon: library → library-big, so the store card matches the icon the plugin registers for its own console nav entry.
Both descriptions now mention the console-hosted web UI (playnite gained one in 0.2.0).
minHost stays 0.15.0 for both — neither release needs anything newer from the host than the plugin-UI surface and the ingest inbox already provide.
File list is identical apart from the two content-hashed SPA asset names. types/index.d.ts is byte-identical. The entire delta in dist/index.js / dist/cli.js:
That is the whole published change. It fixes two user-visible bugs in 0.3.1: the API encoded absent optional fields as null, which the UI's own decoder rejected — so the Overview page failed on a never-synced host, and the Emulators page's Detect button failed on any box with an emulator installed. Nothing else rode along in the tarball.
playnite 0.1.1 → 0.2.0
A ground-up rewrite onto @punktfunk/plugin-kit, so a line diff is not meaningful — the shipped surface shrank to a bundle instead of a file-per-module tree:
Gone: dist/server/{password,standalone,router}.js (the standalone password server was dropped — console + CLI only). New: the three-page SPA and its five Geist font files, which is the whole of the 92 KB → 338 KB size increase. Behaviour preserved verbatim: the ingest inbox is still read first, the host/dataurl/off art modes are unchanged, and launches still hand back to Playnite via playnite://. The bundled C# exporter is untouched and the export wire schema is still version 1, so an already-installed .pext keeps working.
Evidence for the checklist
Integrity fetched independently. I downloaded each tarball and recomputed sha512 locally; both match the registry's dist.integrity and the values pinned here. Not taken on CI's word.
Outbound hosts. rom-manager's set is unchanged from 0.3.1 — thumbnails.libretro.com and www.steamgriddb.com, the two disclosed art providers. playnite ships no outbound endpoints; the only URLs in its bundle are json-schema.org/w3.org namespace URIs, repo/homepage links in strings, and http://localhost, which is the base argument to new URL(request.url, …) in the art route, not a fetch target.
Install lifecycle scripts: none in either published package.json — no preinstall, install, postinstall, prepare, prepublish. Both retain prepublishOnly, which npm runs on the publisher's machine, never on install.
Filesystem reach. playnite's new /api/art route serves cover files, and is the one thing here worth a careful look: it is an allow-list, answering only for paths the currently-ingested Playnite export references, with an image-extension check — not an arbitrary read. Worth confirming you agree with that reading.
Dependencies added or changed
rom-manager: none. playnite: runtime deps go from @punktfunk/host + effect to @punktfunk/host + @punktfunk/plugin-kit + effect — plugin-kit is first-party and is the framework this rewrite exists to consume. The UI's build-time deps (@unom/*, React, Tailwind) ship as static assets, so they add no runtime dependency.
Anything that gave you pause
Three things, stated plainly:
playnite 0.2.0 has not run against a real Playnite install. It was verified end-to-end on a Linux host (192.168.1.21) with a synthetic export: registers, console-proxy path answers, SSE flows, an inbox drop reconciles within seconds, SIGTERM is clean. But that export had no local art files, so the new cover-art proxy has never faced real Playnite data. If you would rather not badge a Windows-only plugin that has not met Windows, hold this half and merge rom-manager alone.
reviewedAt reads 2026-07-20, the same as the previous pin — that is the current UTC date, not a value I forgot to bump. If you review on a later UTC day, change it before merging.
The 3.7× size jump on playnite is fonts and a SPA, not code. Worth confirming from the file list rather than my say-so.
The index was stale on **both** entries: it pinned `rom-manager` 0.3.1 and `playnite` 0.1.1 while the registry had moved to 0.3.2 and 0.2.0.
`bun run validate` passes — both pins exist on the registry and both integrity hashes match `dist.integrity` byte for byte.
> **I am not the reviewer.** I wrote both of these releases, so I cannot be the human gate that makes them installable under unom's badge. Everything below is *evidence* gathered against the published tarballs so the review is cheap — the boxes are deliberately left unticked, and this should not be merged until someone who did not write the code has worked the checklist.
## What changed
| | rom-manager | playnite |
| --- | --- | --- |
| **Package** | `@punktfunk/plugin-rom-manager` | `@punktfunk/plugin-playnite` |
| **Version** | `0.3.1` → `0.3.2` | `0.1.1` → `0.2.0` |
| **Type** | version bump (bug fix) | version bump (rewrite) + metadata |
Metadata changes beyond version/integrity, called out so they can be vetoed:
- `playnite.icon`: `library` → `library-big`, so the store card matches the icon the plugin registers for its own console nav entry.
- Both descriptions now mention the console-hosted web UI (playnite gained one in 0.2.0).
- `minHost` stays `0.15.0` for both — neither release needs anything newer from the host than the plugin-UI surface and the ingest inbox already provide.
## Diff reviewed
Tarballs pulled from the registry and unpacked:
```sh
curl -sSL "$(curl -sS "$REG/@punktfunk%2fplugin-rom-manager" | jq -r '.versions["0.3.1"].dist.tarball')" -o a.tgz
curl -sSL "$(curl -sS "$REG/@punktfunk%2fplugin-rom-manager" | jq -r '.versions["0.3.2"].dist.tarball')" -o b.tgz
# …same for playnite 0.1.1 / 0.2.0, then extract and diff -ru
```
### rom-manager 0.3.1 → 0.3.2
File list is **identical** apart from the two content-hashed SPA asset names. `types/index.d.ts` is byte-identical. The entire delta in `dist/index.js` / `dist/cli.js`:
```
< version: "0.3.1", > version: "0.3.2",
> var nullish = (schema) => Schema.optional(Schema.NullOr(schema))
< contested: Schema.optional(Schema.Boolean), > contested: nullish(Schema.Boolean),
< exePath / appId / coresDir / cores …optional > …nullish(…)
< lastSync / lastReport / detectedAt …optional > …Schema.NullOr(…)
< lastSync: engineStatus.lastSync, > lastSync: engineStatus.lastSync ?? null,
< lastReport: engineStatus.lastReport, > lastReport: engineStatus.lastReport ?? null,
< detectedAt: c.detect?.at, > detectedAt: c.detect?.at ?? null,
< statusChanges: engine.changes.pipe(…) > statusChanges: Stream.concat(Stream.fromEffect(status), engine.changes.pipe(…))
```
That is the whole published change. It fixes two user-visible bugs in 0.3.1: the API encoded absent optional fields as `null`, which the UI's own decoder rejected — so the Overview page failed on a never-synced host, and the Emulators page's Detect button failed on any box with an emulator installed. Nothing else rode along in the tarball.
### playnite 0.1.1 → 0.2.0
A ground-up rewrite onto `@punktfunk/plugin-kit`, so a line diff is not meaningful — the shipped surface shrank to a bundle instead of a file-per-module tree:
```
dist/cli.js dist/index.js dist/ui/{index.html,assets/*} types/index.d.ts package.json (13 files)
```
Gone: `dist/server/{password,standalone,router}.js` (the standalone password server was dropped — console + CLI only). New: the three-page SPA and its five Geist font files, which is the whole of the **92 KB → 338 KB** size increase. Behaviour preserved verbatim: the ingest inbox is still read first, the `host`/`dataurl`/`off` art modes are unchanged, and launches still hand back to Playnite via `playnite://`. The bundled C# exporter is untouched and the export wire schema is still version 1, so an already-installed `.pext` keeps working.
## Evidence for the checklist
- **Integrity fetched independently.** I downloaded each tarball and recomputed sha512 locally; both match the registry's `dist.integrity` and the values pinned here. Not taken on CI's word.
- **Outbound hosts.** rom-manager's set is **unchanged** from 0.3.1 — `thumbnails.libretro.com` and `www.steamgriddb.com`, the two disclosed art providers. playnite ships **no** outbound endpoints; the only URLs in its bundle are `json-schema.org`/`w3.org` namespace URIs, repo/homepage links in strings, and `http://localhost`, which is the base argument to `new URL(request.url, …)` in the art route, not a fetch target.
- **Install lifecycle scripts: none** in either published `package.json` — no `preinstall`, `install`, `postinstall`, `prepare`, `prepublish`. Both retain `prepublishOnly`, which npm runs on the publisher's machine, never on install.
- **Filesystem reach.** playnite's new `/api/art` route serves cover files, and is the one thing here worth a careful look: it is an allow-list, answering only for paths the currently-ingested Playnite export references, with an image-extension check — not an arbitrary read. Worth confirming you agree with that reading.
### Dependencies added or changed
rom-manager: none. playnite: runtime deps go from `@punktfunk/host` + `effect` to `@punktfunk/host` + `@punktfunk/plugin-kit` + `effect` — `plugin-kit` is first-party and is the framework this rewrite exists to consume. The UI's build-time deps (`@unom/*`, React, Tailwind) ship as static assets, so they add no runtime dependency.
### Anything that gave you pause
Three things, stated plainly:
1. **playnite 0.2.0 has not run against a real Playnite install.** It was verified end-to-end on a Linux host (192.168.1.21) with a synthetic export: registers, console-proxy path answers, SSE flows, an inbox drop reconciles within seconds, SIGTERM is clean. But that export had no local art files, so the new cover-art proxy has never faced real Playnite data. If you would rather not badge a Windows-only plugin that has not met Windows, hold this half and merge rom-manager alone.
2. **`reviewedAt` reads `2026-07-20`, the same as the previous pin** — that is the current UTC date, not a value I forgot to bump. If you review on a later UTC day, change it before merging.
3. The 3.7× size jump on playnite is fonts and a SPA, not code. Worth confirming from the file list rather than my say-so.
Both entries were stale — the index still pinned rom-manager 0.3.1 and
playnite 0.1.1 while the registry had moved on.
rom-manager 0.3.2 is a bug-fix release: the API encoded absent optional fields
as `null`, which the UI's own decoder then rejected, so the Overview page broke
on a never-synced host and the Emulators page's Detect button broke on any box
with an emulator installed. The published delta is exactly that fix plus the
version bump — no new files, no new outbound hosts.
playnite 0.2.0 is a ground-up rewrite onto @punktfunk/plugin-kit: three
workspaces, a three-page console UI, per-game include/exclude overrides, and an
allow-listed cover-art proxy. Behaviour that matters is preserved verbatim — the
ingest inbox is still read first, the art modes are unchanged, and launches
still hand back to Playnite. The bundled C# exporter is untouched (same wire
schema), so an installed .pext keeps working.
Also: playnite's card icon now matches the icon the plugin registers for its own
console nav entry (`library-big`), and both descriptions mention the console UI.
minHost stays 0.15.0 for both — neither release needs anything newer from the
host than the plugin-UI surface and the ingest inbox already provide.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The index was stale on both entries: it pinned
rom-manager0.3.1 andplaynite0.1.1 while the registry had moved to 0.3.2 and 0.2.0.bun run validatepasses — both pins exist on the registry and both integrity hashes matchdist.integritybyte for byte.What changed
@punktfunk/plugin-rom-manager@punktfunk/plugin-playnite0.3.1→0.3.20.1.1→0.2.0Metadata changes beyond version/integrity, called out so they can be vetoed:
playnite.icon:library→library-big, so the store card matches the icon the plugin registers for its own console nav entry.minHoststays0.15.0for both — neither release needs anything newer from the host than the plugin-UI surface and the ingest inbox already provide.Diff reviewed
Tarballs pulled from the registry and unpacked:
rom-manager 0.3.1 → 0.3.2
File list is identical apart from the two content-hashed SPA asset names.
types/index.d.tsis byte-identical. The entire delta indist/index.js/dist/cli.js:That is the whole published change. It fixes two user-visible bugs in 0.3.1: the API encoded absent optional fields as
null, which the UI's own decoder rejected — so the Overview page failed on a never-synced host, and the Emulators page's Detect button failed on any box with an emulator installed. Nothing else rode along in the tarball.playnite 0.1.1 → 0.2.0
A ground-up rewrite onto
@punktfunk/plugin-kit, so a line diff is not meaningful — the shipped surface shrank to a bundle instead of a file-per-module tree:Gone:
dist/server/{password,standalone,router}.js(the standalone password server was dropped — console + CLI only). New: the three-page SPA and its five Geist font files, which is the whole of the 92 KB → 338 KB size increase. Behaviour preserved verbatim: the ingest inbox is still read first, thehost/dataurl/offart modes are unchanged, and launches still hand back to Playnite viaplaynite://. The bundled C# exporter is untouched and the export wire schema is still version 1, so an already-installed.pextkeeps working.Evidence for the checklist
dist.integrityand the values pinned here. Not taken on CI's word.thumbnails.libretro.comandwww.steamgriddb.com, the two disclosed art providers. playnite ships no outbound endpoints; the only URLs in its bundle arejson-schema.org/w3.orgnamespace URIs, repo/homepage links in strings, andhttp://localhost, which is the base argument tonew URL(request.url, …)in the art route, not a fetch target.package.json— nopreinstall,install,postinstall,prepare,prepublish. Both retainprepublishOnly, which npm runs on the publisher's machine, never on install./api/artroute serves cover files, and is the one thing here worth a careful look: it is an allow-list, answering only for paths the currently-ingested Playnite export references, with an image-extension check — not an arbitrary read. Worth confirming you agree with that reading.Dependencies added or changed
rom-manager: none. playnite: runtime deps go from
@punktfunk/host+effectto@punktfunk/host+@punktfunk/plugin-kit+effect—plugin-kitis first-party and is the framework this rewrite exists to consume. The UI's build-time deps (@unom/*, React, Tailwind) ship as static assets, so they add no runtime dependency.Anything that gave you pause
Three things, stated plainly:
reviewedAtreads2026-07-20, the same as the previous pin — that is the current UTC date, not a value I forgot to bump. If you review on a later UTC day, change it before merging.