Inspiration

Have you ever tried planning a group trip with friends and realised everyone is on a completely different page? One person wants a packed itinerary while another just wants to relax. Some are searching for budget food spots, while others are sending luxury hotel recommendations. Meanwhile, the group chat fills up with Reddit threads, travel blogs, and “must-see” TikToks, making it almost impossible to organise everything into a plan that actually works.

NovaSync was built to solve this. It brings scattered travel ideas into one place and turns them into a collaborative, intelligent itinerary that reflects the preferences of the entire group.

However, planning the trip is only half the challenge. Once you arrive, actually booking the best local experiences can be surprisingly difficult, especially in destinations where reservation systems are not in English. Many incredible restaurants, such as teppanyaki spots in Kyoto, only accept bookings through Japanese-language websites, while international booking platforms often miss these local gems.

NovaSync addresses both problems. It helps groups transform scattered ideas into structured travel plans, and uses AI browser automation to navigate local booking sites, allowing travellers to access authentic experiences without being limited by language barriers.

What It Does

NovaSync turns a casual trip idea into a personalised, well-structured itinerary.

  • Group preference collection: Each group member submits their constraints, preferences, and lifestyle profile (wake time, dietary needs, fitness level, budget, etc.).
  • Consensus building: Nova 2 Lite reads all submissions, extracts structured traveler profiles, and merges them using a conservative consensus strategy, union of all preferences, most conservative budget tier wins, conflicts surfaced for the organizer to see.
  • Agentic research: Nova 2 Lite autonomously calls tools to search activities, check weather, find local events (Ticketmaster), and validate places, building an evidence base for the plan.
  • Human-in-the-loop scaffold review: The generated plan is presented as a reviewable draft before itinerary nodes are extracted. Users can request one revision with natural-language feedback before approving.
  • Nova Act booking: For the Japan demo, when the itinerary includes a teppanyaki restaurant in Kyoto, Nova Act opens Tabelog, fills in the search fields (in Japanese, bypassing IME issue via Playwright fill()), runs the search, enumerates restaurant names visible on screen using grounded chain-of-thought, then clicks the target restaurant and navigates to the detail page.

How We Built It

Backend (FastAPI)

  • orchestrate_scaffold() runs parallel workers + Nova 2 Lite agentic loop
  • orchestrate_extraction() parses approved scaffold into ItineraryNode[] and persists to Supabase
  • Session cache (15-min TTL) avoids re-running expensive orchestration between review and extract
  • SSE (Server-Sent Events) streams agent tool calls and plan events to the frontend in real time
  • Feature flag NOVA_AGENT_ENABLED toggles between Nova 2 Lite and OpenRouter fallback pipeline

Frontend (React + TypeScript)

  • AgentActionFeed streams live tool calls as they happen — search, weather, validate place, events
  • ScaffoldReviewCard presents the draft plan with revise/approve controls
  • BookingPanel connects to the Nova Act SSE stream and shows booking progress in real time
  • Group flow: GroupPlanPage handles consensus display, participant list, conflict reporting

Nova Act integration

  • Playwright handles setup: page load, Escape to dismiss popups, fill() for CJK text inputs
  • nova.act() handles the visually-grounded steps: language popup, search execution, restaurant click
  • Grounded CoT prompt forces the agent to enumerate all visible restaurant names before clicking (preventing hallucinated clicks)
  • _run_japan_demo() returns bool to signal whether it emitted its own BookingResult, so run() can skip duplicate emission — a clean return-value signaling pattern

Challenges We Ran Into

Nova Act + Japanese IME: nova.act() uses agentType which sends keyboard events. On a non-Japanese OS, those keyboard events don't go through IME, so Japanese characters got mangled (鉄板焼き鉄板焼け).

  • Fix: Use Playwright's fill() to set input values directly via JavaScript, bypassing keyboard events entirely. Nova Act then handles the visually interesting parts (clicking buttons, navigating).

Bot detection on Tabelog search URLs: Opening the Tabelog Kyoto search results page with pre-populated query params timed out, likely bot detection on parameterized URLs.

  • Fix: Open the Tabelog homepage first (loads reliably), then have nova.act() navigate from there.

Restaurant not visible in search results: When a single nova.act() call was given 5 steps (language, dates, area, keyword, restaurant click), it would complete the search but then scroll past the visible restaurant.

  • Fix: Split into two focused calls: Phase 1 for search, Phase 2 for finding and clicking the restaurant. Simpler tasks = less drift.

Hallucinated restaurant clicks: The agent would claim to click the restaurant but actually click somewhere else.

  • Fix: Grounded chain-of-thought. The agent must first enumerate every visible restaurant name on screen before attempting any click, grounding its action in what it can actually observe.

Hallucinated itinerary timings: Nova 2 Lite occasionally produced overlapping or unrealistic activity times.

  • Fix: The HITL scaffold review step lets users catch and revise these before extraction, the scaffold is reviewed as human-readable text before it's ever parsed into structured nodes.

Accomplishments We're Proud Of

  • Nova 2 Lite generating coherent, personalised multi-day itineraries that are actually usable (not generic tourist traps, for example, surfacing hidden matcha cafes in Kyoto based on user preference)
  • Nova Act successfully navigating a Japanese-language restaurant site with no sign-in required
  • Real-time agent action streaming: watching the AI search, validate places, and check weather in real time makes the planning feel alive, not like a black box
  • Group consensus that surfaces real conflicts instead of silently discarding preferences
  • Clean HITL architecture: the boundary between autonomous scaffolding and human-approved extraction is enforced at the code level, not just by convention

What Learned

  • Vision-language agents (Nova Act) are powerful but need grounded CoT prompts, "enumerate what you see before acting" dramatically reduces hallucinated clicks
  • Splitting large multi-step tasks into smaller focused nova.act() calls improves reliability
  • Playwright + nova.act() is a powerful pairing: Playwright for deterministic setup (fill, navigate, wait), nova.act() for visually-grounded interaction (click the right button, read dynamic content)
  • HITL checkpoints aren't just UX — they're an architectural safeguard. The scaffold review step caught timing errors and preference mismatches that the agent didn't flag itself

What's Next for NovaSync

  • Generalise to all countries and languages, not just Japan
  • Let users log in directly via the Chromium browser provided by NovaSync (persistent sessions for restaurant/hotel bookings)
  • Improve plan quality with more tool integrations (transport APIs, real-time availability)
  • A Reddit-style community forum where users share and "remix" itineraries
  • Direct "chat with your itinerary" interface: modify specific days via natural language after the initial plan is generated

NovaSync is building the future of travel planning: an AI-powered platform that turns scattered group ideas into intelligent itineraries and can autonomously navigate local booking sites to unlock authentic experiences worldwide.

Built With

Share this project:

Updates