Omacosy: Een desktopomgeving in omarchy-stijl voor macOS
De volledige omgeving verbruikt in rust ongeveer 157 MB aan geheugen (gebaseerd op de 'Memory use' per proces).
Het grootste deel bestaat uit vijf kleine, ondertekende Swift-binaries die door de installer worden gebouwd, omdat diverse bestaande tools niet correct werken op macOS 26. Details hierover zijn te vinden onder het kopje "Wat zit erin".
De software is gebouwd voor macOS 26 (Tahoe) op een setup bestaande uit een MacBook Pro en één extern scherm. Hoewel er geprobeerd is om het te generaliseren (door gebruik te maken van display-rollen in plaats van hardwarenamen en per scherm notch-detectie), is het tot nu toe alleen op deze machine getest. De configuratie van machtigingen vereist aanzienlijk werk. Issues en PR's zijn welkom, maar er worden geen garanties geboden voor support.
Installatie
Voor een schone Mac:
git clone https://github.com/paulsp94/omacosy.git ~/.local/share/omacosy &&
cd ~/.local/share/omacosy && ./install.sh
De locatie van de clone is belangrijk. Configuraties worden via symlinks in de repo geplaatst, en macOS privacy-instellingen (TCC) blokkeren launchd-services die proberen ~/Documents, ~/Desktop of ~/Downloads te lezen. Als u toch op die locaties clonet, valt de installer terug op het kopiëren van configuraties; dit werkt nog steeds, maar wijzigingen vereisen dan een opnieuw uitvoeren van install.sh om toegepast te worden.
De installer is idempotent. Hij installeert Homebrew indien deze ontbreekt, voert brew bundle uit, compileert de helper-binaries, genereert de AeroSpace-configuratie op basis van uw app-keuzes, maakt symlinks van configuraties (terwijl bestaande bestanden worden gebackupt), verbergt de native menubalk, past het standaardthema toe en start de services.
Zie de sectie "Machtigingen" voor de benodigde rechten, waarvoor ze worden gebruikt en wat er gebeurt als u deze weigert. Karabiner-Elements vraagt daarnaast om goedkeuring voor de driver-extensie.
Bijwerken
omacosy-update: Voert een pull uit en draait vervolgens de installer opnieuw.omacosy-update --check: Controleert alleen of er nieuwe updates beschikbaar zijn.
install.sh bouwt alleen de binaries opnieuw waarvan de broncode is gewijzigd en start hun agents opnieuw. Daarom is een update een combinatie van een pull en een re-run, wat door dit commando wordt afgehandeld. Het commando weigert updates bij lokale wijzigingen in de clone of wanneer de branch is gedivergeerd.
Er is geen automatische updatecheck op de achtergrond. De statusbar maakt precies één netwerkverbinding (voor het weer). Een daemon die op een timer GitHub zou pollen, zou dit aantal onnodig verhogen. Niets in deze software maakt verbinding met het netwerk tenzij u dit zelf start.
Machtigingen
Een window manager heeft uitgebreide machtigingen nodig. Hieronder volgt de volledige lijst:
| Machtiging | Wie vraagt dit? | Wat doet het? | Gevolg bij weigering |
|---|---|---|---|
| Accessibility | AeroSpace, AerospaceSwipe, omacosy-ffm | Vensters van andere apps verplaatsen, schalen en focussen. Dit is de kern van de tiling. | Tiling werkt niet. In de praktijk niet optioneel. |
| Input Monitoring | Karabiner-Elements, AerospaceSwipe | Karabiner leest toetsen om Caps Lock te hermappen; AerospaceSwipe leest ruwe trackpad-contacten, omdat macOS 26 geen touch-data meer doorgeeft in normale events. | Geen Super-toets, geen swipe-gebaren. |
| Screen Recording | omacosy-overview | Maakt thumbnails per venster voor de overzichtskaarten, inclusief vensters die AeroSpace buiten het scherm heeft geplaatst. | Kaarten vallen terug op app-iconen en titels. |
| Bluetooth | omacosy-bar | Leest de adapterstatus en de lijst met gekoppelde apparaten voor de bluetooth-indicator en het menu. | De indicator verbergt zichzelf. |
| Location | omacosy-bar | Leest uitsluitend de naam van het wifi-netwerk (wat macOS classificeert als locatiegegevens). Er worden nooit coördinaten opgevraagd. | De titelrij van de wifi-popup toont "wi-fi" in plaats van de netwerknaam. |
| Automation | omacosy-bar, theme-set | Apple Events naar Spotify (wat er speelt; play/pause/next) en System Events (slapen, vergrendelen en herstarten; behang instellen). | De media-indicator verdwijnt; menu-opties doen niets. |
| Files and Folders | omacosy-bar | Alleen nodig als de clone in ~/Documents, ~/Desktop of ~/Downloads staat. De bar leest het palet uit de themamap in de repo. | De bar blijft bij opstarten hangen. Clone naar ~/.local/share/omacosy om dit te voorkomen. |
Aanvullende opmerking over Locatie: Het gaat hier uitsluitend om één string. De bar vraagt autorisatie en leest vervolgens ssid(). Er worden geen posities opgevraagd, geen coördinaten opgeslagen en geen locatie-updates gestart. Op macOS 26.3 leest een ongebundlede binary nil, ongeacht de autorisatie, waardoor de bar als een minimale .app wordt verzonden.
Wat het niet doet
- Geen telemetrie, geen analytics, geen crash-rapportage. Er worden geen gegevens over u of uw machine verzonden.
- Er is slechts één netwerkoproep:
https://wttr.in/?format=j1op een lange timer voor de weer-indicator.wttr.inleidt uw stad af uit het IP-adres; er worden geen coördinaten verzonden. Verwijder de weer-indicator en er verlaat niets de machine. - De eigen binaries van omacosy draaien nooit als root.
install.shgebruikt geensudo, installeert geen LaunchDaemon, en elke helper draait als de huidige gebruiker in de login-sessie. - Karabiner-Elements draait wel als root. Dit is een Homebrew-afhankelijkheid, puur om Caps Lock om te zetten naar Super. Het bevat een DriverKit system extension en daemons die als root draaien. Dit is het meest bevoorrechte onderdeel van deze repo. Sla dit over als u dit niet wilt; u verliest dan de Super-toets, maar behoudt de rest.
- Niets in deze software leest uw toetsaanslagen. Geen enkele omacosy-binary opent een keyboard event tap. Alleen Karabiner ziet toetsen (nodig voor remapping). De event tap van AerospaceSwipe is alleen voor gebaren en is 'listen-only', waardoor het geen toetsaanslagen kan zien of wijzigen. Debug-logs bevatten venstertitels, app-namen en workspace-nummers, nooit invoer.
Machtigingen zijn gekoppeld aan de code-signature van een binary. Met een Apple Development-identiteit tekent install.sh elke helper met een stabiele identifier, zodat machtigingen behouden blijven bij herbouw. Zonder deze identiteit ziet macOS elke herbouw als een nieuwe app en moet u de machtigingen opnieuw verlenen.
App-keuzes
Sneltoetsen starten apps die zijn gedefinieerd in config/apps.conf. De standaardwaarden zijn:
- Terminal: Ghostty
- Browser: Safari
- Muziek: Spotify
- Messenger: Slack
U kunt deze overschrijven in config/apps.local.conf (gitignored), waarna u install.sh opnieuw moet uitvoeren:
# config/apps.local.conf
TERMINAL=Korren
BROWSER=Arc
Uw persoonlijke shell-configuratie hoort in ~/.zshrc.local; de zshrc van de repo verbindt de CLI-stack en roept dit bestand aan.
Wat zit erin
| Onderdeel | Tool | Configuratie |
|---|---|---|
| Tiling WM | AeroSpace | config/aerospace/aerospace.template.toml |
| Super-toets | Karabiner (Caps Lock → cmd+ctrl+alt) | config/karabiner/ (gekopieerd, geen symlink) |
| Statusbar, popups, shade | omacosy-bar (zelf-gecompileerde launchd agent) | helper/bar.swift |
| Window borders + fullscreen shroud | omacosy-borders (zelf-gecompileerde launchd agent) | helper/borders.swift, config/borders.conf |
| Focus follows mouse | omacosy-ffm (zelf-gecompileerde launchd agent) | helper/ffm.swift, config/ffm-ignore |
| Trackpad swipes | aerospace-swipe + patch | config/aerospace-swipe/config.json, patches/ |
| Workspace overview | omacosy-overview (zelf-gecompileerde resident daemon) | helper/overview.swift |
| Dwindle split direction | on-focus-changed hook → omacosy-helper split-hint | config/aerospace/aerospace.template.toml, helper/main.swift |
| Workspace / window navigatie | omacosy-ws, omacosy-cycle, omacosy-float | bin/ |
| Stack parkeren/herstellen | omacosy-toggle | bin/omacosy-toggle |
| Systeem-glue | omacosy-helper (zelf-gecompileerd) | helper/main.swift |
| Prompt | starship | config/starship.toml |
| Shell | zsh | zsh/zshrc + ~/.zshrc.local |
| CLI stack | fzf, eza, zoxide, ripgrep, bat, lazygit, btop | Geconfigureerd in zsh/zshrc |
Waarom zoveel zelfgebouwde software?
- AutoRaise werkte niet meer op macOS 26, dus
omacosy-ffmfocust vensters via dezelfde SkyLight-aanroepen die AeroSpace gebruikt. - aerospace-swipe was kapot omdat CGEvent taps geen multi-touch data meer doorgaven. De gepatchte versie leest ruwe
MultitouchSupportframes. - JankyBorders verbruikt honderden MB's omdat het per venster een bitmap bijhoudt.
omacosy-borderstekent éénCAShapeLayerdie door de WindowServer wordt gerasterd, aangestuurd door SkyLight-notificaties. - Mission Control kan de virtuele workspaces van AeroSpace niet zien, dus
omacosy-overviewmoet deze zelf vastleggen. - omacosy-helper regelt het instellen van het behang (omdat System Events scripting in macOS 14+ gedeeltelijk kapot is), CoreAudio output switching, IOBluetooth-bediening, cursorpositie, notch-detectie per scherm en de dwindle split hint.
- omacosy-bar houdt het window-model in het geheugen en schrijft zich in op systeem-publishers: SkyLight voor vensterwijzigingen, IOBluetooth voor verbindingen, SCDynamicStore voor netwerk, IOPS voor batterij, CoreAudio voor volume, DisplayServices voor helderheid en Spotify voor de track. Er wordt niets gepolld wat macOS niet zelf aankondigt; de enige timers zijn voor het weer en de klok.
De statusbar
Eén proces tekent alles: de bar, popups en sliders. De bar is transparant en elk element is een platte 'pill' met een radius van 4.
- Gedrag: Een popup blijft open zolang de cursor in de bar of de popup is. De bar verbergt zichzelf bij fullscreen vensters, maar verschijnt weer als u de cursor naar de bovenrand beweegt (vergelijkbaar met de native menubalk).
- Apple menu: Over, Systeeminstellingen, Vergrendelen, Slapen, Herstarten, Uitschakelen en Volgende Thema.
- Workspaces: Eén gesegmenteerde capsule per monitor; accent-pill op de actieve workspace; klikken om te springen.
- Media: Vorige / Play-Pause / Volgende + tracktitel (Spotify). Centraal op platte schermen, links op schermen met een notch.
- Bluetooth: Apparaatmenu (klik om te verbinden/ontkoppelen) en aan/uit-schakelaar.
- WiFi: De pill is alleen het icoon; de popup toont de netwerknaam, IP, router, signaalsterkte, linkrate, beveiligingsgeneratie en kanaal.
- Weer: Via
wttr.in, met een gecachte details-popup. - Volume: Scrollen past het volume aan, klikken opent de slider en het output-apparaatmenu, rechtsklikken muteert.
- Helderheid: Scrollen past de helderheid aan, klikken opent een slider. Scrollen onder de 0 activeert een 'shade' die het scherm dimt door gamma te schalen, zodat screenshots normaal blijven en externe schermen (zonder backlight API) ook gedimd kunnen worden.
- Overig: Batterij, Klok (met kalender-popup) en Activiteit (floating
btop). - Floats: Verschijnt alleen als de workspace floating vensters bevat; klikken brengt het volgende venster naar voren.
Sneltoetsen (Super = Caps Lock ingedrukt)
Karabiner mapt Caps Lock naar cmd+ctrl+alt (een combinatie die macOS nooit gebruikt), zodat het omarchy-schema letterlijk overgenomen kan worden. Caps Lock kort aanraken werkt als Escape.
| Combinatie | Actie |
|---|---|
| Navigatie | |
| Super + 1..9 | Schakel naar workspace N van dit scherm |
| Super + tab / Super + shift + tab | Volgende / vorige workspace op dit scherm |
| Super + b | Wissel tussen de laatste twee workspaces |
| Alt + tab / Alt + shift + tab | Cycle door vensters op deze workspace (incl. floats) |
| Ctrl + Alt + tab | Wissel focus tussen displays |
| Super + pijlen | Focus op het venster in die richting |
| Super + s | Breng het volgende floating venster naar voren |
| Vensters Verplaatsen | |
| Super + shift + pijlen | Verplaats venster in die richting |
| Super + shift + 1..9 | Verplaats venster naar workspace N en volg het |
| Super + shift + o | Verplaats venster naar dezelfde slot op het andere scherm |
| Super + shift + space | Verplaats de HELE workspace naar het andere scherm |
| Layout | |
| Super + w | Sluit venster |
| Super + t | Toggle floating |
| Super + j | Toggle split-richting |
| Super + - / Super + = | Schalen (resize) |
| Super + f | Fullscreen (op notched displays wordt de camerastrook zwart gemaakt) |
| Super + n | Native macOS fullscreen (apart Space) |
| Super + r | Resize-modus (h/j/k/l, -/=, esc) |
| Super + shift + ; | Service-modus (esc reload, r flatten, $\text{backspace}$ close others) |
| Apps en Systeem | |
| Super + enter / Super + shift + enter | Terminal / Browser |
| Super + space | Launcher (Raycast) |
| Super + shift + f / + m / + g | Bestanden / Muziek / Messenger (instelbaar in apps.conf) |
| Super + shift + t | Volgende thema |
| Super + shift + l | Scherm vergrendelen |
| Super + k | Sneltoets-overzicht (deze tabel) |
Opmerking: Screenshots, klembord en app-switching blijven macOS-standaard (Cmd+Shift+3/4/5, Cmd+C/V, Cmd+Tab).
Workspaces en Displays
Elk scherm heeft een onafhankelijke set van negen workspaces: het hoofdscherm heeft 1–9, het secundaire scherm 11–19. Super+N schakelt naar slot N van de gefocuste monitor.
Bij het ontkoppelen van een extern scherm worden de workspaces 11–19 gevouwen in het eerste scherm. omacosy-ws-collapse zorgt ervoor dat bezette gast-workspaces worden verplaatst naar de laagste vrije 1–9 slots. Bij het opnieuw aansluiten van het scherm keren de vensters individueel terug naar hun oorspronkelijke plek.
Thema's
theme-set <naam> schakelt alles tegelijk om: bar, borders, behang op elk scherm en elke terminal die de omarchy-conventie volgt. Super+Shift+T cycleert door de thema's.
Beschikbare thema's: tokyo-night, catppuccin, gruvbox, osaka-jade. Elk thema bevat een colors.toml (palet van 22 kleuren), configuraties voor de bar en ring, en achtergrondafbeeldingen.
Tiling: Dwindle
AeroSpace plaatst nieuwe vensters standaard als gelijke 'siblings' (drie vensters worden drie kolommen). De 'dwindle'-layout splitst het gefocuste venster langs de langste zijde: een nieuw venster komt naast een breed venster en onder een hoog venster.
Omdat AeroSpace geen geometrie in zijn configuratietaal ondersteunt, wordt de richting bepaald in code. Een on-focus-changed hook voert omacosy-helper split-hint uit, die het frame van het gefocuste venster leest en aerospace split horizontal of vertical aanroept.
Floats: Omdat macOS vensters niet 'pinned' kan houden boven andere apps zonder SIP uit te schakelen, groeit de statusbar met een pill wanneer er floating vensters aanwezig zijn. Super+S of een klik op die pill brengt het volgende floating venster naar voren.
Focus follows mouse & Swipes
- omacosy-ffm: Hoveren focust het venster, maar brengt het niet naar voren boven floating vensters. Het is event-driven; een geparkeerde cursor steelt geen focus van een startend venster. Hoveren over een Touch ID-prompt verandert de focus niet. Uitsluitingen per app staan in
config/ffm-ignore. - Swipes: 4-vinger swipes links/rechts schakelen workspaces op het scherm onder de cursor. De native 4-vinger gebaren van macOS worden uitgeschakeld via
macos-defaults.shom conflicten te voorkomen.
Workspace Overzicht
Een 4-vinger swipe omhoog activeert het overzicht. Het behang trekt zich terug achter een donkere waas en elke niet-lege workspace van de huidige monitor krijgt een kaart met live venster-previews (via ScreenCaptureKit), app-iconen en een accent-ring op de gefocuste workspace.
Kaarten kunnen versleept worden om de volgorde te reorganiseren. Omdat AeroSpace workspaces niet kan hernoemen of herpositioneren, worden bij het verslepen van een kaart de vensters erin verplaatst.
De setup parkeren
omacosy-toggle off brengt de Mac terug naar de standaard staat in één commando (AeroSpace stopt, alle daemons en de bar stoppen) zonder alles te verwijderen. omacosy-toggle on activeert alles weer.
Geheugengebruik
De totale fysieke voetafdruk is ongeveer 157 MB over WM, bar, drie achtergrond-daemons, de swipe-daemon en Karabiner.
| Proces | Footprint | RSS |
|---|---|---|
| omacosy-overview | 36 MB | 46 MB |
| omacosy-bar | 32 MB | 55 MB |
| AeroSpace | 24 MB | 85 MB |
| Karabiner (4 proc.) | 24 MB | 61 MB |
| omacosy-borders | 19 MB | 29 MB |
| aerospace-swipe | 13 MB | 22 MB |
| omacosy-ffm | 10 MB | 24 MB |
Terug naar een normale Mac
Voer ./uninstall.sh uit. De installatie is manifest-gestuurd: install.sh legt vast wat er precies is toegevoegd (Homebrew packages, cloned repos, originele waarden van defaults keys), en uninstall.sh verwijdert en herstelt exact deze zaken. Tools en instellingen die u al had vóór omacosy blijven onaangetast.
Licentie & Credits
MIT (zie LICENSE). Gebaseerd op:
- omarchy: Het concept, thema-paletten en wallpapers.
- AeroSpace, Karabiner-Elements, aerospace-swipe (MIT; gepatcht voor macOS 26).
Groetjes,