Inspiration

Learners quit Japanese because the material is not about anything they love. Courses choose by difficulty; people choose by taste. Qloo knows taste across shows, films, games, music and books, so the cross-domain signal can pick what to study with while a separate rule checks whether it fits the learner's level.

What it does

Enter up to 5 favorites (any domain) and a level. Taste Trail returns a 7-day trail (a goal and a 10-20 minute task per day). Every card shows two things side by side and never mixes them: "Qloo says" (taste affinity 0 to 1, shared tags, which favorite pulled the pick) and "Our level rule says" (fits / a stretch / no language signal, with the tags behind it). Each card also shows the Japanese title (from Qloo's akas, when Qloo has one) as "Search in Japan: ...", so the learner can find it on a Japanese service. A panel shows how the agent decided: Plan, Act, Check level-fit, Replan.

How we built it (and how Qloo is used)

  • /search resolves favorites; /v2/insights runs once per domain (shows, films, games, music, manga) with all favorites as signal.interests.entities and feature.explainability=true, so each pick says which favorite pulled it.
  • A per-domain Japan lens found by probing the API: filter.release_country (and Japan must be the first listed country), Qloo tag ids from /v2/tags for music and manga, a publisher list for games.
  • The agent loop: plan the domains, act, check (enough candidates? is a pick a "stretch" for the level? does one favorite dominate?), replan (ask for 50 candidates, swap picks, rebalance favorites; up to 2 rounds).
  • The public demo runs deterministic rules (free to operate). A Claude-driven planner/reviewer (claude -p) plugs into the same loop for local runs; 20 live cases for each planner are in docs/LIVE_RUN.md.
  • Cloudflare Pages + Functions, zero dependencies, key only as a server-side secret, in-memory server cache, input validation, rate limit. If the key is missing the demo shows "Getting ready" instead of fake results.

Without Qloo the agent has no taste signal and its picks would be arbitrary.

Challenges we ran into

The docs say video_game; the API only takes urn:entity:videogame. release_country lists every release country (origin first), so a naive Japan filter returned US films. Games have no country field. Qloo answers 429 on bursts (we cap concurrency and retry). Podcasts have no usable Japan lens, so they are out.

Accomplishments that we're proud of

Evidence and our own judgement stay separate on screen; the agent's decisions are visible; 20/20 live cases complete (see docs/LIVE_RUN.md for what that does and does not measure).

What we learned

Explainability (per-favorite contribution) is the most useful field for a multi-favorite agent. Qloo returns 100+ tags per entity, so any heuristic over them needs word-level matching and caps.

Limits (read these)

Level fit is a heuristic over tag names, not measured difficulty, and is not validated against learner outcomes. Qloo affinities are group-level, not facts about the user. The Japan lens is imperfect for games and music. No personal data is sent to Qloo.

What's next for Taste Trail

Learner feedback buttons ("too hard") that re-plan a single day; a Qloo MCP tool version; measuring retention with real learners.

Testing instructions for judges

No account or key needed. Open https://taste-trail.pages.dev , press an example button (or type up to 5 favorites, e.g. "Cowboy Bebop", "Hades (game)", "Radiohead"), pick a level, press the button. You get a 7-day trail in about 3 seconds. Run locally: git clone https://github.com/fujiken1016/taste-trail && cd taste-trail && npm test (offline mock, Node 22); with a Qloo key set QLOO_API_KEY and QLOO_BASE_URL=https://hackathon.api.qloo.com and run node server.js.

Built With

  • claude
  • cloudflare-pages
  • cloudflare-workers
  • node.js
  • qloo-api
Share this project:

Updates

Submission history