Build anything you can imagine and launch it with a keystroke. Martillo is a powerful actions launcher for macOS powered by Hammerspoon. Create custom actions, automate repetitive tasks, and access everything through a command palette with fuzzy search.
Your productivity hub, your way. An open-source alternative to Raycast and Alfred with no vendor lock-in, zero dependencies, and full configuration through a single Lua file. Write your own actions, use ready-made bundles, customize every keybinding, add aliases for lightning-fast access, and share your creations freely. All configuration lives in a single file, inspired by lazy.nvim's declarative plugin system.
Screen.Recording.2025-11-14.at.06.41.37.mp4Core Capabilities:
- ⚡ Fast & Lightweight: Pure Lua, zero dependencies, no compilation needed
- 🎯 Command Palette: Searchable actions with fuzzy search
- 🚀 App Launcher: Quick switching between apps with single hotkey
- 🌐 Browser Routing: Smart URL routing to different browsers based on patterns
- 🔄 Auto-Open on Load: ActionsLauncher opens automatically when Hammerspoon loads
Window Management - Complete keyboard-driven positioning:
- Maximize, Almost Maximize (90%), Reasonable Size (70%), Center
- Halves (left, right, top, bottom)
- Quarters (all four corners)
- Thirds (horizontal and vertical, including two-thirds combinations)
Clipboard History - Never lose copied content:
- Persistent clipboard with fuzzy search
- Support for text, images, and files with file size and line count display
- Enter to paste, Shift+Enter to copy only
Process Killer - Manage running processes:
- Fuzzy search through running processes with app icons
- Shows memory and CPU usage
- Enter to kill, Shift+Enter to copy PID
Smart Converters - Live transformation with visual previews:
- ⏰ Time Converter (Unix ↔ ISO ↔ Relative)
- 🎨 Color Converter (HEX ↔ RGB with color preview)
- 🔐 Base64 (Encode/decode)
- 🔑 JWT Decoder
System Information - Real-time system monitoring:
- CPU usage and load average
- Memory usage and pressure
- Battery/Power status
- Network upload/download speeds
- Auto-refreshing every 2 seconds
Keyboard Actions:
- 🔒 Lock Keyboard (for cleaning, unlock with <leader>+Enter)
- ⏰ Keep-Alive (simulate activity to keep screen active)
Text Utilities:
- 📊 Word Count (characters, words, sentences, paragraphs with real-time updates)
- 🔑 Generate UUID
Network Utilities:
- 🌐 IP Geolocation
- 📡 Network Speed Test
Screen Effects:
- 🎉 Confetti animation
- 📏 Screen ruler
Utilities:
- ☕ Toggle Caffeinate (prevent sleep)
- 🌓 Toggle Dark/Light Mode
Browser Management:
- 🔗 Safari tab switcher
Calendar Integration:
- 📅 Today's events in menu bar with countdown timers
- Clickable meeting URLs for quick joining
Use <leader> as a placeholder in any keybinding. It expands to your configured leader_key:
The central command palette with all your actions. Martillo automatically loads all built-in bundles and store actions:
Action Fields:
- keys - Keybindings for direct access
- alias - Short name for faster fuzzy search
- desc - Optional description for the keybinding
Note: All bundles from bundle/ and custom actions from store/ are automatically loaded. You don't need to manually import them!
- bundle.window - Window positioning (halves, quarters, thirds, maximize, center) - 25 actions total
- bundle.system - System management (caffeinate, dark mode, system information)
- bundle.utilities - Text utilities (UUID generation, word count)
- bundle.converter - Converters (time, colors, base64, JWT)
- bundle.keyboard - Keyboard actions (lock, keep-alive)
- bundle.clipboard_history - Clipboard manager with history
- bundle.kill_process - Process killer with fuzzy search
- bundle.network - Network utilities (IP geolocation, speed test)
- bundle.safari_tabs - Safari tab switcher
- bundle.screen - Screen effects (confetti, ruler)
- bundle.martillo - Martillo management (reload, update)
The store/ directory is for custom actions that extend Martillo. All actions in store/ are automatically loaded - just drop a new folder with an init.lua file and it's ready to use!
Example Store Structure:
Each action module should return an array of actions, just like bundles. Custom icons placed in store folders will override default icons with the same name.
See store/README.md for details on creating custom actions.
Quick app switching with single hotkeys:
Calendar integration in menu bar:
Smart URL routing to different browsers:
- Search: Type to fuzzy search actions and aliases
- Enter: Execute selected action
- ESC: Close launcher
- Shift+ESC: Close all pickers
- Type: Filter results in real-time
- Enter: Execute action (paste, convert, etc.)
- Shift+Enter: Alternate action (copy only, etc.)
- DELETE/ESC (empty query): Navigate back to parent
- Shift+ESC: Close all pickers
Create a new file in the bundle/ directory for core actions:
Create a new folder in store/ with an init.lua file for custom actions:
That's it! The store auto-loader will automatically discover and load your action. No need to manually import it - just drop a new folder in store/ and use it in your config:
Contributions welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create feature branch (git checkout -b feature/AmazingFeature)
- Commit changes (git commit -m 'Add AmazingFeature')
- Push to branch (git push origin feature/AmazingFeature)
- Open Pull Request
- Raycast - Inspiration for the launcher UX and workflow philosophy
- Hammerspoon - The powerful macOS automation tool that makes this possible
- lazy.nvim - Inspiration for declarative config style
- 3dicons.co - Beautiful 3D icon collection
.png)

