
Chaos im Alltag – und wie man rauskommt
Typischer Montag bei einer Hausverwaltung: Fünf Nachrichten zum selben Wasserschaden. Eine WhatsApp mit Handyfoto („läuft wieder!“), zwei E-Mails („Was ist jetzt mit der Heizung?“), ein Anruf vom Mieter, später noch ein Rückruf vom Handwerker. Übersicht? Gleich null. Die Frage, die immer wieder kommt: Was ist eigentlich schon erledigt – und was gammelt seit Wochen ungesehen im Postfach?
Genau diese Baustelle will mieterportal.net zuschütten. Ziel: Alle Meldungen, Kommunikation und Verwaltung an einem Platz. Keine Zettelwirtschaft mehr, keine Excel-Inseln, keine Nachtschichten zum Sortieren der letzten 30 E-Mails. Funktioniert das? Ja. Aber der Weg dahin ist holpriger als die meisten Tutorials glauben machen.
Tech-Stack: Der Abspeck-Plan
Große Frameworks? Gab's nicht. Laravel, Symfony, React – alles draußen gelassen. Stattdessen:
- PHP 8.3 mit `declare(strict_types=1)` (ohne das geht heute eh nichts mehr)
- SQLite, weil niemand Lust auf MySQL-Server hat, der nachts um 3 Uhr abschmiert
- Vanilla JavaScript (also kein Vue, kein React, kein npm-Gewürge)
- Handgebauter Mini-Router, bisschen MVC – das reicht meist
- Chart.js für ein paar hübsche Auswertungen
- Bootstrap Icons und eigenes CSS, weil das Auge mitklickt
Klingt nach Bastelbuden-Stack? Vielleicht. Aber: Weniger Abhängigkeiten, weniger Hosting-Ärger. Gerade auf Shared Hosting ein echter Vorteil. Wer schon mal Composer samt 20 Abhängigkeiten auf einem 2-Euro-Hoster zum Laufen gebracht hat, weiß, was gemeint ist.
Natürlich: Eigenbau hat seinen Preis. Alles, was Frameworks sonst erledigen (Routing, CSRF, E-Mail, Rechte), muss selbst gebaut werden. Dauert. Kostet Nerven.
Trotzdem: Für klar umrissene SaaS-Produkte spart das oft Zeit. Und graue Haare. Wer PHP- und JS-Architektur genauer sehen will: PHP mit etwas JS: Wieso Agenturen 2026 meist keinen Framework-Zirkus brauchen.
Was kann das Ding?
Nicht nur ein schicker Bug-Tracker: Das System ist in mehreren Iterationen gewachsen.
- Schadensmeldungen mit Foto-Upload, Statuswechsel („neu“ bis „erledigt“)
- Kommentare, intern & öffentlich, Benachrichtigungen per E-Mail
- Verwaltung für Wohnungen, Mietverträge, Mieterwechsel
- Fünf Benutzerrollen, sauber getrennt
- Mandantenfähig: Jeder Vermieter sieht nur seine Daten
- Abo & Paketverwaltung – Testphasen, Kündigung, Erinnerungen laufen per Cronjob
- CSV/XLSX-Import für Objekte – bisschen KI, wenn’s sein muss
- Homeday-Preisatlas eingebunden, damit die Miete nicht auswürfeln
- Dashboard für Reaktionszeiten, Aktivitätslog, Newsletter-Tool, DSGVO-Pflichtprogramm
Was nervt – und wie es trotzdem geht
Die echten Probleme tauchen nie im Tutorial auf. Ein paar Klassiker aus dem Alltag:
Mandantenfähigkeit nachrüsten: Einmal Hölle und zurück
Erst für einen Vermieter gebaut. Dann plötzlich Wunsch: Multi-Tenancy. Nachträglich. Bedeutet: Jede Abfrage muss Mandant filtern. Ein falscher Join, fremde Daten im Dashboard. Spaßig ist anders.
Klartext: Mandantentrennung muss von Anfang an ins Datenmodell. Nachrüsten? Never again.
E-Mail-Versand: Spam ahoi!
Gmail App-Passwörter als Startlösung – bequem, aber landet fix im Spam. Absender @gmail.com? Sieht nach Scam aus. Erst mit eigenem SMTP-Server, SPF & DKIM gibt’s stabile Zustellung.
Log & Versandwarteschlange sind Pflicht. Sonst sucht man Fehler im Dunkeln.
Rechte & Datenschutz: Wenn „Darf der das sehen?“ die Woche dominiert
Zehnmal am Tag die Frage: Wer darf was sehen? Sichtbarkeitsregeln nerven, aber ohne geht’s nicht. Viele kleine `if`-Abfragen führen zu Sicherheitslücken. Lösung: Zentrale Rechte-Matrix, editierbar nur vom Vermieter. Alles andere wird zur Dauerbaustelle.
500er Fehler: Eigenbau = Blackbox?
Fehlerseite kommt, aber warum? Fehlendes Logging, Routing-Fehler, PHP-Exceptions – ohne systematisches Server-Log keine Chance. Erst mit sauberem Logfile lässt sich jeder 500er auflösen.
404 – läuft lokal, knallt live
Lokal alles prima, live 404. Ursache: Pfadprobleme, Groß/Kleinschreibung, .htaccess, Rechte. Demos finden das selten. Erst echte Nutzer mit echten Rollen stolpern drüber.
Filter ohne Formular-Absenden: Nur für Geduldige
Filter sollen sofort reagieren, kein Button-Klick – klingt nach Luxus, nervt beim Programmieren. JS-Logik muss sitzen, sonst verschwindet die halbe Tabelle. Einheitliche Suchmuster helfen.
Zeitumrechnung: UTC vs. Lokalzeit – Klassiker
SQLite speichert UTC, angezeigt wird Berlin. Ohne penible Umrechnung falsche Zeitstempel. Lösung: Immer UTC speichern, lokal ausgeben. Sonst gibt’s Chaos im Protokoll.
Sicherheit: Wenn alles selbst gebaut werden muss
CSRF, Rate-Limiting, Passwort-Reset, Host-Header-Check – alles selbst gebastelt. Besonders wichtig: Host-Header per Regex prüfen, sonst landet der Link im Nirwana.
SEO hinterm Login: Was draußen bleiben muss
Die App ist fast komplett hinterm Login. Indexiert werden dürfen nur Startseite, Impressum, Datenschutz. Der Rest: `noindex, nofollow` – sonst steht das nächste Datenschutzproblem vor der Tür.
Robots.txt blockt Admin & Nutzerbereiche. Sitemap? Nur öffentliche Seiten. JSON-LD für Org, Website, FAQ. Landingpage? Klare Reihenfolge: Problem, Lösung, Features, Preis, FAQ. Ohne Schnickschnack.
Kritisch: Wer Admin-Bereiche oder Tickets indexieren lässt, spielt mit Feuer. Im Zweifel: Weniger veröffentlichen, kein Risiko eingehen.
Nach 30 Jahren Webentwicklung: Mein Fazit
Frameworks haben ihren Platz – bei Großprojekten, wildem Feature-Wachstum, wechselnden Anforderungen. Für klar abgezirkelte Produkte reicht ein Eigenbau-Stack oft. Updates und Abhängigkeiten bleiben so überschaubar, Hosting läuft auch auf einfacheren Setups. Aber: Disziplin nötig. Mandanten, Rechte, Logging, E-Mail – alles von Anfang an mitdenken. Sonst wird’s teuer.
Für Agenturen mit 5 bis 10 Leuten: Schneller deployen, weniger Hosting-Kosten, aber mehr Verantwortung beim Testen. Einzelkämpfer? Kommen mit dem Stack klar, wenn sauber dokumentiert und getestet wird. Nachbessern dauert sonst ewig.
Weiterlesen – was noch hilft
Wer tiefer einsteigen will:
- PHP 8.4: Neue Stolpersteine, neue Chancen – was jetzt ansteht
- PHP-Altprojekte absichern: OWASP-Check für SQL-Injection, XSS und Session-Fixation
Was bleibt?
mieterportal.net beweist: Mandantenfähige SaaS mit PHP 8.3, SQLite, Vanilla JS – geht ohne Framework, wenn Routing, Sicherheit, E-Mail und Datenmodell stimmen. Heißt konkret:
- Mandantenfähigkeit von Anfang an einplanen
- Rechte zentral, nicht überall verstreut
- E-Mail? Nur mit eigener Domain, Logging, Zustellbarkeit prüfen
- Ohne Logging ist alles Rätselraten
- Testen: Echte Rollen, echte Daten, keine Demos
Für klar abgegrenzte Produkte bleibt der schlanke Weg oft der beste. Schnell gebaut, wartbar, günstig im Betrieb. Wenn Sicherheit und Datentrennung stimmen.
*Live: mieterportal.net · Stack: PHP 8.3, SQLite, Vanilla JS, Chart.js · Hosting: Plesk/Shared*
bye
mo