Kachelwerk ist kein Ersatz für den Fenstermanager von macOS, sondern ein Aufsatz darauf. Es benutzt die Bedienungshilfen-API (Accessibility), um laufende Fenster zu verschieben und zu skalieren. Alles, was dieser Weg hergibt, funktioniert – alles, was einen eigenen Compositor bräuchte, nicht. Beides steht hier vollständig.
Auf einen Blick
| Funktion | |
|---|---|
| 🧱 | Sieben Layouts – dwindle, master, master-left, master-right, centered, scrolling, grid |
| 🗂 | Zehn virtuelle Arbeitsflächen, unabhängig von den Spaces des Systems |
| ⌨️ | Globale Tastenkürzel, die auch aus fremden Apps heraus greifen |
| 🖱 | Kürzel-Editor – Tastendruck aufzeichnen statt Konfigurationsdatei tippen |
| 📝 | Konfiguration in einer Textdatei, live nachladbar bei jedem Speichern |
| 🎛 | Zwei Kürzel-Profile, jedes Kürzel einzeln überschreibbar |
| 🖥 | Mehrere Bildschirme – jeder Schirm wird eigenständig gekachelt, auf Wunsch mit eigenem Layout |
| 🪟 | Fensterregeln je App: schwebend, gekachelt, ignoriert, Hauptfenster, feste Arbeitsfläche, Zusatzfenster mittig |
| 🟡 | Fenstermenü am gelben Knopf – alle Aktionen für genau dieses Fenster, auch per Tastatur |
| ★ | Anklickbares Master-Abzeichen – Hauptfenster durchreichen, fixieren, Anteil ändern |
| 🗃 | Dashboard – die Anordnung umstellen, bevor sie angewendet wird |
| 🚀 | Fernsteuerung über Adressen, dazu ein Raycast-Paket |
| 🤖 | MCP-Server – ein KI-Assistent liest die Anordnung und ordnet Fenster an (ab Werk aus) |
| 📥 | Scratchpad – eine unsichtbare Ablage für Fenster |
| 🧭 | Menüleisten-App ohne Dock-Symbol; das Symbol zeigt das aktive Layout |
| ♻️ | Sauberes Beenden – geparkte Fenster werden alle wiederhergestellt |
Die Kacheln
Jedes neue Fenster bekommt automatisch einen Platz. Es gibt keine Überlappung, keinen Stapel und keine ungenutzte Fläche. Welche Aufteilung dabei entsteht, bestimmt das gewählte Layout – ausführlich beschrieben unter Layouts.
Zwei Abstände regeln das Erscheinungsbild:
general {
gaps_in = 6 # Abstand zwischen zwei Fenstern
gaps_out = 12 # Abstand zum Bildschirmrand
}
Fensterregeln
Nicht jede App will gekachelt werden. Sechs Regeltypen decken die üblichen Fälle ab; der zweite Wert ist ein Teilstring des App-Namens, Groß- und Kleinschreibung ist egal.
windowrule = float, Calculator # startet schwebend
windowrule = tile, Preview # wird immer gekachelt
windowrule = ignore, Karabiner-Elements # wird nie angefasst
windowrule = master, iTerm2 # wird immer das Hauptfenster
windowrule = workspace, Mail, 4 # landet auf Arbeitsfläche 4
windowrule = center, Mail # weitere Fenster schweben mittig
Zusatzfenster mittig statt gekachelt
Manche Programme öffnen zu ihrem Hauptfenster kurzlebige Zusatzfenster – das Fenster für eine neue E-Mail ist das bekannteste. Ohne Regel bekäme es eine eigene Kachel, und alle anderen Fenster rückten für eine Minute zusammen.
Mit windowrule = center, <App> wird das erste Fenster des Programms wie
gewohnt gekachelt. Jedes weitere, das danach aufgeht, bleibt schwebend und
landet in der Mitte des Bildschirms, auf dem es sich geöffnet hat. Die übrigen
Kacheln bewegen sich nicht, die Größe des Fensters bleibt, wie das Programm sie
gewählt hat.
Eine automatische Erkennung gibt es bewusst nicht: Ein Verfassen-Fenster und ein zweites Hauptfenster sehen für einen Fenstermanager gleich aus – und ein zweites Terminal- oder Browserfenster soll ja gerade gekachelt werden.
Arbeitsflächen
Kachelwerk bringt eigene virtuelle Arbeitsflächen mit. Sie haben nichts mit den Spaces von macOS zu tun – und genau deshalb funktionieren sie ohne Umschaltanimation und ohne Mission Control.
SUPER+1…0wechselt auf Arbeitsfläche 1 bis 10SUPERSHIFT+1…0nimmt das fokussierte Fenster mitSUPER+Tabspringt zur nächsten belegten Arbeitsfläche
Wie das Verstecken funktioniert
Fenster einer inaktiven Arbeitsfläche müssen irgendwo hin. Dafür gibt es zwei
Verfahren, umschaltbar über hide_strategy:
| Wert | Verfahren | Vorteil | Nachteil |
|---|---|---|---|
offscreen (Standard) | Fenster werden weit außerhalb aller Bildschirme geparkt | Sofort, ohne Animation, Inhalte laufen weiter | Stürzt Kachelwerk ab, bleiben sie draußen – ein Neustart holt sie zurück |
minimize | Fenster werden ins Dock minimiert | Übersteht einen Absturz | Langsamer, sichtbare Animation, Videos pausieren |
Scratchpad
Eine unsichtbare Ablage für Fenster, die man griffbereit, aber nicht im Weg
haben will. SUPER SHIFT + S legt das fokussierte Fenster hinein,
SUPER + S blendet die Ablage ein und wieder aus.
Mehrere Bildschirme
Jedes Fenster wird dem Bildschirm zugeordnet, mit dem es sich am stärksten überlappt – nicht dem, auf dem zufällig sein Ursprungspunkt liegt. Das ist der Unterschied, der bei einem halb über die Kante geschobenen Fenster zählt. Die Layout-Berechnung läuft danach einmal pro Bildschirm: jeder Schirm hat sein eigenes Hauptfenster und seine eigene Aufteilung. Für Fenster, die weit außerhalb geparkt wurden, greifen zwei Rückfallebenen.
Ein Layout je Bildschirm
Unter Menüleiste → Displays stehen alle angeschlossenen Bildschirme, jeweils
mit dem Layout, das dort gerade gilt. Jeder Bildschirm folgt ab Werk dem
Standard-Layout; wer will, gibt ihm ein eigenes – etwa grid auf dem
eingebauten Display und master-left auf dem großen Monitor.
displays {
dell-u2720q = master-left
integriertes-retina-display = grid
}
Wird ein Monitor an- oder abgesteckt, kachelt Kachelwerk nach etwa einer halben Sekunde neu. Die Fenster des abgezogenen Monitors landen auf dem übrigen Bildschirm und werden mit dessen Layout angeordnet; kommt der Monitor zurück, kommt sein Layout mit.
Das Menüleisten-Menü
Kachelwerk hat kein Dock-Symbol und kein Hauptfenster – es lebt ausschließlich in der Menüleiste. Das Symbol zeigt das aktive Layout und wird zu einem Pause-Zeichen, sobald das Kacheln ausgeschaltet ist oder die Berechtigung fehlt.
┌──────────────────────────────────────────┐
│ Kachelwerk — 4 Fenster · Arbeitsfläche 2 │
├──────────────────────────────────────────┤
│ ☑ Kacheln aktiv │
│ Layout ▸ │
│ Displays ▸ │
│ Tastenkürzel-Profil ▸ │
│ Arbeitsflächen ▸ │
├──────────────────────────────────────────┤
│ Konfiguration ▸ │
│ Anleitung │
│ Keybindings │
├──────────────────────────────────────────┤
│ Kachelwerk beenden │
└──────────────────────────────────────────┘
Enthält die Konfigurationsdatei Fehler, erscheint zusätzlich ein Eintrag
⚠︎ n Konfigurationswarnung(en), der jede fehlerhafte Zeile mit Zeilennummer
auflistet.
Das Fenstermenü am gelben Knopf
Bleibt der Zeiger einen Moment auf dem gelben Knopf eines Fensters stehen, öffnet Kachelwerk ein eigenes Menü mit den Aktionen für genau dieses Fenster:
| Eintrag | Wirkung |
|---|---|
| Zum Hauptfenster machen | tauscht dieses Fenster mit dem Hauptfenster |
| Mit Fenster darüber tauschen | tauscht die Plätze nach oben |
| Auf die linke / rechte Seite | schiebt das Fenster in die jeweilige Spalte |
| Schwebend / gekachelt | nimmt das Fenster aus der Kachelung heraus oder zurück hinein |
| Vollbild · Zentrieren | wie die gleichnamigen Befehle |
| Auf nächste / vorige Arbeitsfläche | verschiebt das Fenster |
| Fenster schließen | schließt es |
Rechts in jeder Zeile steht das Tastenkürzel, das denselben Befehl auslöst –
abgeleitet aus der tatsächlichen Belegung. Ohne Maus öffnet SUPER + A das
Menü; die Pfeiltasten wählen, ⏎ führt aus, ⎋ schließt.
Warum der gelbe und nicht der grüne Knopf: Auf dem grünen zeigt macOS sein eigenes Kachel-Menü, und das lässt sich nicht abschalten. Ein Klick auf den gelben Knopf legt das Fenster weiterhin ins Dock – das Menü erscheint nur beim Verweilen.
Das Master-Abzeichen
In den Layouts mit Hauptfenster trägt dieses ein schwebendes Abzeichen mitten
auf seiner Titelleiste – standardmäßig ★ Master. Es ist nicht nur Anzeige,
sondern anklickbar:
| Geste | Wirkung |
|---|---|
| Linksklick | Das nächste Fenster aus dem Stapel wird Hauptfenster, das bisherige geht ans Ende |
| ⌥ + Linksklick | dasselbe rückwärts – nimmt genau einen Klick zurück |
| ⇧ + Linksklick | Das zuletzt fokussierte Fenster wird Hauptfenster |
| Rechtsklick | Menü: Hauptfenster wählen, fixieren, Master-Anteil, Layout |
Der Platz des Hauptfensters ändert sich beim Durchreichen nicht, nur sein
Inhalt – Klick, Klick, Klick reiht die Fenster durch, ohne dass die Hand
wandert. Hauptfenster fixieren (master { pinned }) hält den Platz fest:
ein neu geöffnetes Fenster übernimmt ihn dann nicht mehr.
Das Abzeichen liegt auf der Titelleiste und verschluckt auf seiner Fläche das
Ziehen des Fensters. Wer das nicht will, macht es mit
master_badge_interactive = false wieder zur reinen Anzeige oder blendet es mit
master_badge = false aus.
Dashboard und Markierung
SUPER+Oöffnet das Dashboard: eine Vorschau aller Kacheln, in der sich die Anordnung umstellen lässt. Angewendet wird erst mit „Fertig".SUPERSHIFT+Nlegt einen farbigen Ring um das zuletzt geöffnete Fenster – hilfreich, wenn ein neues Fenster irgendwo einsortiert wurde.
Fernsteuerung und MCP-Server
Kachelwerk nimmt Befehle auch von außen an: über Adressen der Form
kachelwerk://dispatch/…, über ein Raycast-Paket – und über einen
MCP-Server, mit dem ein KI-Assistent die Fensteranordnung lesen und Fenster
anordnen kann. Der MCP-Server ist ab Werk abgeschaltet. Alles dazu unter
Fernsteuerung & MCP-Server.
Grenzen auf macOS
Der Fenstermanager von macOS lässt sich nicht ersetzen, nur fernsteuern. Diese Tabelle sagt offen, wo die Grenze verläuft.
| Funktion | Status | Grund bzw. Ersatz |
|---|---|---|
| Fenster kacheln, verschieben, skalieren | ✅ | Über die Bedienungshilfen-API |
| Globale Tastenkürzel | ✅ | Ein CGEventTap fängt die Taste ab, bevor die App sie sieht |
| Virtuelle Arbeitsflächen | ✅ | Eigene Umsetzung, nicht die Spaces des Systems |
| Mehrere Bildschirme | ✅ | Zuordnung nach größter Überlappung, Berechnung je Schirm |
| Fensterrahmen, Ecken, Schatten | ❌ | Zeichnet der WindowServer – kein Zugriff über eine API |
| Echte Transparenz oder Weichzeichner je Fenster | ❌ | Nur die App selbst kann das für ihre Fenster festlegen |
Pseudo-Tiling (pseudo) | ❌ | Setzt einen eigenen Compositor voraus |
| Spaces des Systems steuern | ❌ | Keine öffentliche API – Kachelwerk bringt eigene Arbeitsflächen mit |
| Fenster im nativen Vollbild kacheln | ❌ | Diese liegen auf einem eigenen Space und werden übersprungen |
| Systemeinstellungen kacheln | ❌ | Die App erzwingt ihre Größe selbst; sie steht in ignore_apps |
| Fenstertitel ändern | ❌ | AXTitle ist bei fremden Prozessen schreibgeschützt – deshalb kennzeichnet ein schwebendes Abzeichen das Hauptfenster |
Fenster mit der Maus verschieben (bindm) | ⚠️ | Die Konfigurationszeile wird gelesen, die Mausgeste fehlt noch |
| Animationen | ⚠️ | Kachelwerk interpoliert selbst – macOS animiert Fremdfenster nicht |
Kürzel ändern ohne Texteditor
Wer keine Konfigurationsdatei anfassen will, ändert jedes Kürzel direkt in der
App: Menüleiste → Keybindings → Zeile auswählen → „Bearbeiten …". Der Dialog
zeichnet den Tastendruck auf, meldet Konflikte mit bereits belegten
Kombinationen und schreibt anschließend die passende bind-Zeile in die
Konfigurationsdatei. Beide Wege führen also zur selben Datei – die Oberfläche
ist eine Schreibhilfe, keine zweite Quelle der Wahrheit.
Unter der Haube
| Kennzahl | Wert |
|---|---|
| Sprache | Swift 6.2 |
| Oberfläche | SwiftUI + AppKit |
| Swift-Dateien | 130 |
| Codezeilen | rund 17.400 |
| Testfälle | 702, laufen headless in Millisekunden |
| Speicherbedarf der App | ca. 8 MB |
Der Kern liegt in einem eigenen Modul ohne einen einzigen AppKit-Import. Die Layout-Berechnungen sind reine Funktionen ohne gespeicherten Zustand – auch das scrollende Band berechnet seinen Versatz bei jedem Durchlauf neu, statt ihn aufzuaddieren. Deshalb driftet nichts nach einem Bildschirmwechsel, und deshalb laufen alle Tests ohne Bildschirm, ohne Freigabe und ohne App-Bundle.