Zero-config dev boot + centralized branding (TEC-234, 235, 237, 231)#50
Merged
Merged
Conversation
Without a .env, env.server.ts substituted a dead placeholder DATABASE_URL that could never reach the Docker database, so the "app always boots in dev" guarantee produced a booted app where every page errored. Point the database fallbacks at the docker-compose.dev.yml defaults (postgres:postgres@localhost:5432/iridium and 5433/voltagent) so a fresh clone + `bun run docker:up` + `bun run dev` works with zero configuration. The dev banner still shows so it stays obvious you're on fallback values. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0153FGSLfBe9tV84usFroCVW
prisma.config.ts resolved env('DATABASE_URL') eagerly at import time, so
`bunx --bun prisma generate` failed with PrismaConfigEnvError on a fresh clone
with no .env — even though generate is pure codegen that never connects.
Resolve process.env.DATABASE_URL ourselves with the docker-compose default
fallback so generate (and migrate/seed against a running docker:up) work with
zero env. Production always sets DATABASE_URL, so the fallback never runs there.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0153FGSLfBe9tV84usFroCVW
Docker Compose derived the project name from the directory, so cloning or renaming the repo orphaned the old containers/volumes (iridium-postgres-1, iridium_pgdata) — invisible to `docker compose down`/`docker:nuke` and left to be removed by hand. Add an explicit top-level `name: iridium` so container and volume names are deterministic, and add `--remove-orphans` to docker:down and docker:nuke so removing a service also cleans up its container. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0153FGSLfBe9tV84usFroCVW
Rebranding a derived app required editing "Iridium" in 20+ spots. Add
app/config.ts exporting APP_NAME and APP_TAGLINE (client-safe, no server
imports) and consume it from every brand surface: per-route <title> tags and
meta/OgMeta descriptions, the SiteHeader brand link, the SiteFooter tagline,
both react-email templates, the reset-email subject, and the EMAIL_FROM
default. Values are unchanged ("Iridium"), so rendered output — and the E2E
specs asserting it — stay identical; rebranding is now a one-line change.
Left as follow-ups (higher risk / separate concern): the iridium_theme cookie
name (changing it invalidates existing cookies) and the @iridium.dev/.test
seed/test email domains.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0153FGSLfBe9tV84usFroCVW
…t doc .claude/agents/staff-engineer.md hardcoded an absolute agent-memory path (/Users/seth/repositories/iridium/...) that breaks the moment the repo is cloned or renamed. Make it repo-root-relative. This is the concrete "remove hardcoded absolute repo paths from agent docs" slice of TEC-232; the broader doc-dedup (single source of truth) is left for a follow-up. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0153FGSLfBe9tV84usFroCVW
…enshots Every UI change ended with the human as the verifier: agents reported "done" after a successful edit and the user ran the app and screenshotted it themselves. The repo already has the machinery (visual inventory helpers, Playwright fixtures, chat mocks) — this skill makes agents use it: boot on a dedicated port (7780), interact with the change via a throwaway spec, capture a light/dark × desktop/phone screenshot matrix, assert zero console errors, run the surface's e2e + visual guardrails, and hand back evidence instead of claims. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0153FGSLfBe9tV84usFroCVW
The backlog accumulated tickets that don't apply to this repo (imported from a derived app) and past-tense tickets describing finished work; nothing checked new tickets against the codebase until implementation time. This skill encodes the verify-before-fix sweep: fetch backlog/unstarted Iridium issues, skip ones already bearing a triage comment, grep the code to confirm or refute each ticket's checkable claims, classify (valid-safe / valid-needs-render / valid-large / already-done / not-applicable / unclear), and leave an evidence-backed comment. Triage never fixes and never changes state unless explicitly asked. Runnable on demand or on a schedule. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0153FGSLfBe9tV84usFroCVW
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Combs through the Iridium Linear backlog, verifies each ticket against the current code, and fixes the valid, tightly scoped ones. One commit per issue.
Fixes
TEC-234 — DEV_FALLBACKS should match docker-compose defaults
env.server.tssubstituted a dead placeholderDATABASE_URLthat could never reach the Docker database, so the "app always boots in dev" guarantee produced a booted app where every page errored. Points the DB fallbacks at thedocker-compose.dev.ymldefaults so a fresh clone +bun run docker:up+bun run devconnects with zero config. The dev banner still renders (its effect text was updated to match).Closes TEC-234
TEC-235 —
prisma generateshould not require DATABASE_URL locallyprisma.config.tsresolvedenv('DATABASE_URL')eagerly at import, sobunx --bun prisma generatefailed withPrismaConfigEnvErroron a fresh clone. Resolvesprocess.env.DATABASE_URLourselves with the docker-compose default fallback. Verified: config now loads withDATABASE_URLunset.Closes TEC-235
TEC-237 — Pin the compose project name so containers survive repo renames
Adds a top-level
name: iridiumtodocker-compose.dev.ymlfor deterministic container/volume names, and--remove-orphanstodocker:down/docker:nuke.Closes TEC-237
TEC-231 — Centralize app branding in a single APP_NAME config
Adds
app/config.tsexportingAPP_NAME+APP_TAGLINE(client-safe) and consumes it from every brand surface: per-route<title>tags and meta/OgMeta descriptions, theSiteHeaderbrand link, theSiteFootertagline, both react-email templates, the reset-email subject, and theEMAIL_FROMdefault. Values are unchanged, so rendered output — and the E2E specs asserting it — stay identical; rebranding is now a one-line change. Deferred as higher-risk follow-ups: theiridium_themecookie name and the@iridium.dev/.testseed/test email domains.Closes TEC-231
Triage of the rest of the backlog (verified, not fixed here)
Not applicable to Iridium — imported from a derived app (the-writing-room):
safe-area-insetoverflow, but there's nosafe-area-insetCSS anywhere to fix.Valid but out of scope for a safe, unrendered PR (large refactor / migration / design decision):
.env.example↔ schema (needs a design decision).Validation
APP_NAMEimport is wired to a real usage.session.server.test.ts) and fulltypecheckneed the generated Prisma client, andbinaries.prisma.shis blocked in this environment — CI runs them where the binaries are reachable.🤖 Generated with Claude Code
https://claude.ai/code/session_0153FGSLfBe9tV84usFroCVW