CASE STUDY · 2026

Juno: an AI wedding planner you can actually trust

An AI-agent product I built solo in about a month, and now use to run my own wedding. A case study in designing the trust boundaries that make an agent safe to hand real work to.

getjuno.tech · Next.js, Postgres, Claude

Deep dives: Evals instead of vibes · Building Juno with AI coding agents

While planning my own wedding, I kept hitting the same three problems every couple hits: there's no source of truth (decisions live across email threads, calls, contracts, and chat), the project-management overhead is enormous, and you've never done this before (you plan a wedding exactly once, with no way to know if you've covered everything).

Juno is my answer. Two names, one letter apart, so let me be precise. Juno is the product, a private planning studio for one couple. June is the planner who works inside it: an agent with her own inbox, her own voice, and deliberately limited powers. You forward vendor emails to June, upload contracts and proposals, and ask her to handle things. She reads everything, keeps the workspace current, and drafts outreach, but every change to your plan passes through your explicit approval.

The wedge is specific, because I lived it. We locked in the big, obvious vendor decisions (venue, caterer, photographer, florals) ourselves. At that point, hiring a human planner for thousands of dollars stops making sense. But that's exactly when the real work begins: months of small logistical and aesthetic decisions, dozens of vendor threads, none of it droppable, all of it living in email. A project that is high-stakes, email-centric, bounded in scope, and run by first-timers is close to an ideal shape for an agent, if the couple can trust it.

Juno's Today page: a morning greeting, a ready-to-review rail, past-due and upcoming task rails, and contracts awaiting signature
The Today page (demo workspace). Five independently-streaming rails: email proposals ready to review, past-due tasks, the next 14 days, contracts awaiting signature, and recent decisions.

The product

The workspace covers the whole planning surface: a kanban board for tasks, contracts with payment schedules, an hour-by-hour wedding-week timeline, a decision log, and inspiration boards. Two deliberate product choices shape all of it:

Kanban board with five status columns and shared category filters
The board: five statuses, drag-and-drop, one shared category taxonomy across tasks, contracts, and decisions. Note the "Needs your input" dot, where a June run paused on that task, waiting for an answer.
Contracts page showing in-review and signed vendor agreements with totals, payments made, and upcoming payment schedules
Contracts: totals, what's paid, what's owed, and when it's due. Payment schedules answer the money questions that actually bite, a deliberate substitute for a full budgeting product (more on that below).
Wedding week timeline with day-grouped agenda
The wedding week: day-grouped agenda with side-by-side lanes for concurrent events. Times are stored as venue wall-clock, so "4:30pm" means 4:30pm at the venue, no matter where you view it from.

Email in, reviewed changes out

The core insight: the source of truth already exists. It's just trapped in vendor email. So each workspace gets its own planner email address. Forward a vendor thread (or just CC June), and an ingestion pipeline turns it into structured, reviewable changes:

Vendor email+ documents Extractcandidate tasks / contracts / decisions / events Reconcileagainst existing rows + pending proposals Deterministic filterblocks status regressions Couple reviewsedit · approve · reject Workspace

The two-stage LLM pipeline (extract, then reconcile) is shared by email and uploaded documents. Reconcile sees the whole batch alongside existing data, so a new email can update an existing proposal in place or supersede one that a newer fact made obsolete, instead of piling up duplicates.

Review queue showing a vendor email thread and proposed changes with Edit, Approve and Reject buttons
The review queue. Each vendor thread groups its proposed changes; every field is editable before approving. The pipeline never writes to the plan directly; approval does.

Two design details here I'm particularly happy with:

Why June has her own inbox

One design decision I find most interesting: June doesn't touch the couple's email at all. Each workspace gets its own inbox, a real address like june-…@agentmail.to, that the couple forwards or CCs vendor threads to. Everything June reads arrives there; only mail from senders the couple has confirmed (or replies on threads June is already part of) gets in, and with an explicit opt-in, an approved outreach draft actually sends from June's address, in June's voice, with both partners CC'd. Vendors just reply to June, and the loop continues.

The obvious alternatives were OAuth into the couple's Gmail to read it, or sending on their behalf from their own address. I chose the separate inbox deliberately:

This is the design decision production has validated most clearly. I expected getting vendors to correspond with an AI to be the awkward part; instead, they simply started replying to June directly, the way they would to any coordinator. The persona and the dedicated address did the work: no explanation needed, no behavior to teach.

June: an agent with a structural firewall

Every chat conversation, a quick question or "handle this task for me," runs on one background engine. June can read the whole workspace, read ingested email and parsed documents, and search the web. When she needs something from you, the run pauses: a question, an email draft, or a proposed workspace change becomes a card in the conversation, and the run resumes only when you answer, approve, revise, or dismiss it.

Chat with June showing an answered question, an outreach email draft, a steering reply, and a proposed workspace change awaiting approval
One June run on a task: she asks about budget, drafts vendor outreach, and proposes a follow-up task, each a gate the couple explicitly clears. The reply box doubles as the approval surface: "Looks great, go ahead" resumes the run.

The safety model is the part I'd defend in any design review: the capability firewall is structural, not prompted. There is no send-email tool and no payment tool anywhere in the agent's tool registry. It isn't "the prompt says don't," it's that the capability does not exist. The workspace has 70 server actions; only 57 are registered as agent tools, and the gap is deliberate: sends, uploads, invites, and review-queue approvals are user-only. Sending an approved email happens as a user action at the approval seam (idempotent via a unique per-draft send claim, so double-clicking Approve can't double-send). A unit test pins the allowlist so a future refactor can't quietly hand the model send authority.

A few more agent-engineering details under the hood:

What I cut

A month of solo scope means saying no to things that would appear in any competitor's feature matrix. The clearest cut was budget tracking. Every wedding tool has a budget module; I skipped it. Contract payment schedules already answer the money questions that actually bite (what's owed, to whom, by when) as a side effect of data the pipeline extracts anyway. A full budgeting product (envelopes, forecasts, category rollups) is a different product, and building a mediocre version of it would have taken weeks away from the thing only Juno does: turning vendor email into a plan you can trust. Depth on the coordination loop beat breadth on the checklist.

Running my own wedding on it

Juno isn't a demo I built and moved on from. It's how my wedding is actually being planned. Every vendor thread now includes June. At any given time the board holds roughly thirty live tasks in equal thirds: about ten in the backlog, ten waiting on us, and ten waiting on vendors. The couple-side work is executing on a vision, a stream of logistical and aesthetic decisions, and keeping track of all of it is exactly the job Juno was built for.

How do I know if it's working? The metric I watch is tasks completed by June, and how many days a task sits in progress. So much of a wedding is locking in details sooner: every early decision returns time to the couple and surfaces downstream risks while they're still cheap. And the metric is honest by construction: nothing forces a couple to route work through June. They can complete any task themselves, so if June is completing tasks, it's because she earned them.

Two lessons from production that no amount of building in private would have taught me:

Evals instead of vibes

An agent product lives or dies on quality you can't see in a demo: does the extraction pipeline catch the payment schedule buried in an email? Does June answer from the workspace's actual data, or does she make something up? Both LLM surfaces have eval harnesses (22 golden fixtures for the ingestion pipeline, 21 scenario fixtures across 7 suites for the agent) built on a few opinionated principles: evaluate the production code path rather than a copy of it, score deterministically first and use an LLM judge only for the genuinely fuzzy residue, diff every run against a committed baseline instead of gaming a pass/fail threshold, and keep evals deliberately separate from CI. The full reasoning is in Evals instead of vibes.

How it was built

Juno is a solo project, built in about a month alongside actually planning the wedding, and it's also my testbed for AI-native development. I ran a spec-driven workflow with AI coding agents (Claude Code and Codex): each feature goes roadmap → spec → plan → task list → implementation, with the repo's conventions and invariants maintained in an agents-facing architecture document that keeps every session grounded. Four quality gates (lint, typecheck, unit tests, production build) plus a 36-test Playwright e2e suite against real auth and RLS run on every PR. What worked, what broke, and what it taught me about building with agent teams is in its own write-up.