ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Teach and learn topics live with interactive board and file sharing
AI summary · website content
EducationJavaScript · TypeScriptGitHub @poken-appOnlineOwner 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
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Learn by teaching. You explain a topic out loud; an AI student listens, watches your camera, whiteboard or screen, asks questions — and is deliberately wrong about 30% of the time so you have to catch it. You pick your student's persona — eager, skeptic, or confused.
Built on Gemini Live (native audio), Hono + ws, and a single vanilla-JS page. Hosted on
Google Cloud Run. Handoff notes — architecture, the session-handover design, and known
pitfalls — are in NOTES.md.
npm install
cp .env.example .env # add GEMINI_API_KEY
npm run dev # http://localhost:8000
npm run typecheck runs strict TypeScript over the server.
Cloud Run, via Cloud Build:
gcloud builds submit --config cloudbuild.yaml --project poken-app-260919
Production: https://poken.live (also www.poken.live; the Cloud Run URL
https://poken-7skula3n3a-uc.a.run.app still serves the same service).
GCP project poken-app-260919.
Needs the Secret Manager secret gemini-api-key in the project. cloudbuild.yaml sets the
60-minute request timeout, session affinity (required for WebSockets), and
SESSION_TIMEOUT_S to match the timeout.
Part of this codebase is implemented by Devin, Cognition's AI software
engineer, working from specs the team writes as GitHub issues. Each task runs in its own
draft PR: the kickoff /devin command, Devin's commits, its own verification summary, and the
team's review are all on the PR.
| Task | Issue | PR | Devin session |
|---|---|---|---|
| Traditional → Simplified Chinese conversion in transcripts | #1 | #4 (merged) | cd128bce |
| Teacher transcription via ElevenLabs Scribe v2 Realtime | #2 | #5 (merged) | 4c4040ee |
| Dead-code removal (Firebase remnants, unused CDN script, unused route, dead state) | #7 | #8 (merged) | f8431d3f |
| Coaching tips for typed teacher messages | #9 | #13 (merged; cooldown fix added in review) | 03a071b6 |
Demo hardening: pinned jsPDF, persona/language recap, protected /api/logs | #10 | #14 (merged) |
main.ts process entry — listens on $PORT
api/server.ts HTTP (Hono) + WebSocket + Gemini Live + prompts
server/ materials extraction, vision and video analysis
public/ index.html, app.js, logo.svg — served by the same process
Dockerfile node:20-slim, tsx runtime (no build step)
cloudbuild.yaml build → push → gcloud run deploy poken
| c957bb8a |
| Remove the ElevenLabs Scribe integration (Gemini transcription only) | #27 | #28 (merged) | 0f39c396 |
| Detect more diagram-request phrasings; student never refuses to draw (feature later removed) | #29 | #30 (merged) | — |
| On-demand diagrams drawn from the student's explanation, not the request (feature later removed) | #31 | #32 (merged) | — |
| Gemini transcription: trailing silence + settle so utterance tails aren't dropped | #33 | #34 (merged) | — |
| Transcript chunks concatenated verbatim (approach corrected in review) | #35 | #36 (merged) | — |
| Drop the leftover "solo" label from the session debug line | #39 | #40 | session |
| App-wide auth 1/3: Supabase auth moved into its own module | #41 | #42 |
| App-wide auth 2/3: return to the screen sign-in started from | #43 | #44 |
| App-wide auth 3/3: one account control on every screen that wants one | #45 | #46 |
| In-app confirm dialog, and Delete all for Learn history | #47 | #48 |
| Teaching history: delete one or all, and a way back to the landing page | #49 | #50 |
| Learn Mode: bold, subheads and lists in explanations | #52 | #53 |
| One mascot 1/3: extract the shared blob component | #54 | #55 |
| One mascot 2/3: the two loading screens | #56 | #57 |
| One mascot 3/3: the session student and the pill | #58 | #59 |
| Teach page: drop branding and stats, student choice moves left | #60 | #61 |
| Account control in one fixed corner on every screen | #62 | #63 |
| Grid-paper background on teach, learn and open questions | #64 | #65 |
| Learn and open questions: content on a white card | #66 | #67 |
| Reflection: grid paper, neutral palette, Pokey with a line | #68 | #69 |
| Persona cards: Pokey instead of emoji, coloured selection | #70 | #71 |
| Learn page: saved topics rendered twice (race in showTopics) | #72 | #73 |
| Floating polka dots on teach, learn and open questions | #74 | #75 |
| Visible float dots, emoji-free reflection buttons, pastel gradient | #76 | #77 |
| Opaque buttons and cards on the grid screens; plain Teach Again | #78 | #79 |
| Opaque Upload button and signed-in account pill | #80 | #81 |
| Progress bar from upload to end of document analysis | #82 | #83 |
| Pre-session progress bar no longer snaps back to empty | #84 | #85 |
| Document viewers: draggable popup in session, side panel in Learn | #86 | #87 |
| Palette colours for the reflection vocabulary and topic numbers | #88 | #89 |