Skip to content
99ersstudio
← Studio Log
app-spotlight2 min read

Mieter App: German tenant-rights companion. 8-city Mietspiegel, Mietpreischeck, Nebenkostenpruefung, PDF export.

Read in Deutsch
Mieter App: German tenant-rights companion. 8-city Mietspiegel, Mietpreischeck, Nebenkostenpruefung, PDF export.

A tenant in Berlin opens a Mieterhöhung letter. The landlord wants 480 euros more per month. Is that legal? The answer lives in a 90-page city PDF laid out for civil servants. The Mieter App moved that answer onto a phone.

What we built

Flutter on Android and iOS. Dart handles the Mietpreis math deterministically, with no rounding drift across devices. The Mietspiegel lookup is built in: we bundle eight German cities and the app picks the right table from the Postleitzahl. SQLite holds the rent ranges offline, so the check still works on a train with no signal.

The Mietpreischeck is the first screen users hit. Type the Miete, type the Fläche, type the PLZ. In under 100 ms the app shows whether the rent sits above or below the Mietspiegel range. If the rent is over, we pull up a template-Schreiben that cites §557 BGB and inserts the concrete numbers.

Nebenkostenprüfung is the second stack. The user dumps a utility bill as text and the app flags the seven most commonly inflated line items: Grundsteuer split wrong, Hausmeister full-wage, Versicherung doubled. Not legal advice, just the red flags a Mieterbund lawyer would call out in ten minutes.

PDF export runs on Flutter's built-in PDF widget plus a small composition layer, so letters come out in a German postal-ready layout.

What we got wrong the first time

The first build loaded all eight city Mietspiegel tables at startup. Cold-start took 3.8 seconds on a Pixel 4a. In Phase 3 we switched to lazy loading on first PLZ entry and cold-start dropped to 640 ms. The 98 integration tests caught a Mietpreis rounding regression the unit tests had missed, so we added a dedicated fixture for PLZs that straddle a Bezirk boundary.

The second mistake was reuse. We wrote the Mietpreis form in Dart first, then tried to share its widgets with the Nebenkosten form. The input shapes were different enough that reuse became a drag on both features. We tore the shared layer out in Phase 5. Zero widgets shared between the two screens now, 40 percent less code per screen, and the two features stopped blocking each other on every release.

Where it is now

Live on Google Play and the App Store at version 1.4. Eight cities covered: Berlin, Hamburg, München, Köln, Frankfurt, Stuttgart, Düsseldorf, Leipzig. 98 tests green. Next up in version 1.5: Dresden and Bremen plus a Betriebskosten scanner that reads photographed utility bills instead of typed text. The OCR pass is already in a side branch on the Android build, pinned against a small corpus of twelve real utility bills a friend of the studio scanned for us.

Related