main #1

Merged
luke merged 42 commits from main into test 2026-08-07 10:14:55 +01:00
Owner
No description provided.
luke added 42 commits 2026-08-07 10:03:11 +01:00
Server clones still pointed to old GitHub remotes after Codeberg migration.
Switch container registry from Codeberg to self-hosted registry.gsylabs.gg
Some checks failed
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Failing after 41s
Deploy / deploy-dev (push) Has been skipped
6789990e52
chore: move to host.gsylabs.gg registry + odin deploy (new standard)
Some checks failed
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Failing after 3m6s
Deploy / deploy-dev (push) Has been skipped
bc290189c0
chore: retry build (docker hub rate limit hit)
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 1m44s
Deploy / deploy-dev (push) Successful in 20s
a792f8b5a8
fix: add set -e to dev deploy, use --env-file per env
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 2m13s
Deploy / deploy-dev (push) Successful in 21s
5677b3b14f
fix: install drizzle-kit in runtime image for schema push
Some checks failed
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / build-dev (push) Failing after 53s
Deploy / deploy-dev (push) Has been skipped
8ec9d8dc27
fix: drizzle-kit in runtime image for schema push (devDep stripped by npm ci --omit=dev)
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 1m42s
Deploy / deploy-dev (push) Successful in 15s
32c3b40cae
fix: drizzle-kit needs drizzle-orm at runtime — install both globally
All checks were successful
Deploy / build-and-push (push) Has been skipped
Deploy / test (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 1m59s
Deploy / deploy-dev (push) Successful in 17s
bfa90ac08b
fix: install drizzle-kit into project node_modules (config requires it locally)
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / build-dev (push) Successful in 3m37s
Deploy / deploy-dev (push) Successful in 19s
2bf218ac3e
fix: rebuild bcrypt native binding + keep drizzle-kit local in runtime
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 5m33s
Deploy / deploy-dev (push) Successful in 25s
7bc3ba3ef1
fix: use -p roadsgg-{env} project convention, drop container_name (matches dcu helpers)
Some checks failed
Deploy / build-and-push (push) Has been skipped
Deploy / test (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Failing after 2m1s
Deploy / deploy-dev (push) Has been skipped
a17e389f3c
fix: pull base image from self-hosted registry (no Docker Hub rate limits)
Some checks failed
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Failing after 2m21s
Deploy / deploy-dev (push) Has been skipped
9e7f6c9f4a
chore: retry after buildkit cache prune (base image from self-hosted registry)
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 3m4s
Deploy / deploy-dev (push) Successful in 22s
ed94defdce
feat: standalone Hono API service + shared db package (iOS initiative)
Some checks failed
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Failing after 1m54s
Deploy / deploy-dev (push) Has been skipped
3a9785afd0
- Extract Drizzle schema to packages/db (npm workspaces), web imports rewritten
- New api/ Hono service: dual cookie/bearer auth, account deletion, closures,
  votes, comments, photos (sharp->S3), roads-data, route, events SSE, contact,
  admin endpoints, ArcGIS cron (env-gated), debug API with masked fields
- Contabo S3 photo storage (public bucket) + volume->S3 migration script
- Email: Resend with verification enabled, verify/reset/contact flows
- docker-compose.dev.yml: api service behind Host+PathPrefix(/api), no valhalla
- Forgejo workflow: build+push api image for dev/test deploys
- Fix pre-existing build break (activeClosureFilter export in route endpoint)
- 171 api tests + 613 web tests green
fix: restore workspace-aware Dockerfile (packages/db moved out of src/lib/server/db)
Some checks failed
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Failing after 1m7s
Deploy / deploy-dev (push) Has been skipped
376ee7a352
The phase-1 workspace extraction moved the db schema to packages/db, but the
deploy-fix commits overwrote the Dockerfile with the pre-workspace version,
leaving COPY --from=builder /app/src/lib/server/db pointing at a path that no
longer exists. Runtime image build fails on the runner. Restore the
workspace-aware COPYs + workspace manifests for npm ci in both stages.
fix: use self-hosted registry base image for api (avoid Docker Hub rate limits)
Some checks failed
Deploy / build-and-push (push) Has been skipped
Deploy / test (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Failing after 1m35s
Deploy / deploy-dev (push) Has been skipped
c4be98d1ae
Align api/Dockerfile with the web Dockerfile: FROM
host.gsylabs.gg/gyslabsgg/node:22-alpine instead of node:22-alpine.
The runner's push failed with 'toomanyrequests' (Docker Hub 429) because
the api image pulled its base from Docker Hub while the self-hosted
registry is the configured mirror.
ci: prune buildkit cache before builds (fix toomanyrequests from stale Docker Hub layers)
Some checks failed
Deploy / build-and-push (push) Has been skipped
Deploy / test (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Failing after 4m5s
Deploy / deploy-dev (push) Has been skipped
960e206062
The runner's buildkit cache still holds base-image layers from the old
Docker Hub-based Dockerfiles. Pushing images that reference those stale
blobs triggers revalidation against Docker Hub and fails with
'toomanyrequests' (429). Prune the buildkit cache before each build so
bases are pulled fresh from the self-hosted registry — the same fix as
ed94def (manual prune + retry), now automatic in the pipeline.
chore: retry build after Traefik unbuffered registry uploads fix
Some checks failed
Deploy / build-and-push (push) Has been skipped
Deploy / test (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Failing after 4m3s
Deploy / deploy-dev (push) Has been skipped
15a9fecec0
chore: retry build after runner fetch_interval fix (5s polling)
Some checks failed
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Failing after 5m19s
Deploy / deploy-dev (push) Has been skipped
33aa028d50
chore: retry build after runner report_interval fix (5s)
Some checks failed
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Failing after 4m16s
Deploy / deploy-dev (push) Has been skipped
33282c133e
chore: retry build after fixing stale REGISTRY_PASSWORD secret
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 6m43s
Deploy / deploy-dev (push) Successful in 46s
aa71803efa
remove route planning feature from UI and API
Some checks failed
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Failing after 4m2s
Deploy / deploy-dev (push) Has been skipped
759843b86e
- Delete RouteCard.svelte (directions card with origin/dest inputs)
- Delete SvelteKit /api/route endpoint and tests
- Delete separate API server route handler and tests
- Delete routeCache from offline IndexedDB schema
- Delete geocoding utils (only used by RouteCard)
- Remove routePolyline prop and rendering from MapView
- Remove fab-route button and CSS from +page.svelte
- Remove GeoLocation, RouteResult, RouteWaypoint types
- Remove route import/registration from api/src/index.ts
fix: retry docker push after build (first push spuriously fails client-side)
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 6m42s
Deploy / deploy-dev (push) Successful in 43s
30683a955f
fix: add local filesystem fallback to photo upload when S3 is not configured
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 5m22s
Deploy / deploy-dev (push) Successful in 39s
6f96c1b21a
- uploadToS3 now returns the storage path (S3 key or local filesystem path)
- deleteFromS3 handles both S3 keys and local file paths
- photoUrl returns /storage/photos/ filename when S3 is not configured
- processAndSavePhoto uses uploadToS3's return value as the authoritative filepath
feat: redesign auth pages with tabl.gg-style login layout
All checks were successful
Deploy / build-and-push (push) Has been skipped
Deploy / test (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 5m20s
Deploy / deploy-dev (push) Successful in 21s
651b907b60
Copy tabl.gg's login visual design onto roads.gg's /login, /register and
/forgot-password: centered brand header (logo + wordmark drop-shadow),
rounded-2xl card, rounded inputs with primary focus ring, boxed error
messages, full-width primary button, centered footer link. Uses roads.gg's
sky-blue primary and CSS variable system; adds SEO meta via SEO.svelte.

New shared AuthCard.svelte component replaces ~60 lines of duplicated auth
CSS across the three pages. All form logic, logged-in states, password
requirements and the forgot-password success state are preserved.
feat: auto-send verification code on /verify load with 60s resend cooldown
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 4m7s
Deploy / deploy-dev (push) Successful in 28s
2c9c20869c
- Verify page auto-sends a new code on load when the account is unverified
  and no code was sent in the last 60s, fires once per session, and resumes
  an in-progress countdown on reload
- 60s resend cooldown: button disabled with live countdown, shows last-sent
  time ("Code sent at HH:MM — request another in Xs", then "Code last sent
  at HH:MM")
- Register records send time before redirecting so first arrival at /verify
  doesn't send a duplicate email
- Cooldown state is client-side localStorage; server's 3/hour per-IP resend
  rate limit remains the real cap
- New verifyCooldown util with unit tests (8 cases)
fix: photo add/remove buttons no longer submit the closure report form
All checks were successful
Deploy / build-and-push (push) Has been skipped
Deploy / test (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 3m51s
Deploy / deploy-dev (push) Successful in 22s
7fd6fdbc70
PhotoUploader's add-photo and remove buttons lacked type="button", so
inside SubmitForm's <form> they defaulted to type="submit" — clicking
"Add photo" submitted the report whenever location was set. Added
explicit type="button" to both buttons in the shared component (fixes
SubmitForm and QuickReportForm).
fix: photo uploads on dev write to shared volume; guard S3 URL generation
All checks were successful
Deploy / build-and-push (push) Has been skipped
Deploy / test (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 3m42s
Deploy / deploy-dev (push) Successful in 27s
05f0b2853c
On dev, traefik routes /api/* to the Hono API service, but that container
had no volume mounted, so the local-filesystem fallback wrote photos to
ephemeral container disk — the app (which serves /storage/photos) never
saw them, and redeploys wiped them. Root cause of intermittent photo 404s.

- docker-compose.dev.yml: mount photo_storage_dev at /app/storage/photos
  on the api service (shared with the app, persistent)
- api/src/storage.ts: photoUrl only emits S3 URLs when S3_PUBLIC_URL is
  set — partial S3 config previously produced broken relative /filename
  URLs
- api/vitest.config.ts: add S3 creds to the test env (test expected an S3
  URL but the env lacked creds; fixes a pre-existing failing test)
fix: require full S3 config (incl. public URL) before enabling S3 storage
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / build-dev (push) Successful in 4m4s
Deploy / deploy-dev (push) Successful in 27s
c7031babc2
With S3 credentials set but S3_PUBLIC_URL missing, uploads went to S3
while photoUrl returned local /storage/photos URLs — every photo 404ed.
Now isS3Configured() requires endpoint, access key, secret key AND public
URL, so upload, URL generation and delete all agree: fully-configured S3
end-to-end, or the local shared-volume fallback.
fix: app display paths resolve photo URLs via S3 when configured
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 5m33s
Deploy / deploy-dev (push) Successful in 47s
c46f4fabff
Uploads went to S3 (via the Hono API) but the SvelteKit app hardcoded
/storage/photos URLs in 9 read paths (homepage SSR, closure detail, admin,
debug UIs, app-side closure APIs), so every photo 404ed on display.

- New src/lib/server/photoUrl.ts: same all-or-nothing S3 gate as the API;
  returns S3_PUBLIC_URL/filename when fully configured, otherwise the
  local /storage/photos route (prod unchanged — no S3 vars there)
- env.ts + docker-compose.dev.yml: app container now receives the S3 vars
- All 9 read paths use the helper; admin PhotosTab URLs resolved
  server-side (client cannot read private env)
- 4 unit tests for the helper
Delete the app's 71 /api endpoints (src/routes/api/**) and the three
server modules only they used (ratelimit, email, contentFilter). The Hono
api service now owns the API surface for web + iOS on every environment.

- Port the 4 debug UI mirrors (/api/debug/ui/{homepage,admin,account,
  closure}) and an /api/health alias into the api service, with smoke tests
- Add CORS middleware to Hono (CORS_ORIGINS env, default *)
- docker-compose.prod.yml + docker-compose.yml: add the api service with
  Host && PathPrefix(/api) routing and the shared photo volume (local
  fallback path unchanged for existing prod photos)
- .env.production.example documents S3/CORS/ARCGIS_CRON_ENABLED
- Bump SW api cache to v16 (backend swap invalidation)
- playwright: E2E_BASE_URL support to run e2e against a deployed env
  (local preview no longer serves /api)

Verified: app 515 tests, api 167 tests, svelte-check clean, composes valid.
fix: add api service to test compose (backend removal parity)
All checks were successful
Deploy / test (push) Has been skipped
Deploy / build-and-push (push) Has been skipped
Deploy / deploy-test (push) Has been skipped
Deploy / deploy-production (push) Has been skipped
Deploy / build-dev (push) Successful in 4m24s
Deploy / deploy-dev (push) Successful in 31s
Deploy / build-dev (pull_request) Has been skipped
Deploy / deploy-dev (pull_request) Has been skipped
Deploy / test (pull_request) Successful in 2m19s
Deploy / build-and-push (pull_request) Has been skipped
Deploy / deploy-test (pull_request) Has been skipped
Deploy / deploy-production (pull_request) Has been skipped
0100b9500c
luke merged commit 09ea698ad3 into test 2026-08-07 10:14:55 +01:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
gsylabsgg/roads.gg!1
No description provided.