ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
Duolingo-style learning app: server-checked lessons, FSRS spaced repetition, weekly leagues. Next.js 16, Supabase with RLS, 1,300+ unit tests.
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Five-minute lessons, streaks and weekly leagues. English from A1 to C2 and JavaScript from zero to pro, for Ukrainian speakers, with a pixel mascot that grows with you.
playloo.app · Blog · Docs
English · Українська
Loo is a Duolingo-style app. Any subject becomes a path of short lessons, tests and reviews; learners earn XP and two currencies, keep a daily streak, compete in weekly leagues and dress their character. Explanations are in Ukrainian, answers are checked only on the server, and every learner's progress lives in their own Postgres rows under row-level security.
On a phone: bottom navigation, large targets, installable as a PWA.
| Course | Sections | Topics | Lessons | Exercises | Reels |
|---|---|---|---|---|---|
| English A1 → C2: grammar, 4,287 words, listening, pronunciation, reading, IELTS guide | 6 (A1…C2) | 166 | 2,361 | 9,375 | 499 |
| JavaScript Zero → Pro: from variables to the event loop, patterns and interviews | 9 | 73 | 779 | 1,759 | 271 |
A course is a Markdown guide written in Obsidian plus a course.yaml manifest. A compiler turns it into a bundle of sections, topics, lessons, topic tests, section exams and exercise pools. A new course is new content, not new code (docs/COURSE_FORMAT.md).
user_id and an own_rows policy; server-only tables (analytics, admin log, email) have no grants for anon or authenticated.readAll, content is cached, round trips are kept to a minimum (PERFORMANCE.md).flowchart LR
vault["Obsidian vault<br/>Guides/ · Courses/"] -->|pnpm content:sync| content["content/<br/>Markdown + course.yaml"]
content -->|pnpm course:build| bundle["content/courses/*.json<br/>course bundle"]
content -->|content-snapshot| snap["content snapshot<br/>(units, articles)"]
bundle --> app["Next.js 16 on Vercel<br/>RSC + server actions"]
snap --> app
app <-->|"withUser (RLS)"| db[("Supabase Postgres<br/>progress · game · analytics")]
app <--> auth["Supabase Auth<br/>email · Google · GitHub"]
browser["Browser / PWA"] <--> app
src/
content/ vault -> domain model; block registry (quiz, word, listen, speak, pair, task...); Obsidian parser
course/ course schema, bundle compiler, placement test, skills, adaptive selection (pure logic)
progress/ XP, levels, FSRS, mistakes, streaks, achievements (no I/O)
game/ ranks, currencies, shop, leagues, character
db/ Drizzle schema and Postgres client
server/ auth, actions, services, admin, analytics
ui/ React components
app/ Next.js routes (App Router)
Admin analytics on local demo data.
Next.js 16 (App Router, React Compiler) · React 19 · TypeScript strict · Tailwind CSS 4 · Drizzle ORM + postgres-js · Supabase (Postgres, Auth, RLS) · ts-fsrs · Zod · Vitest · Playwright · Vercel (Fluid Compute) · Resend · Obsidian as the CMS.
Node.js 22.12+ and pnpm (corepack enable).
pnpm install
cp .env.example .env.local # VAULT_PATH, DATABASE_URL, Supabase keys, ADMIN_EMAILS
pnpm db:local # local Postgres (PGlite) on :54329, in a separate terminal
pnpm db:migrate # schema + RLS
pnpm dev # http://127.0.0.1:3000
Without Supabase keys you can work on the UI with DEV_AUTH_BYPASS=1 pnpm dev (only in next dev and only without keys). Sign-in setup: docs/AUTH.md.
| Command | What it does |
|---|---|
pnpm dev / pnpm build / pnpm start | development / build / production mode |
pnpm content:sync | copies Guides/ and Courses/ from the vault into content/ |
pnpm course:check <course> / pnpm course:build | validates and compiles courses into bundles |
pnpm db:generate / pnpm db:migrate | Drizzle migrations |
pnpm test / pnpm e2e | unit tests (Vitest) / end-to-end (Playwright) |
pnpm lint / pnpm typecheck | ESLint with layer boundaries / TypeScript |
| Topic | File |
|---|---|
| Architecture and layers | ARCHITECTURE.md |
| Content and course format | CONTENT_SPEC.md · COURSE_FORMAT.md |
| Language courses, placement, skills | LANGUAGE_COURSE.md · ENGLISH_SYLLABUS.md · SPEECH.md |
| How we teach | LEARNING_PLAYBOOK.md |
| Game and economy | ECONOMY.md · BATTLES.md |
| Design | DESIGN.md |
| Sign-in and security | AUTH.md · SECURITY.md |
| Performance | PERFORMANCE.md |
| Blog, email, analytics, admin | BLOG.md · EMAIL.md · ANALYTICS.md · ADMIN.md |
| Roadmap |
Most docs are in Ukrainian.
user_id under RLS; deleting the account deletes all progress (cascade).| ROADMAP.md |