Inspiration
Every founder, PM, and agency team knows the moment: someone drops a one-line idea into a doc — "build me a dashboard for X" — and everyone downstream has to guess what it actually means. AI tools make this worse, not better. Feed a vague prompt to a generator and you get a polished-looking output built entirely on invented assumptions nobody signed off on. Rework follows.
We wanted the opposite of "generate first, ask questions never." Lumixia Brief starts from the belief that a good brief isn't written, it's interviewed into existence — one adaptive question at a time, until the team can see exactly what's known, what's assumed, and what still needs a human decision.
What it does
Lumixia Brief turns a deliberately vague project idea into a reviewable, versioned one-page brief:
- Enter a rough idea.
- Answer 5–12 adaptive questions, one at a time — never while typing, only on submit.
- Watch confidence build across eight dimensions: Problem, Audience, Outcome, Scope, Constraints, Timeline, Risks, and Success criteria.
- Review a structured brief plus an "Alignment Improvement" summary showing what got clarified along the way.
- Reject any section for a focused follow-up question, or approve an immutable, versioned snapshot.
- Sync the approved version to a Notion page, idempotently — retrying never creates a duplicate.
The model (GPT-5.6) proposes facts, assumptions, contradictions, and dimension assessments. It never decides. The server independently calculates the confidence score, enforces stop rules, and owns every workflow transition — so the process stays explainable and testable, not a black box.
How we built it
- Frontend: React 19 + Vite, served from Vercel's CDN, with an EN/TH language switch and full desktop/mobile support.
- Backend: A single Express app running as one Vercel Fluid Compute function, with strict Zod contracts shared between client and server.
- Auth & data: Supabase Auth (Google OAuth + mandatory TOTP/AAL2) and Supabase Postgres with forced Row-Level Security on every table — RLS checks ownership and MFA independently of the application layer.
- AI: OpenAI's GPT-5.6 Responses API with Structured Outputs,
store:false, and strict retry rules — swappable behind a provider interface so the app can run fully mocked for development. - Integrations: Per-user Notion OAuth with AES-256-GCM-encrypted tokens, and an owner-operated Codex MCP server (
/api/mcp) that lets us run the entire interview through a Codex session instead of paid API calls, gated by Supabase OAuth 2.1 consent and AAL2. - Ops: Sentry with full payload redaction, Docker for local Supabase/portability checks only (not the runtime), GitHub Actions running format/lint/typecheck/unit/UI/RLS/E2E/audit/SBOM/secret-scan gates on every PR.
Codex was our pair programmer for nearly the entire build — scaffolding the app, implementing the confidence engine, writing the RLS policies, and generating the test suite — with every milestone logged in a Build Ledger and every architectural decision written up as an ADR.
Challenges we ran into
- No paid OpenAI credits during the build. We solved this by making the model provider fully swappable (
disabled/mock/live) and building an owner-operated Codex MCP integration plus a loopback bridge so the live interview could run against a real reasoning model without ever touchingOPENAI_API_KEY. - Browsers don't trust HTTPS pages calling
http://127.0.0.1. Our first Production rehearsal got blocked outright (ERR_BLOCKED_BY_CLIENT). We fixed it by keeping a same-origin loopback pairing popup open as a relay, so the production page never makes a mixed-scheme request directly. - Auth migration mid-build. We started on a third-party auth provider and migrated to native Supabase Auth to get first-class AAL2/MFA enforcement baked into both the API and RLS — a full rip-and-replace under deadline pressure.
- Keeping AI honest. It was tempting to let the model's confidence claims stand on their own. Instead we built a deterministic scoring rubric (
sum of dimension points / 24 × 100) entirely in server code, so the number is explainable and unit-tested, not a model's opinion.
Accomplishments that we're proud of
- Production fails closed: missing security or provider configuration stops the app from starting at all — no silent fallback to insecure defaults.
- 85%+ line/function coverage on the server, with stricter 90% gates on security-critical code, backed by unit, API, UI, Supabase RLS, and Playwright E2E suites.
- A fully working Codex MCP integration that lets the owner run the core product loop without spending a cent on the OpenAI API.
- A complete, sanitized audit trail — 22 Build Ledger milestones and 9 architecture decision records — documenting exactly what changed, why, and how it was verified.
- A sub-three-minute path from a vague one-line idea to an approved, Notion-synced brief.
What we learned
- Separating "the model proposes, the server decides" turns AI output from a trust exercise into something you can actually test and reason about.
- Loopback-to-browser communication under HTTPS has real, non-obvious security constraints — an origin-bound relay window ended up being simpler and safer than trying to fight the browser's mixed-content policy.
- Supabase RLS plus AAL2-aware JWT claims is a powerful pattern for enforcing MFA at the data layer, not just the UI.
- Writing ADRs and a build ledger while iterating fast with an AI pair programmer keeps decisions traceable instead of getting lost in commit history.
What's next for Lumixia Brief
- Turn on the live GPT-5.6 Responses API path for all users once API budget is approved (the code path is already contract-tested and ready).
- Richer Notion sync — mapping brief fields to database properties, not just creating a child page.
- Multi-brief workspaces with team comments and shared review, not just single-owner approval.
- Additional languages beyond EN/TH, and a lighter mobile-first interview flow.
Built With
- docker
- eslint
- express.js
- github-actions
- gpt-5.6
- model-context-protocol
- node.js
- notion-api
- openai-api
- openai-codex
- playwright
- postgresql
- prettier
- react
- react-router
- row-level-security
- sentry
- supabase
- supabase-auth
- totp
- typescript
- vercel
- vite
- vitest
- zod
Log in or sign up for Devpost to join the conversation.