Case Study · Eigenes ProduktLive seit Juli 2026
Arbeit, Zeit, Geld und Alltag. In einer App.
Self-Engine ist mein eigenes Produkt: eine Produktivitäts-App für Freelancer und Selbstständige, in der Zeiterfassung, Aufgaben, Kalender, Finanzen und Gewohnheiten ein gemeinsames Datenmodell teilen. Ich entwerfe, entwickle und betreibe sie allein — offline-first, im Web, auf dem Mac und bald auf dem Handy.
- Web-App
- macOS (Alpha)
- iOS-Beta
- Offline-first
- Commits seit Dezember 2025
- 2.100+
- Releases seit Juli 2026
- 79
- automatisierte Tests
- ~5.900
- Datenbank-Migrationen
- 137
- synchronisierte Tabellen
- 37
- Architektur-Entscheidungen (ADRs)
- 38
Getrennte Tools wissen nichts voneinander.
Zeiterfassungs-Tools wissen nicht, was eine Stunde wert ist. Finanz-Apps wissen nicht, welche Arbeit das Geld verdient hat. Und Kalender zeigen, was geplant war — nie, was wirklich passiert ist. Die Verbindungen dazwischen existierten nur in meinem Kopf.
In Self-Engine sind genau diese Verbindungen das Produkt: Aus einem Termin startet ein Timer, der Timer wird zum Zeiteintrag, und eine Auszahlung markiert die Einträge als bezahlt und bucht das Geld in den Finanzen.
- 01
Termin
geplant im Kalender
- 02
Timer
startet aus dem Termin
- 03
Zeiteintrag
mit Stundensatz und Rundung
- 04
Auszahlung
markiert Einträge als bezahlt
- 05
Cashflow
im richtigen Konto und in der richtigen Währung
Und Gewohnheiten füllen sich von selbst — aus der Zeit, die du auf einem verknüpften Projekt erfasst.
Ein Datenmodell, fünf Module.
Jedes Modul funktioniert für sich — und kennt die anderen.
Projekte & Zeiterfassung
Ein Timer pro Projekt, parallel, pausierbar und mit Pomodoro. Jede Stunde kennt ihr Projekt, ihren Stundensatz und ihre Zeitklasse.
- Geteilte Zeit über mehrere Projekte
- Rundungsregeln und bewusste Überlappungs-Entscheidungen
- Offene Arbeit und Auszahlungen — auch offline
Aufgaben
Inbox, Heute, Demnächst und ein Kanban-Board — mit eigenen Status in festen Kategorien.
- Geplanter Tag und Deadline getrennt
- Unteraufgaben, Tags, Prioritäten, Erinnerungen
- Unscharfe Suche über alles
Kalender
Termine und erfasste Zeit nebeneinander in Woche und Monat — Plan und Wirklichkeit auf einen Blick.
- Zwei-Wege-Sync mit Google und Apple (iCloud)
- Synchronisiert serverseitig, auch bei geschlossener App
- Timer direkt aus dem Termin
Finanzen
Konten in je einer Währung, einmalige und wiederkehrende Zahlungen, Umbuchungen und Währungswechsel.
- Auswertungen strikt pro Währung
- Wiederkehrende Zahlungen pausieren und fortsetzen
- Festpreis-Projekte und Kontaktprofile
Gewohnheiten
Täglich, an bestimmten Wochentagen oder als flexible Quote pro Woche oder Monat.
- Streaks immer aus dem Verlauf berechnet
- Pausieren, ohne den Verlauf zu verlieren
- Fortschritt automatisch aus erfasster Zeit
Ein Assistent mit Leitplanken.
Der eingebaute Assistent kennt 39 typisierte Capabilities über alle Module. Er arbeitet pull-first: Das Modell bekommt Zähler und Hinweise statt Nutzerdaten und muss über typisierte Read-Tools nachfragen. Rate-Limits, Kosten-Tracking und Routing ausschließlich über Zero-Data-Retention-Endpunkte erzwingt der Server.
Wer lieber den eigenen Agenten nutzt, verbindet Claude, Claude Code oder Cursor per OAuth mit dem MCP-Server von Self-Engine. Berechtigungen gelten pro Datentyp, Agenten können höchstens in den Papierkorb verschieben, und jeder Aufruf landet im Agenten-Protokoll.
- VorbereitenVorschau aus Live-Daten
- Freigebeneinmalig, an die exakte Eingabe gebunden
- Ausführendieselbe Domain-Mutation wie ein Klick
Offline-first — wirklich.
Jede App schreibt zuerst in eine lokale SQLite-Datenbank; ein Schreibvorgang wartet nie auf die Cloud. PowerSync stellt die Änderung in eine Warteschlange und lädt sie geordnet zu Supabase hoch, wo Postgres mit Row-Level-Security auf jeder Tabelle die Quelle der Wahrheit bleibt. Änderungen anderer Geräte fließen zurück in die lokale Datenbank, und die UI aktualisiert sich über Live-Queries — ohne manuelle Cache-Invalidierung.
Die Domäne lebt in geteilten Packages: 37 synchronisierte Tabellen, Zod-Schemas und typisierte Collections, die Web und Mobile identisch nutzen. Geschäftsregeln sind pure Funktionen hinter einem Persistence-Port — dieselbe Regel schützt einen Tap in der Mobile-App, einen Klick im Web und den Tool-Aufruf eines KI-Agenten auf dem Server.
Identität ist ein einzelnes Clerk-JWT für beide Datenpfade: PowerSync prüft es für die Replikation, Postgres erzwingt es per Row-Level-Security bei jeder Query. Die Desktop-App ist eine Electron-Shell um die Web-App — mit Menüleisten-Timer, Quick Capture und signierten Auto-Updates.
Teuer bezahlte Erkenntnisse.
Eine Domäne, drei Laufzeiten
Damit KI-Agenten auf dem Server dieselben Regeln treffen wie die App auf dem Gerät, habe ich die Domain-Logik von PowerSync gelöst und hinter einen Persistence-Port gelegt — mit drei Adaptern (PowerSync, In-Memory, Postgres) und einem Test, der den Import-Graphen jeder Regel prüft.
Ein kaputter Write darf nicht alle blockieren
Offline-Warteschlangen laden streng geordnet hoch — ein einziger ungültiger Write hielte alle späteren auf. Darum werden fatale Postgres-Fehler klassifiziert und verworfen, zusammengehörige Writes atomar übertragen, und du erfährst, in welchem Bereich eine Änderung verloren ging.
Kalender-Sync auf Offline-Basis
Das Schwierige am Sync mit Google und iCloud ist nicht die API, sondern Identität: Deterministische IDs machen Creates idempotent, ETags fangen parallele Änderungen ab, abgelaufene Sync-Tokens lösen einen vollständigen Resync aus, und der serverseitige Abgleich teilt sich einen Lock mit dem Sync aus der App.
Den Identity-Provider im laufenden Betrieb tauschen
Jede User-ID von Supabase Auth zu Clerk zu migrieren hieß: alle Row-Level-Security-Policies in einer einzigen Migration neu schreiben und zwei unabhängige Datenpfade auf ein JWT umstellen — ohne eine einzige Offline-Warteschlange zu verlieren.
Gebaut mit
Web
- TanStack Start
- TanStack Router
- TanStack DB
- TanStack Query
- Mantine
- Paraglide
Mobile
- Expo
- React Native
- Expo Router
- HeroUI Native
- EAS Updates
Desktop
- Electron
- electron-builder
- electron-updater
Daten & Sync
- SQLite
- PowerSync
- Supabase
- Postgres
- Clerk
- Zod
KI
- TanStack AI
- OpenRouter
- Model Context Protocol
Qualität & Tooling
- TypeScript
- Bun
- Turborepo
- Vitest
- pgTAP
- Oxlint
- Knip
- Sentry
Probier es selbst aus.
Self-Engine läuft im Browser und auf dem Mac — 30 Tage kostenlos.
Self-Engine ist ein kommerzielles Produkt; der Quellcode ist nicht öffentlich.