Adds the M5 slice of the community layer: Mod/ModVersion/ModDependency/
ModInstallation/ModInstalledFile/AchievementDefinition (migration
m5_mods_achievements). Gods/Users are referenced as plain soft columns
(gameId/uploaderId/identityId), not Prisma relations, following the
concurrent-edit-avoidance pattern devices.prisma established -- content.prisma
and user.prisma only grow a comment each.
Mods: syncs from script-library/scripts/archive-mod.py's _index/catalog.json
(read-only bind mount, homelab-compose/drop-stack/docker-compose.yml) into
Mod/ModVersion/ModDependency, resolves dependency refs into real Mod rows
where archived, and exposes a topologically-ordered install-plan resolver
with cycle/conflict/unresolved-dependency detection
(GET /mods/:id/versions/:v/plan). The install manifest
(ModInstallation/ModInstalledFile) records created/overwrote/skipped per
file so an uninstall plan is exact, computed server-side from what was
recorded, applied by the caller. Downloads stream directly off the mount
(GET /mods/:id/versions/:v/download) since cdn.quasarke.net has no
file_server wired to /mnt/local24/game-mods yet -- documented as a known gap
in server/internal/community/README.md, deliberately not fixed by editing
the live Caddyfile. A manual add form covers the DESIGN.md open-question #4
fallback (no upload write path exists).
Achievements: imports gbe_fork's archived generate_emu_config output
(/mnt/local24/game-tools/goldberg/schemas, also read-only mounted) via
goldbergAdapter.ts, copying icons into Drop's own object store
(objectHandler.createFromSource, same mechanism as Steam cover art) so
nothing is hotlinked. Display joins AchievementDefinition against M2's
already-landed AchievementUnlock by (steamAppId, apiName), exactly the join
key M2 designed it around -- no stub needed, M2's table was already in the
tree. Verified against real fixtures: appid 245170 (Skullgirls) importing
45/45 definitions with 90 icons, and 274190 (Broforce) importing 17/17.
Pages: /community/mods, /community/mods/:slug, /community/mods/new,
/community/achievements, /community/games/:gameId (achievement grid +
per-title mods, completion %). Small additive nav links on /community's
index rather than touching the actively-changing shared game-detail page.
* feat: small library tweaks + company page
* feat: new store view
* fix: ci merge error
* feat: add genres to store page
* feat: sorting
* feat: lock game/version imports while their tasks are running
* feat: feature games
* feat: tag based filtering
* fix: make tags alphabetical
* refactor: move a bunch of i18n to common
* feat: add localizations for everything
* fix: title description on panel
* fix: feature carousel text
* fix: i18n footer strings
* feat: add tag page
* fix: develop merge
* feat: offline games support (don't error out if provider throws)
* feat: tag management
* feat: show library next to game import + small fixes
* feat: most of the company and tag managers
* feat: company text field editing
* fix: small fixes + tsgo experiemental
* feat: upload icon and banner
* feat: store infinite scrolling and bulk import mode
* fix: lint
* fix: add drop-base to prettier ignore
* #51 Adds settings page with showTitleDescriptionOnGamePanel
* Removes console.log
* Renames isHidden to system, adds missing system column on Game and fixes nitro plugin on fresh database
* Implements a different way to handle the placeholder image
* Removes system column on Game
* Groups settings keys together
* Removes unused i18n keys
* fix: fix eslints and other small tweaks
---------
Co-authored-by: Francois Ribemont <ribemont.francois@gmail.com>