Hauke Schnau
Back to projects

Studienbuch

Rethinking privacy, backup, and sync in Studienbuch

Studienbuch explores how a privacy-sensitive school app can preserve user control while gaining reliable backup, synchronization, and connected features.

Studienbuch app screens showing the day view, grades, and absences

The project today

The product is actively used by one school. Its current production generation remains in service while I build a production-bound React Native and TypeScript rewrite.

What I’m solving

The original privacy model had become effectively local only. That protected data but made backup, synchronization, and richer connected workflows structurally awkward. Retrofitting those capabilities into the existing shape would have meant working around the real limitation, so I redesigned the ownership and synchronization model instead.

My responsibility

I own the product direction and technical architecture across mobile, web, domain logic, APIs, persistence, synchronization, testing, and delivery.

01

Key decisions

01

Typed domain core

Extract reusable policy, selectors, and formatting into a framework-independent typed domain core instead of coupling product behavior to one UI generation.

02

Explicit sync contracts

Build Groundswell around explicit event and adapter contracts for offline publication, canonical verification, persistence, broadcast, retry, and replay.

03

Protected external integration

Keep the unstable WebUntis integration behind strict schemas, typed services, recovery behavior, and contract/live tests.


Where it stands

The product continues to support one school while the rewrite evolves separately.

The rewrite now has explicit seams between domain logic, platform UI, external systems, persistence, synchronization, and delivery checks.

What I learned

I initially pushed event sourcing too far. Mostly static reference facts such as when a school was founded did not benefit from events and created avoidable complexity. I now reserve events for behavior where history, ordering, replay, or synchronization earns their cost, and use simpler fetch-and-cache boundaries for reference data.


  • TypeScript
  • React Native
  • Expo
  • TanStack Start
  • TanStack Router
  • Effect
  • Bun
  • NativeWind
  • Nix
  • Flutter
  • Dart
  • TanStack Query
  • TanStack Form
  • TanStack Table
  • tRPC
  • Hono
  • Drizzle ORM
  • PostgreSQL
  • SQLite

Back to projects