ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
דף יומי אינטראקטיבי לחזרה ולימוד — נוצר כל לילה על ידי סוכן Claude
翻訳待ち
Loading the full README. The saved excerpt is shown below.
Interactive Hebrew study pages for Daf Yomi, generated by an AI agent and verified against the Gemara text.
Content lives as JSON; a zero-dependency Python generator renders a static site.Read the full README ↗Live site: https://daf.tsemach.dev (the old daf-ai.pages.dev redirects there)
Interactive Hebrew study pages for Daf Yomi, generated by an AI agent and verified against the Gemara text. Content lives as JSON; a zero-dependency Python generator renders a static site.
| Path | What |
|---|---|
data/<slug>/<daf>.json | One daf: header, nav, storyline (הקדמה), sugyot with steps + argument tree, quiz, links, source texts |
data/glossary.json | Shared glossary (sages, concepts). Longest key wins; first occurrence per page is marked |
data/sources.json | Shared verse / halacha texts shown in the in-page source dialog |
content/home_about.html | Static blocks on the home page |
site/app.css, site/app.js | Shared runtime: glossary popovers, source dialogs, tree view, chavruta mode, settings, quiz |
build.py | data/ → dist/ (/, /<slug>/, /<slug>/<daf>/) |
validate.py | Schema + content checks; non-zero exit on errors |
tools/extract_from_hub.py | One-time migration from the original single-file hub |
python validate.py # must pass
python build.py # writes dist/
python -m http.server -d dist 8000
{
"key": "bechorot9", "tractate": "Bekhorot", "slug": "bechorot", "tractate_he": "בכורות", "daf": 9,
"title": "בכורות ט׳", "eyebrow": "…", "thesis": "…", "meta": ["<hebrew date>", "עמודים א–ב", "~20 דקות לימוד"],
"nav": [{"id": "s2", "amud": "עמוד א", "title": "…"}],
"storyline": "<one paragraph, html allowed>",
"sections": [
{"id": "s2", "kind": "sugya", "ref": "Bekhorot.9a.7-13", "amud": "עמוד א · גמרא", "title": "…",
"quote": {"text": "…", "cite": "…"} | null,
"flow": "<בקצרה: 1–3 sentences>",
"pre": "<html before the steps>", "post": "<html after: verdicts, think boxes>",
"steps": [{"tag": "קושיה", "type": "q|a|c|", "hideable": true, "p": 0, "body": "<html>"}]},
{"id": "sum", "kind": "raw", "amud": "סיכום", "title": "…", "html": "<table…>"}
],
"quiz": [{"q": "…", "o": ["…","…","…"], "a": 1, "e": "…"}], // exactly 8
"links": [{"href": "…", "text": "…"}],
"srctext": {"Bekhorot.9a.7-13": {"t": "בכורות ט׳ ע״א", "p": ["<verbatim segment>", "…"]}},
"card": {"date": "…", "topics": "…", "stats_html": ["<span>…</span>"]}
}
p = index of the earlier step this step responds to (argument tree). Step types: q question, a answer, c conclusion, empty = statement.
tsemachh/daf-ai.python build.py · Build output directory: dist · Root: /.PYTHON_VERSION=3.11.Every push to main rebuilds and deploys.
Every daf page has "💬 הערה על הדף" and a per-sugya "הערה על סוגיה זו". Notes are stored in
Cloudflare D1 (db/schema.sql) by Pages Functions in functions/:
| Endpoint | Who | What |
|---|---|---|
POST /api/feedback | public | save a note → {id, token}; honeypot, optional Turnstile, 6/hour per IP hash |
GET /api/feedback/status?n=<id>.<token>,… | the author | status + public reply of their own notes |
GET /api/feedback/page?p=bechorot/9 | public | notes marked fixed on a page (no text/name/email) |
GET /api/feedback/config | public | Turnstile sitekey |
/admin/ , GET /admin/api/list?status=new , POST /admin/api/update | owner / nightly job | dashboard and API, behind Cloudflare Access |
Readers stay anonymous. The browser keeps id.token pairs in localStorage; the tracking page is
/feedback/ (or /feedback/?n=<id>.<token> from the link shown after sending). An email is kept
only when "עדכון במייל" is ticked, and should be cleared (clear_email) after the update is sent.
Pages show "✓ תוקן בעקבות הערת קורא" on sections with fixed notes.
Statuses: new, in-progress, fixed, feature, rejected, needs-info.
Update body: {"id":12,"status":"fixed","reply":"…","commit_sha":"abc1234","notified":true,"clear_email":true}.
daf-ai-feedback → Console → paste db/schema.sql → Execute.DB → daf-ai-feedback.daf.tsemach.dev and daf-ai.pages.dev, Managed). In Pages → Variables and
Secrets add TURNSTILE_SITEKEY (text) and TURNSTILE_SECRET (secret). Optional: IP_SALT (secret).daf.tsemach.dev and daf-ai.pages.dev, path admin,
policy "Allow" for the owner's email. Copy the app's AUD tag; add Pages variables
ACCESS_TEAM = <team>.cloudflareaccess.com and ACCESS_AUD = the AUD tag.
For the nightly job: Access → Service Auth → create a service token and add a second policy
(action "Service Auth") for it. The job sends CF-Access-Client-Id / CF-Access-Client-Secret.Without DB the form answers 503 ("not saved"); without ACCESS_* /admin answers 503.
npx wrangler d1 execute DB --local --file db/schema.sql # with a wrangler.toml that declares DB
npx wrangler pages dev # serves dist/ + functions/
Every page shows the sources used and "Powered by Shefing" with the logo
(site/static/shefing-logo.png, shefing-logo-white.png for dark mode) linking to shefing.com.
The nightly instructions live in tasks/daily-daf.md. Content, code and hosting are in GitHub and
Cloudflare, independent of any Claude account: to move the job, create a scheduled task on the new
account with that file as the prompt and give it write access to this repo.
table: opinions × cases matrix — {"title": str, "cols": ["", "<שיטה>", …], "rows": [["<מקרה>", "<תא>", …]]}.decide: if → then cards — {"title", "branches": [{"if": str, "then": [str, …]}]}.chain: source chain — {"title", "links": [{"k": "פסוק|דרשה|דין|תוצאה", "t": str}], "note"?: str}.calc: worked numbers — {"title", "rows": [[label, value, cite?]], "lines": [[label, value, cite?]], "note"?}.seq: order of events — {"title", "items": [str, …]}.
table / decide / chain / calc / seq render together in a collapsed "עזרים" panel.cont: "next" / "prev" for a sugya split across dapim (otherwise inferred from the amud label).data/changelog.json — newest first (new days at the top, and new items at the TOP of the day's list), [{"date": "YYYY-MM-DD", "items": ["…"]}]. Home shows the latest 5 items;
/changes/ lists everything. Add an entry for every site improvement.
lab/index.json lists dapim that have an alternative version (lab/<slug>-<daf>-<model>.json, same schema as data/). build.py renders /lab/<slug>/<daf>/ with both versions side by side (blind, randomized order) and a vote (/api/lab/vote, table lab_votes); the regular daf page links to it.