* fix(server): repair age-rating migration drift
The age-ratings change (97c6f2c8) appended the AgeRatingOrganization
enum and GameAgeRating table to 20260224145112, a migration that had
already been applied to existing databases. Prisma never re-runs applied
migrations, so those databases were left without the enum/table; the
later 20260726041153_add_user_groups migration then failed with
"type AgeRatingOrganization does not exist" and game pages 500'd.
Restore 20260224145112 to its original applied content, make
20260726041153 self-healing by creating the enum when it is missing, and
add an idempotent 20260915000000_add_game_age_ratings migration that
creates the type, table, index and foreign key. All statements are
guarded so they are safe on databases already repaired out-of-band.
* fix(server): eliminate file descriptor double-close and stream leaks in object storage
* feat(server): add generic Podman Quadlet deployment template
* fix(server): address platform-stability review feedback
Migrations are now append-only: 20260224145112 and 20260726041153 are left untouched and 20260915000000_add_game_age_ratings is replaced by 20260726041152_repair_age_rating_schema, named to sort before 20260726041153 so drifted databases create the enum before add_user_groups runs. Databases whose add_user_groups row already failed still need migrate resolve --rolled-back, which is documented in the migration.
FsObjectBackend#write now truncates before writing, so overwriting an object with shorter content cannot leave stale trailing bytes. FsObjectBackend#fetchHash computes and stores the hash on a database miss (FsHashStore#get returns undefined, not null).
Quadlet: drop the README and the chunk-cache volume/env keys (the chunk cache is not implemented in this repository), fix rootless boot via default.target, add a PostgreSQL healthcheck, use the drop-postgres DNS name, and fix the uninstall volume glob.
* fix(server): grant save owners read access and enforce save size limits
Save snapshots were created with no permissions, so the desktop client
could never pull an archive back, and pruning relied on deleteWithPermission
(which requires a delete grant the object never has), silently leaking every
pruned snapshot. Grant `<userId>:read` and reclaim as the system.
The advertised saveSlotSizeLimit was also never enforced; measure the stream
and reject oversized payloads with a 413 before the full archive is written.
---------
Co-authored-by: John Smith <you@example.com>
Sorry, I'm just a devcontainer type of guy :D
The restructure of the repo to a monorepo broke some things. I think I corrected them all so far.
I had to add .pnpm-store to the root .gitignore, because the pnpm install in the container places it there. Alternatively, if that is not wanted, I could move the story via env variable afaik to another place inside the container outside of the repo.
When trying to import a game which is restricted in your country, steam seems to not provide a full_description. This caused errors while importing, because the undefined was unexpected here.
I made this case explicit and the code a bit more typesafe to fix this error and at least allows to import the metadata you have access to via steam.
Fixes#403.
* Adding groups logic and restrictions
* Cleaning up some redundant code
* hastily made translations
* Linter issues
* More linting
* PR comments
* Covering other APIs with age filters per comment
* Add ages to age ratings
* Making the linter happy
---------
Co-authored-by: Robert Clabough <robert@clabough.tech>
* Adding groups logic and restrictions
* Cleaning up some redundant code
* hastily made translations
* Linter issues
* More linting
* PR comments
* Covering other APIs with age filters per comment
---------
Co-authored-by: Robert Clabough <robert@clabough.tech>
* Fix Windows and Linux launch
* Add process handler selector, pin Prisma
* Regenerate lcofkiel
* Fix torrential inclusion in image
* Fix layouting
* Implement tree kill for Windows
* Fix server lint
* add basic git files to root
* make server part of monorepo
* import promo
* import libraries base
* import docs
* import desktop
* move docs and promo
I never used headlessui before, so I have no idea why this is needed, but it looks like this fixes the problem. I think a high z-index is alright, because there shouldn't be things that should lie above the options.
* Adds settings for server name and logo
* Implements ApplicationLogo and replaces site name based on settings
* Refactors component for changing the company logo
* Removes unused variable
* Uses message instead of statusMessage
* Replaces favicon with logo if set