Edge-native event-query service for concerts, gigs, comedy, and live experiences.
- Public event search UI (SvelteKit).
- Open API endpoints under
/api/v1/*. - Postgres data model and seed data (Drizzle + SQL migrations).
- OTLP observability with local Grafana LGTM (logs, traces, metrics).
- OpenAPI spec generation from Zod-backed contracts.
SvelteKit+TypeScriptBun(package manager, script runner, local tooling)Drizzle ORM+PostgreSQLOpenTelemetry+Grafana LGTMZod+zod-to-openapi
src/routes: UI routes + API routes.src/lib/server: DB access, domain logic, observability, OpenAPI builder.scripts: migration/seed/openapi generation scripts.drizzle: SQL migrations.docs: architecture/setup docs + generatedopenapi.json.static: static assets (favicon, etc.).
- Bun
>= 1.3 - Docker + Docker Compose
- Copy environment file (
cp .env.example .envon macOS/Linux,Copy-Item .env.example .envon Windows PowerShell). - Start infrastructure:
docker compose up -d - Install dependencies:
bun install - Apply migrations:
bun run db:migrate - Seed local data:
bun run db:seed - Start app:
bun run dev
- App:
http://localhost:5173 - Health:
http://localhost:5173/api/v1/health - OpenAPI JSON:
http://localhost:5173/api/v1/openapi.json - Swagger UI (dev):
http://localhost:5173/api/v1/docs - Grafana LGTM:
http://localhost:3000
bun run dev: Start development server.bun run build: Build app.bun run preview: Preview production build.bun run check: Type-check + Svelte diagnostics.bun run db:migrate: Run SQL migrations indrizzle/.bun run db:seed: Seed local sample data.bun run openapi:generate: Generatedocs/openapi.json.
GET /api/v1/healthGET /api/v1/searchGET /api/v1/events/:idPOST /api/v1/eventsPATCH /api/v1/events/:id
Search query parameters:
q,city,from,to,genre,vibe,limit,offset- optional geo:
lat,lng,radius_km
- OTLP endpoint/protocol configured via environment variables.
- HTTP request logs/traces are correlated (
trace_id,span_id,request_id). - Local LGTM stack is defined in
docker-compose.yml.
- MVP routes are intentionally unauthenticated for fast iteration.
- Error JSON shape is stable:
{ "error": { "code": "...", "message": "..." } }