Mark's Reports

← All reports

Bidet AI — public app fork, built end-to-end today

A separate distributable version of Bidet AI, forked from the personal Apex install, shipped as a private GitHub repo with a working settings UI and custom AI tabs. Two PRs merged. Domain wired. Email routing live. Ready to test locally; deploy is your call.

Date: 2026-04-26 (Sun). Architect: Claude Code on Apex. Coder: Cursor + Claude (PR 2 self-coded after Cursor stalled on harness verification). Cost: a few cents in API calls + one Gemini cap-raise.

The TL;DR. The differentiator (custom AI tabs that you define your own prompts for) is shipped and working. Two locked outputs run on every dump — Raw + Clean. Everything else is your tabs, your prompts, your call. Backend stateless, all your stuff lives in your browser via IndexedDB. No accounts, no DB, no Supabase, no Mark-paid tier (yet). Friends paste their Groq + Gemini keys once into Settings and use it.

What you have right now

Two PRs shipped to main

bf94ac8 — PR 2: browser-only architecture (IndexedDB state, stateless backend, custom tabs UI)

1fe7b2e — PR 1: Groq + BYOK LLM abstraction + Wake Lock + IndexedDB resilience + research-backed AI prompt

PR 1 — plumbing + recording resilience

PR 2 — the architecture pivot (and the differentiator)

The original plan was Supabase auth + a Postgres schema with users / sessions / tabs / outputs tables. After mocking up the Chrome-agent runbook for project creation and the JWT middleware spec, the right answer became obvious: none of that infrastructure was buying anything the BYOK model needs. Pivoted.

WhatOriginal planShipped
API keysEncrypted column in Supabase Postgres, server holds themIndexedDB on the user's browser, server only sees them per-request
Custom tabsPostgres tabs table with RLS policies + signup trigger to seed defaultsIndexedDB tabs store, defaults seeded on first page load
Session historyPostgres sessions + outputs tables, JWT-gatedIndexedDB sessions store, full history per user per browser
AuthSupabase email + passwordNone. Friends bookmark the URL, paste keys once.
Backend statePostgres + Supabase Auth + RLSNone. Two stateless endpoints: /transcribe, /run-tab
PRs to ship the differentiator4 (auth + schema + tabs runtime + Settings UI)1

The shipped backend is two endpoints:

The shipped frontend is a single HTML page + ~700 lines of vanilla JS:

Domain + email — wired

Two pivots that matter (the honest version)

Pivot 1 — chunked rotation didn't work. §5.10 of the original mission brief specced 30-second MediaRecorder chunks for resilience. Shipped that in PR 1, hit the classic timeslice gotcha (only chunk 0 has the WebM header), tried stop+restart rotation as a fix, hit a worse gotcha (late-run chunks degraded to empty 110-byte blobs after repeated stop+restart cycles in backgrounded tabs). Abandoned chunking entirely. Single MediaRecorder + Wake Lock + IndexedDB-on-failure = bulletproof for actual brain-dump use cases. Net audio lost: 0. Time spent down the chunking rabbit hole: ~2 hours of session that cost real Cursor cycles.
Pivot 2 — Supabase was overengineering. When you said "Seems like a lot of work on my part. Are you sure this is what we need to do?" you were right. The Supabase plan needed: a Chrome runbook for project creation, key capture, JWT verification middleware, RLS policies, signup trigger SQL, login/signup UI. All to provide auth and key storage that the BYOK model doesn't actually need. Browser-only is the right architecture for a "BYOK + tip jar" product. Three PRs collapsed into one.

What's left

How to test it locally right now

cd C:\Users\Breezy\bidetai-app
uvicorn web.backend.main:app --host 0.0.0.0 --port 8957 --reload

Open http://localhost:8957 → click ⚙ Settings → paste your Groq + Gemini keys → Save → record a 30-second test.

Watch all three default tabs (AI, Business Notes, Classroom Notes) render in parallel after Clean lands. Try editing AI's prompt and rerunning. Try adding a new tab. Try History to reload a past session.

Cost

ServiceSpentNote
Cloudflare$0Free tier; existing zone reused
Supabase$0Avoided entirely (pivot)
Groq verification~$0.01Two real .webm transcribes during architect verification
Gemini verification~$0.10End-to-end runs of Clean + AI tab on real audio
Gemini cap raiseapproved this sessionWas on free tier, blocked verification once. You raised it; one-time event, no monthly subscription change
Cursor session~hours of CursorPR 1 + harness work; Cursor-agent CLI hung silently for ~2h on the first dispatch (token-burning loop). Killed and restarted manually. Real coding time was ~20 min.
Architect (Claude Opus)significantLong session; multi-pivot iteration. PR 2 self-coded after Cursor's harness kept failing on automation issues that weren't real product gates.

Memory updates

Decisions you made today (for the record)

Generated 2026-04-26 evening from the live session that built this. If anything in this report doesn't match what you see in the repo, the repo is truth.