尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Searchable archive of Mob (mob.co.uk) recipes, scraped from public JSON-LD data
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A searchable personal archive of recipes from mob.co.uk,
built from the Recipe JSON-LD structured data the site already embeds in
every recipe page (the same data Google reads for rich search results).
There's no official Mob API/dump, so this project scrapes public HTML rather
than any private endpoint — no login, no paywall bypass.檢視完整 README ↗A searchable personal archive of recipes from mob.co.uk,
built from the Recipe JSON-LD structured data the site already embeds in
every recipe page (the same data Google reads for rich search results).
There's no official Mob API/dump, so this project scrapes public HTML rather
than any private endpoint — no login, no paywall bypass.
scripts/scrape.mjs reads Mob's own sitemap (/sitemap.xml →
*-section-recipes-*-sitemap-pN.xml) to enumerate every recipe URL, then
fetches each page and pulls out its Recipe JSON-LD block (name,
ingredients, steps, times, category, cuisine, image, etc). It's polite by
default — limited concurrency and a delay between requests..github/workflows/scrape.yml runs that script on GitHub's own runners
(manually via Actions → Scrape Mob recipes → Run workflow, or weekly
on a schedule) and commits the refreshed data/recipes.json back to the
repo. Vercel is connected to this repo's main branch, so every commit
triggers a new deployment automatically.public/search-index.json)
from data/recipes.json at build time and does fuzzy search + category/
cuisine filtering client-side (via Fuse.js).
Full ingredients/instructions are only rendered on each recipe's own
statically-generated detail page, so the homepage stays light even with
thousands of recipes./api/nearby every few seconds which recipe is open, and the server answers
with what other devices behind the same public IP (same Wi-Fi) have open.
The entries live a minute in Upstash Redis (added from the Vercel
Marketplace, which sets KV_REST_API_URL and KV_REST_API_TOKEN); only a
salted hash of the IP is stored. Without Redis the feature is simply off.
It cannot match devices when iCloud Private Relay is on or when one device
uses IPv4 and the other IPv6. Logic: lib/nearby.mjs, tests:
node scripts/test-nearby.mjs.POST /api/share) and opens at /s/<id>, where
the receiver can save it into their own Saved. Logic: lib/share.mjs,
tests: node scripts/test-share.mjs. Every share also shows a QR code;
the in-app scanner (scan icon in the top bar, jsQR loaded on demand) opens
recipe and folder codes inside the app and links devices from a sync code.
On iPhone a link or a Camera scan always opens Safari, which has its own
storage, so scanning inside the app is the way to land in the Home Screen
app. Logic: lib/qr.mjs, tests: node scripts/test-qr.mjs./api/sync/pair, codes
live 10 minutes, tries are rate limited) and then share a "space" in Redis.
Each device sends what changed since its last sync and gets back the merged
result (/api/sync). Every value carries the time it changed and the newer
one wins, value by value; removals are kept as markers so they reach the
other devices. Linking first keeps a raw copy of the data under
<key>:backup-sync. "Share everything" in Saved starts the same linking
(a code, its QR and a sendable link), so sharing everything means staying
in sync. Logic: lib/sync.mjs, tests:
node scripts/test-sync.mjs.<ViewTransition>): like iPhone apps, a recipe
slides in from the right and back out, tabs switch at once; from the
Continue cooking chip its photo flies into the recipe page. Types live in
lib/transitions.js, animations at the end of app/globals.css.
Respects Reduce Motion (no animation at all).@starting-style entry animations, Popover API plus CSS anchor
positioning for ingredient amounts in method steps,
content-visibility for long recipe grids, text-wrap balance/pretty.components/cook/CookMode.jsx): one step per screen with
scroll snap, Screen Wake Lock, the step remembered per recipe.navigator.vibrate where it exists (lib/haptics.js); on
iPhone a clear label over each button wraps a hidden native switch, and a
real finger tap on it plays the system tick (components/Haptic.jsx).prefers-color-scheme: all colors are tokens on :root.components/OfflineKeeper.jsx sends the service worker
the recipe pages, JSON and photos of everything in Saved and My kitchen
(KEEP_OFFLINE in public/sw.js), and asks for persistent storage.lib/aisles.mjs, tests:
node scripts/test-aisles.mjs.npm install
npm run scrape # full scrape — can take a while, be patient
# or, for a quick smoke test:
SCRAPE_LIMIT=20 npm run scrape
npm run dev # http://localhost:3000
npm run build && npm start
isAccessibleForFreeSome recipes are flagged isAccessibleForFree: false in their own
structured data (Mob's premium/app-exclusive content), even though the full
ingredients and method are present in the same public JSON-LD block used
for SEO. The scraper records that flag on every recipe (isAccessibleForFree
field) but doesn't filter on it — that's a judgment call left to whoever
runs this for their own use.
This is an unofficial, personal project for search/reference. All recipe content belongs to Mob (mob.co.uk); this repo is not affiliated with them.