Phase 1: Walking Skeleton
First milestone: deployable Go API binary + full test/CI infrastructure. No queue logic yet (that's Phase 2).
What works
- Single Go binary (cmd/api) exposing /healthz and /version, graceful shutdown on SIGTERM
- Local dev: docker compose up brings api + postgres + redis online
- Tests: unit (race-enabled) + integration (real Postgres + Redis via testcontainers-go, no mocks)
- Lint: golangci-lint v2 with errcheck, govet, ineffassign, staticcheck, unused, gosec, misspell
- Git hooks: pre-commit (gofmt + vet + short tests) and pre-push (lint + race tests), opt-in via make install-hooks
- CI: GitHub Actions runs lint + unit + integration + image build on every push and PR
- K8s manifests authored under deploy/k8s/, validated offline with kubeconform
- Docker: multi-stage build to distroless/static-debian12:nonroot
Not yet (by design)
- Queue logic (Phase 2)
- Gmail/Drive integration (Phase 3)
- Live deployment to Hetzner (Phase 1.5)
- Dashboard UI (Phase 4)
Stack
Go 1.25, chi, pgx/v5, go-redis/v9, slog, testcontainers-go, Docker, GitHub Actions, k3s manifests.