ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A full-featured LMS built for Africa's AI Capacity Building Initiative:
courses with progress-locked modules, AI-graded assessments, real
payments, publicly verifiable certificates, an employer portal for
discovering and hiring trainees, and a course review/testimonial
system — built out from the original M9 foundation scaffold through
47 sequenced milestones across six stages, all now complete except one
external, non-technical dependency (see "What's genuinely not done"
below).README 전문 보기 ↗A full-featured LMS built for Africa's AI Capacity Building Initiative: courses with progress-locked modules, AI-graded assessments, real payments, publicly verifiable certificates, an employer portal for discovering and hiring trainees, and a course review/testimonial system — built out from the original M9 foundation scaffold through 47 sequenced milestones across six stages, all now complete except one external, non-technical dependency (see "What's genuinely not done" below).
For a complete, step-by-step guide covering both local development and live production deployment (Vercel + Neon), see
DEPLOYMENT.mdin this same folder. The quick version below is a fast reference for anyone already familiar with the stack;DEPLOYMENT.mdis the one to follow if this is your first time running the project.
If you obtained this project by extracting it from a
.skillfile rather than having Claude generate it fresh, some folder names undersrc/app/may still read as__id__or__code__instead of[id]/[code](Next.js's real dynamic-route syntax) — a packaging limitation, not a typo. Runpython3 scripts/materialize_template.py .from the skill directory once to fix that before continuing.
npm install
cp .env.example .env # see that file's own comments for what each key is for and which are optional
docker compose up -d # starts local Postgres
npx prisma generate # requires internet access — downloads the query engine
npx prisma db push # creates tables from prisma/schema.prisma
npm run db:seed # demo staff, trainee, employer, course, and testimonial
npm run dev
Then open http://localhost:3000.
[email protected] / ChangeMe123! → /admin/login[email protected] / TraineeDemo123! → /trainee/login[email protected] / EmployerDemo123! → /employer/login (pre-approved — visit /employer/discover to see the demo trainee)AAICBI-EXCEL-DEMOOnly AUTH_SECRET and ANTHROPIC_API_KEY are required to run the app
at all — every other key in .env.example (email, payments, WhatsApp,
Google Translate, avatar storage) has its own real fallback behavior
when left unset, documented directly in that file's own comments next
to each one. Nothing crashes because a key is missing; features that
depend on one degrade to "not available yet" instead.
Note on
prisma generate: it needs to reachbinaries.prisma.shto download the query engine binary. If you're running this inside a network-restricted sandbox (as this scaffold was built and tested in), that step will fail with a 403 — it works fine on a normal machine or CI runner with unrestricted internet.tsc --noEmitwill show a cascade of@prisma/client"no exported member" errors in that case — that's this same cause, verified against the original unmodified template, not a bug in this project. Seereferences/porting-notes.mdin the skill for the verification.This same restriction means real schema validation (as opposed to the individual, seeded-Postgres checks used throughout this whole build) could never run from inside this sandbox — and the very first real
prisma generate, run by someone with actual internet access, did catch something genuine:Examhad two fields both namedcourse— a legacy free-text label predating the realCourserelation, and that relation itself, added later without noticing the name was already taken. Confirmed no application code anywhere referenced the relation by that name before fixing it (it was defined but never actually used), and fixed by renaming the relation toparentCourse— the exact same naming-collision fixcourseModule(vs the legacymodulelabel) already applied earlier in the same model, just not consistently carried forward when this second relation was added. Also swept the entire schema afterward for any other duplicate field name across every model — this was the only one.
Run the parser tests any time with npm test — they don't need a
database or the Prisma client, so they're a fast sanity check after any
change to the DOCX import logic.
Works on Vercel out of the box for the Next.js app; point DATABASE_URL
at a managed Postgres (Neon, Supabase, Railway, RDS...) instead of the
local docker-compose one. On Vercel, the vercel-build script
(scripts/vercel-build.mjs) runs prisma migrate deploy before the build
on production deployments only; previews and local builds never touch the
database. Elsewhere, run npx prisma migrate deploy against the production
database as part of your deploy step. See docs/public-ecosystem.md.
build is deliberately prisma generate && next build, not just
next build. @prisma/client's own postinstall usually regenerates
the client automatically, but Vercel's build cache can skip a fresh
npm install on a redeploy, silently leaving a stale, mismatched
client in place — a well-known real-world failure mode for Prisma
projects on Vercel, not a hypothetical one. Running prisma generate
explicitly as the first step of build guarantees a fresh client on
every single deploy, cache or no cache.
Trainee experience — self-registration and login, structured courses with progress-locked modules and lessons, AI-graded assessments with instant feedback and per-attempt analysis, offline material downloads (redirect-based for video, proxied for documents), lesson-level Q&A with staff replies and likes, WhatsApp notifications alongside email (code complete, pending Meta's own approval process — see "What's genuinely not done" below), and publicly verifiable certificates the moment a course is completed.
Payments — real Paystack integration: webhook verification, payment initiation, subscription lifecycle handling, OTP-gated course unlock, and a manual reconciliation fallback for when a webhook never arrives.
Staff/admin — four-role auth (SUPER_ADMIN/ADMIN/INSTRUCTOR),
the full CBT exam engine (server-side timing, idempotent grading, no
answer leakage before submission), the DOCX-upload → AI-structure →
review → publish pipeline for building assessments, Q&A moderation
with automatic warning-to-suspension escalation, and a real in-app
notification center (not just email) mirrored across every account
type.
Employer portal — a fourth account type with real registration verification fields (business registration number, phone, optional website/LinkedIn), staff-gated approval, trainee discovery with per-introduction disclosure choices (a trainee's contact information is never shown until they genuinely accept a specific request), a job board with AI-screened postings that still always require a real staff decision, and automatic posting expiry.
Reviews & testimonials — a trainee can review a course only after genuinely completing it (a real, non-revoked certificate), staff can promote a real review to a public landing-page testimonial with one click, and manual testimonial entry for anything that predates this system.
Public, unauthenticated pages — a real landing page describing the
actual product, a certificate verification page
(/certificate/[code]) anyone can check without logging in, and a
trainee-generated public profile link (/profile/[code]) that only
works while the trainee has discoverability turned on.
WHATSAPP_ENABLED=false until that approval exists; setting
it to true without a real provider implementation will make
notifications fail loudly rather than pretend to send something that
doesn't exist.theme cookie (dark unless the cookie explicitly says light). The
settings toggle writes that cookie, so a choice persists across
navigation and refresh everywhere — not just on pages that re-run
the apply logic. One deliberate boundary: existing accounts
created before this change still carry darkMode: false in the DB,
so a logged-in user who never touched the toggle keeps light on
authenticated pages (their stored preference wins on those pages by
design — we don't silently flip a saved choice). New accounts
default to dark. If you want dark to override for everyone
including pre-existing users, run a one-line migration:
UPDATE "Trainee" SET "darkMode" = true; (and the same for "User"
and "Employer") — intentionally left as an explicit opt-in rather
than done automatically.Option.isCorrect or
Question.explanation to a route a trainee's browser can reach before
submission. serveableQuestion() in examEngine.ts is the only
sanctioned way to shape a question for the client.startAttempt/recordAnswer re-check expiresAt server-side on every
write — the client-side timer is cosmetic.passwordHash.requireRole() with an explicit role
list, not a bare call.src/lib/ssrfGuard.ts for the real
DNS-resolving check that closes this, and its own comment for
exactly what it does and doesn't defend against.src/app/api/employer/discover/route.ts and the introduction/
application routes for the pattern.
"# AAICBI"