Inspiration

Small restaurants, cafés and boutiques in France decide their playlist, their dish of the week and their window display on instinct. Generic AI can write the copy, but it has no idea what the people on their street like. Qloo does. Carte Locale puts that signal in front of the owner as a plan they can act on Monday morning.

What it does

Enter a shop address and a business type. The agent returns a seven-day plan: dish of the day, playlist, shelf pick, window theme, a local partner to approach. Every line names the Qloo entity it is built on and why Qloo surfaced it, for example "liked by people who also go to" two named venues within walking distance. English or French.

Remove Qloo and the agent has nothing to say about a specific street. That is the design test we built against.

How we built it

  • Next.js on Vercel, agent logic server-side, one input page and one result page.
  • Geocoding: OpenStreetMap Nominatim, cached, within its usage policy.
  • Step 1, read the neighbourhood: Qloo /v2/insights for places around the address, narrowed to the merchant's own kind of venue with filter.tags (tag ids from GET /v2/tags). Sparse result, wider radius: 1.5 km, then 5 km, then 20 km.
  • Step 2, cross domains: the top five local places go back in as signal.interests.entities, and the agent queries artists, brands and films with feature.explainability=true. Qloo then reports which neighbourhood venue drove each result. That is the "why" on every line.
  • Rules layer: each business type maps signals to concrete actions (a restaurant gets dishes, playlists and themed evenings; a boutique gets shelf picks, window themes and partners).
  • Optional copy layer: Claude rewrites the seven lines. A rewrite is rejected unless every line still names its Qloo entity, so the model cannot drift from the data. No key, budget reached or any error: the rule templates are served and the page still works.
  • The result page shows every agent step: which type, which radius, how many seeds, how many hits.

Challenges

With location signals alone, Qloo answers "Could not calculate explainability". The per-result "why" only appears once the query carries interest entities. Seeding the cross-domain queries with the neighbourhood's own top venues solved it. The agent's reasoning is now visible on the page.

Accomplishments

  • Every recommendation is traceable to a Qloo entity and to the local venues behind it.
  • The LLM is optional and fenced: it can rephrase, it cannot invent.
  • The public repository holds no Qloo data. Without a key the app runs on clearly labelled synthetic fixtures.

What we learned

Cross-domain affinity is the part a general model has no data for. Location narrows the audience; interest seeds turn that audience into reasons.

What's next

A one-page "what your street likes" report a merchant can keep, refreshed monthly, and a French-first interface for owners who work in French.

Built With

  • claude
  • next.js
  • openstreetmap-nominatim
  • qloo-insights-api
  • typescript
  • vercel
Share this project:

Updates

Submission history