尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗A free, ad-free recipe app for your phone. Paste or share a link to any recipe page and get just the recipe: ingredients and steps, no life story. Save recipes, sort them into categories and recipe books, scale servings while you cook, and share them with anyone.
vercel.json handle the rest.extract-yourname.vercel.app. That's your app.To use your own domain, for example recipes.bnewt.com, open the project in Vercel, go to Settings → Domains, and add it.
iPhone: open your app's address in Safari, tap the Share button, then Add to Home Screen.
Android: open the address in Chrome, tap ⋮, then Install app (or Add to Home screen).
Open it from the home-screen icon from then on. On iPhone, the home-screen app keeps its own storage, separate from Safari.
Every recipe opens on a review screen first, so you can fix anything before saving.
Without this, links from sites that publish standard recipe data work fine. Most big recipe sites and food blogs do. With it, you can also read photos of recipe cards, cookbook pages, and pasted text, plus sites without that data.
ANTHROPIC_API_KEY: your key.ACCESS_CODE: any password you choose. This stops strangers who find your app's address from using your key. Enter the same code once in the app under Settings → Access code.Optional: set RECIPE_MODEL to use a different Claude model. The default is claude-haiku-5-5.
Sync keeps your recipes, books, meal plan and grocery list the same on your phone, computer, and anyone else who signs in with your email. It also makes share links short. Without it, everything still works on one device.
extract) and a database password (save it somewhere), and pick the region nearest you. Wait a minute for it to finish setting up.supabase/schema.sql from this repo, and click Run. It should say "Success. No rows returned."<h2>Your Extract sign-in code</h2>
<p>Enter this code in Extract: <strong>{{ .Token }}</strong></p>
Save. (The app signs in with this 6-digit code instead of a link, because on iPhone a link would open Safari instead of the installed app.)SUPABASE_URL (the Project URL) and SUPABASE_ANON_KEY (the anon key). Then redeploy: Deployments → ⋯ on the latest → Redeploy.About the free plan: Supabase pauses a free project after about a week with no use, and emails you first. Your data is kept; open the Supabase dashboard and click Resume project. Using the app every few days keeps it awake. The anon key is designed to be public: the database rules in schema.sql let each person read and change only their own data, and a share can be opened only by someone who has its link.
Supabase's built-in email sender allows only about 2 emails per hour for the whole project, and one code request per minute per person. Each device needs one sign-in, so set up one device, wait if needed, then the next. To lift the limit, add your own email sender (for example a free Brevo or Resend account) under Authentication → Emails → SMTP Settings.
Every new feature gets an entry in public/tour.js (TOUR). People who already took the tour see only the new entries, under "What's new", the next time they open the app.
Share on a recipe or a book makes a link anyone can open, no account needed; they can save their own copy. With sync on, links are short. Without it, the link carries the recipe itself, so books with many recipes make long links; if a messaging app cuts one off, send it as text instead. A shared link is a copy: later edits don't change it.
Under Settings → Backup, Save a backup saves a file you can keep in Files or Google Drive, and Restore from backup loads it on a new phone. With sync on, your data is also in your Supabase project.
No build step. public/ is the app (plain HTML/CSS/JS, installable PWA with an offline service worker and an Android share target). api/ holds Vercel serverless functions:
| Route | What it does |
|---|---|
GET /api/fetch?url= | Fetches the page server-side and reads its schema.org Recipe data. Falls back to Claude when the page has none and a key is set. Blocks private and internal addresses, with redirect, size and time limits. |
POST /api/extract | Reads { text, url? } or { image: { data, media_type } } with Claude. |
GET /api/status | Reports whether Claude reading is on, whether an access code is required, and the Supabase project to sync with. |
Sync (public/sync.js): each recipe, book, planned day and the grocery list is one row in items. Devices pull rows by server time and push through push_items, which only accepts a change newer than the stored one, so an offline phone can't overwrite newer edits. Deletions are synced as tombstones.
npm test # reader, cook mode, units and sync-rule tests
node test/dev-server.js # local preview at http://localhost:5173
FAKE_SB=1 node test/dev-server.js # same, with an in-memory stand-in for Supabase