Agree on the partnership before you commit to it
파트너와 실제 합의 내용을 확인하고 각자 답변을 비교해 차이를 파악한 뒤 변호사에게 전달할 공동 요약을 작성합니다
레스토랑 주변 Qloo 맛 그래프를 읽어 메뉴·이벤트·현지 마케팅·공급업체 쇼핑리스트를 제공하고 근거를 제시하는 AI 에이전트
An AI agent that reads Qloo's taste graph around your restaurant and turns it into menu moves, events, local marketing and a supplier shopping list, with the evidence behind every call.
비즈니스TypeScript · JavaScriptGitHub @antonmareo10온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Agentic cultural intelligence for independent restaurants: a Claude + Qloo agent that reads who loves a restaurant on Qloo's taste graph and returns next week's dishes, event and supplier order, scored by crowd-vs-city lift, with every Qloo fact checked. Built for the Qloo Agentic Hackathon.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Chains have insight teams. Independent restaurants decide their menu, their events and their marketing on gut feel. Tastecraft is an AI agent that reads Qloo's taste graph around a restaurant and turns it into decisions an owner can act on this week: three dishes to test, an event, a ready-to-post campaign aimed at the right neighborhoods and a supplier shopping list, with the Qloo evidence behind every call.
Live demo: https://tastecraft-xi.vercel.app · Video (2:27): https://youtu.be/rfagHjhzI1c · Built for the Qloo Agentic Hackathon (2026), from scratch during its submission period (30 Sep – 30 Oct 2026): the repository starts from create-next-app on 16 Oct 2026 (git log --reverse).
The headline number: +10% over the same model alone, on 22 restaurants it never saw, and by my own pre-registered rule that is not proven. Before running anything I committed the 22 restaurants, the metric and the decision rule (eval/PREREGISTRATION_30.md, commit 9a147de). The result, whatever it was, is in eval/HELDOUT_30.md. With the same model at the same effort in every arm and every dish scored only on a held-out half of each Qloo restaurant set (5 random splits), the model's dishes score ×1.11 crowd lift on their own, ×0.95 when given Qloo affinity data, and ×1.22 with Tastecraft's crowd-vs-city contrast computed on the other half: ×1.10 the model alone per restaurant (95% bootstrap interval ×0.96 to ×1.27), better in 13 of 22 restaurants and 60 of 110 plans. The interval includes ×1, so this sample cannot tell the gain from no difference.
Two results are clear. Qloo's affinity data on its own scored below the model alone (×0.85, interval ×0.73 to ×0.99), and the crowd-vs-city contrast beats it: ×1.29 (×1.16 to ×1.44), better in 19 of 22. Raw affinity leans towards what is popular everywhere; the contrast is what makes Qloo's signal specific to one crowd. The ruler is Qloo's own menu tags, so all of this measures whether the dishes follow the crowd's Qloo signal, not whether guests will order them. npm run eval:heldout reproduces it (how).
Other numbers you will see, and why they differ:
The contrast did not beat the model alone in 12 of the 30 restaurants. In 10 of them the model alone already scored above ×1 by staying with the restaurant's own cuisine, and the contrast pulled it towards dishes that the crowd's places in the scoring half serve no more often than the city's (part of this is regression to the mean). It loses most at casual places: at $ and $$ it wins in 3 of 11 new restaurants, at $$$ and $$$$ in 10 of 11 (exploratory). One line each, worst first; the numbers are the held-out arm's score divided by the model alone's:
It helps most where the model alone is weak: Commander's Palace goes from ×0.72 alone to ×1.59, Casa Lucio from ×0.59 to ×1.56. The full lines are in eval/HELDOUT_30.md.
| Criterion | Where to look |
|---|---|
| Technological implementation (how thoroughly and skillfully Qloo is used) | Eight Qloo workflows (below): seven over /search, /entities, /v2/insights (entity, tag, demographics and heatmap outputs) and /v2/analysis/compare, and concert ranking through Qloo's official qloo-harness rank workflow; a crowd-vs-city contrast built from two Qloo queries that separates what a crowd favours from what is popular everywhere (src/lib/lift.ts); every cited Qloo name and score checked against the run's own Qloo responses (src/lib/ledger.ts); bounded retries and request smoothing like Qloo's official client; unit tests that need no keys or network, and CI. |
| Design | Streaming agent log, live playbook draft, a one-click Qloo on/off switch on the home page, taste constellation, taste map, per-dish evidence with ✓/⚠, side-by-side with/without Qloo, PDF export, English/Spanish. |
| Potential impact | Independent restaurants (more than 7 in 10 US restaurants are single-unit) get an insight team's output: dishes, an event, a campaign, a shopping list and a week plan. MCP endpoint so POS or reservation assistants can call it. Price, cost to serve, channels and market: Business case. |
| Quality of the idea (creative, non-obvious use of Qloo) | Uses the audience's other tastes (places, music, brands) and contrasts them with the city to find what is specific to this crowd. For example, Katz's guests' other favourite places are cheap pizza slices, hot-dog counters and dive bars, which leads to a weeknight pub-snack menu rather than more deli classics. |
| Qloo kit asks for | Where it is |
|---|---|
| A short product problem statement | The top of this README and /about |
| The Qloo workflows used and why | How Tastecraft uses Qloo |
| A redacted request-to-result explanation, with entity and tag choices | docs/REQUEST_TO_RESULT.md |
| A demo with no credentials or personal data | The live demo and its instant replays of real runs |
| Setup another participant can run from a clean environment | Run it locally, including a no-keys mode |
| Known limitations, including what the results do not establish | Known limitations |
| Data handling | Qloo data handling |
Ask a general-purpose LLM what a tapas bar in Madrid should add to its menu and you get the same answer every tapas bar gets. Tastecraft starts from who actually goes to this restaurant, as seen through Qloo's cross-domain taste graph, and only then reasons about food:
| Question an owner has | What Tastecraft asks Qloo | Endpoint |
|---|---|---|
| Is my restaurant in the graph, and how is it tagged? | Entity search (falls back to the name alone when the city words drown it) | GET /search, GET /entities |
| What else do my guests love: nearby places, music, brands, films? | Cross-domain affinity from the restaurant entity (places filtered to the city; other domains localised with a location signal) | GET /v2/insights (filter.type=urn:entity:*) |
| What does my crowd favour that the city at large doesn't? | Crowd vs city: the ~150 restaurants my audience loves most vs the city's ~150 most popular, compared tag by tag and menu term by menu term (lift) | GET /v2/insights (filter.type=urn:entity:place, filter.tags=…restaurant, with and without signal.interests.entities) |
| Which dishes, cuisines and vibes does my crowd lean towards? | Taste analysis on tag families (specialty dishes, menu highlights, cuisines, ambience) | GET /v2/insights (filter.type=urn:tag) |
| Who are my guests? | Age and gender over/under-indexing | GET /v2/insights (filter.type=urn:demographics) |
| How am I positioned against my closest rival? | Head-to-head of the two places: tags only one of them carries | GET /v2/analysis/compare |
| Where in the city does my kind of guest live and go out? | Heatmap of taste affinity by geohash, then the top distinct neighborhoods | GET /v2/insights (filter.type=urn:heatmap) |
| Which concerts nearby would my guests go to? (optional, with a Ticketmaster key) | Ranks the billed artists for this audience with Qloo's official harness (rank workflow) | @qloo/qloo-harness over /search + /v2/insights |
Qloo's tag affinity is percentile-like and saturates at the top for any audience: the top-10 dish tags average 99.2 for a restaurant's audience and 99.6 for the city overall (eval/SUMMARY.md). An average of affinities therefore reads ~96–100 for any plan. Crowd lift compares the audience with a baseline instead:
Browser ──POST /api/agent──▶ Next.js route (streams NDJSON events)
│
├─ Claude (claude-opus-5-5) via the Anthropic SDK tool runner
│ tools: find_restaurant · audience_affinity · taste_tags · audience_profile
│ compare_rival · taste_gaps · taste_map · nearby_shows · publish_playbook
│
├─ each tool → Qloo hackathon API (cached server-side, ≤4 requests in flight) → compact JSON
│ → events for the UI
└─ publish → cited names and scores checked against this run's Qloo responses → crowd lift (plan + no-Qloo baseline)
publish_playbook tool call, streamed so the UI drafts the playbook live; if the streamed JSON is malformed, the last step is retried once with server-validated input./v2/trending endpoint does not accept places (set QLOO_PLACE_TRENDS=1 if a key does).X-Api-Key header; it never reaches the browser, a prompt or a log.src/data/demos.json is gitignored. Deployments get them as an encrypted file downloaded at build time from a private URL (TASTECRAFT_DEMOS_URL, AES-256-GCM with TASTECRAFT_DEMOS_KEY); without those variables the app simply runs live-only. See scripts/pack-demos.mjs and scripts/ensure-demos.mjs.eval/*.local.json); eval/SUMMARY.md and eval/HELDOUT_30.md have aggregates and restaurant names only.Numbers marked hypothesis are not tested yet; everything else is measured or sourced.
| Who pays | Independent restaurants and small groups (2–10 locations), per location per month, with the first playbook free. Price hypothesis: US$49 per location per month. |
| Cost to make a playbook | Claude: US$0.32–0.37, from the token counts of two logged runs at Claude Opus 5.5 list prices (US$4 per million input tokens, US$5 per million 5-minute cache writes, US$0.20 per million cache reads, US$20 per million output tokens). The runs used 81.8k and 92.9k input tokens (57.2k and 60.1k of them cache reads, 24.6k and 32.8k cache writes) and 8.7k and 9.2k output tokens, plus under US$0.01 for the no-Qloo quick answer. Qloo: about 17 to 34 API requests, counted from the code paths the three recorded runs took: restaurant search 1–2, audience affinity 4–5, taste tags 3, demographics 1, head-to-head 1, the crowd and city sets 6 (3 pages of 50 each, plus 3 for an age-lens crowd), heatmap 1, and the concert ranking through Qloo's harness, which adds one request plus one lookup per artist (up to 10) and the restaurant. Identical requests are cached for 6 hours. |
| Unit economics | A weekly playbook is about US$1.50 of Claude per location per month. Qloo's commercial price is not public, so it is not included. |
| How it reaches owners | The app marketplaces of POS systems (Toast, Square and Clover each run one) and reservation platforms' partner programs, through the MCP endpoint or an embed; and food distributors, because the shopping list is already an order for them. |
| How big | 412,498 independent restaurants in the US at the end of 2025, down 2.3% in a year (Technomic data via Nation's Restaurant News); more than 7 in 10 US restaurants are single-unit operations (National Restaurant Association, 2025 State of the Industry pocket guide). Arithmetic, not a forecast: 1% of US independents at the hypothetical price is about 4,125 locations and US$2.4M a year. |
| Why it is good for Qloo | Every playbook is Qloo API usage, and a weekly playbook makes every subscribing restaurant a recurring Qloo API customer by proxy. |
| Why this builder | The author built Supplora, an AI tool that read 715 supplier delivery notes for a family-run restaurant in Spain by September 2026. That is where the gap showed: owners who know their costs to the cent decide their specials on gut feel. |
Tastecraft is also an MCP server, so an existing agent (Claude Desktop, Cursor or a restaurant's own POS assistant) can call it:
{ "tastecraft": { "url": "https://tastecraft-xi.vercel.app/api/mcp" } }
| Tool | What it returns | Cost |
|---|---|---|
taste_profile | The restaurant's Qloo entity, places/artists/brands its guests love (0-100 affinity), dishes/cuisines/vibes they lean towards, age/gender skew | Qloo only, seconds |
taste_playbook | The full verified playbook (same as the web app) | Qloo + Claude, about 2 minutes, rate-limited |
Requires Node.js 22 or newer.
git clone https://github.com/antonmareo10/tastecraft.git && cd tastecraft
npm install
| Mode | Command | Needs |
|---|---|---|
| UI only, replaying a synthetic run | npm run dev:fixture | nothing |
| The real agent against a synthetic Qloo API | npm run dev:mock | ANTHROPIC_API_KEY in .env.local |
| Live | npm run dev | ANTHROPIC_API_KEY and QLOO_API_KEY in .env.local |
Then open http://localhost:3000. For the live mode, copy the example file and add your keys (cp .env.example .env.local):
ANTHROPIC_API_KEY=... # Claude API key
QLOO_API_KEY=... # Qloo hackathon key
QLOO_BASE_URL=https://hackathon.api.qloo.com
# optional
TASTECRAFT_MODEL=claude-opus-5-5
LIVE_RUNS_DAILY_CAP=8 # live runs per server instance per day
LIVE_RUNS_PER_IP_PER_HOUR=3
LIVE_RUNS_MAX_CONCURRENT=2
LIVE_RUNS_DISABLED=1 # replay-only mode
TICKETMASTER_API_KEY=... # concerts by your guests' favourite artists + game days nearby
TASTECRAFT_DEMOS_URL=... # encrypted recorded runs for a deployment (see below)
TASTECRAFT_DEMOS_KEY=...
Checks and evaluation:
npm test # unit tests (no keys, no network)
npm run benchmark # with/without-Qloo benchmark -> eval/SUMMARY.md (needs both keys; ~24 short model calls)
npm run benchmark -- --rescore # rescore the saved dishes with the current formula, no model calls
npm run benchmark:holdout # held-out check on the first 8 restaurants (160 short model calls, ~US$2)
npm run eval:heldout # the pre-registered held-out check on 30 restaurants -> eval/HELDOUT_30.md (600 short model calls, ~US$7)
npm run eval:heldout -- --summary # rewrite eval/HELDOUT_30.md from the saved results, no calls
npm run eval:heldout reproduces the headline number. It reads both keys from .env.local or the environment, runs the 22 restaurants of eval/heldout30.restaurants.json and then the original 8, and resumes where it stopped if a call fails (delete eval/holdout30.local.json to start over). Model sampling is not deterministic, so a new run gives close numbers, not identical ones. The raw results stay in that gitignored file because they contain Qloo data.
Recorded runs for instant replays (stored locally, never committed):
npm run record-demo -- "Casa Lucio" "Madrid" "Launch a new seasonal special" http://localhost:3000
npm run rescore-demos # recompute the server-derived crowd-lift fields with the current formula (Qloo only)
npm run pack-demos # encrypt them to .demos/demos.enc.txt with the key in .demos/KEY (both gitignored)
To serve them from a deployment, upload .demos/demos.enc.txt to a private-by-URL location (for example gh gist create .demos/demos.enc.txt, which makes a secret gist) and set TASTECRAFT_DEMOS_URL to its raw link and TASTECRAFT_DEMOS_KEY to the content of .demos/KEY.
Everything works from the keyboard. The Qloo switch is a real switch (Space or Enter flips it, and the new crowd lift is announced), the restaurant and language pickers move with the arrow keys, the agent log can be focused and scrolled with the keyboard, and every badge's spoken name starts with the words you see on it. With reduced motion turned on, nothing slides or drifts and every interaction still works.
How I checked it: axe-core 4.10 (WCAG 2.0, 2.1 and 2.2 AA plus best practices) on the home page with the switch on and off, a full replay and /about, at 1440 px and 390 px, run with Playwright on a production build. Result: 0 violations at any level on all 8 pages. The same script also tabs to the switch, flips it, moves both pickers with the arrows and scrolls the agent log, with and without reduced motion. Lighthouse on a phone profile: Accessibility 100, Best Practices 100, SEO 100, Performance 93.
Next.js 16 (App Router) · React 19 · Tailwind CSS 4 · Anthropic TypeScript SDK (tool runner, adaptive thinking) · Zod · Leaflet + OpenStreetMap · ngeohash · Qloo official harness.
Antonio González Fernández, Business Administration and Data Science student at CUNEF (Madrid). Tastecraft grows out of building Supplora, an AI tool that read 715 supplier delivery notes for a family-run restaurant in Spain by September 2026 and loaded them into its management system. Working in that kitchen made the gap obvious: the owners know their costs to the cent, but decide their specials on gut feel.
MIT. See LICENSE.