Hannes Nagel

Hannes Nagel

Frontend-Dev

02.07.2025 | 3 min Lesezeit

zettl 2.0

Ein Rewrite

zettl 2.0 blog image

zettl ist eine simple, intuitive Zeiterfassungs-App, mit der sich Arbeitsstunden in Projekten erfassen und als CSV- oder PDF-Datei exportieren lassen. Der Fokus liegt auf einfacher Bedienung, klarer Übersicht und reibungsloser Nutzung.

zettl 2.0 ist ein großes Update: Die ursprüngliche React-Native-App wurde vollständig neu in SwiftUI geschrieben.

Aber warum ursprünglich React Native?

Die erste Version von zettl wurde mit React Native umgesetzt, da sowohl JavaScript als auch React bereits bekannt waren und eine schnelle Entwicklung ermöglichten. Zudem versprach React Native eine einheitliche Codebasis für iOS und Android. Die Hoffnung war, dass zettl langfristig auch auf Android verfügbar gemacht werden könnte, ohne den Aufwand einer separaten nativen Entwicklung.

Doch am Ende blieb die App exklusiv auf iOS. Die Vorteile einer Cross-Plattform-Lösung wurden also nie genutzt, während die typischen Einschränkungen plattformübergreifender Frameworks zum Tragen kamen. Diese werden im nachfolgenden Abschnitt genauer beschrieben.

Warum ein Rewrite?

Cross-Plattform-Apps bringen gewisse Kompromisse mit sich. Diese zeigen sich oft in kleinen Details – sei es das Verhalten beim „Swipe to Delete“, die Darstellung von Alerts oder die Art und Weise, wie Menüs funktionieren. Auch zettl wirkte an vielen Stellen nicht ganz „rund” für iOS. Insbesondere die typischen iOS-Interaktionen fühlen sich bei React Native häufig etwas fremd an. Zusätzlich gab es bei zettl auch ein Problem: Zeiteinträge wurden teilweise nicht richtig synchronisiert und blieben dauerhaft nur im lokalen Speicher der App, was auch zu Datenverlust führen konnte.

Der Wechsel zu SwiftUI

Nun kam die Idee auf, zettl von Grund auf neu als native iOS-App zu entwickeln – diesmal in SwiftUI, einem nativen UI-Framework für Apple-Geräte, mit dem ich bereits Erfahrung hatte und dessen Vorteile wir voll ausschöpfen konnten.

Natürlich verläuft ein solcher Rewrite nicht ohne Hürden. Ursprünglich war zettl schon ab iOS 12 verfügbar. Das konnte mit SwiftUI jedoch nicht beibehalten werden, da wir iOS 15 voraussetzen mussten, um relevante SwiftUI-Funktionen nutzen zu können. Dadurch fielen einige ältere Geräte (vermutlich weniger als 1%) aus dem Support, was bewusst in Kauf genommen wurde. Eine weitere Herausforderung stellte Core Data dar, Apples persistentes Speichersystem, das tief in iOS integriert ist, aber in Teilen noch stark von der Objective-C-Ära geprägt ist. Vor allem der Umgang mit Concurrency, also parallelen Datenzugriffen, erwies sich als fehleranfällig und erforderte einige Workarounds, die nicht immer optimal funktionierten.

Nach dem Release der neuen Version stieg die Crash-Rate zunächst deutlich an, was sich aber schnell durch ein gezieltes Update beheben ließ. Ups.

Der Wechsel brachte sofort spürbare Vorteile: zettl konnte nun endlich so funktionieren, wie man es von einer iOS-App erwartet, und das bestehende Backend konnte trotzdem weiterverwendet werden.

Ein zusätzlicher, großer Pluspunkt: Dies ist jedoch weniger dem Framework selbst geschuldet, sondern beruht vielmehr auf einer bewussten Entscheidung im Datenhandling. Alle Einträge werden zunächst lokal gespeichert. Auch Zeiteinträge können lokal erstellt und bearbeitet werden. Änderungen werden lokal gespeichert und später einfach hochgeladen.

Fazit und Ausblick

Der Umstieg schafft nun die Grundlage für deutlich schnellere Weiterentwicklungen. Wir konnten diesen Vorteil bereits nutzen und ein Feature entwickeln, das schon lange auf der Wunschliste unserer User stand: die Archivierung von Projekten.

Aktuell arbeiten wir außerdem an einer erweiterten Version von zettl für Teams und kleine Unternehmen. Damit wird es künftig möglich sein, Zeiteinträge gemeinsam zu verwalten und Projekte zu teilen. Teams können eigene Logos im Export hinzufügen. Schon bald wird auch eine Web-App dazukommen, sodass zettl auch von PCs und Büroarbeitsplätzen aus benutzt werden kann. Dadurch kommen wir den Anforderungen der meisten Teams einen großen Schritt näher, ohne dabei an Einfachheit zu verlieren.

Weiter lesen