- Migrate static JS to TypeScript (static-ts/ → compiled to internal/api/static/)
- Add image resizing on upload: JPEG/PNG/WebP scaled to max 1920px at quality 80
- Extract shared upload logic into upload.go (saveUpload, saveResizedImage, saveResizedWebP)
- Add POST /media endpoint for drag-drop/paste media uploads with markdown ref return
- Add background music player with video/audio coordination (autoplay.ts)
- Add global nav, public feed, hashtags, visibility, Markdown rendering for entries
- Add Dockerfile stage for TypeScript compilation (static-ts-builder)
- Add goldmark, disintegration/imaging, golang.org/x/image dependencies
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Public feed (/) with infinite scroll via Intersection Observer
- Self-registration (/register)
- Admin area (/admin/entries, /admin/users) with user management
- journal_entries: visibility (public/private) + hashtags fields
- users: is_admin flag
- DB schema updated (recreate DB to apply)
- CI: run go test via docker run (golang:1.25-alpine) — fixes 'go not found'
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Introduce store interfaces (TrackpointStorer, StopStorer, SuggestionStorer)
in internal/db/interfaces.go so handlers can be tested without a real DB.
- Refactor HandleSingleTrackpoint, HandleBatchTrackpoints, HandleListDays,
HandleListTrackpoints, HandleListStops, HandleListSuggestions to accept
the new interfaces instead of concrete *db.*Store pointers (no behaviour
change; concrete types satisfy the interfaces implicitly).
- internal/api/ingest_test.go: 13 handler tests covering happy path,
invalid JSON, invalid timestamp, missing event_id/device_id, out-of-range
lat/lon, empty/oversized batch, store errors, and idempotency (single + batch).
- internal/api/query_test.go: 14 handler tests covering missing query params
(400) and empty-result-is-array guarantees for all four query endpoints.
- internal/auth/auth_test.go: 5 unit tests for HashPassword / VerifyPassword
(correct password, wrong password, empty password, malformed hash, salt
uniqueness).
- internal/db/trackpoints_test.go: 6 unit tests for the validateTrackpoint
helper (happy path, missing fields, coordinate bounds, invalid source).
- .gitea/workflows/deploy.yml: add "Test" step (go test ./...) before
"Build & Deploy" so a failing test aborts the deployment.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Secure: true requires HTTPS — cookie was not sent back on HTTP requests,
breaking the session after login.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove submodule tracking; backend is now a plain directory in the repo.
Also update deploy workflow: remove --recurse-submodules.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add root Dockerfile: node build → copy dist into Go embed path → distroless binary
- Update docker-compose: one service (api on :9050), DB renamed ralph→pamietnik
- Remove references to RALPH/reisejournal across all docs and configs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>