This is a modular Hammerspoon configuration for macOS automation, providing window management, application launching, media controls, and system automation through keyboard shortcuts.
⌃⌘⌥R: Reload Hammerspoon configuration⌃⌘⌥H: Open Hammerspoon console⌃⌘⌥D: Toggle the supported home/office second external input (DisplayPort 1/HDMI 1)⌃⌘⌥L: Repair display layout⌃⌥⌘N: Toggle notch hider overlay
⌃⌥ARROWS: Half-screen positioning⌃⌥⇧ARROWS: Quarter-screen positioning⌃⌥Return: Maximize window⌃⌥C: Center window⌃⌥O: Restore original position
⌘⌥C: Visual Studio Code⌘⌥Q: QQ⌘⌥W: WeChat⌘⌥D: DingTalk⌘⌥G: Google Chrome⌘⌥F: Finder⌘⌥H: HammerspoonF10: WezTerm
⌘⌃⌥←/→: Previous/Next track⌘⌃⌥Space: Play/Pause⌘⌃⌥↑/↓: Volume control
Button2(middle click): Mission Control outside browsers; native browser middle-click inside browsersButton3: Switch Space forwardButton4: Switch Space backward
Mouse buttons are implemented by synthesizing keystrokes via hs.eventtap.
This setup defaults to using Fn+Ctrl as the modifier chord because on this
machine Ctrl+Arrow synthesized events do not reliably trigger macOS Mission
Control/Space switching shortcuts.
Browser middle-click is intentionally left to Chrome, Edge, and Safari. It keeps native tab close and background-link-open behavior. Hammerspoon cannot reliably allow the browser to consume link clicks while reclaiming unconsumed middle-click events on page background for Mission Control fallback.
Some mouse drivers can emit repeated otherMouseDown events during a press/hold.
The mouse module suppresses duplicate injections within a short window to avoid
accidental double space-switches.
- System overviews:
docs/SystemArchitecture.md,docs/ConfigurationSystem.md,docs/ModuleSystem.md - Module and utility summaries:
docs/modules/*.md - Diagrams: system-level in
docs/*.puml, module-specific indocs/modules/diagrams/
Validate PlantUML files with plantuml --check-syntax <diagram-path>.
config_loader.lua- Centralized configuration managementinit_system.lua- Module registration and dependency managementlogger.lua- Centralized logging system
window_management.lua- Magnet-style window positioningapp_launcher.lua- Fast application launchingmedia_controls.lua- Media and system controlsdisplay_layout.lua- Repair external display layout viadisplayplacerand toggle the supported home/office second external input viam1ddcmouse_management.lua- Mouse and input device managementwifi_automation.lua- Network automation and monitoringkeystroke_visualizer.lua- KeyCastr functionalitywindow_expose.lua- Window expose (lazy-loaded)notch_hider.lua- Menu-bar notch masking with canvas overlay and rounded corners
app_utils.lua- Application management utilitiesdisplay_utils.lua- Multi-monitor display utilitiesnotification_utils.lua- System notification utilitieswindow_utils.lua- Window manipulation utilities
hotkeys.lua- Central hotkey definitionsdisplay_layout.lua- Displayplacer profiles for screen layout repair plus supported home/office second externalm1ddcinput toggleapplications.lua- Application configurationskeycastr.lua- KeyCastr settingswifi.lua- WiFi automation settingsvisual.lua- Visual configuration- Announcement policy:
hotkeys.announcementstoggles module-level toast overlays handled byutils/hotkey_utils
- Modular Architecture: Clean separation of concerns with dependency management
- Configuration Management: Centralized settings with hot reloading
- Lazy Loading: Performance-optimized loading of heavy modules
- Cross-Display Support: Sophisticated multi-monitor window management
- Smart Edge Detection: Intelligent window positioning at screen boundaries
~/.hammerspoon/
├── init.lua # Main configuration
├── core/ # Core system modules
├── modules/ # Feature modules
├── utils/ # Utility modules
├── config/ # Configuration files
└── docs/ # Documentation (plus PlantUML diagrams in docs/diagrams/)
- Hammerspoon for macOS
- macOS 10.12 or later
- Location services access (for WiFi automation)
- Use the logger system for all modules
- Register modules with the init system
- Keep configuration in separate config files
- Use lazy loading for heavy operations
- Follow established naming conventions
For detailed documentation, see the docs/ summaries and accompanying diagrams.
AI-specific instructions and context are in AGENTS.md.