Skip to content

Sécurité renforcée + nouvelles fonctionnalités (articles liés, vues, design, outillage)#3

Open
envindavsorg wants to merge 6 commits into
masterfrom
claude/security-fixes-features-53r83q
Open

Sécurité renforcée + nouvelles fonctionnalités (articles liés, vues, design, outillage)#3
envindavsorg wants to merge 6 commits into
masterfrom
claude/security-fixes-features-53r83q

Conversation

@envindavsorg

@envindavsorg envindavsorg commented Jun 9, 2026

Copy link
Copy Markdown
Owner

🔒 Sécurité

  • Rate limiting sur l'action d'envoi de CV (3/10 min par IP + plafond global 20/h) — bloque le spam d'e-mails via l'action serveur publique. Limiteur réutilisable dans src/lib/rate-limit.ts (testé unitairement).
  • Messages d'erreur serveur masqués par défaut dans le client next-safe-action (seuls les messages ActionError sont exposés).
  • Schéma e-mail durci : prénom trim + caractères autorisés, e-mail max 254 caractères.
  • Route /api/og durcie : titre/description bornés (120/280) et nettoyés des caractères de contrôle.
  • Headers de sécurité : HSTS (preload), CSP conservatrice (frame-ancestors 'none', object-src 'none', base-uri 'self', form-action 'self'), COOP, X-DNS-Prefetch-Control.
  • /.well-known/security.txt (RFC 9116).
  • Lecture des variables d'env via src/env.ts partout (octokit, actions GitHub).

✨ Fonctionnalités

  • Articles liés « à lire ensuite » en bas des articles/composants/outils, classés par tags partagés puis par date (src/lib/related.ts, testé), FR + EN.
  • Barre de progression de lecture en haut des pages de contenu (Motion).
  • /resume.json : CV machine-readable au format JSON Resume, référencé dans /llms.txt.
  • Compteur de vues par contenu avec Vercel Blob (stats/views.json) : 1 vue par session, validation du slug contre le contenu réel, rate limiting par IP, masqué proprement sans BLOB_READ_WRITE_TOKEN.

🎨 Design

  • Bouton « retour en haut » flottant animé après 600px de scroll (icône ChevronUp animée, FR + EN).
  • Easter egg Konami ↑↑↓↓←→←→BA : confettis + toast + son — dans l'esprit pixel/rétro du site.

🛠️ Outillage dev (Next.js Weekly)

  • rsc-boundary : visualisation des frontières RSC/client en dev (rend uniquement children en prod).
  • nextmap : pnpm routes:map ouvre une carte interactive des routes.

✅ Validation

  • 25 tests unitaires verts (dont les nouveaux : rate limiter, contenus liés)
  • pnpm types et pnpm lint au vert, compilation prod OK
  • Interactions vérifiées en navigateur (Playwright) : back-to-top, Konami, articles liés FR/EN, /resume.json

⚠️ Notes de déploiement

  • Les compteurs de vues nécessitent BLOB_READ_WRITE_TOKEN en prod (Vercel → Storage → Blob).
  • L'écriture des vues est non atomique (lecture-modification-écriture) : suffisant pour un portfolio, passer à Upstash Redis si besoin d'exactitude stricte.
  • Suggestion hors scope : versionner pnpm-lock.yaml (absent du repo) pour des builds reproductibles.

https://claude.ai/code/session_01SKa4Csg7HxNxwrt4knWE7r

…, security.txt

- Limitation de débit (par IP + globale) sur l'action d'envoi de CV pour
  bloquer le spam d'e-mails via l'action serveur publique
- Messages d'erreur serveur masqués par défaut (ActionError pour les
  messages sûrs) dans le client next-safe-action
- Schéma e-mail durci : prénom trim + caractères autorisés, e-mail max 254
- Route /api/og : titre/description bornés et nettoyés des caractères
  de contrôle (anti-abus de génération d'images)
- Nouveaux headers : HSTS, CSP (base-uri, frame-ancestors, object-src,
  form-action), COOP, X-DNS-Prefetch-Control
- /.well-known/security.txt (RFC 9116)
- Lecture des variables d'env via src/env.ts au lieu de process.env
  (octokit, data.action, commit.action)
- Tests unitaires du rate limiter

https://claude.ai/code/session_01SKa4Csg7HxNxwrt4knWE7r
@vercel

vercel Bot commented Jun 9, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cuzeacflorin-fr Ready Ready Preview, Comment Jun 9, 2026 8:53pm

…sume.json

- WritingsRelated : suggestions « à lire ensuite » en bas des articles,
  composants et outils, classées par tags partagés puis par date
  (lib getRelatedContent testée unitairement), FR + EN
- WritingsProgress : barre de progression de lecture en haut des pages
  de contenu (motion, useScroll + useSpring)
- /resume.json : CV machine-readable au format JSON Resume, référencé
  dans /llms.txt

https://claude.ai/code/session_01SKa4Csg7HxNxwrt4knWE7r
@envindavsorg

envindavsorg commented Jun 9, 2026

Copy link
Copy Markdown
Owner Author

- Action serveur trackViewAction : compte les vues par article,
  composant et outil dans un blob JSON (stats/views.json), avec
  validation du slug contre le contenu existant, rate limiting par IP
  et désactivation propre si BLOB_READ_WRITE_TOKEN est absent
- Composant WritingsViews : affiche « x vues » à côté du titre,
  une seule vue comptée par session de navigation (sessionStorage),
  masqué tant que le compteur n'est pas disponible
- ArticleTitle accepte des children et WritingsHeading un slot meta
  pour accueillir le compteur, FR + EN

https://claude.ai/code/session_01SKa4Csg7HxNxwrt4knWE7r
- rsc-boundary : visualisation des frontières RSC/composants client
  en dev (pill flottant), branché dans RootDocument — rend uniquement
  children en production
- nextmap : carte interactive des routes via pnpm routes:map
- Documentation du nouveau script dans CLAUDE.md

https://claude.ai/code/session_01SKa4Csg7HxNxwrt4knWE7r
- BackToTop : bouton flottant animé (Motion) qui apparaît après 600px
  de scroll et remonte la page en douceur, icône ChevronUp animée,
  monté dans le layout du site (FR + EN)
- KonamiConfetti : le code Konami (↑↑↓↓←→←→BA) déclenche une pluie de
  confettis, un toast et un son — vérifié en navigateur via Playwright

https://claude.ai/code/session_01SKa4Csg7HxNxwrt4knWE7r
@envindavsorg envindavsorg changed the title Renforcement de la sécurité : rate limiting, durcissement OG, headers, security.txt Sécurité renforcée + nouvelles fonctionnalités (articles liés, vues, design, outillage) Jun 9, 2026
Le workflow Labeler (pull_request_target) échouait sur chaque PR car
son fichier de configuration n'existait pas. Labels par chemins
modifiés : documentation, content, components, actions, routes,
tests, dependencies, ci.

https://claude.ai/code/session_01SKa4Csg7HxNxwrt4knWE7r
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants