Overview
You will learn
Section titled “You will learn”- How to react to window events with hooks
- How to compose layouts with combinators
- How to create custom actions and IPC commands
- How to build full extensions with the engine pipeline
This section teaches you to extend Shoji beyond its built-in features. By the end, you’ll be able to automate window behavior, compose purpose-specific layouts, add custom keybindings, and build extensions that participate in Shoji’s engine pipeline.
Prerequisites
Section titled “Prerequisites”Before starting:
- Shoji installed and running (Installation)
- Basic Lua knowledge (variables, functions, tables)
- A text editor for writing Lua files
How these guides connect
Section titled “How these guides connect”Guides 1 and 2 are independent entry points. Start with whichever matches your interest:
- Interested in automating behavior? Start with Guide 1 (Hooks)
- Interested in layout composition? Start with Guide 2 (Combinators)
Guides 3 and 4 build on earlier material:
Guide 1: Hooks ─────────┐ │Guide 2: Combinators │ ↓ Guide 3: Actions & commands ↓ Guide 4: ExtensionsThe guides
Section titled “The guides”Guide 1: Reacting to events with hooks
Section titled “Guide 1: Reacting to events with hooks”Respond to window events and manipulate state. You’ll build a window activity monitor that logs events, shows app-specific alerts, and auto-floats dialog-sized windows.
What you’ll build: A hook-based system that auto-floats dialogs and monitors window activity.
Guide 2: Composing layouts with combinators
Section titled “Guide 2: Composing layouts with combinators”Build purpose-specific layouts by combining existing ones. You’ll create an adaptive layout that switches between Monocle and Tall based on window count, and an IDE layout using Partition.
What you’ll build: Two composed layouts using IfMax and Partition.
Familiarity with: Built-in layouts (Tall, Monocle, Column).
Guide 3: Custom actions and commands
Section titled “Guide 3: Custom actions and commands”Add new keybindings and external control points. You’ll build a “focus or launch” action, workspace presets, and a custom IPC command.
What you’ll build: Custom actions bound to hotkeys and an IPC command callable from shell scripts.
Requires: Guide 1.
Guide 4: Building an extension
Section titled “Guide 4: Building an extension”Build a complete extension that participates in Shoji’s engine pipeline. You’ll create a display profiles extension that automatically reconfigures layouts when you dock or undock your laptop.
What you’ll build: A full extension with engine event handlers, intent interception, file persistence, and proper teardown.
Requires: Guides 1 and 3.
Reference material
Section titled “Reference material”After completing the guides, use these references:
- Hooks reference — Canonical hook list and signatures
- Actions reference — All built-in actions
- IPC reference — Complete IPC command reference
- Extensions recipe — Extension patterns and examples
- Partition — Partition combinator reference
- IfMax — IfMax combinator reference
Testing your work
Section titled “Testing your work”Throughout these guides, you’ll test changes in Hammerspoon:
- Save your configuration file
- Reload Hammerspoon from the menu bar (Reload config) or run
hs.reload()in the Hammerspoon console - Check the console for output and errors (menu bar > Console)
Keep the console open while developing to catch errors early.