Skip to content
Emmanuel NanadoumRésumé(PDF, opens in a new tab)

VYBE

A ride that knows where it's going, who's in it, and what the car is in the mood for.

Built for
VYBE (Emmanuel's own product)
Engagement
AI passenger experience platform
My role
Product discovery, requirements, solution architecture, build and demo
Source
vybe-app-blue.vercel.app
VYBE Variation 5 home page: night-driving city skyline with the headline More Than a Ride. It's a VYBE.
vybe-app-blue.vercel.app

Status at time of writing

Stamped from the live build, not from the plan.

Status of each component
ComponentStatus
Product site + VYBE VoiceLive

Deployed on Vercel, Variation 5 design locked.

ElevenLabs Scribe + TTSLive

Reported connected by the production health endpoint.

SupabaseLive

Auth, rides, participants, saved VYBEs.

Google Places / Routes + generative modelNot activated

Wired server-side, awaiting production credentials. Route-aware generation is off in production.

1Business problem

Passengers bounce between maps, music apps, restaurant searches and group chats. None of those tools know the ride: where the car is going, how long it takes, who is in it, or the mood.

The result is a trip spent negotiating apps instead of sharing an experience, and suggestions that don't fit the time or place.

2Discovery

  1. 2.1What decisions do people actually make in a car? Four keep recurring: what to hear, what to eat, what to see, what to do.
  2. 2.2What context changes the right answer? Destination, trip length, number of passengers and mood. Those became the ride's first-class inputs.
  3. 2.3Who owns the ride? A shared ride has to reflect the group, not whichever phone opened the app.

3Requirements

Requirements
R-01Ride context model: destination, trip length (15 min / 30–60 min / 1–3 hr / 3 hr+), passengers (1–4), mood (Hype, Chill, Romantic, Hungry, Explore, Surprise me).
R-02Shared rides: compact join codes and a QR flow so everyone connects to the same destination, mood and recommendations.
R-03Saved VYBEs so signed-in users can save and restore a ride setup.
R-04Voice that keeps the ride context across turns, with a typed fallback everywhere.
R-05Provider secrets server-side only; shared-ride membership through authenticated calls.
R-06Recommendations grounded in real provider results, never invented venues.

4Solution architecture

A Vite + vanilla JavaScript front end carries the locked Variation 5 design. Vercel Functions sit between the browser and every provider, and Supabase holds identity and ride state.

VYBE Voice: live path

  1. 01MicrophoneBrowser MediaRecorder captures the request
  2. 02/api/voice-sttElevenLabs Scribe transcription (Web Speech API fallback)
  3. 03/api/voice-liveTranscript + ride context + recent turns
  4. 04Product actionFood, music, stops, mood, group activity
  5. 05/api/voice-ttsElevenLabs speaks the response
Figure 4.1 — VYBE Voice: live path

Ride generation: credential-gated

  1. 01Origin + destination
  2. 02Google Places (New)Resolve the destination
  3. 03Google RoutesCompute route and duration
  4. 04Model rankingAI Gateway or OpenAI
  5. 05SupabaseStore recommendations + saved VYBEs
Figure 4.2 — Ride generation: credential-gated

5Demo / POC

Set destination, trip length, crew and mood once, then talk. The same context stays with the conversation.

VYBE Voice ride-context controls: destination, trip length, people and mood selectors above the voice orb.
Figure 5.1 — Ride context set once: destination, trip, people, mood.
VYBE Voice console with a Talk to VYBE button and prompt suggestions.
Figure 5.2 — The console notes that microphone audio is transcribed with ElevenLabs Scribe.
VYBE Voice landing: A concierge that already knows the ride.
Figure 5.3 — VYBE Voice landing inside the Variation 5 world.

6Technologies

  • Vite
  • JavaScript
  • Vercel Functions
  • Supabase
  • ElevenLabs Scribe
  • ElevenLabs TTS
  • Web Speech API
  • Google Places / Routes (gated)
  • AI Gateway / OpenAI (gated)

7Integration points

Integration points
FromTo
Browser/api/voice-stt → ElevenLabs ScribeBase64 audio in, transcript out
Browser/api/voice-liveMessage, last turns, ride context
/api/voice-ttsElevenLabsSpeech for the response
/api/rides/joinSupabaseAuthenticated shared-ride membership
/api/healthAll providersReports which services are configured

8Tradeoffs

Design decisions and tradeoffs
Grounded recommendations onlyInstead of: Model-invented venuesA wrong restaurant in a moving car costs trust. Generation stays off in production until real Places/Routes data backs it.
Server-side functions for every providerInstead of: Client SDKsKeys never reach the browser, and a health endpoint can report exactly what is connected.
Scribe with a browser speech fallbackInstead of: One transcription pathHigher accuracy where recording works; the demo still answers where it doesn't.
Vanilla JS for the launch surfaceInstead of: A heavier frameworkFull control of the locked Variation 5 visuals and a fast load; the cost is more hand-built state.

9Implementation & handoff

  • Release gates and mobile QA are written down in the repository, so the next build ships against the same checks.
  • A health endpoint turns 'is it working?' into a one-line answer for anyone supporting the product.
  • Mobile requirements (Expo / React Native, Spotify, VYBE+ subscriptions) are scoped as next phases, not presented as shipped.

10What this demonstrates

  1. 1.Takes a fuzzy product idea through discovery to a requirements model a team can build against.
  2. 2.Designs and ships real API integrations (speech in, reasoning, speech out) with keys kept server-side.
  3. 3.Separates what is live from what is architected, and says so in the product itself.