ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
SprintMaths est une web app mobile-first de révision en mathématiques. Positionnement : Le programme de révision maths du Brevet au Bac. Promesse courte : des exercices guidés, un plan clair et une progression visible pour réviser efficacement. Le projet a été rebrandé vers SprintMaths le 2026-05-08 pour s'aligner avec le nouveau domaine https://www.sprintmaths.com. Le projet utilise Next.js 16, Tailwind CSS v4 et npm. Ouvrir http://localhost:3000 pour voir la landing page.檢視完整 README ↗
SprintMaths est une web app mobile-first de révision en mathématiques.
Positionnement : Le programme de révision maths du Brevet au Bac.
Promesse courte : des exercices guidés, un plan clair et une progression visible pour réviser efficacement.
Le projet a été rebrandé vers SprintMaths le 2026-05-08 pour s'aligner avec le nouveau domaine https://www.sprintmaths.com.
Le projet utilise Next.js 16, Tailwind CSS v4 et npm.
npm install
npm run dev
Ouvrir http://localhost:3000 pour voir la landing page.
Avant déploiement, lancer :
npm run build
Créer un fichier .env.local à la racine à partir de .env.local.example.
Voir aussi la checklist Vercel complète dans docs/deployment.md.
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
NEXT_PUBLIC_SITE_URL=https://www.sprintmaths.com
NEXT_PUBLIC_STRIPE_PAYMENT_LINK=
NEXT_PUBLIC_GTM_ID=
NEXT_PUBLIC_GA4_ID=
NEXT_PUBLIC_GOOGLE_ADS_ID=
NEXT_PUBLIC_META_PIXEL_ID=
NEXT_PUBLIC_TIKTOK_PIXEL_ID=
NEXT_PUBLIC_SNAP_PIXEL_ID=
NEXT_PUBLIC_TRACKING_MODE=
SUPABASE_SERVICE_ROLE_KEY=
STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET=
RESEND_API_KEY=
SPRINTMATHS_EMAIL_FROM="SprintMaths <[email protected]>"
[email protected]
SPRINTMATHS_ADMIN_PASSWORD=
SPRINTMATHS_DEV_ACCESS_CODE=
SPRINTMATHS_TEST_CUSTOMER_EMAIL=
RESEND_ACCESS_CODE_ON_DUPLICATE=false
# Legacy fallbacks temporaires, supportés par le code pendant la migration.
# MATHERIA_ADMIN_PASSWORD=
# MATHERIA_BETA_ACCESS_CODE=
Les nouvelles variables SPRINTMATHS_* sont prioritaires. Les variables MATHERIA_* restent supportées comme fallback legacy pour éviter de casser un environnement Vercel déjà configuré.
SUPABASE_SERVICE_ROLE_KEY est un secret serveur absolu : ne jamais le préfixer par NEXT_PUBLIC_.
Secrets serveur à ne jamais préfixer par NEXT_PUBLIC_ :
STRIPE_SECRET_KEYSTRIPE_WEBHOOK_SECRETRESEND_API_KEYSUPABASE_SERVICE_ROLE_KEYVariables à ajouter dans Vercel Production :
STRIPE_SECRET_KEYSTRIPE_WEBHOOK_SECRETRESEND_API_KEYSPRINTMATHS_EMAIL_FROMSPRINTMATHS_EMAIL_REPLY_TONEXT_PUBLIC_SITE_URLNEXT_PUBLIC_TRACKING_MODE=gtm-ready si le tracking marketing doit être actifNEXT_PUBLIC_GTM_ID=GTM-XXXXXXX avec l'ID du conteneur GTM SprintMathsLa marque, le domaine, l'email de contact, le titre SEO par défaut et les routes sitemap/noindex sont centralisés dans src/lib/site.ts.
Valeurs principales :
SITE_NAME: SprintMathsNEXT_PUBLIC_SITE_URL: https://www.sprintmaths.com[email protected]À faire côté registrar ou fournisseur mail : créer [email protected].
SprintMaths utilise Supabase pour les leads, les codes d'accès et les sessions.
Tables conservées :
leadsbeta_accessaccess_codespractice_sessionsNe pas renommer ces tables pour le rebranding.
Installer le schéma depuis supabase/schema.sql dans le SQL Editor Supabase.
Tunnel à vérifier avant publicité :
/bac-maths-2027 : cliquer sur un CTA planning et vérifier l'event
click_lead_magnet_planning./planning-revision-bac-maths : soumettre le formulaire./api/leads/planning : vérifier la réponse JSON, la sauvegarde Supabase
et le statut emailSent./planning-bac-maths-2027.html : vérifier que la version imprimable s'ouvre./diagnostic,
/planning-bac-maths-2027.html et /bac-maths-2027.Variables utiles en local :
NEXT_PUBLIC_SITE_URL=http://localhost:3000
NEXT_PUBLIC_TRACKING_MODE=internal
# Pour persister les leads dans Supabase :
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
# Pour envoyer réellement l'email. Si absent, l'API doit rester en succès
# avec emailSent=false et emailSkippedReason=resend_not_configured.
RESEND_API_KEY=
SPRINTMATHS_EMAIL_FROM="SprintMaths <[email protected]>"
[email protected]
Commandes curl locales, avec une adresse de test non personnelle :
curl -i http://localhost:3000/api/leads/planning \
-H "Content-Type: application/json" \
-d '{"email":"not-an-email","sourcePage":"/planning-revision-bac-maths"}'
curl -i http://localhost:3000/api/leads/planning \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","sourcePage":"/planning-revision-bac-maths","website":"bot"}'
curl -i http://localhost:3000/api/leads/planning \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","sourcePage":"/planning-revision-bac-maths"}'
Résultats attendus :
Entre une adresse email valide.success=true, saved=false,
emailSent=false.success=true; saved=true si Supabase est
configuré, sinon fallback local mocked=true en développement.emailSent=false,
emailSkippedReason=resend_not_configured.npm run dev réinitialise le store
mémoire en local.Debug tracking local :
localStorage.setItem("sprintmaths_tracking_debug", "[]")
window.dataLayer = []
Avec NEXT_PUBLIC_TRACKING_MODE=internal, cliquer sur les CTA et soumettre le
formulaire, puis vérifier :
window.dataLayer.map((event) => event.event)
JSON.parse(localStorage.getItem("sprintmaths_tracking_debug") || "[]")
window.dataLayer.some((event) => JSON.stringify(event).includes("@"))
La dernière expression doit retourner false : aucun email ne doit partir dans
dataLayer ou l'historique debug.
Procédure Vercel Preview :
NEXT_PUBLIC_./bac-maths-2027,
/planning-revision-bac-maths et /planning-bac-maths-2027.html.http://localhost:3000 par
l'URL Preview.leads avec une
source planning_bac_maths_2027:/planning-revision-bac-maths.click_lead_magnet_planning, lead_magnet_request et email_optin.Le tunnel Stripe reste volontairement simple : Payment Link Stripe, sans Checkout custom.
Le webhook checkout.session.completed automatise la génération du code d'accès
et l'envoi email.
Checklist Payment Link :
SprintMaths - Pack Révision Express.39 € en paiement unique.NEXT_PUBLIC_STRIPE_PAYMENT_LINK.https://www.sprintmaths.com/merci.BAC2026 et les codes promotionnels sur le
Payment Link courant tant qu’aucune promotion n’est décidée.https://www.sprintmaths.com/api/stripe/webhook.checkout.session.completed.STRIPE_WEBHOOK_SECRET.STRIPE_SECRET_KEY.sprintmaths.com.RESEND_API_KEY dans Vercel.SPRINTMATHS_EMAIL_FROM="SprintMaths <[email protected]>".[email protected].Ne pas utiliser l'email OVH SMTP pour l'envoi applicatif. OVH peut servir à
recevoir [email protected] si configuré, mais les emails transactionnels
partent via Resend.
Flux automatique :
/api/stripe/webhook.STRIPE_WEBHOOK_SECRET.MATH-XXXX est créé dans access_codes.stripe_session_id empêche une double génération lors des retries Stripe./merci./connexion.Les codes MATH-XXXX sont conservés pour simplicité et cohérence maths.
/admin/codes reste disponible pour générer un code manuel, dépanner un client
ou vérifier les derniers codes créés.
Objet : Votre accès au Pack Révision Express SprintMaths
Corps :
Bonjour,
Merci pour votre achat du Pack Révision Express Bac Maths 2027.
Voici votre code d'accès personnel :
[CODE_UNIQUE]
1) Pour créer l'espace élève et accéder au pack :
https://www.sprintmaths.com/merci
2) Si vous avez déjà créé l'espace :
https://www.sprintmaths.com/connexion
Ce code est personnel et utilisable une seule fois pour créer l'espace élève.
Le pack est une web app accessible depuis un navigateur sur téléphone, tablette et ordinateur.
Besoin d'aide ? Écrivez à [email protected].
À bientôt,
L'équipe SprintMaths
L'email ne contient aucune donnée élève et aucun pixel de tracking.
Installer Stripe CLI si besoin, puis lancer :
stripe listen --forward-to localhost:3000/api/stripe/webhook
Copier le webhook signing secret local dans .env.local :
STRIPE_WEBHOOK_SECRET=whsec_...
Lancer l'application :
npm run dev
Déclencher un événement test :
stripe trigger checkout.session.completed
L'event généré par Stripe CLI peut ne pas contenir un email réaliste. En
développement uniquement, renseigner SPRINTMATHS_TEST_CUSTOMER_EMAIL pour
tester le flux complet d'insertion et d'envoi email.
Pages publiques indexables :
//diagnostic/bac-terminale-maths/bac-premiere-maths/brevet-maths/programme-maths-terminale/programme-maths-premiere/programme-maths-brevet/methodes-maths-terminale/exercices-maths-terminale/articles/articles/[slug]/mentions-legales/cgv/politique-confidentialite/preferences-confidentialite/remboursementLe sitemap est généré par src/app/sitemap.ts et utilise absoluteUrl() depuis la config centrale.
src/app/robots.ts déclare /sitemap.xml, autorise les pages publiques et désautorise notamment /app/*, /admin/* et /api/*.
Pages privées ou transactionnelles noindex :
/app/*/admin/*/merci/connexion/acces/diagnostic/resultatLes JSON-LD principaux sont dans src/lib/seo.ts et utilisent SprintMaths pour Organization, WebSite, Product, FAQ et breadcrumbs.
Le tracking est désactivé par défaut. Si NEXT_PUBLIC_TRACKING_MODE est absent,
vide ou différent des valeurs autorisées, src/lib/tracking.ts retourne off :
aucun event n'est poussé dans window.dataLayer et aucun historique debug local
n'est écrit.
Variables d'environnement :
NEXT_PUBLIC_TRACKING_MODE: mode global du helper tracking.NEXT_PUBLIC_GTM_ID: conteneur Google Tag Manager chargé en mode gtm-ready
ou ads-ready.NEXT_PUBLIC_GA4_ID: présent dans les exemples d'environnement, mais non lu
par le code aujourd'hui.NEXT_PUBLIC_GOOGLE_ADS_ID, NEXT_PUBLIC_META_PIXEL_ID,
NEXT_PUBLIC_TIKTOK_PIXEL_ID, NEXT_PUBLIC_SNAP_PIXEL_ID: réservés aux
pixels directs en mode ads-ready; les scripts fournisseurs ne sont pas
chargés par le code actuel.Exemple local ou Vercel Production pour activer le tracking GTM :
NEXT_PUBLIC_TRACKING_MODE=gtm-ready
NEXT_PUBLIC_GTM_ID=GTM-XXXXXXX
Valeurs possibles de NEXT_PUBLIC_TRACKING_MODE :
off: no-op complet.internal: events poussés dans window.dataLayer et debug local seulement ;
aucun provider externe n'est chargé.gtm-ready: events dataLayer plus chargement de GTM si NEXT_PUBLIC_GTM_ID
est défini.ads-ready: base gtm-ready plus helpers pixels directs disponibles, mais
seulement si les scripts pixels sont chargés ailleurs.Providers actuellement branchés :
gtag.js initialisé par
NEXT_PUBLIC_GA4_ID.console.info.src/components/tracking/GoogleTagManager.tsx avec
NEXT_PUBLIC_TRACKING_MODE=gtm-ready et NEXT_PUBLIC_GTM_ID.À mettre dans Vercel avant publicité :
NEXT_PUBLIC_TRACKING_MODE=gtm-ready
NEXT_PUBLIC_GTM_ID=GTM-XXXXXXX
Le conteneur GTM doit ensuite publier les tags GA4/Ads et les triggers basés sur
les events dataLayer. Sans conteneur GTM publié, les events client existent
localement mais ne sont pas envoyés à un outil analytics externe.
Vérifier en local :
.env.local.npm run dev, car les variables NEXT_PUBLIC_* sont injectées au
build/dev server.window.dataLayer
localStorage.getItem("sprintmaths_tracking_debug")
NEXT_PUBLIC_GTM_ID est configuré, vérifier aussi dans le preview
Google Tag Manager que les events arrivent.Vérifier en production :
NEXT_PUBLIC_TRACKING_MODE=gtm-ready et
NEXT_PUBLIC_GTM_ID=GTM-XXXXXXX.NEXT_PUBLIC_* sont figées dans le bundle client
au moment du build.https://www.sprintmaths.com, vérifier que window.dataLayer
contient gtm.js puis les events SprintMaths après interaction.Events réellement émis côté client aujourd'hui :
page_viewclick_diagnosticclick_exercisesclick_offerstripe_clickdiagnostic_startdiagnostic_completeclick_lead_magnet_planninglead_magnet_requestemail_optinaccount_createdsprintmaths_view_offerurgency_banner_clickclick_bac2027_diagnosticclick_bac2027_exercisesclick_bac2027_offerclick_bac2027_stripeclick_planning_diagnosticclick_planning_typebacclick_planning_subjectsclick_planning_offerclick_typebac_offerclick_typebac_subjects_pageclick_subjects_typebac_startclick_subjects_typebac_planningclick_subjects_typebac_diagnosticclick_subjects_typebac_offerclick_subjects_cluster_exerciseclick_internal_subjects_typebacguarantee_viewfaq_expandEvents J10 et zones attendues :
click_subjects_typebac_start,
click_subjects_typebac_planning, click_subjects_typebac_diagnostic,
click_subjects_typebac_offer, click_subjects_cluster_exercise.click_planning_diagnostic, click_planning_typebac,
click_planning_subjects, click_planning_offer.click_typebac_subjects_page.click_internal_subjects_typebac.Les properties attendues restent marketing et non personnelles :
source_page, destination_page, level, intent, cta_location, avec
selon le CTA cluster, lead_magnet, offer, price et currency.
Events disponibles dans le type mais non émis côté client aujourd'hui :
lead_magnet_downloadfree_exercise_startfree_exercise_completepurchaseaccess_code_createdfirst_session_startsession_completerefund_requestsprintmaths_page_viewsprintmaths_diagnostic_startedsprintmaths_diagnostic_completedsprintmaths_leadsprintmaths_initiate_checkoutsprintmaths_complete_registrationbac2026_primary_cta_clickbac2026_secondary_cta_clickpricing_cta_clickLogs serveur non sensibles :
purchase: loggé dans /api/stripe/webhook après checkout.session.completed
payé.access_code_created: loggé quand un nouveau code est créé.access_code_email_sent: loggé quand Resend confirme l'envoi.Ne jamais envoyer dans analytics : email, code d'accès, pseudo, réponses aux
exercices, scores détaillés, notes indicatives /20, chapitres faibles,
historique pédagogique ou toute autre donnée personnelle. Les events client
actuels passent par sanitizeTrackingParams() et ne doivent rester composés que
de paramètres marketing non sensibles.
Toute mesure d'achat doit rester liée à une preuve serveur fiable du paiement
Stripe. Le client ne déclenche pas d'event purchase.
Les clés localStorage ont été migrées vers le préfixe sprintmaths_*.
Clés principales :
sprintmaths_student_profilesprintmaths_session_historysprintmaths_guided_exercise_historysprintmaths_bac_mock_exam_historysprintmaths_utm_contextsprintmaths_tracking_debugsprintmaths_tracking_preferencesprintmaths_cookie_consentLe helper src/lib/storageKeys.ts lit encore les anciennes clés legacy si une nouvelle clé n'existe pas, puis réécrit la valeur sous la clé SprintMaths.
Tests utiles dans la console navigateur :
localStorage.getItem("sprintmaths_utm_context")
localStorage.getItem("sprintmaths_tracking_debug")
localStorage.getItem("sprintmaths_student_profile")
Fonctionnalités principales :
/merci, /connexion, /acces./app./20.Limites assumées :
La procédure détaillée de configuration Preview/Production est documentée dans
docs/deployment.md.
Checklist Vercel :
www.sprintmaths.com au projet Vercel.NEXT_PUBLIC_SITE_URL=https://www.sprintmaths.com.STRIPE_SECRET_KEY.STRIPE_WEBHOOK_SECRET.RESEND_API_KEY.SPRINTMATHS_EMAIL_FROM="SprintMaths <[email protected]>".[email protected].SPRINTMATHS_ADMIN_PASSWORD.SPRINTMATHS_DEV_ACCESS_CODE seulement pour le développement si nécessaire.MATHERIA_* si l'environnement les utilise déjà.NEXT_PUBLIC_*./sitemap.xml et /robots.txt après déploiement.Les pages légales sont des modèles de travail à compléter avant toute vente réelle :
Elles ne remplacent pas une validation juridique, comptable ou conformité adaptée à la situation exacte de l'entreprise.