// changelog
Changelog
> everything that shipped, reverse chronological.
2026-04-20
v0.2.0 — deploy pipeline
Deploy pipeline
Added
- Agent binary (Bun) with WebSocket protocol back to the relay, heartbeat, and exponential-backoff reconnect
- Relay agent-gateway: pre-shared-token auth + in-memory connection manager with least-loaded agent selection
- BullMQ build queue and dispatcher that routes jobs to an agent and updates the deployment row as it progresses
- Nixpacks build pipeline on the agent: git clone via GitHub installation token → Nixpacks detect → Docker build → internal registry push
- Container lifecycle handlers on the agent: start, health check (3×30s), drain-then-stop, with stable labels for later retention
- Caddy Admin API integration for dynamic preview routing at {slug}--{sha}.preview.primdb.local
- HTML response rewriter running inside the agent so promoted hosts can later carry the overlay bundle without changes in user apps
- GitHub App installation-token helper (@primdb/github) and PR comment bot for preview-ready and build-failed events
- GitHub webhook receiver on the relay with HMAC-SHA256 signature verification, auto-supersedes prior preview builds per PR
- Deployments API (GET /api/projects/:slug/deployments) and a dashboard tab rendering status badges, preview URL, and failure reasons
- Transactional email via Resend with an invite template and a log-fallback when RESEND_API_KEY is unset
- Full docker-compose orchestration: Docker registry v2, agent container, preview bridge network, Caddy Admin API exposed on :2019
- Manual end-to-end Playwright spec documenting the PR → preview URL flow (skipped in CI, reproducible by hand)
Changed
- Agent + relay modules lazy-initialize the GitHub App so the integration test suite does not need a real private key
- Dispatcher branches on job_status payload shape to chain build → start → route-register without adding new message types
- Dockerfiles bumped from bun:1.2-alpine to bun:1-alpine so local bun 1.3 lockfiles still install inside containers
Fixed
- Workspace package.json files for agent-protocol, github, and agent were missing from relay/dashboard/migrate Dockerfiles; installs now succeed under --frozen-lockfile
- Octokit rest namespace is not available on getInstallationOctokit(); switched to the generic octokit.request() to avoid adding @octokit/plugin-rest-endpoint-methods
- BusyBox tar shipped in oven/bun's Alpine base rejects Nixpacks' install script; added GNU tar to apk packages
- Invite email HTML now escapes user-controlled values (inviter + project name) to close an obvious XSS vector
2026-04-20
v0.1.1 — dev environment & visual polish
Dev environment & visual polish
Added
- Full-stack docker-compose: relay, dashboard, and a one-shot migration runner all containerized with bind-mounted source for hot reload
- Gurulu-aligned design system adopted across the dashboard (Tailwind 3.4 + shadcn/ui New York preset + pixel theme default)
- Landing page at / with Silkscreen hero, a six-card feature grid, a terminal status block, and a three-column footer
- Public /changelog page (this one) with serif headings and a terminal-style subtitle
- Developer sign-in form on /login gated by NEXT_PUBLIC_PRIMDB_DEV=1 for bypassing GitHub OAuth during local iteration
Changed
- Project list moved from / to /dashboard so unauth visitors land on the marketing page; authed users redirect there automatically
- Navbar renders Changelog + Sign in for anon users and Dashboard + Changelog + sign-out for authed users
- Dashboard server components prefer RELAY_URL_INTERNAL when set so Docker internal networking works without exposing the relay URL to the browser
Fixed
- Sign-in page no longer crashes on empty responses from Better Auth; surfaces a specific hint when GitHub OAuth credentials are missing
- Better Auth Drizzle adapter now passes generateId: () => crypto.randomUUID() so Postgres accepts our uuid primary keys instead of the default nanoid strings
2026-04-20
v0.1.0 — foundation
Foundation
Added
- Monorepo scaffold (Turborepo + Bun + TypeScript) across relay, dashboard, agent (stubbed), shared, db
- Postgres / Redis / MinIO / Caddy infrastructure via docker-compose with a one-shot migration runner
- Platform API: project CRUD, member invites, invite acceptance, billing subscription endpoint
- Authentication via Better Auth with GitHub OAuth social provider and automatic Free-tier subscription creation on sign-up
- GitHub App install callback storing installation_id on the user record
- Dashboard UI: login, project list, new project, project detail, members, settings, invite acceptance
- Design system: Tailwind 3.4 + shadcn/ui (New York preset) + pixel theme as default, matching Gurulu's system
- Foundation E2E test covering sign-in → create project → project appears in list
Changed
- Error handling switched to Hono's idiomatic app.onError(handler) pattern after the middleware variant didn't intercept downstream throws
- Database client made lazy (Proxy + __resetDbForTests) so integration tests can spin up fresh Postgres testcontainers per describe block
Fixed
- Env validation: dev secrets are now real 32-byte / 44-char base64 values so Zod schema passes on boot
- Docker image builds: added root .dockerignore so host node_modules never leaks into image layers
- Better Auth drizzle adapter: usePlural: true (schema exports plural table names)
roadmap
Roadmap
Plan 3 — Feedback overlay
- Injected overlay bundle on preview HTML
- Magic-link email auth for commenters (project-scoped 24h JWT)
- Comment CRUD with threads, edit/delete/resolve/reopen
- Per-URL-path .md export
Plan 4 — Approval gate & promote
- Approve/revoke per preview with rebuild reset
- Promote with "≥1 approve + 0 open blocker" gate
- Atomic Caddy route swap with container drain
- One-click rollback with audit log
Plan 5 — Custom domain & billing
- DNS verification + Let’s Encrypt via Caddy Admin API
- Stripe checkout, customer portal, invoice handling
- Tier-based quota enforcement and soft-limit warnings