Plateforme et application installable (PWA) d'un institut d'épilation laser durable en Allemagne : zones et tarifs, offres, FAQ, avant/après, réservation intégrée via Beautinda, contenus gérés dans Sanity et ambiance 3D en verre.
Next.jsTailwind CSSSanityThree.jsPWA
Livraison fin octobre 2026
/SERVICES
Sites & plateformes web
Sites et applications sur mesure avec Next.js, React, TypeScript et Tailwind CSS : rapides, bien référencés, installables en PWA quand c'est utile.
CMS & back-end
Contenus gérables sans développeur avec Strapi, Sanity ou Supabase, API REST, espaces membres avec authentification, e-mails automatiques et documents PDF.
GET /api/projects
200 OK · 42 ms
{
"title": "Zielscheibe",
"status": "live",
"cms": "Strapi 5"
}
Identité & UI/UX
Identité visuelle, maquettes UI/UX et guides graphiques, puis supports marketing : flyers, brochures et visuels pour les réseaux sociaux.
AaStyle guide
Multilingue & accessible
Sites jusqu'à 7 langues, dont l'arabe avec lecture de droite à gauche, pensés pour tous les publics et tous les écrans.
ENHello
FRBonjour
DEHallo
ARمرحبا
Infrastructure & mise en ligne
Conteneurs Docker, serveurs Linux, intégration continue, protection anti-spam et en-têtes de sécurité, déploiement sur Vercel, Netlify ou Railway.
❯ docker compose up -d
✔ web · running
✔ db · healthy
✔ proxy · running
❯ git push (deploy)
/E-MAILS
Les e-mails de confirmation envoyés par mon formulaire de contact, conçus et codés à la main : tableaux, styles en ligne, animations CSS et version texte. Voyez l'aperçu, puis lisez le vrai code.
Une carte claire : un logo pixel dont le >_ se tape tout seul, une apparition progressive, le récapitulatif de la demande et une chronologie numérotée.
Code
functions/_lib/email/classic/index.ts
1importtype{ValidContact}from"../../../../lib/contact/schema";2import{ profile }from"../../../../data/profile";3import{ escapeHtml as h }from"../escape";4importtype{Mail}from"../notification";5import{ createContext }from"../shared/context";6import{ footer, header, hero, nextSteps, recap, recapItems, signature }from"./sections";7import{STYLE}from"./style";89/**10 * E-mail de confirmation « classique » : une carte claire. Envoyé au visiteur dans la langue choisie sur le site11 * (en, fr ou de). Mise en page en tableaux et styles en ligne pour tous les clients ; animations CSS pour ceux12 * qui les gèrent.13 */14exportfunctionclassicConfirmationMail(data:ValidContact, siteUrl?: string, logoSrc?: string):Mail{15const ctx =createContext(data, siteUrl, logoSrc);16const{ c, kind, firstName, workUrl }= ctx;1718const html =`<!doctype html>19<html lang="${data.locale}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="color-scheme" content="light"><title>${h(c.subject[kind])}</title><style>${STYLE}</style></head>20<body style="margin:0;padding:0;background:#ececea">21<div style="display:none;max-height:0;overflow:hidden;opacity:0;color:transparent">${h(c.preheader[kind])} ͏ ͏ ͏</div>22<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" bgcolor="#ececea"><tr><td align="center" style="padding:28px 12px">23<table role="presentation" width="600" cellspacing="0" cellpadding="0" border="0" style="width:100%;max-width:600px;border-radius:18px;overflow:hidden;background:#ffffff;box-shadow:0 30px 70px -30px rgba(0,0,0,.35)">2425${header(ctx)}2627${hero(ctx)}2829${recap(ctx)}3031${nextSteps(ctx)}3233${signature(ctx)}3435</table>36${footer(ctx)}37</td></tr></table>38</body></html>`;3940const items =recapItems(ctx);41const text =[42 c.title.replace("{name}", firstName),43"",44 c.lead[kind],45"",46...(items.length ?[c.recap.title.toUpperCase(),...items.map((r)=>`${r.label}: ${r.value}`),""]:[]),47 c.nextTitle.toUpperCase(),48...c.steps[kind].map((s, i)=>`${i + 1}. ${s}`),49...(workUrl ?["",`${c.cta}: ${workUrl}`]:[]),50"",51 c.signature,52`${profile.fullName}, ${c.role}`,53"",54 c.footer,55].join("\n");5657return{ subject: c.subject[kind], text, html };58}59
Aperçu
C'est le vrai e-mail envoyé par le formulaire, avec des données d'exemple, dans la langue de la page. Les animations jouent dans Apple Mail et iOS Mail ; Gmail, Yahoo et Outlook affichent le même e-mail sans mouvement. Les vrais fichiers source du dépôt, découpés par rôle (gabarit, sections, styles, thème) : le même code construit l'aperçu ci-dessus et l'e-mail envoyé aux visiteurs. Le style se choisit avec une seule variable, CONFIRMATION_STYLE.
Profil
/PROFIL
Développeur full-stack avec une solide base en réseaux et télécommunications. Je conçois des plateformes web modernes (Next.js, React, TypeScript), je mets en place l'infrastructure qui les fait tourner et j'applique les technologies actuelles sur de vrais projets, du CMS à l'interface.
Front-end
Next.js
React
TypeScript
Tailwind CSS
Design responsive
UX / UI design
Back-end & CMS
Strapi
Supabase
Sanity
PostgreSQL
API REST
SEO (bases)
Infrastructure & réseaux
Docker
Portainer
Linux (Kali)
SSH · Tailscale
CI/CD
Réseaux & sécurité IT
Fibre optique
Développement natif IA
Codage agentique
Développement assisté par IA
Workflows natifs IA
Intégration de LLM (Groq, OpenAI)
Transmission & langues
Pédagogie
Création de supports
Français (natif)
Allemand (C1)
Anglais (B1)
Homelab
Cluster personnel (ZimaBoard, Raspberry Pi) pour héberger mes propres services, géré avec Docker et Portainer et des pipelines CI/CD automatisés.
Un projet en tête ?
Ensemble, on peut créer quelque chose de clair et d'impactant. Réserve un créneau ou écris-moi : on en parle autour d'un café (virtuel).
❯ write --to castoleBerlin --:--
Salut, c'est Castole ! Dis-moi ce que tu as en tête : je lis chaque message moi-même.