Nathan Klieme Startseite

Nathan Klieme · Auftragsarbeit · Wochenplanung für einen Handwerksbetrieb

Baueinteilung

Wer ist diese Woche auf welcher Baustelle? Die Tafel hängt am Fernseher im Büro und wird in der Besprechung bedient. Eine Woche passt auf eine Bildschirmseite — ohne Scrollen, ohne Bedienleisten.

15.728Zeilen TypeScript
613Prüfungen in
13 Testdateien
4Pakete, die im
Betrieb mitlaufen
Im Hausein eigener Rechner
im Betrieb

Worum es geht

In dem Betrieb wird die Woche am Montag verteilt: Welche Mannschaft fährt auf welche Baustelle, wer ist krank, wer im Urlaub, wo fehlt noch jemand. Vorher hing das an einer Pinnwand-Software, die für den Bildschirm im Büro nie gedacht war — auf dem Fernseher kaum lesbar, und jede Woche wurde alles neu geschoben.

Die Baueinteilung macht daraus eine Seite. Fünf Spalten, eine je Werktag. Jede Karte ist ein Bauvorhaben mit seiner Mannschaft; Namen werden mit der Maus verschoben und rasten in ein Raster ein. Nichts scrollt, nichts klappt weg, und es gibt keine Bedienleiste, die den Blick stiehlt. Wer im Raum sitzt, soll die Woche von seinem Platz aus lesen können — das war die härteste Anforderung, härter als jede technische.

Bedient wird währenddessen live. Verschiebt jemand eine Karte, sehen alle anderen Geräte die Änderung sofort; der Stand wird von selbst gespeichert. Alles läuft auf einem Rechner im Haus des Betriebs — kein fremder Server, keine Cloud, keine Konten bei einem Anbieter.

Ein Rundgang

Aufnahmen aus dem laufenden Programm
Die Woche. Fünf Spalten, eine je Werktag, darunter die Ablagen für Nicht eingeteilt, Teilweise, Krank und Urlaub. Die Farbe an einer Karte gehört dem zuständigen Bauleiter.
Vollbild. So hängt sie am Fernseher. Ein Knopf, und die Bedienung verschwindet — übrig bleibt die Woche.
Anmelden. Sechs Ziffern, kein Benutzername. Wer einteilt, hat einen eigenen Code; wer nur zuschaut, nimmt den gemeinsamen Lesezugang.

Der Verwaltungsbereich

Was man der Tafel nicht ansieht

Die Woche ist nur die Oberfläche. Dahinter liegt, was den Betrieb am Laufen hält: wer dazugehört, welche Bauvorhaben es gibt, welche Leute üblicherweise zusammen fahren — und eine Spur davon, wer wann was geändert hat. An diesen Bereichen wurde am längsten gearbeitet, obwohl man sie im Alltag am seltensten öffnet.

Mitarbeiter. Wer austritt, wird ausgetragen und nicht gelöscht. Name und Farbe bleiben erhalten, damit zurückliegende Wochen weiter so aussehen wie damals.
Baustellen. Jedes Bauvorhaben mit seinem zuständigen Bauleiter. Dessen Farbe ist es, die später auf der Karte in der Woche erscheint.
Standardbesetzung. Wer üblicherweise zusammen fährt, steht als Mannschaft fest. Eine neue Woche fängt damit nicht bei null an, sondern bei der Regel — geändert wird nur, was abweicht.
Protokoll. Jede Änderung mit Zeit und Urheber, seit es das Programm gibt. Gelöscht wird hier nie. Fragt am Mittwoch jemand, warum eine Mannschaft woanders steht, lässt es sich nachlesen statt erraten.

Wie es gebaut ist

Eine Webseite, die im Firmennetz auf einem kleinen Rechner läuft. Im Browser React mit einer Bibliothek fürs Ziehen und Ablegen, auf der anderen Seite ein eigener Server mit SQLite und einer offenen Verbindung für den Live-Abgleich. Zusammen kommt das mit vier Paketen aus, die im Betrieb mitlaufen — alles Übrige ist Werkzeug für die Entwicklung und bleibt draußen.

Im Browser

  • React 19 · TypeScript
  • dnd-kit · Ziehen und Ablegen
  • Vite · Bau und Entwicklung

Auf dem Server

  • Node · eigener HTTP-Server
  • SQLite · eine Datei
  • WebSocket · Live-Abgleich

Im Betrieb

  • Docker Compose
  • Caddy · davor
  • Rechner im Haus · Firmennetz

Wer hereindarf

Eine Rechnung, keine Gefühlssache

Angemeldet wird mit einem Code, ohne Benutzernamen. Das ist bequem — an einem Fernseher im Büro will niemand Namen tippen —, hat aber eine unangenehme Eigenschaft: Wer blind durchprobiert, muss nicht den Code eines bestimmten Menschen treffen, sondern irgendeinen. Jeder zusätzliche Zugang macht die Tür also leichter auf, nicht sicherer. Deshalb steht der Hinweis, sparsam zu sein, im Programm selbst — dort, wo jemand einen Code vergibt, und nicht in einer Anleitung, die niemand liest.

Dieselbe Rechnung hat die Länge der Codes entschieden. Bei vier Ziffern und zehn Zugängen sitzt im Schnitt nach 909 Versuchen einer. Mit der damaligen Bremse — vierzig Versuche je Stunde — wäre ein unbeaufsichtigtes Skript in knapp einem Tag drin gewesen. Mit sechs Ziffern sind es rund 95 Tage bei sonst gleicher Bremse. Es wurde auf sechs umgestellt.

Dazu kam eine Sperre, die mit jedem Mal länger wird: nach zehn Fehlversuchen eine Viertelstunde, beim nächsten Mal eine Stunde, dann vier. Ein Mensch merkt davon nichts — wer sich zweimal vertippt, löst gar keine Sperre aus. Für ein Skript bricht das Tempo dagegen zusammen: Statt tausend Versuchen am Tag bleiben rund vierzig, und aus knapp einem Tag werden rund vier Jahre.

Bei vier Stunden ist die Treppe zu Ende, und das ist Absicht. Längere Stufen bringen nichts, was zählt — vier Jahre und vierzig Jahre heißen beide „kommt nicht rein" —, kosten aber im Ernstfall echte Zeit. Der Ernstfall ist nämlich nicht der Angreifer, sondern der Betrieb selbst: Wer während einer Sperre keinen gültigen Nachweis im Browser hat, kommt nicht herein und erreicht damit auch den Knopf zum Lösen nicht. Eine Tagessperre hieße dann: einen Tag lang keine Baueinteilung.

Die Codes liegen nirgends im Klartext, sondern als nicht umkehrbarer Abdruck mit eigenem Salz, absichtlich langsam gerechnet. Verglichen wird so, dass die gebrauchte Zeit nichts über den Code verrät. Jede Sperre landet im Protokoll — als Urheber steht dort das Programm selbst. Und ein geänderter Code wirft den, der damit angemeldet war, sofort hinaus.

Zugänge. Einzeln zum Bearbeiten, gemeinsam zum Lesen. Wer einen Code vergibt, liest im selben Moment, warum sparsam besser ist.
Admin. Sicherungen, offene Verbindungen und der Stand der Anmeldesperre auf einer Seite. Auch der unbequeme Satz steht dort: Eine Sicherung, die nur auf demselben Rechner liegt, ist eine Kopie und kein Sicherheitsnetz.

Entscheidungen, die halten müssen

Warum es so gebaut ist und nicht anders

SQLite statt einer Datei mit den Wochendaten. Speichern zwei Leute gleichzeitig und der Server stürzt dabei ab, ist eine halb geschriebene Datei unbrauchbar — und mit ihr die Woche. SQLite schreibt entweder ganz oder gar nicht. Für die Sicherung ändert sich nichts: Es bleibt eine einzelne Datei zum Wegkopieren.

Und ausdrücklich ohne SQLites Schreibprotokoll. Das wäre bei gleichzeitigen Zugriffen schneller, macht aus der Ablage aber drei Dateien statt einer. Wer nur die Hauptdatei wegsichert — und genau das tut ein Dateisicherer —, sichert dann eine leere Datenbank. Der kleine Geschwindigkeitsgewinn ist es nicht wert, dass eine Sicherung im Ernstfall nichts enthält.

Geprüft wird in beide Richtungen. Beim Lesen wie beim Schreiben schaut das Programm nicht nur jedes Feld für sich an, sondern die Woche als Ganzes: niemand an einem Tag an zwei Orten, niemand gleichzeitig eingeteilt und krank gemeldet. Ein Fehler soll auffallen, solange er sich noch beheben lässt.

Eine Sicherung je Tag, dreißig Tage aufbewahrt. Kopiert wird mit SQLites eigenem Befehl dafür, nicht mit einem Dateikopierer: Das liefert eine in sich stimmige Datei, auch wenn gerade jemand schreibt.

Wie ich daran arbeite

  1. Geprüft wird die Logik, nicht das Aussehen 613 Prüfungen in 13 Dateien decken Wochenstand, Ablage, Zugänge und Protokoll ab. Was sich ausrechnen lässt, wird geprüft; was man sehen muss, nehme ich am laufenden Programm ab.
  2. Die Gestaltung wurde getrennt entschieden Sie war ausdrücklich nicht Teil des Auftrags. Farben, Schriften und Abstände sind eigens festgelegt worden, mit der Leseentfernung im Raum als härtester Anforderung. Ein erster Anlauf ist zurückgenommen und neu aufgezogen worden.
  3. Abgenommen wird am laufenden Programm Für jede Runde eine Liste zum Abhaken statt einer Mail mit Stichpunkten. Wer abhakt, prüft; wer liest, überfliegt.
  4. Nachgereichte Wünsche stehen schriftlich Eine Bemerkung je Karte, ein Lesezugang mit engem Zeitfenster, ein Abzug als PDF: aufgenommen, festgehalten, gebaut, abgenommen. Was noch nicht gebaut ist, steht genauso da.

Auf einen Blick

FrageAntwort
Was es istEine Webseite für die wöchentliche Baueinteilung, bedient am Fernseher im Büro
SpracheTypeScript, durchgehend, mit Typprüfung als Teil der Auslieferung
DatenSQLite in einer Datei, auf dem Rechner des Betriebs. Nichts verlässt das Haus
GleichzeitigOffene Verbindung je Gerät; wer etwas verschiebt, ändert es für alle sofort
ZugängeEinzeln zum Bearbeiten, gemeinsam zum Lesen, jeder Zug mit Urheber im Protokoll
SicherungEine Kopie je Tag, dreißig Tage, angelegt mit SQLites eigenem Kopierbefehl
BetriebDocker Compose hinter Caddy auf einem Linux-Rechner im Firmennetz
StandIm täglichen Einsatz. Die erste Fassung ist abgenommen, es kommt weiter etwas dazu
Baueinteilung · Aufnahmen vom 14. September 2026 Alle Namen in den Aufnahmen sind erfunden, der Betrieb wird nicht genannt — die Bilder entstehen an einem eigens angelegten Vorführstand