ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Toutes les formations montagne du Club Alpin Français. Inscription facile et alertes personnalisées.
Translation pending
EducationTypeScript · HTMLGitHub @ffcam-auraOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
🏔️ Trouvez facilement votre prochaine formation montagne FFCAM : recherche avancée, filtres et notifications pour toutes les formations en France
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Application web pour afficher et filtrer les formations du FFCAM (Fédération Française des Clubs Alpins et de Montagne). Cet outil a été construit par des développeurs bénévoles du Comité Régional Auvergne Rhone-Alpes.Read the full README ↗
Application web pour afficher et filtrer les formations du FFCAM (Fédération Française des Clubs Alpins et de Montagne). Cet outil a été construit par des développeurs bénévoles du Comité Régional Auvergne Rhone-Alpes.
Production : https://formations.ffcam-aura.fr
┌─────────────────────────────────────────────────────────────────────────────┐
│ SOURCES DE DONNÉES │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Site FFCAM │ │ Clerk │ │
│ │ (formations.html)│ │ (Authentification)│ │
│ └────────┬─────────┘ └────────┬─────────┘ │
│ │ │ │
└─────────────┼────────────────────────────┼──────────────────────────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ NEXT.JS APPLICATION │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ CRON JOBS (Vercel) │ │
│ │ ┌─────────────────────┐ ┌──────────────────────────────────┐ │ │
│ │ │ /api/sync (4h UTC) │ │ /api/notifications/send (6h UTC)│ │ │
│ │ │ │ │ │ │ │
│ │ │ • Scrape FFCAM │ │ • Trouve nouvelles formations │ │ │
│ │ │ • Parse HTML │ │ • Match préférences users │ │ │
│ │ │ • Upsert DB │ │ • Envoie emails │ │ │
│ │ │ • Ping healthcheck │ │ • Ping healthcheck email │ │ │
│ │ └─────────────────────┘ └──────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ API ROUTES │ │
│ │ ┌──────────────────┐ ┌────────────────┐ ┌────────────────────┐ │ │
│ │ │ GET /formations │ │ GET/POST /users│ │ GET /sync/last │ │ │
│ │ │ (rate limited) │ │ (auth Clerk) │ │ │ │ │
│ │ └──────────────────┘ └────────────────┘ └────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ SERVICES │ │
│ │ ┌────────────────┐ ┌─────────────────┐ ┌────────────────────────┐ │ │
│ │ │ SyncService │ │ FormationService│ │ NotificationService │ │ │
│ │ │ • synchronize │ │ • upsert │ │ • notifyBatchFormations│ │ │
│ │ │ • pingHealth │ │ • getRecent │ │ • matchPreferences │ │ │
│ │ │ • sendReport │ │ • getAll │ │ │ │ │
│ │ └────────────────┘ └─────────────────┘ └────────────────────────┘ │ │
│ │ ┌────────────────┐ ┌─────────────────┐ │ │
│ │ │ EmailService │ │ UserService │ │ │
│ │ │ • sendEmail │ │ • getPreferences│ │ │
│ │ │ (via SMTP) │ │ • updatePrefs │ │ │
│ │ └────────────────┘ └─────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ REPOSITORIES │ │
│ │ ┌──────────────────────┐ ┌──────────────────┐ │ │
│ │ │ FormationRepository │ │ UserRepository │ │ │
│ │ │ • upsertFormations │ │ • findPreferences│ │ │
│ │ │ • findAll │ │ • upsertPrefs │ │ │
│ │ │ • findRecent │ │ • findUsersToNotify│ │ │
│ │ └──────────────────────┘ └──────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────┬──────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ INFRASTRUCTURE │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────────────┐ │
│ │ PostgreSQL │ │ Brevo │ │ Healthchecks.io │ │
│ │ (Neon DB) │ │ (SMTP Email) │ │ (Monitoring) │ │
│ │ │ │ │ │ │ │
│ │ • formations │ │ • Notifications │ │ • Ping sync status │ │
│ │ • disciplines │ │ • Error reports │ │ • Email delivery check │ │
│ │ • user_prefs │ │ • Healthchecks │ │ • Dead man's switch │ │
│ │ • lieux │ │ │ │ │ │
│ └──────────────────┘ └──────────────────┘ └────────────────────────┘ │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Sentry │ │ Vercel Analytics │ │
│ │ (Errors) │ │ (Usage stats) │ │
│ └──────────────────┘ └──────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
| Catégorie | Technologies |
|---|---|
| Framework | Next.js 15, React 19, TypeScript |
| Base de données | PostgreSQL (Neon) + Prisma ORM |
| Authentification | Clerk |
| UI | Tailwind CSS, Radix UI |
| Nodemailer + Brevo SMTP | |
| Monitoring | Sentry, Healthchecks.io, Vercel Analytics |
| Secrets | Keyway |
| Tests | Vitest, React Testing Library, Playwright (e2e) |
L'application utilise plusieurs systèmes de monitoring :
Sync healthcheck : Ping quotidien après synchronisation
Email healthcheck : Email quotidien pour vérifier la délivrabilité
@hc-ping.com qui attend un email régulier| Événement | Destinataire | Contenu |
|---|---|---|
| Erreur critique sync | Admin | Stack trace + état avant erreur |
| Erreurs partielles sync | Admin | Liste des formations en échec |
| Nouvelle formation | Utilisateurs | Formations matchant leurs préférences |
Les secrets de ce projet sont gérés via Keyway, qui synchronise automatiquement les variables d'environnement avec Vercel. Cela permet de :
.env par Slack ou email# Base de données
POSTGRES_URL="postgresql://..."
POSTGRES_URL_NON_POOLING="postgresql://..."
# Authentification Clerk
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY="pk_..."
CLERK_SECRET_KEY="sk_..."
# Email (Brevo SMTP)
SMTP_HOST="smtp-relay.brevo.com"
SMTP_PORT="587"
SMTP_USER="..."
SMTP_PASSWORD="..."
EMAIL_FROM="noreply@xxxxx"
EMAIL_SENDER_NAME="FFCAM Formations"
SYNC_NOTIFICATION_EMAIL="admin@xxxxx"
# Sécurité CRON (minimum 32 caractères)
CRON_SECRET="your-very-long-secret-at-least-32-chars"
# Monitoring (optionnel)
HEALTHCHECK_SYNC_URL="https://hc-ping.com/your-uuid"
HEALTHCHECK_NOTIFICATIONS_EMAIL="[email protected]"
nvm use lit .nvmrc)# Cloner le projet
git clone [email protected]:ffcam-aura/ffcam-formations.git
cd ffcam-formations
# Installer les dépendances
pnpm install
# Configurer les variables d'environnement
cp .env.example .env.local
# Éditer .env.local avec vos valeurs
# Lancer la base de données (optionnel, si Docker)
docker run --name ffcam-postgres \
-e POSTGRES_DB=ffcam_formations \
-e POSTGRES_USER=ffcam_user \
-e POSTGRES_PASSWORD=ffcam_password \
-p 5432:5432 \
-d postgres:15-alpine
# Appliquer les migrations
pnpm prisma migrate dev
# Lancer le serveur de développement
pnpm dev
pnpm dev # Serveur de développement
pnpm build # Build production
pnpm test # Tests unitaires
pnpm test:watch # Tests en mode watch
pnpm test:coverage # Couverture de tests
pnpm lint # Linting
pnpm prisma studio # Interface graphique DB
Les tests e2e vérifient que les pages publiques chargent correctement. Ils ne sont pas exécutés en CI (trop lents) mais doivent être lancés manuellement avant une release importante.
pnpm test:e2e # Lancer les tests e2e (headless)
pnpm test:e2e:headed # Lancer avec navigateur visible
pnpm test:e2e:ui # Interface Playwright interactive
Note : Les tests e2e nécessitent que le serveur de développement soit démarré (Playwright le lance automatiquement).
Husky vérifie automatiquement avant chaque push :
pnpm lint - Lintingpnpm build - Build sans erreurs| Endpoint | Description | Rate Limit |
|---|---|---|
GET /api/formations | Liste des formations | 60 req/min |
GET /api/sync/last | Date dernière sync | - |
# Synchronisation manuelle
curl -X GET "https://formations.ffcam-aura.fr/api/sync" \
-H "Authorization: Bearer YOUR_CRON_SECRET"
# Envoi notifications
curl -X GET "https://formations.ffcam-aura.fr/api/notifications/send" \
-H "Authorization: Bearer YOUR_CRON_SECRET"
| Endpoint | Méthode | Description |
|---|---|---|
/api/users | GET | Récupérer préférences |
/api/users | POST | Mettre à jour préférences |
Corps de la requête POST :
{
"disciplines": ["Alpinisme", "Escalade"]
}
L'application est déployée automatiquement sur Vercel à chaque push sur main.
Configurés dans vercel.json :
| Job | Schedule | Description |
|---|---|---|
/api/sync | 4h UTC | Synchronisation FFCAM |
/api/notifications/send | 6h UTC | Envoi notifications |
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)Ce projet est sous licence MIT License.