Strand Hudpleie
Nettsted og adminpanel for en hudpleieklinikk i Tønsberg, som erstatning for WordPress og WooCommerce. Adminpanelet er der klinikken faktisk driftes fra.

Strand Hudpleie & Velvære er en hudpleieklinikk i Tønsberg sentrum. Nettstedet deres kjørte på WordPress med WooCommerce for gavekort, og som mange slike oppsett var det både mer enn de trengte og mindre enn de ville ha. Jeg bygde nettsted og adminpanel på nytt, og adminpanelet er der klinikken faktisk driftes fra.
Det personalet gjør selv
- Behandler henvendelser og gavekortbestillinger i en statusflyt med definerte overganger og optimistisk lås, slik at to ansatte ikke overskriver hverandre
- Justerer hele prislisten i ett skjema, med prosentjustering per kategori som må godkjennes i et eget steg før den lagres
- Publiserer kampanjer med tidsvindu og rabatt per behandling. Laveste pris vinner, og den beregnes i databasen, ikke i grensesnittet
- Kjører gjenbesøksrunder mot kunder systemet har regnet ut burde komme tilbake, basert på kundens egen besøksrytme
- Retter teksten på alle de offentlige sidene direkte i nettleseren, med feltlås, versjonshistorikk og ett klikk tilbake
Det tekniske
Teksten er kode, ikke database. JSON-filer i repoet er fasit, og databasen er mellomlager. En nattlig jobb skriver rettelsene personalet har gjort tilbake til repoet som en pull request, og oppryddingen skjer først når endringen er bekreftet å kjøre i produksjon. Klinikken kan redigere fritt, mens innholdet fortsatt versjoneres sammen med koden. En byggeport feiler dersom tekst i grensesnittet ikke kommer fra en tekstfil.
Passordhvelv som krypteres og dekrypteres i nettleseren. Serveren ser aldri nøkkelen. Bygget på Web Crypto uten tredjeparts kryptobibliotek, med egne nøkkelområder per tilgangsnivå.
Webhook fra bookingsystemet logger rå payload før prosessering og kvitterer på alt den klarer å lagre, slik at leveransene ikke stopper ved våre egne feil. Feilede leveranser spilles av på nytt fra admin, og payload saneres for særlige kategorier personopplysninger før den logges.
Besøksstatistikk uten informasjonskapsler, økt-id, IP eller nettlesersignatur. Klinikken ser hva som blir lest, uten å samle inn noe om hvem som leser.
Tilgang håndheves i fire lag, med databasen som siste og avgjørende lag. Server actions i stedet for et REST-lag.
Stack
Next.js 16, React 19 og TypeScript, Tailwind CSS 4, selvhostet Supabase på PostgreSQL, TipTap for redigering, Resend for e-post, og Docker på Coolify.