How Slow-Path Dispatch Works in the Omarchy CLI: A Complete Technical Breakdown
The Omarchy CLI uses a two-stage dispatch system where the slow-path fallback dynamically discovers commands by scanning script metadata when fast-path lookup fails.
Omarchy's command-line interface implements a two-stage dispatch mechanism that balances speed for common operations with flexibility for extensions. Understanding how slow-path dispatch works in the Omarchy CLI reveals the architectural decisions that let users add commands without modifying core files. This article examines the implementation details in bin/omarchy and the surrounding script ecosystem.
Fast-Path vs. Slow-Path: The Dispatch Architecture
The Omarchy CLI evaluates every invocation through two distinct stages:
- Fast-path – Immediate lookup in the static
GROUP_DESCRIPTIONStable - Slow-path – Dynamic discovery by parsing script metadata across
bin/
Only when the fast-path fails does the dispatcher engage slow-path dispatch. This design keeps routine commands snappy while preserving extensibility.
The Fast-Path Foundation
In bin/omarchy, the GROUP_DESCRIPTIONS table provides O(1) command resolution. When you run omarchy toggle touchpad, the dispatcher checks this pre-computed mapping:
# Fast-path execution — no file scanning required
$ omarchy toggle touchpad
# Sources bin/omarchy-toggle-touchpad immediately
Commands found here execute without additional filesystem operations.
How Slow-Path Dispatch Engages
The slow-path dispatch activates when any of these conditions occur:
- The command is missing from
GROUP_DESCRIPTIONS - The command is marked
hidden=truein the static table - The script name uses a non-standard naming convention
- The command belongs to an optional group added at runtime
Step-by-Step Slow-Path Execution
The slow-path implementation follows this sequence:
-
Directory scan — The dispatcher iterates through all
bin/omarchy-*files -
Metadata extraction — It invokes
omarchy-cmd-presenthelpers to parse script headers -
Hidden flag detection — The parser checks for
# omarchy:hiddendirectives in comment blocks -
Description parsing — Command descriptions are extracted from header comments
-
Fuzzy matching — The dispatcher searches for loose name matches against the user input
-
Execution or error — On match, the script is sourced; otherwise, the "unknown command" help displays
This process is inherently slower due to multiple file reads and parsing operations, but it only runs when necessary.
Practical Code Examples
Discovering Hidden Commands
Hidden commands—those intentionally omitted from GROUP_DESCRIPTIONS—require slow-path dispatch:
# Slow-path: hidden command discovery
$ omarchy hidden secret-feature
# CLI scans all bin/* scripts, parses headers, finds match, executes
Adding Commands Without Core Modifications
The slow-path enables zero-downtime extension:
# Create a new command script with metadata header
$ echo '# omarchy:hidden=false' > bin/omarchy-mygroup-newcmd
$ chmod +x bin/omarchy-mygroup-newcmd
# Immediate availability via slow-path — no GROUP_DESCRIPTIONS edit needed
$ omarchy mygroup newcmd
The new command works instantly because the slow-path scanner discovers it dynamically.
Key Implementation Files
Understanding slow-path dispatch requires familiarity with these source files:
| File | Function in Dispatch |
|---|---|
bin/omarchy |
Contains GROUP_DESCRIPTIONS table and fast-path logic; implements fallback to slow-path |
bin/omarchy-* |
Individual command scripts with parseable metadata headers |
AGENTS.md |
Documents the command-group architecture governing dispatch behavior |
docs/testing.md |
Houses test coverage for both dispatch paths |
The dispatcher in bin/omarchy orchestrates the transition between paths. When fast-path lookup returns no result, control flows to the slow-path routine that leverages omarchy-cmd-present utilities for metadata extraction.
Performance Characteristics
| Aspect | Fast-Path | Slow-Path |
|---|---|---|
| Time complexity | O(1) | O(n) — scales with script count |
| Filesystem operations | None | Multiple reads per script |
| Use case | Standard commands | Hidden, optional, or new commands |
| Flexibility | Fixed at startup | Runtime extensible |
The Omarchy CLI optimizes for the common case: most daily operations hit the fast-path and execute instantly. The slow-path trade-off—accepting latency for flexibility—only affects edge cases.
Design Rationale: Why Two Paths?
The dual-path architecture serves competing requirements:
- Speed — Core commands must feel instantaneous
- Extensibility — Users need to add functionality without forking
- Hidden features — Some commands exist but shouldn't clutter help output
- Optional components — Plugin-like groups may or may not be present
Slow-path dispatch resolves this tension. It keeps the critical path minimal while providing an escape hatch for everything else.
Summary
- Slow-path dispatch activates when fast-path lookup fails in
bin/omarchy - It dynamically discovers commands by scanning and parsing
bin/omarchy-*script metadata - The
omarchy-cmd-presenthelpers extract hidden flags and descriptions from header comments - Users can add commands without editing
GROUP_DESCRIPTIONS—the slow-path finds them automatically - Performance cost is isolated to rare invocations; common commands remain O(1)
Frequently Asked Questions
What triggers slow-path dispatch in Omarchy?
Slow-path dispatch triggers when a command is absent from the GROUP_DESCRIPTIONS table, marked as hidden, or uses a non-standard naming convention. Any fast-path lookup failure automatically invokes the dynamic discovery mechanism.
How does omarchy-cmd-present work?
The omarchy-cmd-present utilities parse script header comments to extract metadata directives like # omarchy:hidden. These helpers enable the slow-path to build a runtime catalogue of available commands without requiring a central registry.
Can I disable slow-path dispatch for performance?
No—the slow-path is a hardcoded fallback in bin/omarchy. However, you can ensure your commands use the fast-path by adding them to GROUP_DESCRIPTIONS with hidden=false. This requires editing the core dispatcher but eliminates scanning overhead.
What's the performance difference between paths?
Fast-path executes in constant time with zero filesystem operations. Slow-path scales linearly with the number of scripts in bin/, performing multiple reads and parses. In practice, this difference is only perceptible when invoking rarely-used or newly-added commands.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →