This loads image files via backend asset links (with auth when available), applies them as Three.js textures on plane meshes, and falls back to primitive placeholders if texture loading fails. 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.