Repository navigation
Conversation
RomM scans, enriches, and plays retro game collections. The script keeps the ROM library, fetched artwork, and saves on one location so RomM can link artwork correctly, auto-generates all database and auth secrets, and pins the PostgreSQL version to protect against accidental one-way database upgrades. Optional install questions let advanced users provide metadata-provider API keys and toggle scanning options while defaults stay one-click friendly; blank optional credentials resolve to empty strings to match fields left blank in the TrueNAS UI.
…potter, paperless-ngx)
…rracker Three entries declared requirements that did not match what they actually use. None broke an install — the runtime is lenient about all three — but each one made the requirements screen lie to the user about what the app needs. handbrake mounts $LOCATION(Downloads) into the container but never listed Downloads, so the location was neither shown nor covered by the permission grant. paperless-ngx had no specifications block at all, so it advertised no CPU, disk, or memory needs. It bundles postgres, redis, and an OCR pipeline, so it now declares 2 cores, roughly 2 GB to install, and 2 GB of RAM — the last one matters most, since OCR is what actually runs the box out of memory. warracker listed "documents", which is not a LocationPreferenceId and so could never resolve. The script never touches Documents; it uses ApplicationsCapacity, which was undeclared. Replacing the one with the other fixes both halves. Patch versions bumped so the change shows up in the update plan's changelog.
Correct the declared requirements on handbrake, paperless-ngx, and warracker
Install scripts run on users' machines, and until now nothing checked them. A script that is merely valid JSON can still misbehave once installed: an unknown $LOCATION throws during processing, a $QUESTION with no question behind it resolves to nothing, an icon path that is not in the repo 404s in the catalog UI. All of that was landing on staging unexamined. The validator checks JSON parse, the install-script version, the required script/requirements/app_values blocks, the spec regex, the permission and location enums, port ranges, metadata assets that must exist inside the repo, duplicate or malformed question keys, hook shape and duplicate ids, the ensure_directories_exists owner/snapshot/network_share shapes, unknown or unbalanced macros, every $LOCATION against the enum, and every $QUESTION against a declared key. Locations used by a macro but never declared are warnings rather than errors: they install correctly, they just under-report what the app needs. This repository is public and the platform is private, so CI cannot import the real types. Everything enforced is mirrored in _lib/contract.ts, in one place, so a drift fix is a single edit rather than a hunt through checks. The workflow typechecks the tooling before running it. Bun executes TypeScript by stripping types, so a type error in _lib would never stop the validator from running — it would just make its verdict untrustworthy.
Validate install scripts on every pull request
Teaches the validator the v6 contract so v6 scripts (hooks with kind/events/conditions/target/surfaces/rerun, and widgets with sizes/slots/conditions/buttons) pass CI when they land. No app scripts included — this is scaffolding only; fileflows and other v6 apps follow as separate PRs. contract.ts: version 6 added to SUPPORTED_VERSIONS, plus HOOK_KINDS, HOOK_EVENT_SPECS, HOOK_RERUNS, HOOK_SURFACES, HOOK_CONDITION_TYPES/ROLES, HOOK_TARGET_TYPES, SUPPORTED_WIDGETS_SCHEMA, WIDGET_SLOT_TYPES. validate.ts: v6 hook validation branch (kind, events array, conditions, target, surfaces, rerun, retries), full widget validation (id format, title, refresh floor, script/scriptContent, entrypoint, sizes with slot type/field/count limits, conditions, buttons referencing hook ids), shared checkCondition helper, per-hook question-key scoping for v6 (hooks carry their own inputs independently). hook_context.ts: updated mirror with ContextMount, target (file-targeted actions), mounts, getInstalledAppUrl, setProgress.
Add install script v6 support to the validator
Completes the v6 scaffolding: _lib/widget_context.ts is the hand-maintained mirror of the platform's WidgetContext (packages/backend/src/interface/widgets.ts) that catalog widget scripts import for typechecking — WidgetContext with host/port/mounts, WidgetFieldValue slot shapes (text/stat/list/image), and WidgetQueryResult. Every v6 app PR with a widget script depends on it.
A validator-green v6 script could still be rejected by the backend's zod: the merged v6 support checked field shapes but not the cross-field rules. Now mirrored from hookDeclarationV6Schema's superRefine: v5-style singular event rejected, rerun required iff user-triggerable, target/optional/userOptional gated to their firing class, version-gated triggers can't share a declaration with userAction, duplicate triggers and both-halves-of-a-ceremony declarations rejected, event objects validated (lifecycle-only, from/to on upgrade events, strict keys), target.accepts extension format, requiresHooks capped at 8 and resolved against declared hook ids, capabilityPresent conditions require a capability, widget sizes.media validated. Also fixes a false positive: widget refresh below 10 is legal (the platform clamps to 10) — now a warning, not an error. Verified non-vacuous: a synthetic script planting all 16 defects produces exactly 16 errors + 1 warning; the 49 real scripts stay clean.
Complete the v6 scaffolding: widget_context mirror
First v6 install script in the catalog. Includes a "Convert to MP4" file-targeted hook action (H.264 encode via FFmpeg Builder, hardware-first with CPU fail-over, non-destructive — the converted copy lands next to the original) and a "Conversions" widget showing active/queued files with real encoder details harvested from runner logs.
…convert hook, ETA, quoted-path log join, source codec from the probed stream
…-defaults Password-type credential questions with generate-button defaults + secret length bumps
Parametric requirement specs: GB-multiple conversions, grammar docs, palworld RAM spec
✨ Flagged first-boot-only admin credential questions installonly
Add FileFlows v6 install script
Add Scrutiny disk-health widget on a v6 install script
Add Plex now-playing widget on a v6 install script
Removed "(optional)" from questions. We now have a red asterisk showing if a question is optional or not added moby games question Removed the questions for rescanning library, scheduling library rescans, enabling hasheous, playmatch and howlongtobeat. this was done to streamline the questions list and make it seem less daunting. I see no reason not to enable those 3 metadata providers by default. If there is any good reason I am happy to add the questions back. Same for auto scanning. Scheduled scanning using cron time seemed complicated for the average user so it was removed. as this is a postgres app, I have decided not to expose any romm folders as postgres apps tend to not work as intended when users interact with their file directories outside of using the app.
Add RomM install script and donetick
update question default for romm (merge to staging)
hexos-test, hexos-test-fail and hexos-test-inline move to the v6 install script format, copied unchanged from feature/app-actions-widgets. hexos-test gains the harness actions and widgets the app surface E2E specs run. Lifecycle hooks parse to the same runnable hooks as before.
Move the hexos-test harness apps to v6 with their actions and widgets
…for Jellyfin (#71) * Add card sizes for the Plex and FileFlows widgets, with validator and type support for the card size and progress * Validated widgets against widgetsSchema 3: a widget is the app's card, with its own background and slots The sizes of widgetsSchema 2 are gone, an image is never a slot (the artwork is the background), and a list slot may say how many rows it shows. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * Moved the FileFlows and Scrutiny widgets to widgetsSchema 3 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * Moved the Plex widget to widgetsSchema 3, with each stream's artwork behind the card The script fetches each stream's wide artwork once, caps it to the image field's size and keeps it while the stream plays. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * Added a now-playing widget to Jellyfin, the same card Plex draws The setup hook creates the API key the widget reads sessions with; without it the widget asks the user to sign in. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * Moved the hexos-test harness widgets to widgetsSchema 3 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.