Skip to content

Add Vietnam Bike Price Scout cookbook example#68

Merged
simantak-dabhade merged 6 commits intotinyfish-io:mainfrom
giaphutran12:main
Mar 10, 2026
Merged

Add Vietnam Bike Price Scout cookbook example#68
simantak-dabhade merged 6 commits intotinyfish-io:mainfrom
giaphutran12:main

Conversation

@giaphutran12
Copy link
Copy Markdown
Contributor

Summary

Vietnam Bike Price Scout — compare motorbike rental prices across Vietnam in seconds. No rental shop has an API; this app sends TinyFish browser agents to 18 websites simultaneously and streams structured pricing data back to a real-time dashboard.

Live Demo → viet-bike-scout.vercel.app

Screenshots

Empty State Searching Results
Empty Searching Results

How it uses TinyFish

  • Parallel SSE fan-out: One Mino agent per rental website, all fired concurrently — up to 18 agents across 4 cities
  • Structured JSON extraction: Consistent bike data (name, engine CC, type, daily/weekly/monthly price in USD, deposit, availability) from wildly different site layouts (WordPress, Wix, custom builds)
  • Live browser agent iframes: Real-time visibility into what each agent is doing — up to 5 active windows per search, auto-removed on completion
  • Multi-step navigation: Agents handle cookie banners, currency switchers, pagination, and "Load More" buttons autonomously
  • SSE streaming to client: Results appear live as each agent finishes, not after all complete

What makes this use case unique

  • Zero API territory — not a single rental shop exposes pricing data programmatically
  • Zero aggregator exists — there is no "Kayak for Vietnam motorbikes"
  • Real user pain — millions of tourists visit Vietnam annually; nearly all rent a motorbike
  • Parallel scale demo — visually demonstrates Mino's core advantage as results stream in from 18 sites

Tech Stack

Layer Choice
Framework Next.js 16 (App Router, Node.js runtime)
UI React 19 + Tailwind CSS v4 + shadcn/ui
Scraping TinyFish Mino API (SSE streaming)
Caching Supabase (PostgreSQL, 6h TTL, graceful degradation)
Hosting Vercel

Included

  • Full Next.js source (src/, config files)
  • Supabase migration for cache table
  • README with architecture diagram, setup instructions, and covered shops
  • PRD with Mino goal prompt, sample JSON output, and architecture overview
  • App screenshots (empty state, searching, results)

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 5, 2026

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 32595816-f4dd-4401-8860-4acbd888a18f

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@simantak-dabhade simantak-dabhade left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @giaphutran12 — really impressive submission! The parallel SSE fan-out across 18 rental sites is a great showcase of TinyFish, the cache-aside pattern with Supabase is well-implemented, and the Zod env validation is a nice touch. A few things to clean up:


🔴 Must Fix

1. Rename Mino → TinyFish throughout
The actual code already uses the correct API URL (agent.tinyfish.ai) and TINYFISH_API_KEY env var — nice. But variable/type/function names and docs still reference "Mino" heavily (~80 occurrences). Key renames:

In code (src/app/api/search/route.ts, src/components/live-preview-grid.tsx, src/app/layout.tsx):

  • MINO_SSE_URLTINYFISH_SSE_URL
  • MinoEventTinyFishEvent
  • runMinoSseForSiterunTinyFishSseForSite
  • [MINO] log prefixes → [TINYFISH]
  • Meta descriptions: "TinyFish Mino" → "TinyFish"
  • iframe title: "Mino agent" → "TinyFish agent"

In docs (README.md, use-case-brief.md, vietnam-bike-price-scout/PRD.md, vietnam-bike-price-scout/README.md, vietnam-bike-price-scout/social-post.md):

  • Replace all "Mino" / "TinyFish Mino" references with "TinyFish"
  • Fix links: mino.aitinyfish.ai, tinyfish.iotinyfish.ai

2. Add .env.example
The .gitignore blocks .env* so there's no example for setup. Add one:

TINYFISH_API_KEY=
NEXT_PUBLIC_SUPABASE_URL=
SUPABASE_SERVICE_ROLE_KEY=

🟡 Should Fix

3. Remove the vietnam-bike-price-scout/ subfolder
This looks like planning/brainstorming docs (a second README, PRD, social media post draft, duplicate screenshots). The actual project lives in the root of viet-bike-scout/ — this subfolder shouldn't ship in the cookbook. The screenshots are already in public/.


🟢 Everything Else Looks Great

  • Correct API URL and env var naming in actual code
  • Parallel SSE with Promise.allSettled + AbortController timeouts
  • Supabase cache with graceful degradation (app works without it)
  • Great extraction prompt — handles cookie banners, pagination, VND→USD conversion
  • Zod env validation
  • No committed secrets, no dead code, clean deps

Solid work — just needs the naming cleanup and doc trimming!

@simantak-dabhade
Copy link
Copy Markdown
Contributor

Almost there! Just missing the .env.example file — your .gitignore blocks .env* so new users won't know what keys to set. Please add one with placeholder values for TINYFISH_API_KEY, NEXT_PUBLIC_SUPABASE_URL, and SUPABASE_SERVICE_ROLE_KEY. Everything else looks great.

Copy link
Copy Markdown
Contributor

@simantak-dabhade simantak-dabhade left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Almost there! Just missing the .env.example file — your .gitignore blocks .env* so new users won't know what keys to set. Please add one with placeholder values for TINYFISH_API_KEY, NEXT_PUBLIC_SUPABASE_URL, and SUPABASE_SERVICE_ROLE_KEY. Everything else looks great.

@simantak-dabhade simantak-dabhade self-requested a review March 10, 2026 02:55
Copy link
Copy Markdown
Contributor

@simantak-dabhade simantak-dabhade left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving this for now, just add the .env.example then merge it in!

@simantak-dabhade simantak-dabhade merged commit 4f76b54 into tinyfish-io:main Mar 10, 2026
3 checks passed
KrishnaAgarwal7531 pushed a commit to KrishnaAgarwal7531/TinyFish-cookbook that referenced this pull request Mar 31, 2026
## Summary

**Vietnam Bike Price Scout** — compare motorbike rental prices across
Vietnam in seconds. No rental shop has an API; this app sends TinyFish
browser agents to 18 websites simultaneously and streams structured
pricing data back to a real-time dashboard.

**Live Demo →
[viet-bike-scout.vercel.app](https://viet-bike-scout.vercel.app)**

## Screenshots

| Empty State | Searching | Results |
|---|---|---|
| ![Empty](viet-bike-scout/public/empty-state.png) |
![Searching](viet-bike-scout/public/searching-state.png) |
![Results](viet-bike-scout/public/result-state.png) |

## How it uses TinyFish

- **Parallel SSE fan-out**: One Mino agent per rental website, all fired
concurrently — up to 18 agents across 4 cities
- **Structured JSON extraction**: Consistent bike data (name, engine CC,
type, daily/weekly/monthly price in USD, deposit, availability) from
wildly different site layouts (WordPress, Wix, custom builds)
- **Live browser agent iframes**: Real-time visibility into what each
agent is doing — up to 5 active windows per search, auto-removed on
completion
- **Multi-step navigation**: Agents handle cookie banners, currency
switchers, pagination, and "Load More" buttons autonomously
- **SSE streaming to client**: Results appear live as each agent
finishes, not after all complete

## What makes this use case unique

- **Zero API territory** — not a single rental shop exposes pricing data
programmatically
- **Zero aggregator exists** — there is no "Kayak for Vietnam
motorbikes"
- **Real user pain** — millions of tourists visit Vietnam annually;
nearly all rent a motorbike
- **Parallel scale demo** — visually demonstrates Mino's core advantage
as results stream in from 18 sites

## Tech Stack

| Layer | Choice |
|---|---|
| Framework | Next.js 16 (App Router, Node.js runtime) |
| UI | React 19 + Tailwind CSS v4 + shadcn/ui |
| Scraping | TinyFish Mino API (SSE streaming) |
| Caching | Supabase (PostgreSQL, 6h TTL, graceful degradation) |
| Hosting | Vercel |

## Included

- Full Next.js source (`src/`, config files)
- Supabase migration for cache table
- README with architecture diagram, setup instructions, and covered
shops
- PRD with Mino goal prompt, sample JSON output, and architecture
overview
- App screenshots (empty state, searching, results)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants