ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
프랑스 시험 대비 미니 테스트·방법·연습문제·단원별 프로그램, 선택 옵션으로 고등학교 졸업시험 대비
Mini-test gratuit, méthodes, exercices ciblés et programme par chapitre pour préparer le brevet, le bac de Première et le bac Terminale, avec un pack d'entraînement Terminale en option.
교육TypeScript · JavaScriptGitHub @amokraneharrache-cloud온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.