Skip to content

y3owk1n/mimi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

120 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

mimi

macOS windows and spaces. From the terminal.

Go Version License Early Development


Screen.Recording.2026-06-09.at.1.59.38.PM.mov

You already know your way around a terminal. Why are you still reaching for the trackpad just to move a window?

mimi gives you one-shot commands to jump spaces, move windows, cycle focus, and resize — bind them to hotkeys, drop them in dotfiles, wire them to shell hooks. No SIP disable. No tiling paradigm to learn. Just commands that do what they say.

mimi action space 2                      # jump to space 2
mimi action move_window_to_space next    # throw window forward
mimi action resize_window left-half      # tile left
mimi action focus_window                 # cycle focus

Early development — config format, CLI, and behavior may change between releases.


Install

brew tap y3owk1n/tap
brew install --cask y3owk1n/tap/mimi

Grant Accessibility in System Settings → Privacy & Security → Accessibility, then start using it immediately. No daemon required.

Other options (Nix flake, build from source) → Installation Guide


What mimi does

You want to… Command
Jump to a specific space mimi action space <n>
Jump to next / previous space mimi action space next / prev
Move frontmost window to a space mimi action move_window_to_space <n|next|prev>
Cycle focus between windows mimi action focus_window
Cycle focus backward mimi action focus_window --backward
Focus window to the left mimi action focus_window --left
Focus window to the right mimi action focus_window --right
Focus window above mimi action focus_window --up
Focus window below mimi action focus_window --down
Tile window to a preset mimi action resize_window <left-half|right-half|center|fill>
Center at specific size mimi action resize_window center --width-percent 80 --height-percent 90
Resize to exact pixels mimi action resize_window --width 1024 --height 768
Resize anchored to a corner mimi action resize_window --width 1024 --height 768 --anchor br

Full reference → CLI Guide


Bind to hotkeys

Every action is a plain shell command. Drop it into whatever hotkey tool you already use.

skhd — the natural pairing if you're in the yabai ecosystem:

# ~/.skhdrc
alt - 2         : mimi action space 2
alt - n         : mimi action space next
alt - p         : mimi action space prev
shift + alt - l : mimi action resize_window right-half
shift + alt - h : mimi action resize_window left-half
shift + alt - m : mimi action move_window_to_space next
shift + alt - f : mimi action focus_window

Raycast — create a Script Command pointing to any mimi action … line.

Alfred — wire up a Shell Script workflow step, same idea.

Karabiner, Hammerspoon, BetterTouchTool — if it can run a shell command on a keypress, mimi works with it.


Fits where you are

mimi doesn't tile your layout, enforce window rules, or replace Mission Control. It's not trying to.

yabai and AeroSpace are excellent — and a significant commitment. If you've tried them and found it was more than you needed, or if you just want to stay on native macOS Spaces and drive them faster, mimi is for you.


Optional: daemon + hooks

Start the daemon and mimi can react to what's happening on screen — fire a shell command whenever a window focuses, a space changes, or an app launches.

mimi config init   # creates ~/.config/mimi/config.toml
mimi start
mimi status        # verify everything's running

Edit ~/.config/mimi/config.toml:

[systray]
enabled = true
show_workspace_number = true   # current space number in your menu bar

[hooks]
on_window_focus      = ['echo "$mimi_APP_NAME — $mimi_WINDOW_TITLE"']
on_workspace_changed = ['~/.config/sketchybar/plugins/space.sh']
on_app_launch        = ['osascript -e "display notification \"$mimi_APP_NAME launched\""']

The [systray] block shows the active space number in your menu bar while the daemon runs — no extra setup.

Available hooks

Event Hook key Needs Accessibility
App activated on_app_activate Yes
App deactivated on_app_deactivate Yes
App launched on_app_launch No
App quit on_app_quit No
App hidden / unhidden on_app_hide / on_app_unhide Yes
Window focused on_window_focus Yes
Window title changed on_window_title_change Yes
Window opened / closed on_window_created / on_window_closed Yes
Window resized on_window_resize Yes
Active space changed on_workspace_changed No

Hooks support app/title filters, async execution, and per-hook timeouts. Full details → Configuration Guide

Daemon commands

mimi start                  # start the hook daemon
mimi stop                   # stop it
mimi status                 # check daemon state and permissions
mimi config validate        # validate config before reloading
mimi config reload          # hot-reload config (no restart needed)
mimi services install       # auto-start at login via launchd
mimi services uninstall     # remove the launchd agent

Auto-start setup → Installation Guide — launchd


How it works

Space switching uses a synthetic dock-swipe gesture — the same path Mission Control uses, no hacks. Window-to-space moves use the private SkyLight API for instant, animation-free relocation. Everything else goes through public Accessibility APIs.

CLI actions  →  action handler  →  AX API + SkyLight

daemon  →  observe events  →  event bus  →  your shell hooks
                                    ↓
                             menu bar (optional)

Architecture Guide


Documentation

Guide What's in it
Installation Homebrew, Nix, source, permissions, launchd
CLI Every command and flag
Configuration Hooks, env vars, systray, all settings
Architecture How the pieces fit
Troubleshooting Common issues and fixes
Contributing PRs and bug reports

Contributing

just build && just lint && just test

Development Guide


From the same workshop

mimi's window management and space-switching code was part of neru — a broader tool for navigating your entire screen without touching the mouse.

Where mimi is focused on moving and resizing windows, neru covers the rest: labels on every clickable element, recursive grid navigation, vim-style scrolling — the kind of thing Vimium does in a browser, but system-wide.

If you find yourself still reaching for the mouse inside apps, neru is the natural next step.

brew install --cask y3owk1n/tap/neru

License

MIT — see LICENSE.


Try it. Two commands and you're running.

brew install --cask y3owk1n/tap/mimi && mimi action space next

Made with ❤️ by y3owk1n

About

macOS windows and spaces. From the terminal.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Sponsor this project

 

Packages

 
 
 

Contributors