Inspiration

Executive dysfunction isn't a motivation problem — it's a decision problem. The moment that breaks a day isn't the work itself; it's standing in front of 30 unread emails, 12 half-tasks, and a full calendar, and being unable to pick the one thing to touch first. Every app we tried made this worse: they showed us everything, brightly, all at once. Kanban boards, priority matrices, streak counters — each one a fresh surface to feel behind on. I wanted the opposite. Not a system that demands you organize your life before it helps, but one that reads the life you already have — your inbox, your calendar, your Drive — and quietly hands you a single next thing. Quadri is built around subtraction: throwing away the grid, the firehose, and the shame triggers until one card remains.

What it does

Quadri ingests three Google sources and normalizes every item into one quadrant_signals table in BigQuery, tagged by life quadrant:

  • Google Calendar → Fivetran → BigQuery
  • Google Drive (Sheets, Docs, Slides, PDFs) → Fivetran + direct API
  • Gmail → an LLM inbox-scan, with no stored connector — privacy by design

From that signal table, it does four things that matter:

  1. Surfaces one focus card — Back / Open / Next, an Up Next peek of three, and a collapsible Later lane. No quadrant grid. No ambient time bar (for time-blind users, a schedule staring back is a shame trigger, so slots are opt-in).
  2. Drafts the email you were dreading — when a signal needs a reply, the agent writes it. A Drive tracker row that flips to "fixed" triggers a follow-up, with cross-sheet recipient resolution: "Priya waiting on decision" in one sheet → her address found in another → the email addressed correctly.
  3. Attaches the right Drive doc automatically — a pricing inquiry email pulls the pricing-policy PDF into the draft via find_drive_attachments, and send_email builds the multipart MIME, so it actually rides along.
  4. Schedules send that actually fire, and rebalances overloaded days — pick a time and a background poller sends at that minute; when a day is overloaded, Quadri proposes moves, one at a time, each confirmed by you.

Crucially, the AI proposes; only you commit. Quadri never writes a phantom slot onto your calendar — a time block exists only because you explicitly dragged or asked for it.

How we built it

Quadri is a monorepo with two halves that deploy separately and talk over HTTP.

Frontend — Next.js 15, on Vercel. The App Router app renders the focus card, the chat dock, and the item modals. It's intentionally thin: it reads from BigQuery and calls the agent, but holds no business logic of its own.

Agent backend — FastAPI + Google ADK, on Cloud Run. This is the brain. The Google Agent Development Kit (ADK) defines the agent and its tools — draft_email, draft_signed_doc_email, find_drive_attachments, schedule_send, analyze_workload, suggest_rebalance, move_slot_to_date. FastAPI wraps it as a web service and also runs a background poller (a 60-second lifespan task) that fires scheduled email sends at the right minute — no Cloud Scheduler or cron needed.

Data warehouse — BigQuery. Everything normalizes into one quadrant_signals table. Classifier SQL tags Drive-sheet and calendar rows into the four life quadrants; the agent classifies inbox items. This single table is what lets a small agent reason over a messy, multi-source life.

Ingestion — Fivetran + direct OAuth. Fivetran is the main data path, syncing Google Calendar and Google Drive (Sheets, Docs, Slides, PDFs) into BigQuery on a schedule. Gmail is read on demand by an LLM inbox-scan — deliberately no stored connector, for privacy.

Outbound — Gmail & Google Calendar APIs. Sending email and syncing to Calendar round-trip through the user's own OAuth — Quadri never acts from its own identity. send_email builds the multipart MIME so auto-attached Drive docs actually ride along.

Demo mode. A single flag (QUADRI_DEMO_MODE) keeps every BigQuery read/write real while no-oping the outbound network calls, so the public link is safe to click through. This is what disables Export, Sync, and Send on the public link.

Challenges we ran into

  • Resolving people across sources. A sheet says "Priya," an email needs priya@…. Building reliable cross-sheet name→email resolution — without hallucinating an address — meant grounding every lookup in a second Drive sheet and refusing to send when the match was uncertain.
  • Designing for time blindness. Our first build had a calendar time bar on the home screen. Testing made it obvious it was a stressor, not a feature. Removing it — and making the AI propose-only, never auto-commit to a slot — was the single biggest UX decision.
  • Scheduling without infrastructure. We wanted real-time sends in a demo with no Cloud Scheduler. A FastAPI lifespan poller stamping metadata.send_at turned out to be enough, and far simpler to reason about.
  • Letting judges click without consequences. Demo mode had to be genuinely safe yet not fake — so we sandboxed only the final network hop and kept every BigQuery mutation real.
  • A new Next.js with breaking changes. The frontend ran on a Next.js build whose conventions diverged from what we knew, which meant reading the bundled docs before writing each surface.

Accomplishments that we're proud of

  • Multi-source life into one table. Gmail, Calendar, and Drive — three very different shapes of data — land in a single normalized quadrant_signals table that a small agent can actually reason over.
  • Recipient resolution that doesn't hallucinate. Quadri reads a name in one sheet and finds the email in another, and refuses to send when it isn't sure. Grounded, not guessed.
  • Real-time sends with zero extra infrastructure. A 60-second FastAPI poller delivers scheduled emails at the exact minute — no Cloud Scheduler, no cron, no queue.
  • A demo mode that's safe and honest. Judges can click Send and Sync freely; every BigQuery write is real, only the final outbound network call is sandboxed. Nothing is faked except what leaves the building.
  • An ADHD-first UI defined by what it removes. No grid, no streaks, no ambient schedule. The "Done today" panel hides itself when empty, so a slow day never becomes a shame trigger.
  • Shipped and live. Frontend on Vercel, agent on Cloud Run, data in BigQuery via Fivetran — a working end-to-end product, not a mockup.

What we learned

The hardest part of an ADHD tool is what you refuse to show. Quiet wins beat streaks; a done panel that hides itself when empty removes shame on slow days. AI is most trustworthy when it proposes, and you commit — the value isn't autonomy, it's removing the cost of deciding while leaving the decision yours. And a clean data path matters: funneling Calendar and Drive through Fivetran into one normalized quadrant_signals table is what lets a small agent reason over a messy multi-source life.

What's next for Quadri

Closing the loop on notes. Today, every note you jot auto-exports to a CSV you own; next:

  • Notes sync to Drive automatically, alongside the sheets they came from.
  • Notes update task status — "sent the contract, waiting on Priya" marks the task in progress on its own.
  • Notes spin up new tasks — "follow up with the vendor next week" becomes a classified task, no typing into a form. From capture to action — so the one thing you do leaves a trail that does the next thing for you.

Built With

Share this project:

Updates