Inspiration

What it does

How we built it

Challenges we ran into

Accomplishments that we're proud of

What we learned

What's next for Adjacent — taste-aware discovery for AI agents

What Adjacent does

Pick three things you already love — a musician, a film, a restaurant. Adjacent builds a day in a city you have never visited, and shows the taste evidence behind every stop.

The question it answers is not "what is popular in Lisbon" but "what in Lisbon is popular with people like me". A Burial listener's next cocktail bar. A Wong Kar-wai fan's next gallery. An Ichiran regular's next lunch.

Why it needs Qloo

Ask a language model for "a bar for someone who likes Burial and Wong Kar-wai" and you get a plausible paragraph with no source. Ask Adjacent and you get a place, an affinity score, and the share of that affinity that came from Burial — a number you can disagree with. Remove the taste graph and the product has nothing to show but prose.

How it is built

A Cloudflare Worker serves an MCP endpoint at POST /mcp with three tools:

  • find_entities — resolve a free-text seed ("Burial", "Wong Kar-wai") to a Qloo entity and its tags
  • plan_day — take several seeds, find places near a city, and rank them by cross-domain affinity
  • cross_media — the same seeds, returned as artists, films and books, so a domain Qloo cannot answer stays empty instead of being filled with titles that sound right

The Qloo calls use /search, /v2/tags and /v2/insights. Insights are asked for the signal that explains which seed contributed, not just a score, so every card can show a "because you love X" chip. The UI is server-rendered HTML with no framework, because the interesting part is the evidence, not the chrome.

The demo runs on a live Qloo key since 20 October 2026. Without a key the server falls back to a bundled fixture, and the badge in the header always says which source you are looking at — I did not want a demo that quietly pretends.

Challenges

  • Explainability. An affinity number is easy; attributing it to one of three seeds is not. The first version returned a single score and the cards were unconvincing. Asking insights per seed and normalising made the difference.
  • Empty is a feature. When Qloo has nothing for a domain, the right behaviour is to show nothing. Early versions filled the gap with model guesses, which is exactly the failure this project exists to avoid.
  • Fixture vs live. Building without a key for two days forced a clean separation between the Qloo client and the data source, which turned out to be the best structural decision in the codebase.

What I learned

A recommendation is only as good as the sentence that justifies it. The taste graph is not a ranking API — it is an argument generator, and the product is the argument.

Live demo: https://adjacent.ojikaminari.workers.dev · Source: https://github.com/kaminariouji/adjacent (MIT)

Built With

  • ai-agents
  • cloudflare-workers
  • mcp
  • qloo
  • taste-graph
  • typescript
Share this project:

Updates

Submission history