omacosy README

The project's README from github.com/paulsp94/omacosy. As one markdown file: README.md.

omacosy

omakase + macOS + cosy. An omarchy-style setup for macOS: tiling window management with a real Super key and Hyprland's dwindle layout, a status bar built for it (bar, popups, sliders and screen dimming in one process), focus follows mouse, trackpad workspace swipes, a Mission-Control-style workspace overview with live previews, focused-window border rings, and one theme switch that covers everything down to the wallpaper. All of it installs from this one repo.

The omacosy desktop — themed bar over the osaka-jade wallpaper

The whole environment idles at about 157MB of memory. Numbers per process in Memory use.

Most of it is seven small signed binaries (Swift and C) built by the installer, because several of the existing tools are broken on macOS 26. The details are under What's inside.

Built for macOS 26 (Tahoe) on one desk: a MacBook Pro plus one external display. It tries to generalize (display roles instead of hardware names, per-display notch detection), but so far it has only run on this machine. The permission setup is real work. Issues and PRs welcome; support promises are not made.

Fresh Mac

git clone https://github.com/paulsp94/omacosy.git ~/.local/share/omacosy &&
cd ~/.local/share/omacosy && ./install.sh

The clone location matters. Configs are symlinked into the repo, and macOS privacy (TCC) blocks launchd services from reading ~/Documents, ~/Desktop and ~/Downloads. If you clone there anyway, the installer falls back to copying configs; that still works, but edits then need an install.sh re-run to apply.

The installer is idempotent. It installs Homebrew if missing, runs brew bundle, compiles the helper binaries, generates the AeroSpace config from your app choices, symlinks configs (backing up anything it would replace), hides the native menu bar, applies the default theme, and starts the services.

See Permissions for the grants it asks of you, what each one is used for, and what breaks without it. Karabiner-Elements also asks you to approve its driver extension.

Updating

omacosy-update          # pull, then re-run the installer
omacosy-update --check  # just say whether there is anything new

install.sh rebuilds only the binaries whose sources changed and restarts their agents, so an update is a pull plus a re-run, and this command wraps both. It refuses a clone with local edits, and refuses one whose branch has diverged, rather than deciding either for you.

There is no background update check. The bar makes exactly one network call (the weather), and a daemon polling GitHub on a timer would quietly make that two. Nothing here contacts the network unless you run it.

Permissions

A window manager needs broad permissions, so here is the whole list: every grant, which binary asks, what it is used for, and what you lose by refusing it. Everything is refusable; the parts that depend on a grant hide themselves rather than half-work.

Grant Who asks What it does Without it
Accessibility AeroSpace or OmniWM, omacosy-gesture, omacosy-bar (reads the focused app's menus for the app-pill popup), omacosy-ffm (AeroSpace mode only) Move, resize and focus other apps' windows. This is the tiling itself, and it is the broadest permission here. Nothing tiles. Not optional in practice.
Input Monitoring Karabiner-Elements, omacosy-gesture (and OmniWM, under that option) Karabiner reads keys to remap Caps Lock; omacosy-gesture reads raw trackpad contacts, because macOS 26 stopped carrying touch data in normal events. No Super key, no swipe gestures.
Screen Recording omacosy-overview Captures a thumbnail per window for the overview cards, including windows the window manager has stashed offscreen. A screenshot of the visible screen could not see those. Cards fall back to app icons and titles.
Bluetooth omacosy-bar Reads adapter power and the paired-device list for the bluetooth pill and its menu. The pill hides itself.
Location omacosy-bar Reads only the wi-fi network's name, which macOS classes as location data. No coordinate is ever requested; the authorisation itself is what unlocks CWInterface.ssid(). The wi-fi popup's title row reads "wi-fi" instead of your network's name. Everything else is unaffected.
Automation omacosy-bar, theme-set Apple Events to Spotify (what is playing; play/pause/next from the media pill) and to System Events (sleep, lock and restart from the Apple menu; setting the wallpaper). The media pill hides; those menu rows do nothing.
Files and Folders omacosy-bar Only if your clone lives in ~/Documents, ~/Desktop or ~/Downloads. The bar reads its palette from the theme directory inside the repo, and macOS walls launchd agents off from those folders. The bar hangs at startup waiting on the prompt. Clone to ~/.local/share/omacosy and this never comes up.

More on Location, because it sounds worse than it is: it buys exactly one string. The bar requests authorisation and then reads ssid(). It never asks for a position, holds no coordinate and starts no location updates. Two things are required and neither alone is enough: measured on macOS 26.3, an unbundled binary reads nil however it is authorised, which is why the bar ships inside a minimal .app. Refuse the grant and you lose the name, nothing else.

What it does not do

Grants are tied to a binary's code signature. With an Apple Development identity present, install.sh signs every helper with a stable identifier so rebuilds keep their grants; without one, macOS treats each rebuild as a new app and you re-grant after every install.

App choices

Keybindings launch apps defined in config/apps.conf. Defaults are Ghostty, Safari, Spotify, Slack (terminal, browser, music, messenger). Override any of them in config/apps.local.conf (gitignored), then re-run install.sh:

# config/apps.local.conf — your picks win over apps.conf
TERMINAL=Korren
BROWSER=Arc

Your personal shell config belongs in ~/.zshrc.local; the repo's zshrc wires the CLI stack and sources it.

What's inside

Piece Tool Config
Tiling WM AeroSpace or OmniWM via omacosy-wm-switch config/aerospace/aerospace.template.toml, config/omniwm/settings.toml
Super key Karabiner (Caps Lock → cmd+ctrl+alt) config/karabiner/ (copied, not symlinked — TCC)
Status bar, popups, shade omacosy-bar (self-compiled launchd agent, one process draws all of it) helper/bar.swift
Window borders + fullscreen shroud omacosy-borders (self-compiled launchd agent) helper/borders.swift, config/borders.conf
Focus follows mouse omacosy-ffm (self-compiled launchd agent; parked under OmniWM, whose native ffm takes over) helper/ffm.swift, config/ffm-ignore
Trackpad gestures omacosy-gesture (self-compiled launchd agent; engine absorbed from aerospace-swipe, MIT) helper/gesture/, config/gesture/ (live copy: ~/.config/omacosy/gesture.json)
Workspace overview omacosy-overview (self-compiled resident daemon) helper/overview.swift
Dwindle split direction AeroSpace: on-focus-changed hook running omacosy-helper split-hint; OmniWM: native dwindle + a preselect in omacosy-spawn (omarchy's right/below insertion) config/aerospace/aerospace.template.toml, helper/main.swift
Workspace / window navigation omacosy-ws, omacosy-cycle, omacosy-float, omacosy-wm-switch; under OmniWM all of it rides omacosy-omni, a held-socket IPC client bin/, helper/gesture/omniwm.c
Terminal look & spawn size Ghostty (hidden titlebar; new windows spawn small so tiling never flashes full-screen) config/ghostty/config
Park/restore the stack omacosy-toggle bin/omacosy-toggle
System glue omacosy-helper (self-compiled) helper/main.swift
Prompt starship config/starship.toml
Shell zsh zsh/zshrc + your ~/.zshrc.local
CLI stack fzf, eza, zoxide, ripgrep, bat, lazygit, btop wired in zsh/zshrc

Why so much of it is self-built:

The bar

One process draws all of it: bar, popups and sliders are surfaces of helper/bar.swift. Transparent bar, everything a flat radius-4 pill. A popup stays open while the pointer is anywhere in the bar or the popup, and closes when it is in neither. The bar hides itself when a window takes the whole display, and comes back if you put the pointer on the very top edge, so brightness and volume stay reachable mid-film without leaving fullscreen. The climb happens only when a fullscreen window actually covers the bar — otherwise the top edge belongs to the auto-hidden native menu bar, which reveals ABOVE the bar and stays clickable (app menus were unreachable before that fix). It drops back behind everything when the pointer leaves. Under OmniWM the bar simply stays visible in its reserved strip and never plays this game.

If the native menu bar ever gets stuck revealed over the bar (a Tahoe bug, most often poked by a Focus mode's menu-bar icon), killall SystemUIServer resets it.

Workspace icons

You can set workspace icons in the optional ~/.config/omacosy/workspace-icons.conf file. Each non-comment line has one workspace name, an equals sign, and either one Unicode scalar or a reverse-DNS application bundle identifier.

1 = ★
14 = ◆

4 = com.apple.Safari

The bar first uses a configured icon. It then uses the icon of the sole app on that workspace, and finally shows the workspace's last digit. Exact workspace names win. In this example, workspace 14 uses ◆, not the 4 shorthand. The shorthand applies only to multi-digit, all-numeric workspace names ending in 1 through 9 when they have no valid exact declaration.

The bar reads the file once at startup. To apply an edit, restart it with:

launchctl kickstart -k "gui/$(id -u)/com.omacosy.bar"

Malformed lines are logged and ignored. A well-formed bundle identifier that does not resolve to an installed app is unavailable. It blocks shorthand for that exact workspace, then the bar falls back to the sole app or the digit. Image paths are unsupported because the bar resolves configured app icons at startup and does no config-file or image-file I/O while it draws.

Keybindings — Super = hold Caps Lock

Karabiner remaps Caps Lock to cmd+ctrl+alt (a combo macOS never uses), so omarchy's scheme works letter-for-letter without breaking typing or app shortcuts. Caps Lock tapped alone is Escape.

Chord Action
Navigation
Super+1..9 switch to this display's workspace N
Super+tab / Super+shift+tab next / previous workspace, within this display's set
Super+b back and forth between the last two workspaces
Alt+tab / Alt+shift+tab cycle windows on this workspace, floats included
Ctrl+Alt+tab cycle focus between displays
Super+arrows focus the window in that direction
Super+s surface the next floating window (and bring the cursor)
Moving windows
Super+shift+arrows AeroSpace: move the window in that direction. OmniWM: swap tiles (ctrl+opt+shift+arrows stacks into the neighbor as a group instead)
Super+shift+1..9 move the window to workspace N and follow it
Super+shift+o throw the window to the same slot on the other display
Super+shift+space throw the WHOLE workspace to the other display
Layout
Super+w close window
Super+t toggle floating
Super+j toggle split direction
Super+- / Super+= resize
Super+f fullscreen — on notched displays the camera strip is blacked out so it reads as true fullscreen, while the window stays in its workspace (swipes still reach it)
Super+n native macOS fullscreen (a separate Space — outside the workspace model, avoid unless an app needs it)
Super+r resize mode (h/j/k/l, -/=, esc) — AeroSpace only; OmniWM has no binding modes
Super+shift+; service mode (esc reload, r flatten, ⌫ close others)
Apps and system
Super+enter / Super+shift+enter terminal / browser
Super+space launcher (Raycast; the OmniWM option opens OmniWM's command palette instead)
Super+shift+f / +m / +g files / music / messenger (set in apps.conf)
Super+shift+t next theme
Super+shift+b next wallpaper of the current theme
Super+shift+l lock the screen
Super+k keybinding cheatsheet (this table, rendered from the config)

The keybinding cheatsheet — every binding, parsed from aerospace.toml

Screenshots, clipboard and app switching stay macOS's own (Cmd+Shift+3/4/5, Cmd+C/V, Cmd+Tab). Alt+Tab above is the window-scoped switcher macOS lacks.

On the modifier space. omarchy layers Super+Ctrl and Super+Alt on top of Super. This setup cannot: Super IS cmd+ctrl+alt, so those modifiers are already spent and Shift is the only layer left, two against omarchy's four. Bindings that would collide are re-homed by mnemonic (lock is Super+Shift+L, not Super+Ctrl+L), and the overflow lives in binding modes instead.

Each display owns an independent set of nine workspaces, omarchy style: main holds 1–9, secondary holds 11–19. Same last digit means the same slot, and the bar and overview render only the slot digit. Super+N switches the focused monitor's slot N (via omacosy-ws); Super+Shift+N moves the window to that slot; Super+Shift+O throws the window to the same slot on the other monitor. Windows open on the workspace you're on; nothing is auto-assigned by app.

**U

omacosy (paulsp94/omacosy)

Searching Database…

这是什么?omacosy 是一套 omarchy 风格的 macOS 桌面环境配置,提供真正的平铺式窗口管理(类 Hyprland 的 dwindle 布局)、自定义状态栏、真正的 Super 键、焦点跟随鼠标、触控板工作区滑动和实时工作区总览,全部从一个仓库安装。
这是要下载的应用,还是要安装的配置仓库?它是一个 dotfiles 风格的配置仓库,不是打包好的 .app:install.sh 把配置以符号链接的方式接入你的主目录,并编译若干小型 Swift/C 辅助二进制,随后它们作为 launchd 代理运行。
怎么让它跑起来?克隆仓库(避免放在 ~/Documents、~/Desktop 或 ~/Downloads,因为 macOS TCC 会阻止 launchd 服务访问这些文件夹),然后运行 install.sh;它是幂等的,编辑或更新之后可以重复运行。
需要先装 Homebrew 或 Karabiner 吗?如果 Homebrew 缺失,install.sh 会自动安装并运行 brew bundle;Karabiner-Elements 作为 Homebrew 依赖被带入,纯粹用于把 Caps Lock 重映射为 Super,它也是这里唯一以 root 权限运行的部分。
它能在任意 Mac 上日常使用了吗?该项目尚未到 1.0,而且只在作者的一台 MacBook Pro 外接显示器、运行 macOS 26(Tahoe)的配置上运行过;它力求通用,但没有声称经过更广泛的硬件测试,也不做出支持承诺。
必须是 Apple Silicon 吗,Intel Mac 行不行?README 只确认在 MacBook Pro 的 macOS 26(Tahoe)上测试过;项目说明指明需要 Apple Silicon,且未提及任何 Intel 兼容性。
这里面有组件会偷偷联网上报吗?不会发送任何遥测、分析或崩溃报告;omacosy 自身唯一发起的网络调用,是为状态栏定期获取天气——它根据你的 IP 推断所在城市,不收集任何坐标。
为什么这么多部件都是自建的,而不是用 AutoRaise 或 JankyBorders 这类现成工具?多个现有 macOS 窗口管理工具在 macOS 26 上出了问题——AutoRaise 失去了协作激活,aerospace-swipe 再也收不到多点触控数据——而 JankyBorders 每个窗口要占用数百 MB 内存,所以 omacosy 用 omacosy-ffm、omacosy-gesture、omacosy-borders 等小型自研 Swift/C 辅助程序替代了它们。
整套配置占用多少内存?整个环境空闲时仅占用约 157MB,分布在多个自建的小型 Swift/C launchd 代理上,远低于它所替代的那些工具。
如果跳过安装 Karabiner-Elements 会怎样?你会失去重映射的 Super 键(Caps Lock),但其余一切——平铺、状态栏、手势、总览——都照常工作;Karabiner 是整个技术栈中唯一以 root 身份运行的组件。
可以更改快捷键启动的应用吗?可以——默认是 Ghostty、Safari、Spotify 和 Slack,你可以在 config/apps.local.conf(已被 gitignore)中覆盖其中任意一项,然后重新运行 install.sh 使更改生效。
Creator
paulsp94
Size
24.3 MB
Stars
693
Updated
CommitOct 16
Age
2mo
Commits · 90 Days