ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
모든 스마트폰으로 설문·퀴즈·워드클라우드·경품 응답, 결과는 대형 화면에 즉시 표시, 슬라이드와 동일 위치 제공, 대학·학교·기업용
Polls, quizzes, word clouds, and giveaways answered from any phone, with results on the big screen in seconds and your slides in the same place. For universities, schools, and companies.
교육TypeScript · PLpgSQLGitHub @kenneson온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Seu público fala. Você entende. Sua próxima palestra fica melhor.
Interação em tempo real para aulas, palestras e treinamentos. Seis tipos de pergunta (enquete, escala, nuvem de palavras, pergunta aberta, quiz e ranking), perguntas da plateia e reações, slides em PDF na mesma sequência, telão, sorteio, pesquisa pós-evento por modelo, analytics, evolução entre sessões e insights com IA. Em português, espanhol latino e inglês.
Stack: Next.js 16 (App Router) · TypeScript estrito · Tailwind v4 · componentes estilo shadcn/ui · Supabase (Auth, Postgres, RLS, Realtime, Storage) · Zod · next-intl · Recharts/d3 · Vercel.
npm installnpx supabase init cria um
supabase/config.toml local (o repositório não traz um) e npx supabase start sobe o banco.supabase/migrations/ em ordem
(npx supabase db push com o projeto linkado, ou cole no SQL Editor). A mais recente é
20261017000000_audit_fixes.sql.
Opcional: rode supabase/seed.sql para dados de demonstração
(login [email protected] / demo123456, duas sessões encerradas e um rascunho)..env.example para .env.local e preencha (tabela abaixo).
Gere o segredo do participante com openssl rand -base64 48.http://localhost:3000/**
e https://SEU-APP.vercel.app/** às Redirect URLs (todo domínio por onde se entra: o de produção, o
*-SEU-TIME.vercel.app e o personalizado). Sem isso, o retorno do login cai no Site URL: o proxy leva o
?code= da página inicial para /auth/callback (lib/domain/oauth-return.ts), mas isso só funciona quando o
login começou no mesmo domínio do Site URL.
https://<projeto>.supabase.co/auth/v1/callback. Cole o Client ID e o Client Secret em
Authentication → Sign In / Providers → Google no Supabase. Nenhuma variável de ambiente é necessária./oauth/consent como
Authorization Path e ligue o Dynamic client registration. O Site URL (em URL Configuration) precisa ser o
domínio público do app, porque o consentimento abre em Site URL + /oauth/consent. Local: no config.toml criado
pelo supabase init, [auth.oauth_server] enabled = true e allow_dynamic_registration = true. O servidor MCP
fica em /api/mcp.supabase/templates/
(confirmation.html, recovery.html, email_change.html) no template correspondente, com o assunto indicado em
supabase/templates/README.md.npm run dev → http://localhost:3000Tipos do banco: src/lib/supabase/database.types.ts é gerado do banco. Depois de mudar o schema (migration nova),
rode npm run db:types com o projeto linkado; não edite o arquivo à mão.
| Variável | Obrigatória | Para quê |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | sim | URL do projeto Supabase |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | sim | chave pública (ou NEXT_PUBLIC_SUPABASE_ANON_KEY, criada pela integração da Vercel) |
SUPABASE_SECRET_KEY | sim | só no servidor (ou SUPABASE_SERVICE_ROLE_KEY); fluxo do participante, telão, exclusão de conta |
PARTICIPANT_TOKEN_SECRET | sim | 32+ caracteres; assina o cookie do participante e calcula o hash do IP dos limites de abuso |
NEXT_PUBLIC_APP_URL | local | endereço público do QR Code e dos links; na Vercel pode ficar vazio (usa o domínio de produção) |
NEXT_PUBLIC_APP_TIME_ZONE | não | fuso padrão (America/Sao_Paulo); cada palestrante tem o próprio fuso na conta |
AI_PROVIDER, AI_API_KEY, AI_MODEL | não | IA (groq, openai ou anthropic); sem elas, "Gerar com IA" e os insights somem. AI_MODEL vazio usa o padrão do provedor |
RESEND_API_KEY, CONTACT_EMAIL_FROM | não | aviso por e-mail dos convites do perfil público |
AI_PROVIDER/AI_API_KEY configurados, gere os insights.claude mcp add --transport http pulsestage <endereço>). Anexe um PDF, peça as perguntas, confira a sessão criada e envie o mesmo PDF na aba Slides./es e /en (landing, login, diretório) e troque pelo seletor de idioma. Crie uma sessão com
Idioma da sessão = Español: o celular e o telão aparecem em espanhol mesmo com o navegador em português, a
pesquisa padrão é a "Evaluación general" e "weón" fica fora da nuvem. Veja docs/I18N.md.| Comando | O que faz |
|---|---|
npm run dev | servidor de desenvolvimento |
npm run build | build de produção |
npm run lint | ESLint (flat config do Next) |
npm run typecheck | tsc --noEmit |
npm test | testes unitários (node --test, sem compilar): regras de lib/domain/, cookie do participante, MCP e traduções |
npm run db:types | gera database.types.ts a partir do Supabase linkado |
/join/[código]; o servidor cria o registro e grava um cookie
HTTP-only assinado (HMAC). Toda resposta passa por Server Action, que valida o cookie e calcula acerto,
pontos, tempo do quiz e normalização da nuvem de palavras. O papel anon não escreve em nada.session_live_state e interaction_results, mantidas por triggers.
"Conectados agora" vem do Presence e é apenas informativo.participant_contacts, separado e com consentimento.
A IA recebe dados agregados e trechos de respostas abertas e comentários, nunca nomes ou contatos.
Limites de abuso (pesquisa sem ter entrado, código errado, convites) usam um hash do IP com segredo do servidor;
o IP não é guardado. Detalhes em /privacidade./api/mcp (Streamable HTTP, sem estado) aceita o access token do servidor OAuth
do Supabase (consentimento em /oauth/consent) e roda as ferramentas como o próprio palestrante, com RLS.
O assistente lê o PDF no chat; o PulseStage recebe só as perguntas com after_slide.| Fase | Situação |
|---|---|
| Especificação e schema | ✅ |
| Código do MVP (auth, sessões, builder, ao vivo, projetor, participante, feedback, analytics, evolução, IA) | ✅ |
| Tema escuro (toggle claro/escuro, segue o sistema por padrão) | ✅ |
Polimento: loading/skeletons, diálogos de confirmação, página /privacidade | ✅ |
| Login e cadastro com Google | ✅ |
"Como funciona" na home e guia de uso em /dashboard/guia | ✅ |
| Identidade visual "Campus" (azul acadêmico, Plus Jakarta Sans, escuro em azul-marinho; substitui "Roteiro com deixas") | ✅ |
| Pesquisas pós-evento por modelo (5 prontos + modelos próprios, pontos fortes/fracos por dimensão) | ✅ |
| Navegação lateral com ícones, conta e configurações (perfil, preferências, segurança, LGPD) | ✅ |
| Duplicar sessão e biblioteca de perguntas | ✅ |
| Exportar relatório (PDF pela impressão do navegador) e CSV das respostas e da pesquisa | ✅ |
| IA sugere perguntas para o roteiro (“Gerar com IA”) | ✅ |
| Slides em PDF dentro da sessão (slides e perguntas na mesma sequência, passador avança tudo) | ✅ |
| Nova pergunta durante a sessão ao vivo (lançar agora ou deixar como próxima) | ✅ |
| Tempo de palestra: cronômetro ao vivo (previsto × real, sem pausas) e duração no analytics e relatório | ✅ |
| Nuvem de palavras com layout d3-cloud (animada, no telão, sala ao vivo e analytics) | ✅ |
| Linha do tempo da palestra no analytics (slides, perguntas, QR e pausas; tempo por slide) | ✅ |
| Ranking do quiz animado no telão (“Mostrar ranking”) | ✅ |
| Gamificação: avatares, alternativas com formas/cores e imagens, bônus de velocidade | ✅ |
| Sorteio de prêmios (pesquisa ou todos), número da sorte, telão com suspense e som, controle de entrega | ✅ |
Perfil público verificado do palestrante, diretório /palestrantes (filtros e páginas por tema) e convites | ✅ |
| Participação da plateia: ranking (6º tipo), perguntas da plateia com curtidas e telão, reações ao vivo, filtro de palavrões e moderação |
Especificação completa em docs/PROMPT.md.
| ✅ |
| Servidor MCP (Claude, ChatGPT e outros): criar sessões e perguntas a partir dos slides, OAuth, página Integrações | ✅ |
Idiomas: português, espanhol latino e inglês americano (next-intl, /es e /en, idioma por sessão, palavrões e IA por idioma) | ✅ |
| Realtime resistente a eventos perdidos (releitura ao conectar, após ações e no projetor) | ✅ |
| Auditoria de produto: pesquisa anônima com limite por IP (fora da nota pública), entrada antes do início, modo ensaio, sala ao vivo em tela própria, leituras por GET, limite de código errado | ✅ |
| Celular estilo app: barra de abas embaixo, folhas, alvos de 44 px, sem rolagem lateral; instalável (PWA) | ✅ |
| Sala de espera no telão (quem entra aparece com avatar e nome) e resultado do quiz no celular (acertou, pontos, posição) | ✅ |
| Animações com Motion (motion.dev): troca de tela no celular e no telão, alternativas e toques, barras e números que contam, ranking do quiz, listas que reordenam; respeita "reduzir movimento" | ✅ |
| Leva inspirada no Mentimeter: 100 pontos, matriz 2×2, marcar na imagem, adivinhe o número, quiz de digitar, slide de conteúdo; várias escolhas, imagens, revelar no telão, comparar grupos, equipes, ritmo próprio, notas do palestrante, modelos, marca própria e suplemento do PowerPoint | ✅ |
| Sessão em etapas (Configurações → Slides → Enquetes → Pesquisa pós-evento → Sorteio) | ✅ |
| UX mais enxuta: menu lateral em grupos e recolhível (Ctrl+B), ações secundárias no "⋯", um só "Salvar", tipos de pergunta numa janela, nomes unificados ("pergunta", "Resultados") | ✅ |
| Testes unitários (domínio, cookie do participante, MCP, traduções nos três idiomas) | ✅ |
| Testes de integração e E2E | ⏳ |
| Deploy na Vercel | ✅ |