Building Odosan for H0: Ten Days from DynamoDB Plan to Aurora + Bedrock
A home-maintenance PWA built for the Vercel × AWS H0 hackathon — real Aurora Serverless v2, Bedrock nameplate OCR, and every deployment gotcha that only shows up when the clock is running.
Client
Self (H0 hackathon)
Role
Product Designer & Builder
Tools
Next.js, Vercel, Aurora Serverless v2, Amazon Bedrock, S3, Gemini, better-auth, Kysely
Timeline
Jun 13–22, 2026
tl;dr
Odosan is a home-maintenance PWA for the Vercel × AWS H0 hackathon. The product case study covers the user problem — this log covers the sprint: why the original DynamoDB plan got scrapped, how Lightsail Postgres became a staging lane into Aurora Serverless v2, and what broke along the way (Bedrock inference profiles, Gemini MAX_TOKENS, Vercel monorepo roots, Hobby git-author blocks, Creators API eligibility). Jun 21–22 added Bedrock + S3 for nameplate OCR; Jun 22 cut ~1,500 lines of scope to ship on time.
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.
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–22 milestones
| Date | Shipped |
|---|---|
| Jun 18 | Lightsail Postgres live — SQL-native app shipping |
| Jun 19 | Aurora Serverless v2 — pg_dump migration, Lightsail retired |
| Jun 20 | ~1,500 lines cut — scope to H0 demo path only |
| Jun 21 | Bedrock + S3 nameplate pipeline wired |
| Jun 22 | Submission artifacts + live odosan.tech polish |
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 Jun 22 to keep the demo path credible.
- 6Always keep an AI and commerce fallback — Gemini and affiliate search URLs saved demo day.
H0 proved the stack. Post-hackathon: provider partnerships, proactive home-health reminders before systems fail, and hardening the Creators API path when eligibility clears.
Full case study: product problem, privacy model, journey diagrams, and live embed at /projects/odosan.
H0 proved the stack. Post-hackathon: provider partnerships, proactive home-health reminders before systems fail, and hardening the Creators API path when eligibility clears. Full case study: product problem, privacy model, journey diagrams, and live embed at /projects/odosan.
Explore other case studies

Bookee
AI receptionist that researches leads, calls them back, and books meetings — from one form submission.

Oakling
Family activity app — from research to App Store launch.

FurPass
Native iOS app that turns your pet's care routine into a secure, shareable guide for whoever's watching them. Pivoted from PetCard after App Store rejection.

Kamper
Building a waitlist before Kickstarter — for an outdoor kitchen I designed ten years ago.

NFCtree
A social-sharing product that happens to use NFC — tap a chip, open your whole link tree in any browser.

Bookee
AI receptionist that researches leads, calls them back, and books meetings — from one form submission.

Oakling
Family activity app — from research to App Store launch.

FurPass
Native iOS app that turns your pet's care routine into a secure, shareable guide for whoever's watching them. Pivoted from PetCard after App Store rejection.

Kamper
Building a waitlist before Kickstarter — for an outdoor kitchen I designed ten years ago.

NFCtree
A social-sharing product that happens to use NFC — tap a chip, open your whole link tree in any browser.
