* Fix Install in the missing-dependency modal
The "Missing required dependency" modal calls download_game without
enableUpdates, but the command requires it, so clicking Install fails with:
invalid args `enableUpdates` for command `download_game`: command
download_game missing required key enableUpdates
Pass it the same way the library page does: true when installing the
latest version.
* Update DependencyRequiredModal.vue
---------
Co-authored-by: DecDuck <declanahofmeyr@gmail.com>
* 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>
When a download fails, manage_error_signal removes it from the queue but
doesn't send Go, so the next queued download never starts on its own.
Completed and Cancel both send Go; do the same here.
fetch_game_logic saves a fetched game under the key "<id>", but the
download agent (and the offline path) look it up under "game/<id>". Only
the library list writes "game/<id>".
So a game that isn't in the user's library - for example an emulator
pulled in as a dependency - is never found in the cache. The download
agent then falls back to the game's id for the folder name and installs
it into <install dir>/<uuid> instead of <install dir>/<name>.
GameDownloadAgent::run() prunes the install directory by comparing
locally-scanned relative paths against the manifest's file_list keys.
file_list is always written with `/` separators (see droplet's
path_backend.rs), regardless of which OS produced the manifest, but
Path::strip_prefix().to_string_lossy() on Windows yields `\`-separated
strings. Every nested file therefore fails the exact-string HashMap
lookup and gets deleted on every download/update, while flat root
files (no separator to disagree on) happen to survive. This is most
visible on Unity games, where nearly all content lives under a deeply
nested *_Data folder.
Confirmed against a live Drop server: 401/407 of a real game's
file_list entries contain `/`, with the remaining 6 being
separator-less root files, matching exactly which files survive vs.
get pruned.
* Update actions/checkout consistently to v7
* Update pnpm/action-setup to v6
With pnpm v11 this could and should be replaced with pnpm/setup, I guess.
* Update actions/setup-node consistently to v7
* Update actions/configure-pages to v6
It looks like this should be non-critical, it mainly includes a runtime upgrade to Node 24 as far as I could see that.
* Update actions/cache to v6
* Update docker/metadata-action to v6
I think this is also non-critical and mainly a runtime bump.
* Update docker/login-action to v4
Should also be just the node version bump.
* Update docker/setup-buildx-action to v4
* Update docker/setup-qemu-action to v4
* Update docker/build-push-action to v7
* Update actions/upload-artifact to v7
* Update actions/download-artifact to v8
This is quite a jump and I'm not very familiar with this action. But the changelogs looked more or less not critical, there was only a thing about downloading single artifacts by id in v5, but I think the "No Action Needed If" applies.
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.
* Fixing linux bug where client would never actually quit
* Fixing window minimizing to tray
* Make an official event
---------
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
* 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