// 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 3Feedback 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 4Approval 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 5Custom 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