← Zurück zu den Projekten
Nicht öffentlich

Cosmetra

SaaS-Plattform für Beauty- und Dienstleistungsstudios mit einem selbstgebauten CalDAV-Server für echte Kalendersynchronisation.

Cosmetra

Cosmetra bündelt Terminverwaltung, Kunden, Personal, Buchung und Finanzen für Beauty- und Dienstleistungsstudios in einer Plattform. Das Kernversprechen: Studios sehen ihre Termine dort, wo sie ohnehin schon arbeiten — im Apple-Kalender, in Thunderbird, in DAVx&sup5; — ohne ein separates Sync-Tool.

Dafür betreibt Cosmetra einen eigenen CalDAV-Server statt einer fertigen Bibliothek wie sabre/dav: schlank auf den tatsächlichen Funktionsumfang zugeschnitten und direkt in das eigene Workspace-/Token-Modell integriert.

Galerie

Case Study

Ausgangslage

Beauty- und Dienstleistungsstudios verwalten Termine oft in mehreren, unverbundenen Systemen. Cosmetra ist als Zwei-Personen-Vorhaben (Felix Schattenberg als technischer Umsetzer, ein Mitgründer für Produkt/Go-to-Market) angetreten, das mit echter Kalendersynchronisation zu lösen, statt Studios auf ein weiteres Insel-Tool zu verpflichten.

Herausforderung

Der CalDAV-Server ist mit rund 450 Zeilen eigenem Controller-Code kein triviales Anhängsel: Basic-Auth über eigene Tokens, PROPFIND/REPORT/GET/PUT/DELETE-Handling und manuelles iCal-Parsing und -Serialisieren (Zeilen-Unfolding, Property-/Parameter-Parsing, TZID-Handling, Escaping). Die PUT-Methode war ursprünglich ein Stub, der jeden eingehenden iCal-Payload ignorierte — externe Kalender-Clients konnten damit keine Termine anlegen oder ändern. Der Fix brauchte einen echten VEVENT-Parser, der DTSTART/DTEND/SUMMARY/DESCRIPTION/STATUS extrahiert und per updateOrCreate auf Termine mappt — und machte customer_id in der Termine-Tabelle nullable, weil CalDAV-Clients Termine ohne bekannten Kunden anlegen können.

Vorgehen

Laravel 13 mit PHP 8.5, Vue 3.5 und TypeScript über Inertia.js, shadcn/ui (reka-ui) auf Tailwind CSS 4, Pest für Tests. Mehrmandantenfähigkeit als Shared-Schema-Multi-Tenancy: jede Kernentität trägt eine workspace_id statt eine Datenbank pro Kunde zu betreiben. Auslieferung über GitHub Actions und Deployer mit atomarem Symlink-Swap, Queue-Worker über systemd.

Entscheidungen

Eigener CalDAV-Server statt sabre/dav

Schlanker, workspace- und staff-gescopter Funktionsumfang statt einer vollwertigen DAV-ACL-Bibliothek, direkt ins eigene Token-Modell integriert.

Eigenes Token-Modell statt Session/OAuth für CalDAV

Ein CaldavToken-Modell mit Workspace- oder Staff-Scope, pro Mitarbeiter einzeln einschränkbar.

Inertia statt getrennter SPA

Auth- und Deployment-Komplexität für ein Zwei-Gründer-MVP bewusst niedrig gehalten statt Backend und Frontend als getrennte Deployments zu betreiben.

Shared-Schema-Multi-Tenancy von Anfang an

Vermeidet spätere Table-Rewrites; jede Kernentität trägt eine workspace_id statt Schema-per-Tenant.

Geldbeträge als Integer in Minor Units

Rundungsfehler bei Beträgen ausgeschlossen; Zeit wird intern konsequent in UTC gehalten und erst zur Anzeige in die Workspace-Zeitzone konvertiert.

Eigenanteil

Technische Gesamtumsetzung: Datenmodell, CalDAV-Server, Vue/TypeScript-Frontend, Buchungs- und Finanzlogik, Deployment. Ein zweiter Mitgründer ist als Super-Admin registriert und für Produktseite verantwortlich — primär, aber nicht ausschließlich Einzelarbeit.

Ergebnisse

Kernmodule
9 laut Projektstand fertig: Dashboard, Kunden, Services, Termine, Kalender, Personal, Finanzen, Booking, CalDAV
Tests
220 Pest-Tests, u. a. dedizierte Auth-/Isolations-Tests für den CalDAV-Server
Status
Live im Betrieb, öffentliche Domain steht noch aus

Suche & Navigation

Navigieren Öffnen Esc Schließen