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)
/searchresolves favorites;/v2/insightsruns once per domain (shows, films, games, music, manga) with all favorites assignal.interests.entitiesandfeature.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/tagsfor 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 indocs/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

Log in or sign up for Devpost to join the conversation.