ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Leesavontuur: kort daaglikse leeslesse en oogspeletjies in Afrikaans en Engels vir Suid-Afrikaanse kinders. Short daily reading lessons and eye games in Afrikaans and English.
Translation pending
EducationTypeScript · PLpgSQLGitHub @veronaburger8-boopOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
A reading program in Afrikaans and English for South African children. The full specification is in PROJECT-BRIEF.md. Instructions for Claude Code are in CLAUDE.md.
Status: Phase 6 (Games and polish): the Galgie game, "About reading" articles, Mika the meerkat mascot, and an accessibility check of every page. Built on Phase 1 (accounts, profiles, content library), Phase 2 (the 7-step lesson player), Phase 3 (placement tests and levels), Phase 4 (reports, PIN and child mode) and Phase 5 (topics, requests, lesson form and AI drafting).Read the full README ↗A reading program in Afrikaans and English for South African children. The full specification is in PROJECT-BRIEF.md. Instructions for Claude Code are in CLAUDE.md.
Status: Phase 6 (Games and polish): the Galgie game, "About reading" articles, Mika the meerkat mascot, and an accessibility check of every page. Built on Phase 1 (accounts, profiles, content library), Phase 2 (the 7-step lesson player), Phase 3 (placement tests and levels), Phase 4 (reports, PIN and child mode) and Phase 5 (topics, requests, lesson form and AI drafting).
| Path | What it is |
|---|---|
content/lessons-source.md | The lessons document (Markdown export). |
content/lessons.json | The 130 passages converted to the data format (made by npm run content:convert). |
content/import-report.md | Read this first. What the conversion found and what needs checking. |
supabase/migrations/ | The database: tables and access rules. |
src/app/ | The website pages. |
prototype/ | The approved one-lesson prototype. |
You need a Supabase account (database and logins) and a Vercel account (hosting). Both can be free while testing.
supabase/migrations/ in order, once each: paste the whole file and press Run. (…_foundation.sql first, then …_lesson_results.sql, then …_levels_and_calibration.sql, then …_parent_pin.sql, then …_topics_and_requests.sql, then …_games_and_articles.sql, then …_eye_games.sql, then …_pictures.sql.)….vercel.app address), and add https://<your-address>/** under Redirect URLs.NEXT_PUBLIC_SUPABASE_URL: the project URLNEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY: the publishable keySUPABASE_SECRET_KEY: the secret key (never share this one)NEXT_PUBLIC_SITE_URL: your website addressANTHROPIC_API_KEY (optional, for "Draft with AI"): an API key from your Anthropic account (console.anthropic.com). Never share this one either.PAYFAST_MODE, PAYFAST_MERCHANT_ID, PAYFAST_MERCHANT_KEY, PAYFAST_PASSPHRASE (only when payments go live; see "Payments" below). Secret.update public.profiles set role = 'admin'
where id = (select id from auth.users where email = '[email protected]');
content/lessons.json.Supabase's built-in email is fine for testing but only sends a few emails an hour. Before real families sign up, connect an email service (Supabase → Authentication → Emails → SMTP).
leesavontuur-abc123x-….vercel.app, are frozen snapshots of old versions.main. Vercel publishes automatically when main changes on GitHub, as long as Settings → Git shows the connected repository. If it doesn't, use Deployments → Create Deployment → main.update auth.users
set encrypted_password = extensions.crypt('NewPassword123', extensions.gen_salt('bf')),
email_confirmed_at = coalesce(email_confirmed_at, now())
where email = '[email protected]';
select u.email, p.role from auth.users u join public.profiles p on p.id = u.id; and run the "make yourself admin" line again if needed.supabase/migrations/20260930080815_lesson_results.sql once (copy it from GitHub the same way as the first file).supabase/migrations/20260930100856_levels_and_calibration.sql once.supabase/migrations/20260930112518_parent_pin.sql once.supabase/migrations/20261001090000_topics_and_requests.sql once.ANTHROPIC_API_KEY is added in Vercel (then redeploy). After that, choose the language, level, topic and number, and press Draft passages. It takes a few minutes; the lessons appear as Drafts with a note, and the page shows the estimated cost.supabase/migrations/20261002080000_games_and_articles.sql once.supabase/migrations/20261003080000_eye_games.sql once. (Supabase may warn that it drops something: it only replaces the list of allowed game names, so it is safe to run.)supabase/migrations/20261004080000_pictures.sql once.lessons.json keeps the pictures.How it works: while charging is off (the pilot) everything is free. When the owner switches charging on (Admin → Families), every child gets one free lesson; after that the family needs a subscription of R99 per family per month, paid on PayFast's own secure page. Pilot families (marked on the Families page) stay free. The rule is enforced by the database: a lesson can't be saved, and a game can't be logged, without access. Placement tests are always free.
supabase/migrations/20261005080000_subscriptions.sql once.PAYFAST_MODE = live, PAYFAST_MERCHANT_ID, PAYFAST_MERCHANT_KEY and PAYFAST_PASSPHRASE (the passphrase you set in PayFast → Settings → Developer settings). Redeploy. The Families page then says "live".Paying by bank transfer (EFT) works without any payment company. Run supabase/migrations/20261020080000_eft_payments.sql once (SQL Editor). Then on Admin → Families → How parents pay, fill in your banking details and save. Parents see them on their Subscription page, with their own reference (for example LA3F9A2C) and R99. When a payment shows in your bank account, find the family by its reference on the Families page and click +1 month: they're paid for another month (a payment made early adds on; nothing is lost). The date box next to it corrects mistakes (empty = no paid time). Parents get a reminder on their home page 5 days before their paid time ends. To stop, a family simply doesn't pay; there's nothing to cancel. Card payments (PayFast) stay hidden from parents until you click Show card payments on the same page.
Card payments through Paystack (used instead of PayFast whenever PAYSTACK_SECRET_KEY is set in Vercel). Run supabase/migrations/20261021080000_paystack.sql once. In the Paystack dashboard → Settings → API Keys & Webhooks, set the Webhook URL to https://www.leesavontuur.co.za/api/paystack/webhook (the test one now; the live one too when you go live). On Admin → Families click Show card payments. Parents then click Subscribe, enter their card once on Paystack's page, and Paystack charges R99 every month by itself; each payment, failure or cancellation arrives at the webhook, which only trusts messages signed with your secret key. Practice: with an sk_test_ key, use Paystack's test cards on its payment page (no real money). Going live: when Paystack approves you, replace the key in Vercel with the sk_live_ one, set the live Webhook URL, and redeploy. Cancelling (by the parent, or by deleting the account) stops the charges at Paystack; access lasts until the end of the paid month.
The site never sees card details. PayFast tells the site about each payment (its "ITN" notifications to /api/payfast/notify); the site checks the signature and asks PayFast to confirm before trusting one. The Families page lists every family's subscription and the latest payments.
Try this with one or two children, on a phone and on a tablet if you can:
npm install
cp .env.example .env.local # fill in the values
npm run dev # http://localhost:3000
npm test # converter and validation tests
npm run test:db # database access-rule tests (needs a throwaway PostgreSQL database)
npm run content:convert # lessons-source.md → lessons.json + import-report.md
npm run make-admin -- [email protected]