Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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