GameServer/GameServerStatusHistory/Issue/IssueComment models, a
strategy-per-probe_type ServerProbe (tcp_connect/http_get/presence_inferred,
mirroring script-library's game-server-registry-probe.py including the
integer ConnectTimeout fix), the bundled verified registry seed (WoW, EQEmu,
the Goldberg relay, Impostor, OpenDAoC), and full player+admin UI at
/community/servers and /community/issues. Featured flag pins the
persistent-world servers (WoW/EQEmu/OpenDAoC) to a compact status panel
surfaced on the community landing page. Scheduled sweep respects a
circuit-breaker backoff and never probes on page load; the relay is never
network-probed, only liveness-checked over ssh.
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.
Observed on .88 (2026-08-02): docker build got through deps install,
Prisma generate, and the client bundle fine, then got OOM-killed (exit 143)
during vue-tsc's full-project typecheck -- the host had ~600Mi free and a
fully-exhausted 2GB swap at the time (osrm-routed alone holds ~47GB RSS on
that shared box). This isn't a code problem; it's the single most
memory-hungry step of `nuxt build` landing on an already-saturated host.
--build-arg SKIP_TYPECHECK=true (env NUXT_BUILD_SKIP_TYPECHECK) skips it.
Off by default -- this is a resource-pressure escape hatch for a
contended host, not a reason to stop typechecking; re-run
`pnpm run typecheck` separately once there's headroom.
Replaces the server/pages/community.vue stub ({{ $t("todo") }}) with real
Nuxt pages: a unified Drop+RomM title browser, an admin catalog-sync panel,
and a profile page with playtime rails. Corrects the original architecture
mistake of building this as a separate service at community.quasarke.net --
now that we own the fork's source, community is ordinary Nuxt pages instead
of a sidecar with its own auth/DB/vhost.
Data model: one new table, CommunityTitle, for the RomM catalog (ported
from drop-community M1's Title spine). Drop's own Game/User/Playtime models
already ARE the title/identity/playtime spine for Drop content, so nothing
new was needed there -- profile playtime rails read real, already-existing
Playtime rows, no wrapper/ingest milestone required to populate them.
RommAdapter (server/server/internal/community/rommAdapter.ts) reads RomM's
MariaDB directly via the community_ro read-only role, same deviation and
same reasoning as M1's adapter (RomM's /api/roms needs a browser session,
no service-account key). TitleSyncService runs every 6h
(scheduledTasks.communityTitleSync) and via an admin "Sync now" button
(system:community:sync ACL) -- never deletes, hides instead.
Also folds the three post-build JS patches
(homelab-compose/drop-stack/patch-{launcher-button,telemetry-snippet,
footer-links}.js) into source now that the fork builds from source instead
of patching upstream's prebuilt image:
- library/game/[id]/index.vue: the "Open in Launcher" button gets a real
@click handler (drop://open with a timeout fallback to /download).
- plugins/telemetry.client.ts: OpenPanel RUM injected via a Nuxt client
plugin instead of appending to the compiled entry chunk.
- UserFooter.vue + admin/library source-help links + error.vue + the
Weblate link: repointed at our own infra. The Discord/social link
used to point at community.quasarke.net; that service is retired, so
it now points at /community directly.
* prevent returning expired sessions
* add issuer to ODIC creds
* get id token in ODIC
* make session signin return session
* working backchannel logout?
* require https for ODIC provider
* handle wellknown not being https
* find session api progress
* fix windows build
* return session token on session
* switch OIDC to #searchSessions
* update pnpm
* switch to using message on error obj
* move odic callback
* fix type errors
* redirect old oidc callback
* make redirect url a URL
* remove scheduled task downloadCleanup
* fix session search for oidc
* fix signin result
* cleanup code
* ignore data dir
* fix lint error
* 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
* chore: update prisma to 6.11
more prisma future proofing due to experimental features
* chore: update dependencies
twemoji - new unicode update
argon2 - bux fixes
vue3-carousel - improve mobile experiance
vue-tsc - more stable
* fix: incorrect prisma version in docker
Also remove default value for BUILD_DROP_VERSION, that is now handled in nuxt config
* fix: no logging in prod
* chore: optimize docker builds even more
* fix: revert adoption of prisma driverAdapters
see: https://github.com/prisma/prisma/issues/27486
* chore: optimize dockerignore some more
* Fix `pino-pretty` not being included in build (#135)
* Remove `pino` from frontend
* Fix for downloads and removing of library source (#136)
* fix: downloads and removing library source
* fix: linting
* Fix max file size of 4GB (update droplet) (#137)
* Fix manual metadata import (#138)
* chore(deps): bump vue-i18n from 10.0.7 to 10.0.8 (#140)
Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 10.0.7 to 10.0.8.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v10.0.8/packages/vue-i18n)
---
updated-dependencies:
- dependency-name: vue-i18n
dependency-version: 10.0.8
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps): bump @intlify/core from 10.0.7 to 10.0.8 (#139)
---
updated-dependencies:
- dependency-name: "@intlify/core"
dependency-version: 10.0.8
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Small fixes (#141)
* fix: save task as Json rather than string
* fix: pull objects before creating game in database
* fix: strips relative dirs from version information
* fix: #132
* fix: lint
* fix: news object ids and small tweaks
* fix: notification styling errors
* fix: lint
* fix: build issues by regenerating lockfile
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: DecDuck <declanahofmeyr@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci: pull version from package.json on build
* fix: implicit any type
* feat: inital support for logger
* style: fix lint
* feat: move more logging over to pino
* fix: logging around company importing
* feat: set lang in html head
* fix: add # in front of git ref
* fix: remove unused vars from example env
* fix: package name and license field
* fix: enable sourcemap for client and server
* fix: emojis not showing in prod
this is extremely cursed, but it works
* chore: refactor auth manager
* feat: disable invitations if simple auth disabled
* feat: add drop version to footer
* feat: translate auth endpoints
* chore: move oidc module
* feat: add weekly tasks
enabled object cleanup as weekly task
* feat: add timestamp to task log msgs
* feat: add guard to prevent invalid progress %
* fix: add missing global scope to i18n components
* feat: set base url for i18n
* feat: switch task log to json format
* ci: run ci on develop branch only
* fix: UserWidget text not updating #109
* fix: EXTERNAL_URL being computed at build
* feat: add basic language outlines for translation
* feat: add more english dialects
* fix: release workflow
* feat: move mostly to internal tasks system
* feat: migrate object clean to new task system
* fix: release not getting good base version
* chore: set version v0.3.0
* chore: style
* feat: basic task concurrency
* feat: temp pages to fill in page links
* feat: inital i18n support
* feat: localize store page
* chore: style
* fix: weblate doesn't like multifile thing
* fix: update nuxt
* feat: improved error logging
* fix: using old task api
* feat: basic translation docs
* feat: add i18n eslint plugin
* feat: translate store and auth pages
* feat: more translation progress
* feat: admin dash i18n progress
* feat: enable update check by default in prod
* fix: using wrong i18n keys
* fix: crash in library sources page
* feat: finish i18n work
* fix: missing i18n translations
* feat: use twemoji for emojis
* feat: sanatize object ids
* fix: EmojiText's alt text
* fix: UserWidget not using links
* feat: cache and auth for emoji api
* fix: add more missing translations