ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Repositorio para alojar mis cursos
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Plataforma propia para dictar y publicar cursos: diapositivas proyectables con quizzes interactivos, login sin contraseña, inscripción con código, liberación de clases de a una y resumen de cada clase en PDF. Stack: Next.js 16 (App Router) · TypeScript · Supabase (Postgres + Auth) · @react-pdf/renderer · deploy en Vercel. Las decisiones del proyecto están en DECISIONES.md. El contenido vive en el repo; la base solo guarda lo que cambia en vivo: qué cursos están publicados, qué clases están liberadas (y desde cuándo), quién está inscripto y el código de inscripción de cada curso.查看完整 README ↗
Plataforma propia para dictar y publicar cursos: diapositivas proyectables con quizzes interactivos, login sin contraseña, inscripción con código, liberación de clases de a una y resumen de cada clase en PDF.
Stack: Next.js 16 (App Router) · TypeScript · Supabase (Postgres + Auth) · @react-pdf/renderer · deploy en Vercel.
Las decisiones del proyecto están en DECISIONES.md.
src/
content/ ← EL CONTENIDO (en el repo, versionado)
types.ts tipos de diapositiva, clase y curso
registry.ts lista de cursos de la plataforma
ia-mi-nuevo-asistente/
index.ts datos del curso y sus clases
clase1.ts diapositivas de la clase 1
herramientas-de-google/ curso "Herramientas de Google" (mismo formato)
components/deck/ motor de diapositivas (lienzo 1920×1080)
app/
page.tsx catálogo
cursos/[curso]/ página del curso (+ inscripción con código)
cursos/[curso]/[clase]/ visor de la clase (#12 = diapositiva 12)
cursos/[curso]/[clase]/resumen/ PDF del resumen
login/, auth/ login con link por mail (y Google opcional)
admin/ publicar cursos, código, liberar clases
lib/
access.ts ÚNICO lugar con las reglas de quién ve qué
supabase/ clientes de Supabase y refresco de sesión
pdf/ armado y diseño del PDF
proxy.ts refresca la sesión en cada request
supabase/migrations/ esquema de la base + RLS
El contenido vive en el repo; la base solo guarda lo que cambia en vivo: qué cursos están publicados, qué clases están liberadas (y desde cuándo), quién está inscripto y el código de inscripción de cada curso.
npm install
npm run dev # http://localhost:3000
Sin .env.local la app arranca en modo local: sin login y con acceso de admin, ideal para escribir y revisar contenido. Hay un aviso amarillo arriba mientras está así. En producción, sin las variables de Supabase la app devuelve error (nunca queda abierta por accidente).
Atajos en el visor: ← → (o espacio / PageUp / PageDown) navegar · F pantalla completa · R ver respuesta del quiz · 1–4 elegir opción · I volver al curso.
Celular: el visor cambia solo a "modo celular" cuando la pantalla es chica (diapositivas al ancho, scroll vertical, barra táctil abajo y swipe para pasar). En notebook, tablet y proyector usa el lienzo 1920×1080. Los estilos del modo celular están al final de src/components/deck/deck.css.
Ojo al editar archivos desde PowerShell 5.1:
Set-Content -Encoding utf8agrega un BOM que rompe la primera regla de los.css. Usar el editor o[IO.File]::WriteAllText.
supabase/migrations/ en orden, cada una una sola vez: pegarla en SQL Editor y ejecutar (o supabase db push con la CLI).
20261001000000_init.sql — esquema base.20261001020000_admin_panel.sql — panel de admin (invitaciones, accesos individuales, suspensiones, registro de actividad).20261002000000_course_access.sql — estado "Libre" de un curso (visible sin registrarse).20261002010000_engagement.sql — progreso, evaluaciones, clase en vivo (asistencia + quiz) y encuesta.20261002020000_live_game.sql — clase en vivo estilo Kahoot (nombre de partida, apodos, ranking).20261002030000_media.sql — imágenes, GIFs y videos subidos desde el panel (Storage + slide_media).20261002040000_media_gallery.sql — galerías (varias imágenes por lugar, en orden).20261002050000_media_annotations.sql — flechas y recuadros dibujados sobre cada imagen ("Señalar").20261003000000_survey_open.sql — habilitar / deshabilitar (o programar) la encuesta final.20261006000000_evaluation_settings.sql — evaluaciones: habilitar / deshabilitar por clase y editar sus preguntas desde el panel.20261006010000_access_requests.sql — solicitudes de admisión (quien no tiene Google pide acceso y se aprueba en el panel).20261010000000_class_content.sql — editor de clases: borradores, versiones publicadas e historial de las diapositivas (y con qué versión se dio cada clase en vivo).20261028000000_class_styles.sql — estilo de las diapositivas de cada clase (fuentes y colores), elegido con el botón Estilo del editor. Los estilos están en src/content/styles.ts..env.example a .env.local y completar NEXT_PUBLIC_SUPABASE_URL y NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY (Project Settings → API Keys).http://localhost:3000 (en producción, el dominio real).http://localhost:3000/auth/callback y https://TU-DOMINIO/auth/callback.http://localhost:3000 (y después https://TU-PROYECTO.vercel.app).https://zngigunepuwsroracpkv.supabase.co/auth/v1/callback (la que muestra Supabase en Authentication → Providers → Google).http://localhost:3000/auth/callback (y la de Vercel cuando exista) en Redirect URLs./admin)| Sección | Qué se hace |
|---|---|
| Resumen | Números generales, últimos registros y actividad reciente. |
| Cursos → curso | Estado: Sin publicar / Publicado (con inscripción) / Libre (sin registrarse) · Liberar todas las clases · código de inscripción (escribirlo, generarlo al azar o desactivarlo) · por clase: Liberar ahora, Ocultar o Programar fecha y hora · inscriptos (buscar, suspender, reactivar, quitar) · agregar personas pegando mails (las que ya tienen cuenta quedan inscriptas; las otras quedan invitadas) · invitaciones pendientes · accesos individuales. |
| Personas → ficha | Buscar y filtrar por rol/estado · en la ficha: hacer/quitar admin, suspender/reactivar cuenta, inscribir/suspender/quitar en cada curso y dar acceso individual a una clase, más el historial de acciones sobre esa persona. |
| Actividad | Registro de todas las acciones de los admins. |
Las acciones delicadas piden confirmación con un segundo toque. Nadie puede quitarse su propio rol de admin ni suspender su propia cuenta.
/cursos/<curso>/clase-N/evaluacion. Se define en el contenido (evaluation de la clase, ver src/content/ia-mi-nuevo-asistente/clase1-evaluacion.ts). Necesita SUPABASE_SECRET_KEY en el servidor./vivo y ponen su apodo. En cada quiz se ven las respuestas en tiempo real; R revela la correcta en los celulares; T muestra el ranking. Terminar cierra la partida. Resultados (ranking, asistencia, respuestas por pregunta, CSV) en Admin → curso → Seguimiento./cursos/<curso>/encuesta, definida en Course.survey. Resultados en Admin → curso → Encuesta.SALTA2026, o generar uno al azar).src/content/<curso>/claseN.ts exportando un Slide[] y asignarlo en slides de esa clase en index.ts. Mientras slides esté vacío, la clase figura "En preparación".src/content/<slug>/index.ts con un objeto Course y sumarlo a RAW en src/content/registry.ts. Aparece en /admin; queda oculto hasta publicarlo.media.id fijo. Lo más simple es subir el archivo desde Admin → curso → Imágenes (tiene prioridad). También se puede poner un archivo por defecto en public/img/<curso>/ con media.src. Sin archivo se muestra un recuadro con la descripción de qué buscar.src/content/types.ts..env.example en Settings → Environment Variables (con NEXT_PUBLIC_SITE_URL = dominio real).https://TU-DOMINIO/auth/callback a las Redirect URLs de Supabase.| Comando | Qué hace |
|---|---|
npm run dev | servidor de desarrollo |
npm run build | build de producción (incluye chequeo de tipos) |
npm run typecheck | solo chequeo de tipos |
node scripts/woff-to-ttf.mjs <archivos> | convierte fuentes WOFF a TTF (las del PDF ya están convertidas en src/lib/pdf/fonts) |
/login con tu mail (se crea tu usuario) y hacerte admin desde el SQL Editor:
update public.profiles set role = 'admin'
where id = (select id from auth.users where email = 'TU-MAIL');
NEXT_PUBLIC_AUTH_GOOGLE=on el botón de Google aparece primero y el mail queda como alternativa.