ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證K-12 classroom management: engagement and standards-mastery tracking, clear grades, and AI-assisted feedback that teachers approve. Try it at copilot.rostr.one
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Try it: copilot.rostr.one · Create a free workspace
Teachers can create their own private workspace for free.
Built by Rostr EdTech: custom software designed around your process. Source published for transparency; see LICENSE.
Status lives in TODO.md, not here. This file only covers setup/usage — see
TODO.mdfor what's built so far and what's next, andCONTEXT.mdfor the architecture and why it's built this way.
A K-12 classroom management and learning platform with two sides:
/portal) to see progress and a "Practice Mode" area —
AI-scored free-response and multiple-choice practice questions (AP Chemistry and Introductory
Chemistry banks today), with progressive hints and a predicted-mastery preview. Practice results
are always advisory: they only become part of a student's official grade if a teacher reviews and
approves them.Each teacher who signs up gets their own independent, private workspace — their own classes, students, and standards, invisible to every other teacher's workspace by default. A teacher can explicitly grant a colleague co-teacher access to one or more of their specific classes for real collaboration; that grant never widens beyond the classes it names.
Forked from a CRM scaffold — see CONTEXT.md for the full domain mapping and why this architecture
was reused. (Note: CONTEXT.md/parts of TODO.md describe the original single-teacher premise the
fork started from — data isolation between teachers was added later, see TODO.md's multi-tenant
workspaces milestone, and is authoritative over anything CONTEXT.md still implies about one shared
teacher.)
| Role | Sees | Can do |
|---|---|---|
| Teacher | Their own workspace only — classes/students they created, plus any class an explicit co-teacher grant gives them | Manage their own classes & students, assign co-teachers, generate student invite links, all dashboards/reports/AI tools, manage their own co-teacher accounts |
| Co-Teacher | Only the classes they're assigned to (or every class taught by the one teacher who created their account, if granted all-access — never platform-wide) | Log engagement, record mastery, manage tasks — for their assigned classes only |
| Student | Only their own data, via /portal | See their own engagement, mastery, and predicted grade; use Practice Mode; see feedback a teacher chose to share |
A student gets portal access via a one-time invite link a teacher generates (they choose their own email/password when they open it) or, if configured, by signing in with a school Google account that matches their roster email — a teacher never sets or sees a student's password.
The app is local-first: it runs entirely on a local SQLite database with seeded demo data.
cd classroom-tracker
npm install
# Create your local env (SQLite + a generated AUTH_SECRET):
cp .env.example .env
node -e "console.log('AUTH_SECRET=\"'+require('crypto').randomBytes(32).toString('hex')+'\"')"
# → paste that AUTH_SECRET into .env (DATABASE_URL is already file:./dev.db)
npm run db:push # create the SQLite schema
npm run db:seed # teacher + 2 co-teachers + 6 demo students
npm run dev # http://localhost:3000
npm run build compiles the whole app; npm run db:reset wipes + reseeds.
ChangeMe123! for all)| Role | |
|---|---|
| Teacher | [email protected] |
| Co-Teacher | [email protected] / [email protected] |
| Student | [email protected] / [email protected] / [email protected] / [email protected] / [email protected] |
One demo student (Jordan Lee) is seeded without a portal login, to demonstrate the
"student exists before being invited" state. Or go to /signup to create a brand-new, separate
teacher workspace of your own instead of using the seeded one.
AI features (Assignment Builder, Comments generator, Practice Mode's FRQ scoring/coaching,
standards-mapping suggestions) work with zero API keys configured — they render a clean "not
configured" state instead of erroring. Add a key from /admin/settings (stored encrypted in the
DB) to turn them on; see TODO.md for the Google Sign-In setup steps if you want that too.
Next.js 15 (App Router) · React 18 · TypeScript · Tailwind + a hand-built shadcn-style UI kit · Prisma (SQLite local / Postgres-ready) · custom JWT auth (jose + bcrypt) · Zod · Recharts · lucide-react.
src/lib/access.ts (assertCanAccessStudent/assertCanAccessClass,
accessibleStudentIds/accessibleClassIds, studentScopeWhere/classScopeWhere/
studentIdScopeWhere/taskScopeWhere) is called by every student- and class-scoped action, query,
and API route. Each teacher (OWNER) is scoped to classes they teach or hold an explicit
co-teacher grant on, and students they created or who are enrolled in one of those classes — never
"every class/student in the database." A co-teacher (ASSISTANT) is scoped to their assigned
classes (or their one owning teacher's classes, if granted all-access — never platform-wide).src/actions/users.ts's requireOwnedAssistant — every account-management action (role
change, deactivate, delete, password reset) can only ever target an ASSISTANT the calling
teacher personally created; it can never touch another teacher's account.AUTH_SECRET (no fallback), short session TTL + a sessionVersion check so
role/deactivation changes revoke stale sessions immediately, not just on next expiry.src/lib/crypto.ts/settings.ts) when set from
/admin/settings instead of .env.src/lib/allowed-email.ts,
managed from /admin/settings) — set ALLOWED_EMAIL_DOMAIN to restrict sign-up and Google
Sign-In to the school's domain, and preload approved staff/student emails so /signup can't be
used to create a rogue teacher account, and a Student record's email can't be set to an address
the school hasn't verified. This is what closes a real identity-hijack risk in Google Sign-In's
auto-provisioning: without it, anyone could pre-create a Student row using a real student's
email before that student ever signs in, and silently capture their Google identity into an
unrelated workspace. Bootstrap-friendly — an empty roster just means the domain check (if any)
is the only gate, so the first admin can still sign up before preloading anything.src/lib/ai/run-model.ts) — no
prompt reaches a third-party AI provider until an admin explicitly acknowledges the trade-off in
/admin/settings. Student/class names are also redacted before sending to the End-of-Term
Comments generator and Monitor's AI feedback drafts () and
restored locally afterward — the AI never actually needs the real name to produce usable output.Run the isolation tests:
node --env-file=.env --import tsx scripts/multi-tenant-isolation-test.mts
node --env-file=.env --import tsx scripts/isolation-test.mts
Switch to a new Postgres/Supabase project: flip prisma/schema.prisma provider back to
postgresql + restore directUrl, set the pooled DATABASE_URL/DIRECT_URL and a new
AUTH_SECRET, then prisma db push. File uploads (src/lib/storage.ts) are local-disk only today —
that needs a real backend (e.g. S3/Supabase Storage) before hosting anywhere with an ephemeral or
multi-instance filesystem, since uploaded files won't otherwise survive a restart/redeploy.
src/lib/comments/anonymize.tssrc/lib/rate-limit.ts, in-memory/per-process
— fine for this app's single-instance deployment), and so are the AI-calling Practice Mode
actions a student can trigger, to blunt scripted password-guessing and runaway AI-cost abuse
without adding friction to normal use.src/lib/validations.ts).