尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Paste a saved TikTok cooking video and get a structured, cookable recipe out of it: ingredients,
step-by-step instructions, make time, difficulty, an estimated grocery cost, the dominant protein,
whether it's vegan/vegetarian/pescatarian/omnivore, and estimated per-serving nutrition facts
(calories, protein, carbs, fat, fiber, sugar, sodium).
Saved recipes live across three pages, tied together by the navbar:查看完整 README ↗Paste a saved TikTok cooking video and get a structured, cookable recipe out of it: ingredients, step-by-step instructions, make time, difficulty, an estimated grocery cost, the dominant protein, whether it's vegan/vegetarian/pescatarian/omnivore, and estimated per-serving nutrition facts (calories, protein, carbs, fat, fiber, sugar, sodium).
Saved recipes live across three pages, tied together by the navbar:
ANTHROPIC_API_KEY isn't configured. The grid itself only renders
24 cards at a time with a "Load More 🌸" button to reveal 24 more, plus a dashed "Add new
recipes, girly ✨" card linking out to TikTok once every match is loaded — filtering/sorting/
searching still run over your whole saved library, but the DOM/image load stays light even with
a large collection; changing any filter resets back to the first page./api/nutrition-home-card route, kept
fully separate from this tab's data): instead of a big calorie number it shows a Mon–Sun row of
which days you cooked (with a subtle "🔥 Nd streak" pill for consecutive days), the week's
Protein/Carbs/Fat split as bars, and a line recommending a saved-but-uncooked recipe based on
which macro you're furthest from and how many calories are left in the day (generic 2000
cal/100g protein/250g carb/65g fat reference targets — there's no user profile/goals system).On mobile, the top nav is replaced by a fixed bottom bar (Home / Search / Add / Grocery / Week) so the main actions stay one thumb-tap away — and on mobile, navigation lives only in that bottom bar; the top header (logo, links) is desktop-only.
Clicking any recipe card opens a full detail view in a modal (a direct link to /recipes/[id] still
works as a real page) with a servings adjuster that scales every ingredient quantity live, the
per-serving calories, a personal notes box, a pantry-match badge, and the full nutrition breakdown.
"Start Cooking" on any recipe opens a full-screen, distraction-free guided flow: one step at a time
in a large serif font, with the previous/next step teased in small muted text above/below, a thin
progress bar at the top, and swipe or arrow-button navigation. Steps with a detected duration
("cook for 6-7 minutes", "simmer for 20 minutes" — parsed by src/lib/cookTimers.ts) surface a
"Start Timer ⏱" button; timers run concurrently in a pill bar pinned to the bottom, pulse and
vibrate (where supported) when done. The final step becomes a celebration screen — confetti, "I
made this! 💕", and a 5-star rating — which logs a CookLog row (used by the nutrition snapshot)
and marks the recipe cooked.
Exiting mid-recipe (the ✕ button) offers a "Save my spot" switch, on by default — leave it on and
the button becomes "Resume Cooking (Step X)" next time, picking back up right where you left off
with a toast confirming it; flip it off before exiting to discard that progress and start over
(src/lib/cookModeStorage.ts).
A Tinder-style discovery mode ("Feeling indecisive?" on the homepage) for when you don't know what to make. Recipes not cooked in 7+ days (or never) surface first, ones cooked 3-7 days ago are neutral, and anything cooked in the last 3 days sinks to the back — shuffled within each bucket. Swipe or tap ✅/👋; a right swipe drops you straight into Cook Mode for that recipe.
Tap any ingredient in a recipe's list to open a bottom sheet with 2-3 hardcoded smart swaps (see
src/lib/substitutions.ts — heavy cream, butter, chicken, parmesan, pasta, eggs, milk, and flour
are covered) each with a note on how it changes the dish, a diet tag where relevant, and a badge if
the substitute is already in your pantry or on your grocery list.
yt-dlp fetches the video file and its
metadata (caption, hashtags, uploader, duration).ffmpeg pulls the audio track and a handful of evenly-spaced frames from the
video.The result (title, ingredients, instructions, time, difficulty, price, protein/diet type, nutrition facts) is saved to Postgres. Nutrition facts are a per-serving estimate from the Claude analysis step, reasoned from the ingredients and quantities like a nutrition-label estimate — not a measured or database-verified value.
This requires yt-dlp and ffmpeg on the host, so the app needs a self-hosted deployment (the
included Dockerfile, e.g. on Railway/Render/a VPS) — it doesn't run on Vercel or other serverless
hosts that can't install those binaries.
TikTok lets you group saved videos into a Collection with its own shareable link
(tiktok.com/@user/collection/..., or a tiktok.com/t/... short link that redirects to one).
"Import a whole Collection instead" (below the main form) lets you paste that link, preview every
video in it (title, thumbnail, uploader), uncheck any you don't want, and import the rest — each
one runs through the normal pipeline and streams into your library as it finishes. This also needs
yt-dlp to list the collection's contents.
yt-dlp and ffmpeg/ffprobe on your PATH
(or set YT_DLP_PATH / FFMPEG_PATH / FFPROBE_PATH), plus an
OpenAI API key for transcription.npm install # also generates the Prisma client via `postinstall`
cp .env.example .env # fill in DATABASE_URL, ANTHROPIC_API_KEY (and OPENAI_API_KEY if you have one)
npx prisma migrate deploy
npm run dev
Open http://localhost:3000.
npm run build also runs prisma migrate deploy first, so a normal deploy (Render or otherwise)
applies any pending schema migrations automatically as long as DATABASE_URL is set — you only
need to run it by hand for local dev before npm run dev, since dev doesn't build.
The included Dockerfile installs ffmpeg and a standalone yt-dlp binary alongside the app, so
the pipeline works once deployed. This needs a host that builds from a Dockerfile and runs a
persistent server — not a serverless platform like Vercel, which can't install those binaries.
Render is a straightforward option:
Dockerfile and builds
from it automatically.DATABASE_URL, ANTHROPIC_API_KEY, and
AUTH_SECRET (a random string — see .env.example; without it, login sessions fall back to an
insecure dev-only secret) are the ones you need for a real deployment. Optionally add
OPENAI_API_KEY / ANTHROPIC_MODEL / OPENAI_TRANSCRIBE_MODEL and anything else from
.env.example (email verification, Stripe, Google login, affiliate IDs). You can point
DATABASE_URL at a Render Postgres instance or any other
reachable Postgres instance, including one you set up elsewhere (e.g. Neon).DATABASE_URL needs to be set before the build step even runs (next build fails fast
without it, though it doesn't need to be reachable yet) — the container then runs
prisma migrate deploy at startup, once it's actually live, so the schema gets created on first
boot. This runs at container start rather than during the image build because a Postgres add-on's
private-network host is usually only reachable from the running container, not from the build
environment./app/data so saved
thumbnails and uploaded community-recipe photos survive redeploys (without one, data/uploads
and data/community-uploads reset each time the container rebuilds — saved recipes and their
text/metadata in Postgres are unaffected either way, only those local files).Railway works the same way (New Project → Deploy from GitHub repo; it also detects the
Dockerfile and builds from it automatically).
See .env.example for the full list. The important ones:
| Variable | Required | Purpose |
|---|---|---|
DATABASE_URL | yes | Postgres connection string |
ANTHROPIC_API_KEY | yes | Powers the recipe breakdown itself |
ANTHROPIC_MODEL | no | Defaults to claude-sonnet-5 |
OPENAI_API_KEY | no | Enables Whisper transcription of narration |
OPENAI_TRANSCRIBE_MODEL | no | Defaults to whisper-1 |
YT_DLP_PATH / FFMPEG_PATH / FFPROBE_PATH | no | Override binary locations |
yt-dlp depends on staying current with TikTok's site — run
pip install -U yt-dlp (or your package manager's equivalent) if downloads stop working.maxDuration = 300, but confirm your hosting platform allows long-running server functions.src/lib/tiktok.ts — downloads video + metadata via yt-dlpsrc/lib/media.ts — extracts audio/frames via ffmpegsrc/lib/transcribe.ts — Whisper transcriptionsrc/lib/analyze.ts — Claude-powered structured recipe extractionsrc/lib/pipeline.ts — runs the pipeline end-to-end and persists the resultsrc/lib/collection.ts — lists a Collection's videos via yt-dlp --flat-playlistsrc/app/api/collections/preview — lists a Collection's videos for the picker UIsrc/app/api/collections/import — imports selected videos, streaming one result per line (NDJSON)src/components/CollectionImport.tsx — the preview/select/import UIsrc/app/api/recipes — list/create recipes; src/app/api/recipes/[id] — read/delete/patch one
(patch supports personalNotes and folderId)src/app/api/folders — list/create folders; src/app/api/folders/[id] — delete onesrc/app/api/search-recipes — Claude-powered smart search: given a natural-language query and
lightweight recipe summaries, returns matching recipe ids ranked by relevancesrc/app/api/media/[filename] — serves saved thumbnailssrc/lib/scaling.ts — scales an ingredient quantity string for the servings adjustersrc/lib/groceryCategories.ts — keyword-based Produce/Proteins/Dairy/Pantry categorizationsrc/lib/checklistStorage.ts — localStorage contract for a single recipe's own cook-along
checkmarks (ticking off ingredients/steps while actually cooking) — separate from the grocery listsrc/lib/groceryListStorage.ts — localStorage contract for the grocery list itself: which
recipe/ingredient pairs are on it and which are crossed off, independent of any recipe's own
checklist, plus clearGroceryList() for the "Clear list" buttonsrc/components/RecipeDetailContent.tsx — the recipe detail body (badges, servings adjuster,
checklist, notes, nutrition, folder) shared by both the modal and the standalone pagesrc/components/RecipeDetailModal.tsx / RecipeModalProvider.tsx — the modal recipe view opened
from any recipe card, plus the context that opens it from anywhere in the appsrc/components/MyRecipesGrid.tsx — the "Your Recipes" grid, embedded on the Home page, including
folder creation/deletionsrc/components/GroceryPantryPage.tsx, src/app/grocery-list/page.tsx — the combined
Grocery/Pantry page and its in-page tab switchersrc/components/GroceryList.tsx — the Grocery List tab's contentsrc/app/page.tsx, src/components/RecipeLibrary.tsx — Home (hero, input, dashboard cards, Cook
Tonight, and the Your Recipes grid all in one page)src/app/recipes/[id]/page.tsx — the standalone recipe detail page (direct links/sharing)src/components/CookMode.tsx — the full-screen guided cooking flow (steps, timers, celebration)src/lib/cookTimers.ts — parses a duration out of an instruction step's textsrc/app/api/recipes/[id]/cook — logs an "I made this!" event (CookLog: recipe, timestamp,
optional rating)src/components/CookTonightSwiper.tsx — the Tinder-style "Cook Tonight?" discovery modesrc/components/PantryProvider.tsx — app-wide context that fetches/mutates pantry items oncesrc/lib/pantryMatch.ts — fuzzy text matching between pantry staples and ingredient textsrc/app/api/pantry, src/app/api/pantry/[id] — list/create pantry items; delete onesrc/components/PantryPageClient.tsx — the My Pantry tab's contentsrc/components/BottomSheet.tsx — shared draggable blush bottom-sheet shellsrc/components/SubstitutionSheet.tsx, src/lib/substitutions.ts — the ingredient substitution
tapper and its hardcoded lookup tablesrc/app/api/nutrition-snapshot — aggregates a week's CookLog entries into totals, a daily
breakdown, macro %, an insight line, and balancing recommendations from uncooked savessrc/components/NutritionSnapshotPageClient.tsx, src/app/nutrition/page.tsx — the full weekly
nutrition snapshot page with a week selectorsrc/app/api/nutrition-home-card — the homepage card's own, separate aggregation: day-cooked
marks + streak, week macro %, and a today-remaining-budget recommendationsrc/components/NutritionSnapshotCard.tsx — the compact "This Week" homepage cardsrc/lib/cookTonightFilters.ts — the "Cook something tonight?" pill definitions/matcher, shared
by the homepage pill row and the Your Recipes grid it filterssrc/app/icon.tsx, src/app/apple-icon.tsx — generated "CE" app icons (coral→rose-deep gradient,
matching the rest of the app) for browser tabs and "Add to Home Screen"src/app/manifest.ts — web app manifest (name, theme color, icon) for installing as an app