Plattform und installierbare App (PWA) für ein Studio für dauerhafte Laser-Haarentfernung in Deutschland: Behandlungszonen und Preise, Angebote, FAQ, Vorher/Nachher, integrierte Buchung über Beautinda, Inhalte in Sanity und eine 3D-Glas-Atmosphäre.
Next.jsTailwind CSSSanityThree.jsPWA
Lieferung Ende Oktober 2026
Referenz
/REFERENZ
Was die Menschen, für die ich baue, über die Zusammenarbeit sagen.
”
„Herr Agossou entwickelte für uns nicht lediglich eine gewöhnliche Website auf Grundlage einer gekauften Standardvorlage. Vielmehr programmierte und gestaltete er eine vollständig individuelle, technisch anspruchsvolle und exakt auf unsere betrieblichen Anforderungen zugeschnittene Weblösung.“
/LEISTUNGEN
Websites & Plattformen
Maßgeschneiderte Websites und Anwendungen mit Next.js, React, TypeScript und Tailwind CSS: schnell, gut auffindbar und bei Bedarf als PWA installierbar.
CMS & Back-End
Inhalte ohne Entwickler pflegbar mit Strapi, Sanity oder Supabase, REST-APIs, Mitgliederbereiche mit Authentifizierung, automatische E-Mails und PDF-Dokumente.
GET /api/projects
200 OK · 42 ms
{
"title": "Zielscheibe",
"status": "live",
"cms": "Strapi 5"
}
Identität & UI/UX
Visuelle Identität, UI/UX-Entwürfe und Styleguides, dazu Marketingmaterial: Flyer, Broschüren und Social-Media-Visuals.
AaStyle guide
Mehrsprachig & barrierefrei
Websites in bis zu 7 Sprachen, auch Arabisch von rechts nach links, gestaltet für jedes Publikum und jeden Bildschirm.
ENHello
FRBonjour
DEHallo
ARمرحبا
Infrastruktur & Deployment
Docker-Container, Linux-Server, Continuous Integration, Spam-Schutz und Sicherheits-Header, Deployment auf Vercel, Netlify oder Railway.
❯ docker compose up -d
✔ web · running
✔ db · healthy
✔ proxy · running
❯ git push (deploy)
/E-MAILS
Die Bestätigungs-E-Mails meines Kontaktformulars, von Hand gestaltet und programmiert: Tabellen, Inline-Styles, CSS-Animationen und eine Nur-Text-Version. Erst die Vorschau, dann der echte Code.
Eine helle Karte: ein Pixel-Logo, dessen >_ sich selbst tippt, ein gestaffeltes Einblenden, die Zusammenfassung der Anfrage und eine nummerierte Zeitleiste.
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 * Die „klassische“ Bestätigungs-E-Mail: eine helle Karte. Sie geht an den Besucher in der auf der11 * Website gewählten Sprache (en, fr oder de). Layout mit Tabellen und Inline-Stilen für alle12 * Clients; CSS-Animationen für die Clients, die sie unterstützen.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
Vorschau
Das ist die echte E-Mail, die das Formular sendet, mit Beispieldaten, in der Sprache der Seite. Animationen laufen in Apple Mail und iOS Mail; Gmail, Yahoo und Outlook zeigen dieselbe E-Mail ohne Bewegung. Die echten Quelldateien aus dem Repository, nach Aufgaben getrennt (Vorlage, Abschnitte, Styles, Theme): derselbe Code erzeugt die Vorschau oben und die E-Mail an die Besucher. Der Stil wird mit einer einzigen Variable gewählt, CONFIRMATION_STYLE.
Profil
/PROFIL
Full-Stack-Entwickler mit solidem Hintergrund in Netzwerk- und Telekommunikationstechnik. Ich entwickle moderne Webplattformen (Next.js, React, TypeScript), baue die Infrastruktur auf, auf der sie laufen, und wende aktuelle Technologien in echten Projekten an, vom CMS bis zur Oberfläche.
Frontend
Next.js
React
TypeScript
Tailwind CSS
Responsives Design
UX-/UI-Design
Backend & CMS
Strapi
Supabase
Sanity
PostgreSQL
REST-API
SEO (Grundlagen)
Infrastruktur & Netzwerke
Docker
Portainer
Linux (Kali)
SSH · Tailscale
CI/CD
Netzwerke & IT-Sicherheit
Glasfasertechnik
KI-natives Entwickeln
Agentisches Coding
KI-gestützte Entwicklung
KI-native Workflows
LLM-Integration (Groq, OpenAI)
Vermittlung & Sprachen
Didaktik
Lehrmaterial
Französisch (Muttersprache)
Deutsch (C1)
Englisch (B1)
Homelab
Eigener Cluster (ZimaBoard, Raspberry Pi) für selbst gehostete Dienste, verwaltet mit Docker und Portainer und automatisierten CI/CD-Pipelines.
Ein Projekt im Kopf?
Gemeinsam können wir etwas Klares und Wirkungsvolles schaffen. Buch einen Termin oder schreib mir: Wir sprechen bei einem (virtuellen) Kaffee darüber.
❯ write --to castoleBerlin --:--
Hallo, hier ist Castole! Erzähl mir, was du vorhast: Ich lese jede Nachricht selbst.