Inspiration

Every group chat has the same shape. Two people find a thread and run with it. Someone drops a detail that nobody picks up. A newcomer reads along and never finds the door in. The interest that would have connected them was right there in the messages; nobody had the attention to notice it.

Meta's brief asked for AI that identifies common interests that could spark a new connection. I wanted to make that visible while the conversation is still happening, not in a summary afterwards, so the group itself can act on it.

What it does

Wavelength is a live chat room with a second view of the conversation drawn next to it. People join by scanning a QR code and typing a first name. As they talk, Meta's Muse Spark reads the recent messages and returns three things:

  • Connections: who is bonding with whom, over what, and how strongly. These are drawn as animated waves between people. The amplitude grows with strength and the color warms from violet to aqua to amber. Each wave carries the topic that links the two people.
  • Bridge suggestions: specific, quotable openings such as "Priya's Yosemite photos and Maya's ski trips are the same mountains ask her about it." They reference what people actually said.
  • Inclusion notes: when someone has gone quiet or offered something the group did not pick up, the room is told, warmly, so the group can pull them back in.
  • Make a plan: every bridge suggestion has a button that turns the shared interest into a concrete plan nearby. The server maps the topic to OpenStreetMap tags, finds spots within 3 km of the venue in Midtown Atlanta, and Muse picks one and writes the invitation: "Priya and Jordan, head to Jackson Street Bridge after to swap Yosemite and A-Basin stories while snapping skyline photos together." The card shows a map with the spot and a link to directions.

A vibe gauge tracks the group's overall connection from 0 to 100. Analysis runs every four messages or on demand with the "Read the room" button.

The point is not that an AI knows the group is connected. The point is that the group can see it, and the person on the edge gets named before they drift away.

How we built it

Solo, overnight. I used Claude Code as a pair programmer for the full build, and spun up agents for code review, browser QA of the join and analysis flows, and this documentation.

  • Frontend: Next.js 16 with React 19 and TypeScript. Framer Motion for the interface animations, D3 for the force layout, and a hand-drawn sine path for each link so connections read as waves rather than lines. A canvas oscilloscope sits under the graph and on the landing page, and its energy follows the vibe score. Zustand holds room state on the client.
  • Real time: a small Socket.io server keeps rooms in memory, broadcasts messages, assigns each participant a distinct color, and decides when to call the model.
  • AI: Muse Spark through Meta's Anthropic-compatible endpoint, called with the Anthropic TypeScript SDK. A single system prompt asks for strict JSON: connections, suggestions, alerts, vibe score, one insight. The server validates every name against the live roster before drawing anything.
  • Places: OpenStreetMap's Overpass API for nearby venues, with a curated list of real Atlanta spots as a fallback so the demo never shows an empty plan. The mini-map is drawn from OSM raster tiles positioned so the venue sits at the centre; no map SDK, no API key.
  • Judge flow: the room code opens a QR panel. The socket URL is derived from the page host, so phones on the same Wi-Fi reach the laptop directly. A seeded demo mode drops three scripted participants into a room and streams eight messages at typing pace, so the graph is already lit when a judge scans in.

Challenges

  • Muse Spark always reasons before it answers, and reasoning cannot be turned off. My first calls burned the whole token budget on thinking and returned empty content. The fix was to set an explicit thinking budget at the minimum of 1024 tokens, give the response 4000 tokens of headroom, and retry once if the text block comes back empty.
  • The response puts a redacted_thinking block before the text block. Reading content[0] silently yielded nothing; the parser now finds the first text block and strips any code fences before parsing JSON.
  • The build ran on $50 of Meta API credits. The server rate-limits analysis to once per eight seconds per room, analyzes only the last 24 messages, and stops after a configurable cap. The health endpoint reports how many calls have been used.
  • Rooms live in server memory. That is fine for a demo but it means a socket-server restart wipes the conversation; the client de-duplicates by message id so reconnects do not double the chat.
  • Drawing waves that feel alive without distracting from the chat took tuning: the wave tapers to zero at both ends so it meets each node cleanly, and the analysis sweep flashes links white for under a second before they settle into their color.

What we learned

treat every provider's compatibility layer as its own API. Two quirks (forced reasoning, block ordering) cost more time than the whole prompt design.

What's next

  • Voice rooms using Muse Voice Transcribe so the same analysis runs on a table conversation.
  • Persistent rooms so a Messenger or WhatsApp group can watch its connection history over weeks.
  • Let participants accept a bridge suggestion with one tap, which posts it as an opener.
  • Sentiment tracking so the gauge reflects warmth, not just overlap of interests.

Built With

Share this project:

Updates

Submission history