Platform and installable app (PWA) for a permanent laser hair-removal studio in Germany: treatment zones and prices, offers, FAQ, before/after, booking integrated via Beautinda, content managed in Sanity and a 3D glass atmosphere.
Next.jsTailwind CSSSanityThree.jsPWA
Delivery end of October 2026
/SERVICES
Websites & platforms
Custom sites and applications with Next.js, React, TypeScript and Tailwind CSS: fast, search-friendly and installable as a PWA when it helps.
CMS & back-end
Content you can manage without a developer with Strapi, Sanity or Supabase, REST APIs, member areas with authentication, automatic e-mails and PDF documents.
GET /api/projects
200 OK · 42 ms
{
"title": "Zielscheibe",
"status": "live",
"cms": "Strapi 5"
}
Identity & UI/UX
Visual identity, UI/UX mockups and style guides, then marketing material: flyers, brochures and social-media visuals.
AaStyle guide
Multilingual & accessible
Sites in up to 7 languages, including right-to-left Arabic, designed for every audience and every screen.
ENHello
FRBonjour
DEHallo
ARمرحبا
Infrastructure & deployment
Docker containers, Linux servers, continuous integration, anti-spam protection and security headers, deployment on Vercel, Netlify or Railway.
❯ docker compose up -d
✔ web · running
✔ db · healthy
✔ proxy · running
❯ git push (deploy)
/EMAILS
The confirmation e-mails sent by my contact form, designed and coded by hand: tables, inline styles, CSS animations and a plain-text version. Preview them, then read the real code.
A light card: a pixel logo whose >_ types itself, a staggered reveal, the request recap and a numbered timeline.
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 * “Classic” confirmation e-mail: a light card. Sent to the visitor in the language chosen on the11 * site (en, fr or de). Table layout and inline styles for every client; CSS animations for the12 * clients that support them.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
Preview
This is the real e-mail the form sends, with sample data, in the language of the page. Animations play in Apple Mail and iOS Mail; Gmail, Yahoo and Outlook show the same e-mail without motion. The real source files of the repository, split by role (template, sections, styles, theme): the same code builds the preview above and the e-mail sent to visitors. The style is chosen with one variable, CONFIRMATION_STYLE.
Profile
/PROFILE
Full-stack developer with a solid background in networking and telecommunications. I build modern web platforms (Next.js, React, TypeScript), set up the infrastructure that runs them and apply current technologies to real projects, from the CMS to the interface.
Front-end
Next.js
React
TypeScript
Tailwind CSS
Responsive design
UX / UI design
Back-end & CMS
Strapi
Supabase
Sanity
PostgreSQL
REST API
SEO (basics)
Infrastructure & networks
Docker
Portainer
Linux (Kali)
SSH · Tailscale
CI/CD
Networks & IT security
Fiber optics
AI-native development
Agentic coding
AI-assisted development
AI-native workflows
LLM integration (Groq, OpenAI)
Teaching & languages
Pedagogy
Teaching materials
French (native)
German (C1)
English (B1)
Homelab
Personal cluster (ZimaBoard, Raspberry Pi) hosting my own services, managed with Docker and Portainer and automated CI/CD pipelines.
A project in mind?
Together we can create something clear and impactful. Book a slot or write to me: let's talk over a (virtual) coffee.
❯ write --to castoleBerlin --:--
Hi, I'm Castole! Tell me what you have in mind: I read every message myself.