ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
An Aotearoa nature quest that teaches maths to children aged 5 to 8, built as a native macOS app that also runs in any browser. The content covers all six strands of the New Zealand Curriculum (Te Mātaiaho: Mathematics and Statistics) for Years 1 to 4: Number, Algebra, Measurement, Geometry, Statistics and Probability.查看完整 README ↗
An Aotearoa nature quest that teaches maths to children aged 5 to 8, built as a native macOS app that also runs in any browser. The content covers all six strands of the New Zealand Curriculum (Te Mātaiaho: Mathematics and Statistics) for Years 1 to 4: Number, Algebra, Measurement, Geometry, Statistics and Probability.
Explorers travel through four regions, one per year level: Golden Beach (Te Tāhuna), Kauri Forest (Te Wao Nui), the Southern Alps (Kā Tiritiri o te Moana) and the Starry Skies (Te Rangi Whetū). Each region has ten trails (topics) with Bronze, Silver and Gold rounds that get progressively harder, and ends with a creature rescue: a mixed challenge that frees a native animal (kororā, kiwi, kea, kākāpō) and opens the next region. Correct answers earn feathers to spend in the backpack on hats, gear and trail buddies.
localStorage in the browser).Everything below lives behind the parent PIN, in Parents & teachers → Settings, and applies to the explorer selected at the top of the dashboard.
The app is a Tauri 2 shell around a TypeScript web UI.
Prerequisites on the Mac:
xcode-select --installcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shThen:
npm install
npm run app:dev # run the app with live reload
npm run app:build # produce Nature Maths.app and a .dmg
Bundles are written to src-tauri/target/release/bundle/macos/ and src-tauri/target/release/bundle/dmg/.
The GitHub Actions workflow in .github/workflows/build.yml also builds a universal (Apple Silicon and Intel) .dmg on every push and attaches it to the run as an artifact, so you can download a build without setting up the toolchain. The app is unsigned, so the first launch needs a right-click, Open.
npm install
npm run dev # http://localhost:1420
.github/workflows/deploy-pages.yml publishes the browser version to GitHub Pages on every push to main. Enable Pages with Source set to GitHub Actions in the repository settings if it is not already.
By default progress stays on the device. Optional cloud sync lets a family continue on any device or browser. It uses a free Supabase project that you own, so the data is yours.
Two ways to link devices, chosen in the parent area under Cloud:
kiwi-fern-river-mist-123456; enter it on another device to link them. Anyone with the code can see and change the progress, and a lost code cannot be recovered, so treat it like a password.Sync is offline-first. Saves stay local and are merged with the cloud copy on start-up, after each round, and when you press Sync now. Stars, best scores, feathers and gear are combined so nothing earned is lost when two devices disagree; other settings take the newer copy.
One device, more than one family: the device remembers which account or family code its explorers belong to. Sign out uploads the latest progress, then removes the explorer profiles and the parent PIN from the device, so the next parent to sign in on a shared or handed-on device sees only their own children. Signing in again brings everything back from the account. If that last upload fails the explorers stay put rather than risk losing unsaved progress, and the device still refuses to merge them into a different account. Unlink this device (family codes) always leaves the explorers on the device, because a lost family code cannot be recovered.
supabase/schema.sql. This creates the tables, row-level security and the two family-code functions..env file as VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY. Every build (local, GitHub Pages and the macOS app) reads them from there. To point a CI build at a different project without editing the file, set repository Variables named SUPABASE_URL and SUPABASE_ANON_KEY, which take precedence..env.example to .env.local; that file is ignored by git.The publishable (anon) key is safe to commit: it is embedded in the browser build anyway, and row-level security decides what it can read. Never commit the service-role key. Builds without any values still work; the Cloud tab just explains that sync is not set up.
What is stored in the cloud: each explorer's first name, age, avatar, settings and progress, plus the parent PIN so it applies on every device. Nothing else.
Every screen has a small Report a problem button in the bottom corner. It opens a dialog where a parent types what went wrong; the app attaches the context a bug needs and sends it off. Before sending, Show what is sent with this report displays the exact text that will be filed.
Attached automatically: the screen the problem happened on and the last few screens before it, the explorer's age and whether unlock-everything is on, how many explorers are on the device, the app version and build, the cloud sync mode and last sync error, the browser, screen size, language and time zone, and any errors the app caught (message, file, line and stack).
Never attached: explorer names, parent emails, family codes, the parent PIN, or anybody's progress. src/app/diagnostics.ts builds the payload field by field, and tests/report.test.ts fails if any of those leak into a report.
Where reports go:
reports table using the public anon key. Row-level security allows inserts and nothing else, so a report can never be used to read other reports..github/workflows/bug-reports.yml runs hourly, reads new rows with the service-role key and opens one issue per report, labelled bug and from-app, then marks the row filed so it is never opened twice. It files at most 10 per run, and parks a row that GitHub rejects rather than letting it block the queue.To turn on step 2, add one repository Secret under Settings → Secrets and variables → Actions → Secrets:
| Secret | Where to find it |
|---|---|
SUPABASE_SERVICE_ROLE_KEY | Project Settings → API → service_role. It bypasses row-level security, so it belongs in a Secret — never in a Variable, a VITE_ value or a commit. |
The project URL is read from the committed .env, so there is nothing else to set. With the secret unset the workflow exits quietly, so forks do nothing; with the secret set but no URL to be found it fails loudly rather than reporting success while reports sit unfiled. Run it by hand from the Actions tab to test it. Reports are written with the public anon key, so anyone who has the app can insert one; if that is ever abused, drop the insert policy on public.reports in the SQL editor and the button falls back to the GitHub link.
npm test # generator, progression, timer, migration, account-switching and bug-report tests
npm run typecheck
npm run build && npm run screenshots # headless walkthrough, images in ./screenshots
# Multi-device cloud sync check against a mocked Supabase (no project needed):
VITE_SUPABASE_URL=https://mock.supabase.co VITE_SUPABASE_ANON_KEY=mock-anon-key-0123456789abcdef npm run build
npm run cloud:check
src/curriculum/ question generators per region, curriculum metadata, scoring rules
src/app/ state model, persistence, progression, daily timer, speech, shop, sound
src/screens/ profile picker, map, region, play, backpack, parent dashboard, time-up
src/ui/ HTML helper, SVG art (creatures, explorers, regions, shapes), visual renderer
src/styles/ stylesheet
src-tauri/ Rust shell, Tauri config, icons
tests/ vitest suites
scripts/ Playwright screenshot walkthrough
docs/ generated curriculum map
MIT