ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Offline study app (PWA) for physiotherapy training: interactive 3D anatomy, adaptive tests, spaced repetition and a daily study plan synced from Notion
翻譯準備中
正在載入完整 README。
檢視完整 README ↗Idea, concept and content: Escan Dönmez · LinkedIn
Code and design: Claude Code (Anthropic)
▶ Live app: https://escan-dnmz.github.io/fizyolern/ (works in any browser; on an iPhone use Safari → Share → Add to Home Screen)
💬 Easiest way to get help: give this page's link to your AI (ChatGPT, Gemini, Claude …) and ask "How do I use this app?". It explains everything step by step, in your language.
The problem. I am training as a physiotherapist in Germany. My first language is not German. In the first months we learn hundreds of anatomical structures, every muscle's origin, insertion, nerve supply and function, joint ranges of motion, and definitions in physiology, training science, hygiene, assessment and psychology. Much of it has to be reproduced word for word in German in written and oral exams. Classic flash-card apps did not know my timetable, my teachers' slides or my mistakes, and textbooks only show anatomy in 2D.
The solution. FizyoLern is an installable web app that turns my own lesson notes, weekly timetable and test mistakes into a short, guided study plan for every day:
Explanations are in a helper language you choose in Settings: Turkish or English. The content always stays in the German and Latin that the exams require.
The result. One app replaces flash cards, a quiz book, a vocabulary trainer, an anatomy atlas and a study planner. It works offline on the phone, has no server or account, and my personal data never leaves the device.
| 21 lessons in 9 subjects | Anatomy, physiology, PT basics, PT assessment, orthopaedics/surgery, training science, massage, hygiene, psychology |
| 830+ multiple-choice questions | 377 hand-written (337 of them from the lesson notes), plus questions generated automatically from the anatomy data |
| 100+ open (essay) questions | Answers typed in German, checked for the required key terms |
| 56 muscles, 23 bone groups, 12 joints | Each with origin, insertion, innervation and function, or range of motion, in German and Latin with Turkish and English explanations |
| 19 bony landmarks in 3D | SIAS, Tuber ischiadicum, Trochanter major and others, each linked to the muscles attached there |
| 600+ vocabulary items | Basic medical vocabulary, lesson terms, and 55 gym exercises linked to the muscles they train |
| 7 patient cases | Practice for the practical exam: history → examination → assessment form → therapy plan |
| 3 oral exam subjects | Anatomie, Physiologie and Spezielle Krankheitslehre with the official time limits, questions read aloud in German |
| 2 helper languages | Turkish or English for the interface and all explanations; the German content never changes |
| ~2 MB of 3D models | Real anatomical meshes (BodyParts3D), compressed so the whole app runs offline on a phone |
I am Escan Dönmez. I have been programming since I was 14 and am now training as a physiotherapist in Germany. FizyoLern is where my two worlds meet: understanding of technology and software, applied to a real problem in healthcare education.
Some of my earlier software projects (2021–2024):
| Area | Technologies | Examples |
|---|---|---|
| Game development | Unreal Engine 5, C++ | Shooter, RPG with the Gameplay Ability System, Combat system, Recoil system |
| Web development | C#, ASP.NET Core MVC, JavaScript | Blog, E-commerce site, Admin panel |
| Networking and security tools | Python | Port scanner, ARP scanner |
| Mobile and backend | Kotlin, Go | Kotlin notes, Token service |
More on my GitHub profile and LinkedIn.
The whole idea behind FizyoLern belongs to Escan Dönmez. The code and the design were created by Claude Code, Anthropic's AI programming assistant, following Escan's ideas and instructions.
Escan Dönmez
Claude Code (Anthropic)
The project shows how someone with a clear idea and deep knowledge of a field can turn a real need into working software with modern AI tools.
Helper language: in ⚙️ Settings you choose Turkish 🇹🇷 or English 🇬🇧 for the interface, explanations and translations. German content (questions, answers, model answers, terms) never changes. The screenshots on this page show the English mode. The app starts in Turkish, and a glossary of the Turkish labels is at the end of this page.
js/data/ligaments.js.Morning test: entry (it prepares you for today's classes). The previous school day's new topics come only if they belong to these subjects. If a subject has too few questions, the test is shorter and says so; it is never filled up with other subjects.The German state exam has a written, an oral and a practical part, and each must be passed on its own. FizyoLern trains all three.
an|schwellen → angeschwollen). Practising each word twice in different ways helps it stick.js/data/lig3d.js. Accuracy test: tools/test_lig_anatomie.mjs reads the real bone model and checks every ligament end: it must lie on the surface of the right bone and match textbook rules (e.g. VKB from the lateral femoral condyle to the front of the tibial plateau, Lig. collaterale tibiale 4–10 cm below the joint line, Lig. conoideum medial and behind the Lig. trapezoideum). A new ligament without a rule fails the test.Much of the first year is homework like "learn the pelvic landmarks and the hip muscles by next week". FizyoLern keeps it separate from mistakes:
| Principle | How the app applies it |
|---|---|
| Retrieval practice | Everything is asked, never just shown: tests, typed answers, cloze cards, essay questions |
| Spaced repetition | Cards, words and mistakes come back at growing intervals |
| Interleaving | Mixed tests across subjects; the same word in different question types |
| Immediate, explained feedback | Every answer explains why it is right and what each wrong option actually is |
| Dual coding | Words and 3D pictures together: every term in a question can be opened in the model |
| Desirable difficulty | Plausible distractors from the same region; harder levels unlock with accuracy |
| Low barrier to start | A clear daily list; the way-home routine runs in short, skippable steps on the phone |
┌──────────────── iPhone (offline PWA) ────────────────┐
Notion ──────▶│ read-only sync ─▶ private data (on device only) │
(my notes, │ │
timetable, │ lessons + anatomy data ─▶ question generator │
mistakes, │ ─▶ adaptive selection ─▶ spaced repetition store │
exams) │ │
│ Three.js 3D viewer ◀─ BodyParts3D meshes (Draco) │
└──────────────────────────────────────────────────────┘
No server · no account · progress stored in the browser
No framework, no build step. Plain HTML, CSS and JavaScript modules, hosted for free on GitHub Pages. A service worker caches everything for offline use.
3D pipeline. Python scripts convert the BodyParts3D anatomy models into compressed glTF files: welded, simplified, Draco-compressed, about 2 MB for all bones and muscles.
Tolerant answer checking for German. Edit distance scaled to word length, umlaut folding, article checks, word-stem and word-order tolerance, plus a guard so that medical opposites never count as typos.
Notion integration with privacy by design.
Content quality checks. An audit script checks every question, card and word. It catches:
Unit tests cover the answer checker and the term detection.
Privacy filter. The build script removes teacher names from public content and fails if one remains. Personal files are excluded from the repository.
No backend, no account, no tracking. Progress lives only in the phone's browser storage. A backup file can be downloaded and restored.
The Notion key never leaves the device. It is read-only and sent only to api.notion.com; the browser blocks every other destination.
The public repository contains only general learning content. It holds no timetable, mistakes, teacher names or links to personal pages.
The daily report shares only what you choose. It contains statistics and course names without teachers or rooms. Your own mistake texts and exam topics are only added if you tick the box.
Imported files are checked. Backup and data files are validated field by field before use, so a broken or manipulated file cannot break the app or inject content.
One app per web address. Browser storage belongs to the whole address escan-dnmz.github.io, so no other website is published from this GitHub account.
Class packs (Kurs-Modus) stay separate. A pack is stored under its own key on the device and checked field by field; Notion sync never mixes it into your personal data. Removing the pack leaves your progress untouched.
Delete everything: ⚙️ Settings → Delete all data on this device removes progress, the Notion key, the Notion data and the offline files, for example before giving the phone to someone else.
The app is a website that can be installed like an app. It is free, needs no account and works offline after the first visit.
💬 Not sure how to start? Ask your AI. Copy the link of this page,
https://github.com/Escan-DNMZ/fizyolern, into ChatGPT, Gemini, Claude or any other AI and ask one of these:
- "How do I use this app?"
- "How do I install it on my Android phone and switch it to English?"
- "Set up my Notion for this app from my slides and timetable." (attach them)
The page and the
llms.txtfile were written so that an AI can read them and guide you, in your own language.
| Device | How to install |
|---|---|
| iPhone / iPad | Open https://escan-dnmz.github.io/fizyolern/ in Safari → Share → Add to Home Screen. Start it from the home screen icon. |
| Android | Open the link in Chrome → ⋮ menu → Install app (or Add to Home screen). |
| Computer (Windows, Mac, Linux) | Open the link in Chrome or Edge and click the install icon on the right of the address bar, or simply use it as a website in any browser. |
First steps
All progress (cards, test history, streak, settings) lives only in this browser on this device. There is no cloud copy.
fizyolern-yedek-<date>.json; keep it in iCloud Drive, Google Drive or e-mail it to yourself.Many students don't know how to take good notes. FizyoLern doesn't expect you to. Give your slides (Folien) and your timetable to any AI (ChatGPT, Gemini, Claude, Copilot …) together with the setup prompt. The AI builds your Notion workspace in exactly the format the app reads:
⚠️ Important: the app does not turn your lesson notes into questions by itself. New questions come only from the FizyoLern Questions database. The setup prompt tells your AI to add the question rows automatically after every new lesson note, so new topics show up in your tests the same day.
If the AI can write to Notion (e.g. Claude or ChatGPT with the Notion connector), it creates everything directly. Otherwise it gives you text to paste and a CSV file to import, which works with every AI.
Tested: an AI that only had the guide, a sample timetable and nine slides about the knee joint produced a weekly plan and 44 questions. The app's own Notion parser read all of them: 12 key sentences, 14 multiple choice, 5 open questions and 13 terms, a complete new lesson and the right morning tests.
➡️ Step-by-step guide and copy-paste prompts
A version for a whole class on school iPads, without Notion. A teacher or editor reviews AI-made questions once per slide deck in German; the app gets them as a course pack (shared question bank + the class's weekly plan, Checkliste and exam dates). Plan and design: docs/kurs-modus.md.
…/#/kurs?paket=<address> (e.g. from a QR code) or …/#/kurs and choose the pack file. The app shows class, subjects and question count first; nothing is installed without a tap.node tools/build_kurs.mjs --id klasse-1a --name "Klasse 1A" builds a pack from a private bundle; node tools/redaktion/server.mjs --beispiel opens the local review page FizyoLern Redaktion (German only, made-up example data). TR/EN helper texts are generated automatically (FIZYO_KI=anthropic + ANTHROPIC_API_KEY on the editor's computer; never in the repo).The app works without Notion. With Notion it also shows your own timetable, mistakes, homework and exams, and it updates itself whenever you change your notes. The connection is read-only: the app can never change or delete anything in Notion.
FizyoLern (any name works);ntn_.
Treat it like a password: never post it, send it in a chat or put it in a repository.FizyoLern.ntn_… (Notion Internal Integration Secret).From then on the app updates itself when it is opened (at most every 3 hours). Update now (Şimdi güncelle) in the same place updates immediately, and Remove connection (Bağlantıyı sil) deletes the key from the phone.
Where is the key stored? Only in this phone's browser storage. It is sent only to api.notion.com; the app's security policy blocks every other server. If the phone is lost, delete or renew the secret on the Notion integrations page and the old key stops working immediately.
Easiest way: copy the ready-made pages from the Notion template and paste them into Notion. It has a sample weekly plan with mistakes and homework, plus the database columns.
The app finds the pages by title. Titles work in English, German or Turkish. A title only has to contain the name and capital letters don't matter, so Weekly Plan (iPad) works too. All pages must be inside the page you connected in Step 2.
| English title | German | Turkish | What the app does with it |
|---|---|---|---|
| Weekly Plan | Wochenplan | Haftalık Plan | Today's and tomorrow's classes, morning test, mistake cards, homework cards |
| Vocabulary (database) | Wortschatz | Grundwortschatz | Words of the day |
| Lessons | Unterricht | Dersler | Links from each lesson in the app to its note |
| FizyoLern Questions (database) | FizyoLern Fragen | FizyoLern Sorular | New questions without an app update |
| Exams & Homework | Prüfungen & Hausaufgaben | Sınav & Ödev Takibi | Countdown on the Today screen; subjects with an exam within 7 days get priority |
How the weekly plan is written
## Week 43 (19.–23.10.2026) (also KW / Woche / Hafta). The dates tell the app which week is now, so you can plan weeks ahead.Mon, Tue … (or Mo, Di … / Pzt, Sal …).Morning test: Anatomie in the review column sets the morning test (also Morgentest: / Sabah testi:). Common spellings are understood: PT-Befund = PT Befund, ANA 1 / All ANA / Allg. Anatomie = Anatomie, OC = O/C.Class 2 (11:30–15:00) (also Ders 2 (…) / Stunde 2 …). The way-home mode opens when the day's last class ends. A time in the day's own cell wins, e.g. 13:30 free / 13:30 boş / bis 13:30. Days with — in both class columns have no way-home mode. Without times, the app uses Settings → Way home → Class end (default 15:00); you can also add minutes after class there.### Anatomie), a line starting with ✗, then one bullet per mistake starting with ✗ or ½. The bold part is the answer: ✗ Fossa = **Grube**. At most 20 mistake cards come per day.✗ line contains Homework, Hausaufgabe, Ezber or Ödev. These cards go to the 📌 homework deck and have no daily limit.| What you see | What to do |
|---|---|
| "This doesn't look like a Notion key" | The key must start with ntn_ (older keys: secret_). Copy it again from the integrations page, without spaces. |
| "Invalid key (401)" | The key was deleted or renewed in Notion. Copy the current secret and paste it again. |
| "No page is visible" or "Page not found" | The integration is not connected. In Notion open the parent page → ••• → Connections → add FizyoLern. |
| "Weekly Plan page is not visible" (or another page) | That page's title doesn't contain one of the names in Step 4, or the page is outside the connected parent page. |
| The timetable stays empty | The week heading needs a date range like (19.–23.10.2026), the table must be a simple table and not a database, and every row must start with a day name. |
| No morning test appears | Write Morning test: <subject> in the review column, using one of the subject names above. |
| A mistake card has no gap | Make the answer bold in Notion. Lines without bold text become "remember" cards. |
| Changes in Notion don't show up | Tap ⚙️ Settings → Update now. The app updates by itself at most every 3 hours. |
| The phone shows an old version | Close the app completely and open it again. The new version loads in the background, then appears on the next start. |
| Progress is gone | The browser data was cleared or a different browser or private window is in use. Restore your last backup (Settings → Restore backup). |
Does it cost anything? Do I need an account? No. The app is free, has no account and no ads. Notion's free plan is enough for the integration.
Can I set up Notion only on my phone? Yes, but a computer is easier. The integrations page also opens in a phone browser, and the Connections menu is in the Notion app. To create an integration you must be an owner of the workspace; in your own personal workspace you are.
Is my data safe? There is no server. Your progress and your Notion key stay on your device; the key is sent only to api.notion.com, and the app can only read, not change, your Notion. See Privacy and security above.
Can I use it without Notion? Yes. Everything except your personal timetable, mistakes, homework and exams works with the built-in content.
Is the content correct? It was written from real lesson notes and checked against standard German physiotherapy textbooks. Where a teacher's slide contradicts the textbook, the app teaches the textbook version. It is a study aid and doesn't replace your school's materials.
I'm an AI assistant. Where is a short summary? In llms.txt (also at https://escan-dnmz.github.io/fizyolern/llms.txt).
python -m http.server 8765 # then open http://localhost:8765
node tools/test_check.mjs # answer checking
node tools/test_structures.mjs # term detection for the 3D buttons
node tools/test_reverse.mjs # reverse cards (muscles by landmark / nerve)
node tools/audit_content.mjs # content audit of all questions and cards
python tools/bump_sw.py # after any change, so phones load the new version
| Path | Purpose |
|---|---|
js/app.js | Screens and routing |
js/quizgen.js | Question generation, adaptive selection |
js/reverse.js | Reverse cards: muscles grouped by bony landmark or nerve |
js/store.js | Progress and spaced repetition |
js/words.js, js/fuzzy.js | Words of the day, tolerant answer checking |
js/notion.js, js/private.js | Read-only Notion sync, on-device private data |
js/exam.js, js/report.js | Mock exam, daily status report |
js/anatomy3d.js | 3D viewer: focus mode, landmarks, axes, step-by-step, "find the point" |
js/data/ | Anatomy, landmarks, axes, lessons, vocabulary, questions, gym exercises |
tools/ | Build scripts (lessons, 3D models, icons) and checks |
| Turkish | English |
|---|---|
| Bugün | Today |
| Test / Sorular / Kartlar | Test / (Essay) questions / Flash cards |
| 3D Anatomi | 3D anatomy |
| Dönüş yolu | Way home (afternoon review) |
| Ödevlerim · Hatalarım | My homework · My mistakes |
| Günün kası / kemiği | Muscle / bone of the day |
| Noktayı bul | Find the point |
| Deneme sınavı | Mock exam |
| Sözlü sınav | Oral exam |
| Vaka çalışması | Case study (assessment trainer) |
| 3D'de göster | Show in 3D |
| Tekrar · Zor · İyi · Kolay | Again · Hard · Good · Easy |
| Doğru · Yanlış | Correct · Wrong |
fonts/OFL.txt).