{"id":50954539,"url":"https://github.com/rinpatch/what-to-eat","last_synced_at":"2026-06-18T05:01:18.818Z","repository":{"id":364507859,"uuid":"1268023529","full_name":"rinpatch/what-to-eat","owner":"rinpatch","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-13T08:37:21.000Z","size":836,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-13T10:21:35.484Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://what-to-eat-weld.vercel.app","language":"JavaScript","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/rinpatch.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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-13T04:19:51.000Z","updated_at":"2026-06-13T08:37:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rinpatch/what-to-eat","commit_stats":null,"previous_names":["rinpatch/what-to-eat"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/rinpatch/what-to-eat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rinpatch%2Fwhat-to-eat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rinpatch%2Fwhat-to-eat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rinpatch%2Fwhat-to-eat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rinpatch%2Fwhat-to-eat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rinpatch","download_url":"https://codeload.github.com/rinpatch/what-to-eat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rinpatch%2Fwhat-to-eat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34476728,"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-18T02:00:06.871Z","response_time":128,"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-18T05:01:18.087Z","updated_at":"2026-06-18T05:01:18.812Z","avatar_url":"https://github.com/rinpatch.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# What To Eat Ah\n\n## The Short Version\n\n**What To Eat Ah** is a mobile-first food decision app for Singapore. It turns trending creator food clips into a swipeable deck of real places you can actually visit.\n\nInstead of opening five apps, scrolling for twenty minutes, and still asking \"so what to eat ah?\", the user opens one deck, filters by distance or cuisine, swipes through credible food clips, saves the good ones, and leaves with a shortlist.\n\nIt is not a restaurant directory. It is not a TikTok clone. It is a dinner decision engine powered by social food evidence.\n\n## Demo\n\nWatch the video demo: https://drive.google.com/file/d/1qWUZW9tXGC6I7ANQ79CRfxWSfIovlN3s/view?usp=sharing\n\n## The Problem\n\nChoosing food in Singapore is weirdly hard because the information is everywhere and nowhere at the same time.\n\nSocial feeds show what looks good, but they are built for endless scrolling, not deciding. Map apps show what is nearby, but they rarely capture what is currently exciting. Delivery apps optimize for ordering, not going out. Group chats collect links, but they do not help the group converge.\n\nThe result is a familiar loop:\n\n- Someone asks what to eat.\n- Everyone sends random links.\n- The group opens social videos, map reviews, menus, and distance checks.\n- Nobody knows which option is actually worth acting on.\n\n**What To Eat Ah compresses that loop into a fast, physical swipe decision.**\n\n## Product Promise\n\nOpen the app. Swipe through a small stack of food options. Save the ones that make sense. Pick from the shortlist.\n\nEach card answers the questions that matter in the moment:\n\n- What dish is this?\n- Where is it?\n- How far away is it?\n- Who recommended it?\n- Is there enough social proof?\n- Does it match what I seem to like?\n- Can I open it in Maps right now?\n\nThe product succeeds when the user stops browsing and starts moving.\n\n## Who It Is For\n\nWhat To Eat Ah is built for people in Singapore deciding what to eat on their phone, usually under light pressure:\n\n- Friends choosing dinner in a group chat.\n- Students looking for something nearby after class.\n- Office workers deciding lunch without another spreadsheet-level debate.\n- Couples looking for a casual date-night option.\n- Anyone who trusts creator clips but wants a decision tool, not a feed.\n\nThe app assumes the user is not doing deep restaurant research. They want credible, nearby, craveable options fast.\n\n## Core Experience\n\nThe first screen is the product. No landing page, no explanation wall, no onboarding maze.\n\nThe user sees a phone-sized swipe deck:\n\n- A large food card led by dish imagery or video.\n- Dish name, creator, engagement, distance, price, and rating.\n- A pull quote from the creator when available.\n- A detail layer inside the card with place facts and creator mentions.\n- A bottom action rail for nope, undo, save, and details.\n- A shortlist button in the top bar.\n- A distance slider and cuisine drawer above the deck.\n\nSwiping right saves a card to the user's crawl. Swiping left removes it from the session. The user can undo, open details, filter by cuisine, adjust the distance radius, and jump to Google Maps from the shortlist.\n\n## Why Swipe?\n\nFood decisions are emotional, quick, and comparative. A swipe deck matches that behavior better than a search results page.\n\nSearch works when the user knows what they want. What To Eat Ah is for the more common moment: \"I am hungry, nearby, and open to being convinced.\"\n\nThe deck creates a finite decision loop:\n\n- One option at a time.\n- Clear yes/no action.\n- Immediate feedback.\n- A shortlist that gets better as the session progresses.\n\n## How Ranking Works\n\nThe deck starts with social momentum, then personalizes as the user swipes.\n\nEach clip receives a velocity score based on engagement and recency. Newer, more active clips rise first. As the user swipes, the session updates taste weights across three kinds of tags:\n\n- Cuisine, such as local, Chinese, Malay, Korean, Japanese, Thai, Indian, and more.\n- Price band, such as cheap, mid, or treat.\n- Vibe, such as comfort, spicy, hawker, supper, sweet, or date-night.\n\nRight swipes increase the weights for that clip's tags. Left swipes reduce them. Personalization ramps up gradually, so the first cards are driven mostly by broad social signal, while later cards reflect what the user is choosing in the current session.\n\nThe ranking formula is intentionally simple:\n\n```text\ncard score = social velocity + personalization ramp * taste match\n```\n\nThat makes the product explainable. A card appears because it is trending, nearby, and increasingly aligned with the user's taste.\n\n## Filters That Matter\n\nThe MVP keeps filters tight because too many filters recreate the restaurant-directory problem.\n\nThe current controls are:\n\n- **Distance radius:** 1 km to 15 km.\n- **Cuisine:** multi-select drawer with cuisines like local, Malay, Chinese, Japanese, Korean, Thai, Western, Mediterranean, Indian, and others.\n\nThe app deliberately keeps vibe tags inside the card instead of making them top-level filters. Vibe should explain why a recommendation fits, not become another configuration chore.\n\n## Shortlist\n\nThe shortlist is the payoff.\n\nSaved cards appear in a bottom sheet with:\n\n- Thumbnail.\n- Dish name.\n- Venue name.\n- Distance and rating.\n- Direct Maps action.\n\nThis keeps the user in the decision flow. They can swipe, compare, and leave with an actionable food crawl without switching routes or losing context.\n\n## Data Model\n\nThe product separates social clips from real places.\n\nClips are the evidence. Places are the canonical destination.\n\n| Object | Purpose |\n| --- | --- |\n| `Place` | Venue name, address, location, Google rating, price level, distance, map URL |\n| `Clip` | Dish, creator, caption, poster/video, engagement, tags, quote, source timing |\n| `DeckCard` | A joined place and clip with creator mentions, velocity score, and final score |\n| `TasteWeights` | Session-level preference weights learned from swipes |\n\nThis distinction matters because multiple creators can mention the same place. The user should not see random duplicate content as separate restaurants. The app can use many clips as supporting evidence for one real-world decision.\n\n## Pipeline\n\nThe frontend should feel instant, so heavy video processing happens before the user request.\n\nThe repo includes an offline cache pipeline that turns raw creator content into a stable JSON contract the app can read safely.\n\n```mermaid\nflowchart LR\n  A[\"Instagram food creators\"] --\u003e B[\"Bright Data discovery\"]\n  B --\u003e C[\"Normalize reels\"]\n  C --\u003e D[\"Supabase raw_reels\"]\n  C --\u003e E[\"VideoDB upload and index\"]\n  E --\u003e F[\"Transcript snippets\"]\n  E --\u003e G[\"Visual food snippets\"]\n  F --\u003e H[\"Best clip and quotes\"]\n  G --\u003e H\n  H --\u003e I[\"videodb_evidence.json\"]\n  I --\u003e J[\"Deck API\"]\n  J --\u003e K[\"Swipe UI\"]\n```\n\nThe VideoDB cache records:\n\n- Original post ID and video URL.\n- VideoDB asset ID and stream URL.\n- Best clip start/end.\n- Transcript snippets.\n- Visual snippets.\n- Quote candidates.\n- TokenRouter-ready input.\n- Processing status and per-row errors.\n\nFailed or partial rows do not block the deck. The pipeline is designed to degrade gracefully.\n\n## API Surface\n\nThe app exposes two focused routes:\n\n| Route | Job |\n| --- | --- |\n| `GET /api/deck` | Returns ranked cards for distance and cuisine filters |\n| `POST /api/swipe` | Accepts a left/right swipe, updates taste weights, and returns the next ranked cards |\n\nThe client stores session state in `sessionStorage`, including seen clip IDs, saved cards, taste weights, distance radius, and selected cuisines. This keeps the MVP lightweight: no login is required to get a personalized session.\n\n## Tech Stack\n\nThe product is built as a Next.js app with a data pipeline around it.\n\n- **Frontend:** Next.js App Router, React, TypeScript, Tailwind CSS.\n- **UI system:** Mobile-first CSS, Archivo display type, Instrument Sans body type, lucide-react icons.\n- **Recommendation logic:** Local ranking utilities for social velocity, tag weights, and distance filtering.\n- **Storage and ingestion:** Supabase pipeline scripts for raw reels and processed evidence.\n- **Content acquisition:** Bright Data scripts for Instagram creator discovery.\n- **Video understanding:** VideoDB for food audio indexing, visual indexing, search, best clip extraction, and quote candidates.\n\n## What Makes It Different\n\nMost food products start from one of three places: search, delivery, or content.\n\nWhat To Eat Ah starts from the decision.\n\nThat changes the shape of the product:\n\n- It is finite, not endless.\n- It is place-aware, not just content-aware.\n- It uses social proof without becoming a social feed.\n- It learns from swipes without needing account setup.\n- It treats video as evidence, not entertainment.\n- It turns \"this looks good\" into \"we can go there.\"\n\n## Demo Story\n\nStart with the line everyone knows:\n\n\u003e \"What to eat ah?\"\n\nThen show the app opening directly into the deck.\n\n1. Adjust distance to keep options realistic.\n2. Swipe left on something that does not fit.\n3. Swipe right on something craveable.\n4. Show the taste bars updating after a few swipes.\n5. Open details to show the venue, distance, rating, creator evidence, and quote.\n6. Open the shortlist.\n7. Tap Maps.\n\nThe demo lands because the product does not explain decision-making. It performs it.\n\n## Current MVP\n\nThe MVP already demonstrates the full loop:\n\n- Swipeable mobile deck.\n- Distance and cuisine filters.\n- Left/right swipe actions with button fallbacks.\n- Undo.\n- Saved shortlist.\n- Maps handoff.\n- Session-based personalization.\n- Ranking by social velocity and taste match.\n- Offline VideoDB evidence cache tooling.\n- Bright Data and Supabase ingestion scripts.\n\n## Next Bets\n\nThe strongest next steps are:\n\n- Real user location instead of static distance values.\n- Opening hours and \"open now\" filtering.\n- Group mode for shared shortlists and convergence.\n- Better duplicate handling across creators and dishes.\n- Dietary filters that stay simple, such as halal, vegetarian, spicy tolerance, and budget.\n- Productionized evidence generation from VideoDB cache into deck cards.\n- Stronger place enrichment with canonical venue IDs.\n\n## Product North Star\n\nThe north star is not watch time. It is decision time.\n\n**How quickly can a hungry person go from \"what to eat ah?\" to a shortlist they trust?**\n\nEvery feature should make that loop faster, more credible, or more locally relevant.\n\n## One-Line Pitch\n\n**What To Eat Ah turns Singapore food creator clips into a swipeable, personalized dinner shortlist you can act on immediately.**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frinpatch%2Fwhat-to-eat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frinpatch%2Fwhat-to-eat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frinpatch%2Fwhat-to-eat/lists"}