In Active Development

Lokal — Multi-Tenant-Café-Betriebssystem

Eine Geschäftsplattform, die Treueprogramme, POS und Filialverwaltung in einem einzigen Ökosystem vereint.

FlutterRiverpod.NET 10PostgreSQLRedisSignalRDapperDocker
Das Problem

Jedes Café in der Türkei betreibt Treue anders. Stempelkarten, die in Geldbörsen verloren gehen, Apps, die niemand zweimal herunterlädt, Lochkarten von 2003 — fragmentiert und vergesslich. Für den Kunden sind es zehn Cafés, zehn Systeme, keines kommuniziert mit dem anderen.

Für den Geschäftsinhaber ist es schlimmer. POS-System, Treueprogramm, Personalverwaltung, Bestandsverfolgung — vier verschiedene Tools zusammengeklebt. Der Barista um 8 Uhr mit einer Schlange vor der Tür sollte nicht darüber nachdenken müssen, welche App was macht.

Die Lösung

Lokal ist eine Plattform, die alles macht. Drei Apps — eine für den Kunden, eine für das Geschäft, eine für Admin — teilen sich einen gemeinsamen Kern. Der Kunde sieht eine Treuekarte pro Geschäft. Das Geschäft erhält ein vollständiges POS, Menüverwaltung, Personalrollen und Echtzeit-Reporting.

Screenshot 1
Screenshot 2
Architektur & Entscheidungen

Modularer Monolith .NET 10 Backend, Flutter Monorepo mit 3 Apps (lokal-common Shared Package), PostgreSQL-Datenbank und Redis-Cache. Echtzeit-SignalR-Hub.

System architecture diagram

Warum Scoped RBAC?

Generisches RBAC unterscheidet nicht zwischen 'kann Bestellungen dieses Geschäfts verwalten' und 'kann alle Geschäfte verwalten.' Ich habe den Scope direkt in Permission-Keys kodiert — Store.Order.Create vs Business.Order.Read. Ein Lookup, Scope wird aus dem Key abgeleitet.

Warum Business Template → Store Override?

Der schwierige Teil war nicht das Erstellen des Menüs — sondern es zum Funktionieren zu bringen, wenn ein Unternehmen 5 Filialen hat, die jeweils unterschiedliche Preise für denselben Espresso verlangen, und trotzdem einheitliche Berichte zu generieren.

Warum Bestell-Preis-Snapshots?

Wenn ein Kunde einen Espresso für 3,50 kauft, wird dieser Preis für immer in der Bestellung eingefroren — auch wenn sich das Menü morgen ändert. Historische Bestellungen sind unveränderlich.

Feature-Highlights

40+ Granulare Berechtigungen

Ein Barista sieht andere Dinge als ein General Manager. 7 Standard-Rollen, benutzerdefinierte Rollenerstellung und Business/Store-Scoped Berechtigungen stellen sicher, dass jeder Mitarbeiter nur auf das zugreift, was er braucht.

Dynamische Filialpreise

Produkte einmal definiert, jede Filiale legt ihren eigenen Preis fest. Filialebene-Flexibilität ohne das unternehmensweite Reporting zu beeinträchtigen.

Multi-App-Ökosystem

Kunden-, Geschäfts- und Admin-Apps teilen sich einen gemeinsamen Kern über das lokal-common-Paket, während jede ihre eigene Benutzererfahrung beibehält.

Herausforderungen & Lektionen

Neugestaltung des Berechtigungssystems

Das erste Auth-System war zu starr — fest kodierte Rollen, nicht erweiterbare Berechtigungen. Als es Geschäfte daran hinderte, eigene Rollen zu erstellen, habe ich das gesamte System von Grund auf neu gestaltet.

Katalog-Preisauflösung

Die Store-Override-Schicht richtig hinzubekommen war schwieriger als erwartet. Jede Abfrage musste sowohl Geschäfts-Defaults als auch Store-Overrides berücksichtigen.

Ergebnisse & Auswirkungen
3

Produktions-Flutter-Apps (Kunde, Geschäft, Admin)

40%

Schnellere Abfrageausführung mit Dapper (~45ms vs EF Core ~80ms)

40+

Granulare Permission-Keys mit 7 Standard-Rollen

Live

Als FAB Coffee im App Store und Play Store bereitgestellt