Building Odosan for H0: V0 + AWS (Aurora + Bedrock + S3)
A home-maintenance PWA built for the Vercel v0 + AWS H0 hackathon.
Client
Self (Vercel v0 + AWS H0 hackathon)
Role
Product Designer & Builder
Tools
Next.js, Vercel, Aurora Serverless v2, Bedrock Claude Sonnet 4.6, S3, RDS Proxy, Secrets Manager, Gemini, better-auth, Kysely
Timeline
Jun 13–29, 2026
tl;dr
Odosan is a home-maintenance PWA for the Vercel v0 + AWS H0 hackathon. This log tracks the full sprint: why DynamoDB got scrapped for a SQL-native path, how Lightsail bridged to Aurora with zero rewrites, how Bedrock + S3 became the production nameplate pipeline, and how the UX was tightened into a recording-ready flow (auto-save diagnosis, seasonal tasks, document vault, and deterministic demo mode).
Why the database path mattered more than the feature list
H0 judging cares about AWS services used in production — not mocks. Odosan started with a DynamoDB table design on paper, but the app was already SQL-native: text arrays, UUID keys, GIN indexes, better-auth sessions, and Kysely queries written for Postgres.
The constraint forced a real pivot: ship on managed Postgres first, then migrate into Aurora Serverless v2 without rewriting application code. Everything in this log is about that constraint — not the product story (that lives on the case study).
“Judges need to see AWS in the request path — not just in the README.”
DynamoDB plan → Lightsail → Aurora Serverless v2
Jun 18 shipped on Lightsail Postgres so the SQL-native codebase could move fast. Jun 19 ran pg_dump into Aurora Serverless v2 and swapped DATABASE_URL — zero application rewrites. Lightsail was deleted once Aurora was warm.
What runs in production for judges
The PWA on Vercel calls Next.js API routes. Diagnose and nameplate flows hit Bedrock first, persist artifacts to S3, and write structured rows to Aurora. Gemini and affiliate search URLs stay as automatic fallbacks when AWS or commerce gates block the happy path.
AWS architecture map used in the submission
| Service | Purpose | Region |
|---|---|---|
| Amazon Aurora PostgreSQL Serverless v2 | Primary system of record: providers, leads, auth, home briefs, scanned systems | us-west-2 |
| Amazon Bedrock (Claude Sonnet 4.6) | Nameplate OCR + structured extraction + diagnose support calls | us-west-2 |
| Amazon S3 | Durable storage for uploaded nameplate and home-document photos | us-west-2 |
| Amazon RDS Proxy + Secrets Manager | Connection pooling + credential management for Vercel runtime | us-west-2 |
Gotchas that only show up on a deadline
Eight issues that burned hours — documented so the next sprint does not repeat them.
| Issue | What happened | Fix |
|---|---|---|
| Aurora scale-to-zero | First request after idle hit a 30–60s cold start | Warm-up script + accept cold start in demo |
| Bedrock model ID | Raw model ARN rejected in production | Use inference profile ID, not bare model ID |
| Gemini MAX_TOKENS | Long nameplate prompts returned empty | Trim context + raise maxOutputTokens |
| Vercel monorepo | Build failed — wrong package root | Set root directory + yarn workspaces in vercel.json |
| Hobby git author | Deploy blocked for non-team git email | Pro team or align git config with Vercel account |
| CloudShell region | Aurora CLI commands hit wrong region | Export AWS_DEFAULT_REGION before pg_dump |
| Creators API gate | Amazon Creators API eligibility blocked | Affiliate-tagged search URL fallback |
| Provider claim search | Edge cases in local pro matching | Normalize zip + dedupe before rank |
Jun 21–22 — Bedrock + S3 for nameplate OCR
The AI path landed late in the sprint. Photos strip EXIF client-side, API routes call Bedrock through an inference profile, durable images land in S3, and structured fields sync to Aurora for signed-in users (with localStorage migration for anonymous sessions).
Jun 18–29 milestones
| Date | Shipped |
|---|---|
| Jun 18 | Lightsail Postgres live — SQL-native app shipping |
| Jun 19 | Aurora Serverless v2 — pg_dump migration, Lightsail retired |
| Jun 20 | Two-sided loop closed: homeowner dashboard + provider inbox + quote flow |
| Jun 21 | Bedrock + S3 nameplate pipeline wired |
| Jun 22 | ~1,500 lines cut — scope to H0 demo path only |
| Jun 29 | Recording-ready UX: auto-save, status tracking, seasonal detail pages, demo-mode flow |
Final demo structure used for submission
The final pass focused on reducing demo friction: deterministic diagnose timing, immediate persistence, and clear progression from one diagnosis into ongoing home care.
Diagnose in one take
Preloaded sample photo + narrated wait + deterministic 3.5s path for recording reliability.
Auto-save by default
Diagnosis brief saves on result mount, then appears in My Home with status tracking.
Maintenance journey
Seasonal task pages + document vault + scanned systems make Odosan a lifecycle product, not a one-off diagnostic.
Key Takeaways
- 1Ship on the schema you actually wrote — DynamoDB on paper does not help a Postgres codebase.
- 2Staging Postgres on Lightsail then pg_dump to Aurora beats a big-bang migration under deadline.
- 3Bedrock wants inference profile IDs in production — raw model ARNs fail silently until you check logs.
- 4Monorepo deploy config is a feature — set Vercel root directory before you need it.
- 5Scope cuts are a ship skill — ~1,500 lines removed to keep the submission path credible.
- 6Always keep an AI and commerce fallback — Gemini and affiliate search URLs saved demo day.
- 7Auto-save + status tracking turns diagnosis into a longitudinal home-maintenance record.
H0 proved the stack. Post-hackathon priorities: sync diagnosis status to Aurora (not just local), unlock real Amazon product grid when eligibility clears, and ship auth completeness (Google/Apple sign-in plus password reset + email verification).
Full case study: product problem, privacy model, journey diagrams, and live embed at /projects/odosan.
H0 proved the stack. Post-hackathon priorities: sync diagnosis status to Aurora (not just local), unlock real Amazon product grid when eligibility clears, and ship auth completeness (Google/Apple sign-in plus password reset + email verification). Full case study: product problem, privacy model, journey diagrams, and live embed at /projects/odosan.
Explore other case studies

Bookee
Researches each lead and calls back in under 60 seconds to book qualified meetings.

Oakling
Family-friendly Bay Area activities to do with your trusted circle, and memories that stick.

FurPass
Build a pet care guide once and share a secure link any sitter opens in a browser.

Kamper
Modular outdoor kitchen launching with AI-generated campaign visuals and a waitlist.

NFCtree
Your digital business card on a chip. Tap to share your socials in any browser.

Bookee
Researches each lead and calls back in under 60 seconds to book qualified meetings.

Oakling
Family-friendly Bay Area activities to do with your trusted circle, and memories that stick.

FurPass
Build a pet care guide once and share a secure link any sitter opens in a browser.

Kamper
Modular outdoor kitchen launching with AI-generated campaign visuals and a waitlist.

NFCtree
Your digital business card on a chip. Tap to share your socials in any browser.
