{"id":50804974,"url":"https://github.com/microchipgnu/taste-mirror","last_synced_at":"2026-06-13T00:04:05.683Z","repository":{"id":355046361,"uuid":"1226551329","full_name":"microchipgnu/taste-mirror","owner":"microchipgnu","description":"Vibe-to-bookable: a Claude skill + Viator-backed API that turns a visual mood into bookable travel experiences. Built for the Viator Travel Tech hackathon.","archived":false,"fork":false,"pushed_at":"2026-05-01T15:01:17.000Z","size":371,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-01T16:32:13.671Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/microchipgnu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-01T14:46:15.000Z","updated_at":"2026-05-01T15:01:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/microchipgnu/taste-mirror","commit_stats":null,"previous_names":["microchipgnu/taste-mirror"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/microchipgnu/taste-mirror","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microchipgnu%2Ftaste-mirror","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microchipgnu%2Ftaste-mirror/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microchipgnu%2Ftaste-mirror/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microchipgnu%2Ftaste-mirror/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/microchipgnu","download_url":"https://codeload.github.com/microchipgnu/taste-mirror/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microchipgnu%2Ftaste-mirror/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34266919,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-13T00:04:04.766Z","updated_at":"2026-06-13T00:04:05.673Z","avatar_url":"https://github.com/microchipgnu.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Taste-Mirror\n\nA Claude skill + Viator-backed API that turns a visual mood into bookable travel experiences.\n\nUser shows the agent a handful of travel-aesthetic images (Pinterest, screenshots, photos from past trips). The skill extracts the vibe in-context (using the model's vision), confirms it with the user, asks for a destination, and returns a tight shortlist of real Viator activities that match — each with an affiliate link.\n\nBuilt for the Viator Travel Tech hackathon. **Affiliate model only** — the skill curates, the user clicks out to Viator to book.\n\n## Architecture\n\n```\n┌──────────────────────┐                        ┌────────────────────────┐\n│  Agent harness       │   POST /api/match      │  Vercel Function       │\n│  (Claude Code, etc.) │──────────────────────▶ │  • Viator search       │\n│  + SKILL.md          │   { vibe_profile,      │  • affiliate URL inj.  │\n│  • vision analysis   │     destination, ... } │  • holds API key       │\n│  • match reasoning   │ ◀──────────────────────│                        │\n└──────────────────────┘   ranked candidates    └────────────────────────┘\n```\n\nThe skill does the *thinking* (vision analysis, vibe distillation, ranking, reasoning, presentation). The server does the *plumbing* (Viator search, affiliate URL injection, holds the API key).\n\n## Repo layout\n\n```\napi/match.ts             # POST: vibe + destination → ranked Viator candidates\napi/enrich.ts            # POST: product codes → full Viator detail (inclusions, etc.)\nlib/types.ts             # shared types + zod schemas\nlib/viator.ts            # Viator client (mock + live; uses productUrl as-is)\nlib/viator-tags.ts       # /products/tags cache + vibe → tag-id mapping\nlib/vibe-to-filters.ts   # vibe_profile → search params\nlib/affiliate.ts         # mock-only affiliate URL builder (live uses Viator's productUrl)\nskills/taste-mirror/SKILL.md       # the deliverable — what users install\nskills/taste-mirror/references/    # detailed docs loaded on demand\nskills/taste-mirror/scripts/       # bundled helpers (e.g. traveler-profile builder)\n```\n\nThe server hits four Viator endpoints: `GET /destinations` (cached, name → ID),\n`GET /products/tags` (cached, vibe vocab → tag IDs), `POST /products/search`\n(filtered by tags + flags + duration + window + price), and `GET /products/{product-code}`\n(detail enrichment for the skill's top 3 picks).\n\n## Local dev\n\n```bash\nnpm install\ncp .env.example .env.local\n# leave MOCK_VIATOR=true until you have a Viator API key\nnpx vercel dev --listen 3000\n```\n\nVercel will serve at `http://localhost:3000`. Smoke-test the endpoint:\n\n```bash\ncurl -sS -X POST http://localhost:3000/api/match \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"vibe_profile\": {\n      \"themes\": [\"coastal\", \"slow_food\", \"golden_hour\"],\n      \"pace\": \"slow\",\n      \"social\": \"intimate\",\n      \"aesthetic\": [\"warm_tones\", \"uncrowded\"],\n      \"activity_types\": [\"culinary\", \"nature\"],\n      \"avoid\": [\"mass_tourism\", \"high_energy\"],\n      \"summary\": \"Slow, golden-hour-leaning, food + coastal landscapes.\"\n    },\n    \"destination\": \"Lisbon\",\n    \"limit\": 5\n  }' | jq\n```\n\nExpect 4 candidates (the mass-tourism tuk-tuk should be filtered out by `avoid`).\n\n## Switching to the real Viator API\n\nTomorrow, when the sandbox API key arrives:\n\n```bash\n# .env.local\nMOCK_VIATOR=false\nVIATOR_API_KEY=\u003cpaste sandbox key\u003e\nVIATOR_PARTNER_ID=\u003cpartner id\u003e\nVIATOR_MCID=42383\n```\n\nThe live client (`lib/viator.ts`) is written from the public docs but unverified. Expect to tweak the request/response shape against the real sandbox — the mock contract is what the rest of the stack depends on, so changes stay isolated to that one file.\n\n## Deploying\n\n```bash\nvercel       # link the project, first deploy\nvercel env add VIATOR_API_KEY\nvercel env add VIATOR_PARTNER_ID\nvercel env add VIATOR_MCID\nvercel --prod\n```\n\nThen set the public URL as `TASTE_MIRROR_API` in the skill install instructions.\n\n## Installing the skill\n\n### Recommended: via [skills.sh](https://skills.sh)\n\n```bash\nnpx skills add \u003cowner\u003e/\u003crepo\u003e\n```\n\nThis pulls `skills/taste-mirror/` (SKILL.md + `references/` + `scripts/`) into your agent's skill directory automatically (e.g. `~/.claude/skills/taste-mirror/` for Claude Code). Restart your agent — the skill triggers when you share travel-aesthetic images and ask for matching experiences.\n\nThe skill talks to the public deployment at `https://taste-mirror.vercel.app` by default. If you're running the server locally, override with:\n\n```bash\nexport TASTE_MIRROR_API=http://localhost:3000\n```\n\n### Manual install\n\n```bash\nmkdir -p ~/.claude/skills\ncp -R skills/taste-mirror ~/.claude/skills/taste-mirror\n```\n\n### Optional: build the traveler profile\n\nFor sharper recommendations the skill can read `~/.taste-mirror/traveler_profile.md` — a synthesized portrait of the user distilled from their Claude Code transcripts. Build it with the script bundled in the skill (uses your existing Claude Code auth, **no extra API key**):\n\n```bash\nnpx tsx ~/.claude/skills/taste-mirror/scripts/build-profile.ts\n```\n\nFirst invocation downloads `tsx` (~1 min, then cached). First profile build takes ~30–50 min for ~100 projects at default settings; subsequent runs are nearly instant for unchanged transcripts. See [`skills/taste-mirror/references/traveler-profile.md`](skills/taste-mirror/references/traveler-profile.md) for knobs and rules.\n\n## Submission checklist (hackathon)\n\n- [x] Working integration with the Viator Partner API (live client written; sandbox swap-in tomorrow)\n- [ ] Brief description of project + how Viator's data enhances it (drafted in this README)\n- [ ] Demo video (≤ 3 min) showing end-to-end flow\n- [ ] GitHub repo with code + setup instructions\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicrochipgnu%2Ftaste-mirror","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmicrochipgnu%2Ftaste-mirror","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicrochipgnu%2Ftaste-mirror/lists"}