This switches demo pages and modules to local web/vendor assets, fixes Three GLTFLoader local import resolution, and documents the runtime-data/agent commit workflow updates. Made-with: Cursor
Momswap Geo Backend
Go backend service for user-owned GeoJSON feature collections with Ed25519 authentication and invitation-based onboarding.
What is implemented
- Ed25519 challenge-response auth (
/v1/auth/challenge,/v1/auth/login) - Hybrid invitation onboarding (signed invite payload + inviter lineage)
- User registration with ownership proof (
/v1/auth/register) - Per-user collections and Point feature CRUD endpoints
- Static no-build frontend (
web/) using Vue + Vuetify from CDN - Reusable TypeScript API client (
libs/geo-api-client) using@noble/ed25519 - Bun tests for the TS client and Go tests for API flows
- Gitea CI workflow running Go and Bun test suites
Quick start
go test ./...
go run ./cmd/api
var/ is runtime data and is ignored by git.
Run tests via Docker (avoids local permission issues, e.g. var/):
docker compose --profile test run --rm test
Primary deployed base URL: https://tenerife.baby/.
Local default (for development): http://localhost:8122.
Optional environment variables:
ADDR(default:8122)ADMIN_PUBLIC_KEY— required for registration: bootstrap admin + service key forregister-by-signature. Generate with./bin/gen-admin-key.shSERVICE_PUBLIC_KEY(public key users sign to register; defaults toADMIN_PUBLIC_KEY)
Deployment: Set ADMIN_PUBLIC_KEY before starting. Without it, /v1/service-key returns 503 and registration is disabled.
Docker Compose
Generate server keys (creates etc/server-service.*), then build and run:
./bin/gen-server-keys.sh
COMPOSE_BAKE=true docker compose up --build -d
Or use ./bin/up.sh which runs the key generation if needed.
This starts:
db(postgis/postgis) on5432inside the container, exposed as7721on the host for remote accessapion8122— uses PostgreSQL viaDATABASE_URL(migrations run on startup)minio(S3-compatible storage) with admin UI on8774and internal S3 API on9000
Remote DB access (e.g. postgres://momswap:momswap@HOST_IP:7721/momswap?sslmode=disable): The init script etc/pg-init-remote.sh configures pg_hba.conf for remote connections on fresh installs. If the DB was initialized before that was added, run once: ./bin/fix-pg-remote.sh
Stop the service:
docker compose down
For local development with file watching/rebuild:
COMPOSE_BAKE=true docker compose up -d
COMPOSE_BAKE=true docker compose watch
Notes:
apiservice listens on8122inside the container, mapped to host8122(reverse proxy athttps://tenerife.baby).apiservice uses the productionruntimeimage target.api-devprofile uses thedevimage target and Docker Compose watch.- DB defaults can be overridden via
POSTGRES_DB,POSTGRES_USER,POSTGRES_PASSWORD. - S3 defaults can be overridden via
S3_ENDPOINT,S3_BUCKET,S3_REGION,S3_ACCESS_KEY,S3_SECRET_KEY,S3_USE_PATH_STYLE,S3_USE_TLS.
Frontend
Frontend is served by the Go backend at runtime.
Example:
go run ./cmd/api
Then visit:
- Production:
https://tenerife.baby/web/ - Local:
http://localhost:8122/web/ - Local Leaflet demo:
http://localhost:8122/web/leaflet-demo.html - Local MapLibre GL + Three.js demo:
http://localhost:8122/web/maplibre-demo.html
Documentation
| Doc | Description |
|---|---|
| docs/frontend-development.md | Demo app (web/), client build, local dev |
| docs/typescript-frontend-integration.md | TypeScript client API, integration flow, examples |
| docs/ed25519-security-use-cases.md | Ed25519 auth flows, registration, signatures |
| docs/geo-auth-backend-plan.md | Architecture and planning |
| docs/assets-storage-and-sharing.md | Asset metadata, dedup, visibility rules, and properties.assets contract |
| docs/docker-minio-local-dev.md | MinIO compose topology, bucket bootstrap, and local verification |
API client library
Path: libs/geo-api-client
cd libs/geo-api-client
bun install
bun test
bun run build
CI
Workflow: .gitea/workflows/ci.yml
go test ./...bun testinlibs/geo-api-client
Testing policy
- Keep fast unit tests as the default (
go test ./...). - If a test requires a real Postgres instance, use embedded/ephemeral Postgres in the test process or test fixture lifecycle.
- Do not require manually running an external Postgres container for routine test runs.