ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Live polls, Q&A and quizzes for meetings, classes and conferences. Next.js 16, Neon Postgres, Drizzle, Auth.js.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Live polls, audience Q&A and quizzes for meetings, classes and conferences.
Hosts sign in and run a room; participants join with a short code from any
browser, with no account and no install.
UI, business logic, database queries, validation and realtime are separate
modules; pages compose them and hold no logic of their own.
14 tables. Ownership always runs through events.owner_id.README 전문 보기 ↗Live polls, audience Q&A and quizzes for meetings, classes and conferences. Hosts sign in and run a room; participants join with a short code from any browser, with no account and no install.
app/
(marketing)/ Landing page + marketing layout
(auth)/ Sign in / sign up
dashboard/
events/
[eventId]/ Event workspace (interaction list + editor)
analytics/ Per-event analytics + CSV export links
settings/ Join details, rename, danger zone
new/ Create event
analytics/ Cross-event overview
present/[eventId]/ Presenter mode (projector surface)
event/[eventCode]/ Participant surface
join/ Join by code
api/
auth/[...nextauth]/ Auth.js handlers
realtime/ Server-Sent Events stream (SSE driver)
events/[eventId]/export/ CSV export
components/
ui/ Design-system primitives (Radix + cva)
marketing/ dashboard/ participant/ present/ interactions/ analytics/ shared/
lib/
db/ Drizzle client (Neon HTTP + retry)
auth/ Auth.js config, password hashing, requireUser
realtime/ Channels, event names, publisher, client, in-process bus
queries/ Read models (server-only)
actions/ Server Actions (all writes)
interactions/ Type registry, defaults, normalisation
quiz/ Scoring
validations/ Zod schemas
utils/ cn, event codes, formatting, CSV
db/
schema/ Drizzle table definitions
migrations/ Generated SQL
seed.ts Demo data
hooks/ useRealtime, useEventSync
types/ Shared types
proxy.ts Route protection (Next 16's middleware convention)
UI, business logic, database queries, validation and realtime are separate modules; pages compose them and hold no logic of their own.
14 tables. Ownership always runs through events.owner_id.
| Table | Purpose |
|---|---|
users, accounts, sessions, verification_tokens | Auth.js. password_hash is nullable so OAuth can be added without a migration |
events | Title, description, unique event_code, status, active_interaction_id |
event_members | Collaborators with a role, unique per (event, user) |
interactions | Every interaction. parent_id makes quizzes and surveys containers whose questions are child rows |
interaction_options | Choices, with is_correct for quiz questions |
participants | Anonymous audience members, unique per (event, session) |
responses | Answers as JSONB, unique per (interaction, participant, slot) |
questions, question_votes | Q&A, one vote per person per question |
quiz_scores | Running score, unique per (quiz, participant) |
analytics_events | Append-only activity log |
responses.slot is the duplicate-prevention mechanism. Single-answer
interactions always write slot 0, so the unique constraint rejects a second
row at the database level rather than relying on an application check.
Word clouds increment the slot to allow a configured number of entries.
Enums: event_status, member_role, interaction_type, interaction_status,
question_status. Foreign keys cascade from events downward.
Copy .env.example to .env.local.
| Variable | Required | Purpose |
|---|---|---|
DATABASE_URL | yes | Neon pooled connection |
DATABASE_URL_UNPOOLED | yes | Direct connection for migrations |
AUTH_SECRET | yes | Signs session JWTs (npx auth secret) |
AUTH_URL | yes | Public origin Auth.js redirects to |
AUTH_TRUST_HOST | behind a proxy | Let Auth.js trust the request host |
AUTH_GOOGLE_ID, AUTH_GOOGLE_SECRET | no | Enables "Continue with Google". Redirect URI: <AUTH_URL>/api/auth/callback/google |
PRIVACY_CONTACT_EMAIL | for Google sign-in | Contact address on /privacy, which Google requires before publishing |
NEXT_PUBLIC_APP_URL | yes | Builds join links and the presenter QR code |
PARTICIPANT_COOKIE_SECRET | yes | HMAC for the anonymous participant cookie |
SERVER_ACTION_ALLOWED_ORIGINS | behind a proxy | Extra origins allowed to submit forms |
PUSHER_APP_ID, PUSHER_SECRET, NEXT_PUBLIC_PUSHER_KEY, NEXT_PUBLIC_PUSHER_CLUSTER | for Vercel | Switches realtime to Pusher |
SERVER_ACTION_ALLOWED_ORIGINS matters: Next silently rejects Server Actions
from an origin it does not recognise, which makes every form appear to do
nothing. Set it whenever the public origin differs from localhost.
npm install
npm run dev
npm run db:generate # generate SQL from the Drizzle schema
npm run db:migrate # apply pending migrations
npm run db:studio # browse the data
npm run db:seed
Creates host [email protected] / chorus1234 and the event Digital
Marketing Workshop, code MARKETING26, with a multiple-choice poll, a word
cloud, a 1–10 rating, a Q&A and a three-question quiz. Re-running replaces the
demo event rather than duplicating it.
AUTH_URL and NEXT_PUBLIC_APP_URL to the deployed origin.npm run db:migrate against the production branch.Pusher is required on Vercel. The built-in SSE driver only reaches clients connected to the same Node process, and Vercel runs many.
A driver abstraction with two implementations, chosen by whether the Pusher variables are set:
/api/realtime. Genuine
server push, no external account, correct for local dev and single-node hosts.Messages carry only what changed — an event name and an id — never the new data. Receiving one triggers a refetch from the server. A dropped, duplicated or out-of-order message therefore cannot leave a client showing numbers the database does not agree with. Bursts collapse into one refetch via a 220ms debounce, and both host and participant headers show the live connection state.
Write flow: participant submits → Zod validates shape → the server re-resolves who they are, whether the interaction is open, and what a valid answer looks like → database write (constraints enforce uniqueness) → publish → clients refetch.
Hosts — email/password or Google sign-in, event CRUD, human-friendly join codes
(BRAVO-42, ambiguous characters excluded), an interaction workspace, presenter
mode with QR code and fullscreen, per-event analytics with charts, CSV export.
Eight interaction types — multiple choice, word cloud, rating, open text, ranking (drag or arrows), Q&A (upvotes, anonymity, moderation), quiz (timer, speed-bonus scoring, leaderboard), survey (multi-question, completion tracking).
Participants — join by code with no account, mobile-first surfaces for every type, live results when the host allows them, signed anonymous sessions.
Security — Zod on every input; ownership enforced inside WHERE clauses,
not checked afterwards; participant identity is an HMAC-signed httpOnly cookie;
quiz correct answers withheld from the payload until reveal; anonymous authors
blanked server-side; CSV fields guarded against spreadsheet formula injection;
duplicate votes prevented by database constraints.
event_members exists but has no screen yetanalytics_events and build funnel views on it