Odd Job Oona
HOW IT WORKS

How a sentence becomes a booking.

A customer writes or says what’s wrong. The page reads it as they type, offers real open slots, books one, and emails the confirmation. Oona reviews only the exceptions, in one evening pass.

01LIVE PARSE PROBE · THE BOOKING PAGE’S OWN RULES
Type a job the way a customer would.
ROUTEAsks what’s brokenNo job word yet. The page asks one short question.
deterministicParse() → plan0.00 ms · in your browser
{
  "job": null,
  "extraJobs": [],
  "day": null,
  "time": "any",
  "avoidDays": [],
  "where": null,
  "urgency": "routine",
  "photoNeeded": false,
  "inScope": true,
  "needsOwnerReview": true,
  "route": "ask_clarify"
}
On the real page the server also asks TypeSafe JEV and OpenAI, then checks their answers with these same rules before offering any time.
02PIPELINE
N1LIVE
CaptureFree text, or dictation streamed to OpenAI’s gpt-live-transcribe over WebRTC, with Portland neighbourhoods as keyword hints. The browser’s own speech recognition is the fallback.→ raw text
N2LIVE
ReadRules underline jobs, days, times and places as you type. TypeSafe JEV and OpenAI (via Lovable AI) add typed decisions; rules are the fallback.→ plan + sources
N3LIVE
ResolveDeterministic code turns phrases into Portland dates and time limits, checks the service area and ZIPs, and finds open windows with travel buffers.→ real slots
N4LIVE
BookThe chosen slot is re-checked and saved; the database refuses overlaps. The customer gets a reference and a no-password booking link.→ booking
N5PARTIAL
EmailConfirmations, replies and move requests go out through Resend, marked sent only when Resend confirms. Reminders are stored, not yet scheduled.→ sent / queued
N6LIVE
TriagePhoto jobs, several-job visits, leaks that need a move and not-a-fit requests queue for Oona’s evening.→ send · edit · tomorrow
CHANGE LOOPcustomer says what changed→read as move, cancel or a note→real alternatives, or cancel→freed slot offered to the waitlist
03WHAT THE READING KNOWS
Tap or plumbingtap, faucet, drip, sink, toilet, drain, showerBooks itself when day and time are there
Doordoor, hinge, latch, lock, cabinet, drawerBooks itself when day and time are there
Fan or fixturefan, lamp, light, bulb, socket, outlet, switchBooks itself when day and time are there
Shelves and mountingshelf, tv, mount, bracket, mirror, blindsAsks for a photo of the wall, then books
Drywall patchdrywall, plaster, patch, hole, crackAsks for a photo of the damage, then books
Active leakburst, flooding, water coming through, pouringHeld leak slot, or Oona asks someone to move
Not a fitremodel, renovate, whole kitchen, additionNo slots; Oona replies with a referral
Several jobstwo or more job words in one messageBooks; Oona confirms the visit is long enough
Time limits12 or earlier · not before 9 · between 10 and 2Only times inside the limit are offered
Ruled-out daysnot thursday · can’t do mondayStruck through and skipped
Change of plancame up, move, next week · cancelReal alternatives, or cancel; freed slot offered to the waitlist
04OONA’S EVENING
One decision at a time.Visits that booked themselves are logged, not queued. Only photo jobs, several-job visits, leaks that need someone moved, not-a-fit requests and unclear jobs reach Oona. Every fact in a draft comes from the saved booking, and each item shows where it came from.
Asend
Eedit
Stomorrow
05MOTION ENGINE
Ink, noise and one frame loop.
Ink bleed: a canvas mask grown from the button’s bounding box, its edge distorted by 2D value noise. Hover the button at the bottom of this page.Live reading: parts of the sentence underline as they’re recognised. Blue is a job, terracotta is timing, a struck-through day is one they ruled out.The blot beside the probe breathes when idle and swells with typing speed; Oona’s sign-in answers each keystroke with a dot and a nudged letter.
06BUILD STATUS
LIVEBooking, reschedule and cancel, with overlap protection
LIVEVoice dictation (OpenAI gpt-live-transcribe, browser fallback)
LIVEAI reading (TypeSafe JEV + OpenAI) with rules fallback
LIVEEmail through Resend
LIVEOona’s evening: triage, leak moves, waitlist, examples
LIVEPhone-width layout
TODOReminder emails sent on a schedule
TODOVerified sending domain in Resend
See it working.
SELLWOOD · SE PORTLANDTYPESAFE JEV · OPENAI · GPT-LIVE-TRANSCRIBE · RESENDSHEET 1 OF 1