ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Piattaforma didattica ufficiale della Federazione Italiana Gioco Bridge (FIGB) per imparare il bridge: corsi interattivi, quiz, pratica al tavolo contro l'AI, tornei, sfide tra amici e portale istruttori. In produzione su bridgelab.it.檢視完整 README ↗
Piattaforma didattica ufficiale della Federazione Italiana Gioco Bridge (FIGB) per imparare il bridge: corsi interattivi, quiz, pratica al tavolo contro l'AI, tornei, sfide tra amici e portale istruttori. In produzione su bridgelab.it.
@theme inline in globals.css, nessun tailwind.config) + shadcn/uiavatars), RPCios/, Android in android/)main. Non usare mai vercel --prod (la directory public/ supera i limiti di upload).npm install
cp .env.example .env.local # se assente, creare .env.local con le variabili sotto
npm run dev # http://localhost:3000
Variabili d'ambiente richieste (.env.local, mai committato):
| Variabile | Uso |
|---|---|
NEXT_PUBLIC_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_ANON_KEY | client Supabase (pubbliche) |
SUPABASE_SERVICE_ROLE_KEY | solo server (route API admin/email); bypassa RLS |
RESEND_API_KEY / RESEND_FROM | invio email |
CRON_SECRET | autorizza /api/cron/engagement (header Authorization: Bearer) |
BEN_API_URL | opzionale: server AI neurale BEN self-hosted (fallback automatico su solver/euristica se assente); per ospitarlo vedi deploy/ben-railway/ |
BEN_API_TOKEN | segreto condiviso con la guardia davanti a BEN; obbligatorio se BEN è ospitato, inutile in locale |
NEXT_PUBLIC_GADS_SIGNUP_LABEL | label conversione Google Ads (registrazione) |
ADMIN_NOTIFY_EMAIL | opzionale: destinatario notifiche richieste istruttore |
NEXT_PUBLIC_SENTRY_DSN | error monitoring; se assente Sentry è interamente no-op |
SENTRY_ORG / SENTRY_PROJECT / SENTRY_AUTH_TOKEN | opzionali: upload source map in build (senza, gli stack trace restano minificati) |
HEYGEN_API_KEY | solo script di generazione video |
src/app/ 66 rotte App Router (gioca/, lezioni/, istruttori/, admin/, api/)
src/components/ 90 componenti (bridge/ = tavolo da gioco, ui/ = shadcn)
src/lib/ logica di dominio pura: bridge-engine, dds-table (double dummy
esatto, bridge-dds in WebAssembly), robot-pimc (il robot che
gioca con le carte che vede), bridge-scoring (punteggi WBF/IMP),
ai-difficulty, pbn, hand-encoder, catalog (contenuti da DB)
src/hooks/ 26 hook (use-bridge-game = orchestrazione partita)
src/data/ seed iniziale dei contenuti — ATTENZIONE: i contenuti live sono
nel DB Supabase e DIVERGONO dal seed; correggere via DB, non reseed
scripts/sql/ schema incrementale (eseguire su Supabase Dashboard → SQL Editor)
scripts/ pipeline video HeyGen, validatori smazzate, seed legacy
Lo schema vive su Supabase e si evolve con gli script di scripts/sql/, eseguiti a mano su Dashboard → SQL Editor. Non c'è una catena di migrazioni automatica, ma il database si ricostruisce dal repository e ogni script applicato è tracciato:
scripts/sql/000-schema-baseline.sql è lo schema completo di produzione (tabelle, vincoli, RLS, policy, funzioni, privilegi), generato dal database stesso con node scripts/dump-schema.mjs. Si rigenera e si committa insieme a ogni script che cambia lo schema.public.script_applicati registra gli script eseguiti. Ogni script nuovo termina con la riga che lo registra (insert into public.script_applicati …): un test (src/lib/sql-registro.test.ts) fallisce se manca. node scripts/sql-stato.mjs elenca gli script del repository non ancora applicati in produzione ed esce con 1 se ce ne sono. Gli script anteriori al 2 ottobre 2026 sono registrati come retroattivi.*-rollback.sql). Gli script test-*.sql sono prove da eseguire su un database di prova, non modifiche dello schema.Tutte le tabelle hanno RLS; le RPC amministrative sono protette da is_admin() (colonna profiles.role).
Contenuti didattici. La fonte di verità è il database: lezioni, moduli, smazzate ed eserciziario si correggono lì (UPDATE), mai rieseguendo il seed. Il seed in src/data/ è quello iniziale e diverge da produzione; scripts/legacy/seed-supabase.ts resta solo per storia. Per una copia aggiornata dei contenuti: node scripts/esporta-contenuti.mjs scrive scripts/contenuti/*.json, che non si committa (contiene commenti e soluzioni nascosti agli allievi, e il repository è pubblico).
npx tsc --noEmit # typecheck (bloccante in CI)
npx eslint src # lint, zero errori/warning (bloccante in CI)
npm test # unit test motori di dominio (vitest, bloccante in CI)
npm run test:rls # verifica RLS con anon key (dopo modifiche schema)
npm run test:e2e # smoke E2E Playwright (solo locale: crea/elimina
# un utente di test via service role)
CI: .github/workflows/ci.yml (typecheck + lint + test su ogni push/PR).
Debito noto (perizie tecniche in PERIZIA-*.md e piano in PIANO-MIGLIORAMENTO-2026-08.md): pagine monolitiche (fino a ~2.200 righe), niente i18n (scelta di prodotto), error monitoring assente (aggancio pronto in src/lib/report-error.ts), schema DB senza migrazioni versionate.
Non documentazione tecnica: sono i manuali per chi la piattaforma la usa, da consegnare così come sono.
| manuale | per chi |
|---|---|
docs/manuale-utenti.md | chi usa Bridge LAB per conto proprio |
docs/manuale-allievi.md | chi segue un corso con un istruttore |
docs/manuale-istruttori.md | gli istruttori: classi, compiti, strumenti d'aula |
Quando cambia una funzione visibile, cambiano anche loro: un manuale che descrive la versione di sei mesi fa fa perdere più tempo di uno che non esiste.
profiles.role = 'admin'), sia client sia RLS/RPC.GET /api/cron/engagement gira alle 17:00 UTC via Vercel Cron; trigger manuale con curl -H "Authorization: Bearer $CRON_SECRET".catalog.ts li serve con cache); le infografiche sono generate (Gemini) e i video con HeyGen (scripts/generate-all-videos.py).ios/App (submission marzo 2026).