{"slug": "hammerspoon", "name": "Hammerspoon", "category": "productivity", "category_name": "Productivity", "description": "Open-source macOS automation tool scripted in Lua, bridging system APIs to user scripts.", "recommenders": 14, "commenters": 23, "warners": 0, "score": 14.766, "rising": -1.93, "first": "2025-11-08", "latest": "2026-09-19", "why": "Loved for scriptable window management and hotkeys, plus on-screen overlays and event-driven Mac automation written in Lua.", "why_is_quote": false, "has_verdict": true, "sentiment": {"recommend": 14, "neutral": 9, "compare": 0, "warn": 1}, "spark": [0, 0, 1, 0, 8, 1, 1, 1, 0, 0, 2, 0], "listed": true, "loved": ["Window management", "Screen overlays"], "caveat": "Steep ramp-up", "short_quote": "I'm now happy with hotkeys in Hammerspoon that reposition and resize the current window to one of these presets", "icon": true, "domain": null, "github_repo": "github.com/peterklijn/hammerspoon-shiftit", "official_url": "https://www.hammerspoon.org/", "pricing": "open source", "aliases": ["Hammerspoon"], "verdict": [{"text": "Loved for scriptable window management and hotkeys", "cites": [{"id": 758053104, "item_id": 47378319, "url": "https://news.ycombinator.com/item?id=47378319", "by": "hibbelig", "date": "2026-03-14", "stance": "recommend", "quote": "I'm now happy with hotkeys in Hammerspoon that reposition and resize the current window to one of these presets", "excerpt": "I used to be a fan of tiling window managers, but I found out that I tend to use fairly visually heavy apps on a Mac. By this I mean apps that need quite a bit of screen real estate to show everything that needs to be shown: The mail program has a folder tree on the left, the list of messages in the center, and the current message on the right. The IDE has all these tool windows that need showing, in addition to the ", "context": "Mac user", "use_case": "window positioning hotkeys", "switched_from": "tiling window managers", "story": "Hammerspoon"}, {"id": 757966080, "item_id": 47372880, "url": "https://news.ycombinator.com/item?id=47372880", "by": "msephton", "date": "2026-03-13", "stance": "recommend", "quote": "implement a keyboard based window manager", "excerpt": "I use it to: - implement a keyboard based window manager - arrange/quit/launch some things based on whether my MBP is docked or not - resize and reposition certain windows that don't remember their own size and position - certain other hotkeys - probably stuff I forgot and rely on! I'll be sad when it moves from Lua to JavaScript, but I guess that's better than moving to Tcl.", "context": "MBP user", "use_case": "window management and hotkeys", "switched_from": "", "story": "Hammerspoon"}, {"id": 757990944, "item_id": 47374434, "url": "https://news.ycombinator.com/item?id=47374434", "by": "pazimzadeh", "date": "2026-03-14", "stance": "recommend", "quote": "I love Hammerspoon!!", "excerpt": "I love Hammerspoon!! here's my one handed shortcuts for window control across multiple monitors: https://gist.github.com/pazimzadeh/b1c70f5f205d0b63264e7c0213ef7afc What will v2 enable??", "context": "", "use_case": "window control across multiple monitors", "switched_from": "", "story": "Hammerspoon"}, {"id": 757897824, "item_id": 47368614, "url": "https://news.ycombinator.com/item?id=47368614", "by": "trjordan", "date": "2026-03-13", "stance": "recommend", "quote": "I utterly love Hammerspoon.", "excerpt": "I utterly love Hammerspoon. It's fun to combine with qmk [0], which gives you a bunch more options for hotkeys on your keyboard via layers. I've ended up with a layer where half the keyboard is Hammerspoon shortcuts directly to apps (e.g. go to Slack, to Chrome, etc.) and half of it is in-app shortcuts (like putting cmd-number on the home row, for directly addressing chrome tabs). Between this and one of the tiling w", "context": "", "use_case": "app shortcuts and navigation", "switched_from": "", "story": "Hammerspoon"}]}, {"text": ", plus on-screen overlays and event-driven Mac automation written in Lua.", "cites": [{"id": 765142016, "item_id": 47821376, "url": "https://news.ycombinator.com/item?id=47821376", "by": "noahkirsch", "date": "2026-04-18", "stance": "recommend", "quote": "I made a config with hammerspoon that makes the border of my screen glow orange when claude code is waiting for my input.", "excerpt": "I'm not sure how much this resonates with others. But I have a bad habit where I use Claude Code, then immediately tab out to doomscroll Youtube shorts, completely unaware of when Claude Code is hanging waiting for my next input. No more! I made a config with hammerspoon that makes the border of my screen glow orange when claude code is waiting for my input. It clears when I take the next action in the terminal. It's", "context": "", "use_case": "notify when Claude Code awaits input", "switched_from": "", "story": "I made Claude Code at least 30% more efficient (for me anyway)"}, {"id": 757994416, "item_id": 47374651, "url": "https://news.ycombinator.com/item?id=47374651", "by": "xendipity", "date": "2026-03-14", "stance": "recommend", "quote": "only hs had the ability to render custom panes over maximized windows.", "excerpt": "Excited to see this here! Only yesterday I used it to create an interactive native-like notification my coding agents use to ping me when they push a PR. I had tried a few different libraries over the past month but only hs had the ability to render custom panes over maximized windows. Will be using it for more automation tools moving forward.", "context": "", "use_case": "notifications from coding agents", "switched_from": "", "story": "Hammerspoon"}, {"id": 757907504, "item_id": 47369219, "url": "https://news.ycombinator.com/item?id=47369219", "by": "alexfortin", "date": "2026-03-13", "stance": "neutral", "quote": "I use it to enable/disable the wifi when I disconnec/connect the macbook to a specific usb hub", "excerpt": "I use it to enable/disable the wifi when I disconnec/connect the macbook to a specific usb hub with ethernet connection: local usbWatcher = hs.usb.watcher.new(function(device) if device.productName == \"EMEET SmartCam C960\" then if device.eventType == \"added\" then hs.execute(\"networksetup -setairportpower en0 off\") hs.notify.new({title=\"Wi-Fi\", informativeText=\"Disabled (USB device connected)\"}):send() elseif device.e", "context": "macOS user", "use_case": "toggle wifi on USB hub", "switched_from": "", "story": "Hammerspoon"}, {"id": 746603969, "item_id": 46662748, "url": "https://news.ycombinator.com/item?id=46662748", "by": "wlonkly", "date": "2026-01-17", "stance": "recommend", "quote": "controlled by a Hammerspoon[2] script[3] that calls its CLI on the appropriate display events", "excerpt": "I have the 27\" from that series. In my experience, after I fixed the RGB issue, I also fixed the flickering issue. And to fix the RGB issue, I used BetterDisplay[1], controlled by a Hammerspoon[2] script[3] that calls its CLI on the appropriate display events. The free version of BetterDisplay is sufficient, I really don't use any of its other features. The flickering seems to be gamma related, and is triggered by Ni", "context": "Dell monitor user on macOS", "use_case": "automating display fixes", "switched_from": "", "story": "Dell UltraSharp 52 Thunderbolt Hub Monitor"}, {"id": 770224642, "item_id": 48139040, "url": "https://news.ycombinator.com/item?id=48139040", "by": "iLemming", "date": "2026-05-14", "stance": "recommend", "quote": "Wondrous piece on its own, it is Lua-enabled", "excerpt": "> what the other parts are Of course I can't explain in detail in a single comment everything I listed, besides, that's just a subset of things I do through Emacs. Sometimes I want to kick off a process in the external terminal - long-lived processes are better handled that way. Kitty has remote protocol. I needed bidirectionally - being able to pipe into and from an arbitrary Emacs buffer to and from the terminal, s", "context": "Mac user", "use_case": "window management on Mac", "switched_from": "", "story": "The Emacsification of Software"}]}, {"text": " Complaints are few: one commenter found it had fewer batteries included and a steeper ramp-up than AutoHotkey", "cites": [{"id": 733762145, "item_id": 45860134, "url": "https://news.ycombinator.com/item?id=45860134", "by": "al_borland", "date": "2025-11-08", "stance": "warn", "quote": "it felt more like fewer batteries were included, which made the ramp up seem steeper.", "excerpt": "The only thing I really miss at work after moving from Windows to macOS is AutoHotKey. I tried Hammerspoon. I thought having a more normal language (lua) would make it easier, but it felt more like fewer batteries were included, which made the ramp up seem steeper. Trivial things in AHK seemed like they needed a lot of extra supporting functions to enable it in HS. Some rose colored glasses could be involved here as ", "context": "moved from Windows to macOS at work", "use_case": "macOS automation", "switched_from": "AutoHotkey", "story": "Ask HN: Windows/Linux software that has no real equivalent on macOS?"}]}, {"text": ", and another regretted the planned move from Lua to JavaScript.", "cites": [{"id": 757966080, "item_id": 47372880, "url": "https://news.ycombinator.com/item?id=47372880", "by": "msephton", "date": "2026-03-13", "stance": "recommend", "quote": "implement a keyboard based window manager", "excerpt": "I use it to: - implement a keyboard based window manager - arrange/quit/launch some things based on whether my MBP is docked or not - resize and reposition certain windows that don't remember their own size and position - certain other hotkeys - probably stuff I forgot and rely on! I'll be sad when it moves from Lua to JavaScript, but I guess that's better than moving to Tcl.", "context": "MBP user", "use_case": "window management and hotkeys", "switched_from": "", "story": "Hammerspoon"}]}], "praise": [{"label": "Window management", "summary": "Commenters use it to build keyboard-driven window positioning, resizing and layouts.", "quotes": [{"id": 758053104, "item_id": 47378319, "url": "https://news.ycombinator.com/item?id=47378319", "by": "hibbelig", "date": "2026-03-14", "stance": "recommend", "quote": "I'm now happy with hotkeys in Hammerspoon that reposition and resize the current window to one of these presets", "excerpt": "I used to be a fan of tiling window managers, but I found out that I tend to use fairly visually heavy apps on a Mac. By this I mean apps that need quite a bit of screen real estate to show everything that needs to be shown: The mail program has a folder tree on the left, the list of messages in the center, and the current message on the right. The IDE has all these tool windows that need showing, in addition to the ", "context": "Mac user", "use_case": "window positioning hotkeys", "switched_from": "tiling window managers", "story": "Hammerspoon"}, {"id": 757966080, "item_id": 47372880, "url": "https://news.ycombinator.com/item?id=47372880", "by": "msephton", "date": "2026-03-13", "stance": "recommend", "quote": "implement a keyboard based window manager", "excerpt": "I use it to: - implement a keyboard based window manager - arrange/quit/launch some things based on whether my MBP is docked or not - resize and reposition certain windows that don't remember their own size and position - certain other hotkeys - probably stuff I forgot and rely on! I'll be sad when it moves from Lua to JavaScript, but I guess that's better than moving to Tcl.", "context": "MBP user", "use_case": "window management and hotkeys", "switched_from": "", "story": "Hammerspoon"}, {"id": 757939296, "item_id": 47371206, "url": "https://news.ycombinator.com/item?id=47371206", "by": "ackfoobar", "date": "2026-03-13", "stance": "recommend", "quote": "I use ShiftIt (a lovely project, but dead) reimplemented in Hammerspoon. It is very comprehensive.", "excerpt": "https://github.com/peterklijn/hammerspoon-shiftit I use ShiftIt (a lovely project, but dead) reimplemented in Hammerspoon. It is very comprehensive.", "context": "", "use_case": "window management", "switched_from": "ShiftIt", "story": "Hammerspoon"}]}, {"label": "Screen overlays", "summary": "It can draw borders, labels, notifications and panes over other windows.", "quotes": [{"id": 765142016, "item_id": 47821376, "url": "https://news.ycombinator.com/item?id=47821376", "by": "noahkirsch", "date": "2026-04-18", "stance": "recommend", "quote": "I made a config with hammerspoon that makes the border of my screen glow orange when claude code is waiting for my input.", "excerpt": "I'm not sure how much this resonates with others. But I have a bad habit where I use Claude Code, then immediately tab out to doomscroll Youtube shorts, completely unaware of when Claude Code is hanging waiting for my next input. No more! I made a config with hammerspoon that makes the border of my screen glow orange when claude code is waiting for my input. It clears when I take the next action in the terminal. It's", "context": "", "use_case": "notify when Claude Code awaits input", "switched_from": "", "story": "I made Claude Code at least 30% more efficient (for me anyway)"}, {"id": 757994416, "item_id": 47374651, "url": "https://news.ycombinator.com/item?id=47374651", "by": "xendipity", "date": "2026-03-14", "stance": "recommend", "quote": "only hs had the ability to render custom panes over maximized windows.", "excerpt": "Excited to see this here! Only yesterday I used it to create an interactive native-like notification my coding agents use to ping me when they push a PR. I had tried a few different libraries over the past month but only hs had the ability to render custom panes over maximized windows. Will be using it for more automation tools moving forward.", "context": "", "use_case": "notifications from coding agents", "switched_from": "", "story": "Hammerspoon"}, {"id": 757980816, "item_id": 47373801, "url": "https://news.ycombinator.com/item?id=47373801", "by": "tcoff91", "date": "2026-03-13", "stance": "recommend", "quote": "I really like the Label feature.", "excerpt": "I really like the Label feature. I use it to put labels on the screen in my different aerospace workspaces so I can keep track of which project I\u2019m working on. With agents working in parallel this is really useful.", "context": "", "use_case": "labeling workspaces by project", "switched_from": "", "story": "Hammerspoon"}]}, {"label": "Event automation", "summary": "Scripts react to USB, display and docking events to change system settings.", "quotes": [{"id": 757907504, "item_id": 47369219, "url": "https://news.ycombinator.com/item?id=47369219", "by": "alexfortin", "date": "2026-03-13", "stance": "neutral", "quote": "I use it to enable/disable the wifi when I disconnec/connect the macbook to a specific usb hub", "excerpt": "I use it to enable/disable the wifi when I disconnec/connect the macbook to a specific usb hub with ethernet connection: local usbWatcher = hs.usb.watcher.new(function(device) if device.productName == \"EMEET SmartCam C960\" then if device.eventType == \"added\" then hs.execute(\"networksetup -setairportpower en0 off\") hs.notify.new({title=\"Wi-Fi\", informativeText=\"Disabled (USB device connected)\"}):send() elseif device.e", "context": "macOS user", "use_case": "toggle wifi on USB hub", "switched_from": "", "story": "Hammerspoon"}, {"id": 746603969, "item_id": 46662748, "url": "https://news.ycombinator.com/item?id=46662748", "by": "wlonkly", "date": "2026-01-17", "stance": "recommend", "quote": "controlled by a Hammerspoon[2] script[3] that calls its CLI on the appropriate display events", "excerpt": "I have the 27\" from that series. In my experience, after I fixed the RGB issue, I also fixed the flickering issue. And to fix the RGB issue, I used BetterDisplay[1], controlled by a Hammerspoon[2] script[3] that calls its CLI on the appropriate display events. The free version of BetterDisplay is sufficient, I really don't use any of its other features. The flickering seems to be gamma related, and is triggered by Ni", "context": "Dell monitor user on macOS", "use_case": "automating display fixes", "switched_from": "", "story": "Dell UltraSharp 52 Thunderbolt Hub Monitor"}, {"id": 757966080, "item_id": 47372880, "url": "https://news.ycombinator.com/item?id=47372880", "by": "msephton", "date": "2026-03-13", "stance": "recommend", "quote": "implement a keyboard based window manager", "excerpt": "I use it to: - implement a keyboard based window manager - arrange/quit/launch some things based on whether my MBP is docked or not - resize and reposition certain windows that don't remember their own size and position - certain other hotkeys - probably stuff I forgot and rely on! I'll be sad when it moves from Lua to JavaScript, but I guess that's better than moving to Tcl.", "context": "MBP user", "use_case": "window management and hotkeys", "switched_from": "", "story": "Hammerspoon"}]}, {"label": "Lua scripting", "summary": "Commenters like that it is Lua-enabled and fully customizable.", "quotes": [{"id": 770224642, "item_id": 48139040, "url": "https://news.ycombinator.com/item?id=48139040", "by": "iLemming", "date": "2026-05-14", "stance": "recommend", "quote": "Wondrous piece on its own, it is Lua-enabled", "excerpt": "> what the other parts are Of course I can't explain in detail in a single comment everything I listed, besides, that's just a subset of things I do through Emacs. Sometimes I want to kick off a process in the external terminal - long-lived processes are better handled that way. Kitty has remote protocol. I needed bidirectionally - being able to pipe into and from an arbitrary Emacs buffer to and from the terminal, s", "context": "Mac user", "use_case": "window management on Mac", "switched_from": "", "story": "The Emacsification of Software"}, {"id": 757902272, "item_id": 47368892, "url": "https://news.ycombinator.com/item?id=47368892", "by": "weitzj", "date": "2026-03-13", "stance": "recommend", "quote": "I love hammerspoon. That's it :D", "excerpt": "I love hammerspoon. That's it :D It's lua, so you can get creative with https://fennel-lang.org/", "context": "", "use_case": "macOS automation", "switched_from": "", "story": "Hammerspoon"}, {"id": 796277136, "item_id": 49767321, "url": "https://news.ycombinator.com/item?id=49767321", "by": "zuhsetaqi", "date": "2026-09-19", "stance": "recommend", "quote": "I can just customize my hammerspoon config to behave differently", "excerpt": "> Try and export a few thousand Notes entries with images. Not a problem, I don\u2019t use Apple Notes on my Mac. > Change how you like your day to day workflows in terms of window management Not a problem, I can just customize my hammerspoon config to behave differently > Share a home made app with some friends without helping them install it That depends more on what my friends are using than what I use. Me using Linux ", "context": "macOS user", "use_case": "window management", "switched_from": "", "story": "Apple M6 Pro achieves the highest single-core CPU score in Geekbench 7"}]}, {"label": "Custom hotkeys", "summary": "Used for app-switching shortcuts, key remapping and keybinding overlays.", "quotes": [{"id": 757897824, "item_id": 47368614, "url": "https://news.ycombinator.com/item?id=47368614", "by": "trjordan", "date": "2026-03-13", "stance": "recommend", "quote": "I utterly love Hammerspoon.", "excerpt": "I utterly love Hammerspoon. It's fun to combine with qmk [0], which gives you a bunch more options for hotkeys on your keyboard via layers. I've ended up with a layer where half the keyboard is Hammerspoon shortcuts directly to apps (e.g. go to Slack, to Chrome, etc.) and half of it is in-app shortcuts (like putting cmd-number on the home row, for directly addressing chrome tabs). Between this and one of the tiling w", "context": "", "use_case": "app shortcuts and navigation", "switched_from": "", "story": "Hammerspoon"}, {"id": 757905920, "item_id": 47369120, "url": "https://news.ycombinator.com/item?id=47369120", "by": "overflowy", "date": "2026-03-13", "stance": "neutral", "quote": "I use this to remap app keys:", "excerpt": "I use this to remap app keys: local appHotkeys = {} local function remapAppHotkey(appName, fromMods, fromKey, toMods, toKey, delay) if not appHotkeys[appName] then appHotkeys[appName] = {} end local hotkey = hs.hotkey.new(fromMods, fromKey, function() hs.eventtap.keyStroke(toMods, toKey, delay or 0) end) table.insert(appHotkeys[appName], hotkey) end local appWatcher = hs.application.watcher.new(function(appName, even", "context": "", "use_case": "remap app hotkeys", "switched_from": "", "story": "Hammerspoon"}, {"id": 792865362, "item_id": 49554085, "url": "https://news.ycombinator.com/item?id=49554085", "by": "wolfinunix", "date": "2026-09-03", "stance": "recommend", "quote": "Hammerspoon for the menu tree and keybinding overlay", "excerpt": "This is the right way to see the real thing on an M-series Mac. I used it as the reference while doing the other approach: porting the parts of Omarchy 4 you look at all day to native macOS (AeroSpace for Hyprland, SketchyBar for the bar, Hammerspoon for the menu tree and keybinding overlay, and a theme script that renders Omarchy's own theme templates for Ghostty, Neovim, btop). About 70% of Quattro by a feature-by-", "context": "macOS user porting Omarchy", "use_case": "menu tree and keybinding overlay", "switched_from": "", "story": "Show HN: I built a version of Omarchy that runs on Apple Silicon"}]}], "caveats": [{"label": "Steep ramp-up", "summary": "One commenter found it had fewer batteries included than AutoHotkey, so simple tasks needed extra code.", "quotes": [{"id": 733762145, "item_id": 45860134, "url": "https://news.ycombinator.com/item?id=45860134", "by": "al_borland", "date": "2025-11-08", "stance": "warn", "quote": "it felt more like fewer batteries were included, which made the ramp up seem steeper.", "excerpt": "The only thing I really miss at work after moving from Windows to macOS is AutoHotKey. I tried Hammerspoon. I thought having a more normal language (lua) would make it easier, but it felt more like fewer batteries were included, which made the ramp up seem steeper. Trivial things in AHK seemed like they needed a lot of extra supporting functions to enable it in HS. Some rose colored glasses could be involved here as ", "context": "moved from Windows to macOS at work", "use_case": "macOS automation", "switched_from": "AutoHotkey", "story": "Ask HN: Windows/Linux software that has no real equivalent on macOS?"}]}, {"label": "Time investment", "summary": "Building a setup from Hammerspoon and similar tools was described as a massive time investment.", "quotes": [{"id": 752113585, "item_id": 47007099, "url": "https://news.ycombinator.com/item?id=47007099", "by": "zeppelin101", "date": "2026-02-13", "stance": "neutral", "quote": "I use a variety of smaller apps and scripts to make it less awkward", "excerpt": "Agreed. On MacOS, I use a variety of smaller apps and scripts to make it less awkward, e.g. Karabiner, BetterTouchTool, Hammerspoon, and, of course, \"Alt-Tab\" (https://alt-tab-macos.netlify.app/). I am even contemplating starting to use a dedicated window manager, such as Aerospace (https://github.com/nikitabobko/AeroSpace/). But all of this is a massive time investment.", "context": "macOS user", "use_case": "macOS automation and window tweaks", "switched_from": "", "story": "Resizing windows on macOS Tahoe \u2013 the saga continues"}]}, {"label": "Lua to JavaScript", "summary": "One user was sad about the planned move from Lua to JavaScript.", "quotes": [{"id": 757966080, "item_id": 47372880, "url": "https://news.ycombinator.com/item?id=47372880", "by": "msephton", "date": "2026-03-13", "stance": "recommend", "quote": "implement a keyboard based window manager", "excerpt": "I use it to: - implement a keyboard based window manager - arrange/quit/launch some things based on whether my MBP is docked or not - resize and reposition certain windows that don't remember their own size and position - certain other hotkeys - probably stuff I forgot and rely on! I'll be sad when it moves from Lua to JavaScript, but I guess that's better than moving to Tcl.", "context": "MBP user", "use_case": "window management and hotkeys", "switched_from": "", "story": "Hammerspoon"}]}], "who": [{"by": "zuhsetaqi", "context": "macOS user", "url": "https://news.ycombinator.com/item?id=49767321", "date": "2026-09-19"}, {"by": "wolfinunix", "context": "macOS user porting Omarchy", "url": "https://news.ycombinator.com/item?id=49554085", "date": "2026-09-03"}, {"by": "iLemming", "context": "Mac user", "url": "https://news.ycombinator.com/item?id=48139040", "date": "2026-05-14"}, {"by": "hibbelig", "context": "Mac user", "url": "https://news.ycombinator.com/item?id=47378319", "date": "2026-03-14"}, {"by": "msephton", "context": "MBP user", "url": "https://news.ycombinator.com/item?id=47372880", "date": "2026-03-13"}, {"by": "alexfortin", "context": "macOS user", "url": "https://news.ycombinator.com/item?id=47369219", "date": "2026-03-13"}, {"by": "zeppelin101", "context": "macOS user", "url": "https://news.ycombinator.com/item?id=47007099", "date": "2026-02-13"}, {"by": "wlonkly", "context": "Dell monitor user on macOS", "url": "https://news.ycombinator.com/item?id=46662748", "date": "2026-01-17"}], "tags": ["for macOS users", "for keyboard-driven workflows", "for Lua scripters", "for coding-agent alerts"], "use_cases": ["macos automation", "window management", "menu tree and keybinding overlay", "qwerty midi controller app", "window management on macos", "window management on mac"], "compared": [{"slug": "autohotkey", "name": "AutoHotkey", "co": 2, "switched_from": 1, "switched_to": 0}, {"slug": "aerospace", "name": "AeroSpace", "co": 3, "switched_from": 0, "switched_to": 0}, {"slug": "hyprland", "name": "Hyprland", "co": 2, "switched_from": 0, "switched_to": 0}], "makers": [], "threads": [{"url": "https://news.ycombinator.com/item?id=47367932", "title": "Hammerspoon", "mentions": 12}, {"url": "https://news.ycombinator.com/item?id=49763883", "title": "Apple M6 Pro achieves the highest single-core CPU score in Geekbench 7", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49539913", "title": "Show HN: I built a version of Omarchy that runs on Apple Silicon", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49479837", "title": "GUIs should be fully keyboard-driven", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49390132", "title": "Omacom Foundation Launches with $8M", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=48643848", "title": "Ask HN: New clean macOS install. Must-have apps? Best browser?", "mentions": 1}], "sentiment_by_month": {"2025-11": {"warn": 1}, "2025-12": {}, "2026-01": {"recommend": 1, "neutral": 1}, "2026-02": {"neutral": 1}, "2026-03": {"recommend": 8, "neutral": 4}, "2026-04": {"neutral": 1, "recommend": 1}, "2026-05": {"recommend": 1}, "2026-06": {"recommend": 1}, "2026-07": {}, "2026-08": {"neutral": 2}, "2026-09": {"recommend": 2}, "2026-10": {}}, "quotes": [{"id": 796277136, "item_id": 49767321, "url": "https://news.ycombinator.com/item?id=49767321", "by": "zuhsetaqi", "date": "2026-09-19", "stance": "recommend", "quote": "I can just customize my hammerspoon config to behave differently", "excerpt": "> Try and export a few thousand Notes entries with images. Not a problem, I don\u2019t use Apple Notes on my Mac. > Change how you like your day to day workflows in terms of window management Not a problem, I can just customize my hammerspoon config to behave differently > Share a home made app with some friends without helping them install it That depends more on what my friends are using than what I use. Me using Linux ", "context": "macOS user", "use_case": "window management", "switched_from": "", "story": "Apple M6 Pro achieves the highest single-core CPU score in Geekbench 7"}, {"id": 792865362, "item_id": 49554085, "url": "https://news.ycombinator.com/item?id=49554085", "by": "wolfinunix", "date": "2026-09-03", "stance": "recommend", "quote": "Hammerspoon for the menu tree and keybinding overlay", "excerpt": "This is the right way to see the real thing on an M-series Mac. I used it as the reference while doing the other approach: porting the parts of Omarchy 4 you look at all day to native macOS (AeroSpace for Hyprland, SketchyBar for the bar, Hammerspoon for the menu tree and keybinding overlay, and a theme script that renders Omarchy's own theme templates for Ghostty, Neovim, btop). About 70% of Quattro by a feature-by-", "context": "macOS user porting Omarchy", "use_case": "menu tree and keybinding overlay", "switched_from": "", "story": "Show HN: I built a version of Omarchy that runs on Apple Silicon"}, {"id": 791765296, "item_id": 49485331, "url": "https://news.ycombinator.com/item?id=49485331", "by": "iammattmurphy", "date": "2026-08-28", "stance": "neutral", "quote": "which is built on hammerspoon", "excerpt": "I recently had a revelation when I made an extended qwerty midi controller app that permanently shows the states and functions of all keys including when modifiers are held. It occurred to me that this is a wonderful way to design software: you immediately know the keyboard shortcuts because you\u2019re already looking at them. I\u2019m working on taking what I\u2019ve built for the qwerty midi keyboard controller (which is built o", "context": "", "use_case": "qwerty MIDI controller app", "switched_from": "", "story": "GUIs should be fully keyboard-driven"}, {"id": 790274244, "item_id": 49392140, "url": "https://news.ycombinator.com/item?id=49392140", "by": "jsuth", "date": "2026-08-21", "stance": "neutral", "quote": "macOS with some hammerspoon binds for window management/layouts", "excerpt": "I think tiling makes much less sense on a laptop and more sense when you use a large display. I had a similar experience initially. I disliked many of the defaults. But it's quite easy to use an agent to customize everything to your liking. And I haven't really run into a situation where I couldn't accomplish what I wanted. I'm still deciding how I feel about hyprland. I use a unique hyperkey shortcut to focus each a", "context": "", "use_case": "window management on macOS", "switched_from": "", "story": "Omacom Foundation Launches with $8M"}, {"id": 778312464, "item_id": 48644529, "url": "https://news.ycombinator.com/item?id=48644529", "by": "mortar", "date": "2026-06-23", "stance": "recommend", "quote": "Hammerspoon,", "excerpt": "Hammerspoon, Little snitch, iTerm2, Chezmoi, Orion", "context": "", "use_case": "macOS automation", "switched_from": "", "story": "Ask HN: New clean macOS install. Must-have apps? Best browser?"}, {"id": 770224642, "item_id": 48139040, "url": "https://news.ycombinator.com/item?id=48139040", "by": "iLemming", "date": "2026-05-14", "stance": "recommend", "quote": "Wondrous piece on its own, it is Lua-enabled", "excerpt": "> what the other parts are Of course I can't explain in detail in a single comment everything I listed, besides, that's just a subset of things I do through Emacs. Sometimes I want to kick off a process in the external terminal - long-lived processes are better handled that way. Kitty has remote protocol. I needed bidirectionally - being able to pipe into and from an arbitrary Emacs buffer to and from the terminal, s", "context": "Mac user", "use_case": "window management on Mac", "switched_from": "", "story": "The Emacsification of Software"}, {"id": 765142016, "item_id": 47821376, "url": "https://news.ycombinator.com/item?id=47821376", "by": "noahkirsch", "date": "2026-04-18", "stance": "recommend", "quote": "I made a config with hammerspoon that makes the border of my screen glow orange when claude code is waiting for my input.", "excerpt": "I'm not sure how much this resonates with others. But I have a bad habit where I use Claude Code, then immediately tab out to doomscroll Youtube shorts, completely unaware of when Claude Code is hanging waiting for my next input. No more! I made a config with hammerspoon that makes the border of my screen glow orange when claude code is waiting for my input. It clears when I take the next action in the terminal. It's", "context": "", "use_case": "notify when Claude Code awaits input", "switched_from": "", "story": "I made Claude Code at least 30% more efficient (for me anyway)"}, {"id": 764241777, "item_id": 47765111, "url": "https://news.ycombinator.com/item?id=47765111", "by": "al_borland", "date": "2026-04-14", "stance": "neutral", "quote": "HammerSpoon (Lua), bash, and Apple Shortcuts", "excerpt": "I use Obsidian for daily notes. I\u2019m not sure why someone who primarily uses Obsidian would reach for another app just for daily notes. I was able to specify the folder for my daily notes and the format for their naming. I also have a template setup for them. There is a button in the sidebar that opens the current days note and creates it if it doesn\u2019t already exist. I believe this was all out of the box. I then downl", "context": "", "use_case": "appending to daily notes", "switched_from": "", "story": "An Introduction to Obsidian"}, {"id": 758053104, "item_id": 47378319, "url": "https://news.ycombinator.com/item?id=47378319", "by": "hibbelig", "date": "2026-03-14", "stance": "recommend", "quote": "I'm now happy with hotkeys in Hammerspoon that reposition and resize the current window to one of these presets", "excerpt": "I used to be a fan of tiling window managers, but I found out that I tend to use fairly visually heavy apps on a Mac. By this I mean apps that need quite a bit of screen real estate to show everything that needs to be shown: The mail program has a folder tree on the left, the list of messages in the center, and the current message on the right. The IDE has all these tool windows that need showing, in addition to the ", "context": "Mac user", "use_case": "window positioning hotkeys", "switched_from": "tiling window managers", "story": "Hammerspoon"}, {"id": 757994416, "item_id": 47374651, "url": "https://news.ycombinator.com/item?id=47374651", "by": "xendipity", "date": "2026-03-14", "stance": "recommend", "quote": "only hs had the ability to render custom panes over maximized windows.", "excerpt": "Excited to see this here! Only yesterday I used it to create an interactive native-like notification my coding agents use to ping me when they push a PR. I had tried a few different libraries over the past month but only hs had the ability to render custom panes over maximized windows. Will be using it for more automation tools moving forward.", "context": "", "use_case": "notifications from coding agents", "switched_from": "", "story": "Hammerspoon"}, {"id": 757990944, "item_id": 47374434, "url": "https://news.ycombinator.com/item?id=47374434", "by": "pazimzadeh", "date": "2026-03-14", "stance": "recommend", "quote": "I love Hammerspoon!!", "excerpt": "I love Hammerspoon!! here's my one handed shortcuts for window control across multiple monitors: https://gist.github.com/pazimzadeh/b1c70f5f205d0b63264e7c0213ef7afc What will v2 enable??", "context": "", "use_case": "window control across multiple monitors", "switched_from": "", "story": "Hammerspoon"}, {"id": 757980816, "item_id": 47373801, "url": "https://news.ycombinator.com/item?id=47373801", "by": "tcoff91", "date": "2026-03-13", "stance": "recommend", "quote": "I really like the Label feature.", "excerpt": "I really like the Label feature. I use it to put labels on the screen in my different aerospace workspaces so I can keep track of which project I\u2019m working on. With agents working in parallel this is really useful.", "context": "", "use_case": "labeling workspaces by project", "switched_from": "", "story": "Hammerspoon"}, {"id": 757966080, "item_id": 47372880, "url": "https://news.ycombinator.com/item?id=47372880", "by": "msephton", "date": "2026-03-13", "stance": "recommend", "quote": "implement a keyboard based window manager", "excerpt": "I use it to: - implement a keyboard based window manager - arrange/quit/launch some things based on whether my MBP is docked or not - resize and reposition certain windows that don't remember their own size and position - certain other hotkeys - probably stuff I forgot and rely on! I'll be sad when it moves from Lua to JavaScript, but I guess that's better than moving to Tcl.", "context": "MBP user", "use_case": "window management and hotkeys", "switched_from": "", "story": "Hammerspoon"}, {"id": 757939296, "item_id": 47371206, "url": "https://news.ycombinator.com/item?id=47371206", "by": "ackfoobar", "date": "2026-03-13", "stance": "recommend", "quote": "I use ShiftIt (a lovely project, but dead) reimplemented in Hammerspoon. It is very comprehensive.", "excerpt": "https://github.com/peterklijn/hammerspoon-shiftit I use ShiftIt (a lovely project, but dead) reimplemented in Hammerspoon. It is very comprehensive.", "context": "", "use_case": "window management", "switched_from": "ShiftIt", "story": "Hammerspoon"}, {"id": 757907504, "item_id": 47369219, "url": "https://news.ycombinator.com/item?id=47369219", "by": "alexfortin", "date": "2026-03-13", "stance": "neutral", "quote": "I use it to enable/disable the wifi when I disconnec/connect the macbook to a specific usb hub", "excerpt": "I use it to enable/disable the wifi when I disconnec/connect the macbook to a specific usb hub with ethernet connection: local usbWatcher = hs.usb.watcher.new(function(device) if device.productName == \"EMEET SmartCam C960\" then if device.eventType == \"added\" then hs.execute(\"networksetup -setairportpower en0 off\") hs.notify.new({title=\"Wi-Fi\", informativeText=\"Disabled (USB device connected)\"}):send() elseif device.e", "context": "macOS user", "use_case": "toggle wifi on USB hub", "switched_from": "", "story": "Hammerspoon"}, {"id": 757905920, "item_id": 47369120, "url": "https://news.ycombinator.com/item?id=47369120", "by": "overflowy", "date": "2026-03-13", "stance": "neutral", "quote": "I use this to remap app keys:", "excerpt": "I use this to remap app keys: local appHotkeys = {} local function remapAppHotkey(appName, fromMods, fromKey, toMods, toKey, delay) if not appHotkeys[appName] then appHotkeys[appName] = {} end local hotkey = hs.hotkey.new(fromMods, fromKey, function() hs.eventtap.keyStroke(toMods, toKey, delay or 0) end) table.insert(appHotkeys[appName], hotkey) end local appWatcher = hs.application.watcher.new(function(appName, even", "context": "", "use_case": "remap app hotkeys", "switched_from": "", "story": "Hammerspoon"}, {"id": 757905456, "item_id": 47369091, "url": "https://news.ycombinator.com/item?id=47369091", "by": "juancn", "date": "2026-03-13", "stance": "neutral", "quote": "I use it to hide Zoom's screen sharing controls so they don't come back when pressing Esc:", "excerpt": "I use it to hide Zoom's screen sharing controls so they don't come back when pressing Esc: -- Hide Zoom's \"share\" windows so it doesn't come back on ESC keypress local zoomWindow = nil local originalFrame = nil hs.hotkey.bind({\"cmd\", \"ctrl\", \"alt\"}, \"H\", function() print(\"> trying to hide zoom\") if not zoomWindow then print(\"> looking for window\") zoomWindow = hs.window.find(\"zoom share statusbar window\") end if zoom", "context": "", "use_case": "hide Zoom share controls", "switched_from": "", "story": "Hammerspoon"}, {"id": 757904272, "item_id": 47369017, "url": "https://news.ycombinator.com/item?id=47369017", "by": "jmcguckin", "date": "2026-03-13", "stance": "neutral", "quote": "I use it to give me focus-follows-mouse and to have a large circle surrounding the mouse", "excerpt": "I use it to give me focus-follows-mouse and to have a large circle surrounding the mouse when i move it, to aid finding it.", "context": "", "use_case": "focus-follows-mouse, mouse highlight", "switched_from": "", "story": "Hammerspoon"}, {"id": 757902272, "item_id": 47368892, "url": "https://news.ycombinator.com/item?id=47368892", "by": "weitzj", "date": "2026-03-13", "stance": "recommend", "quote": "I love hammerspoon. That's it :D", "excerpt": "I love hammerspoon. That's it :D It's lua, so you can get creative with https://fennel-lang.org/", "context": "", "use_case": "macOS automation", "switched_from": "", "story": "Hammerspoon"}, {"id": 757897824, "item_id": 47368614, "url": "https://news.ycombinator.com/item?id=47368614", "by": "trjordan", "date": "2026-03-13", "stance": "recommend", "quote": "I utterly love Hammerspoon.", "excerpt": "I utterly love Hammerspoon. It's fun to combine with qmk [0], which gives you a bunch more options for hotkeys on your keyboard via layers. I've ended up with a layer where half the keyboard is Hammerspoon shortcuts directly to apps (e.g. go to Slack, to Chrome, etc.) and half of it is in-app shortcuts (like putting cmd-number on the home row, for directly addressing chrome tabs). Between this and one of the tiling w", "context": "", "use_case": "app shortcuts and navigation", "switched_from": "", "story": "Hammerspoon"}, {"id": 752113585, "item_id": 47007099, "url": "https://news.ycombinator.com/item?id=47007099", "by": "zeppelin101", "date": "2026-02-13", "stance": "neutral", "quote": "I use a variety of smaller apps and scripts to make it less awkward", "excerpt": "Agreed. On MacOS, I use a variety of smaller apps and scripts to make it less awkward, e.g. Karabiner, BetterTouchTool, Hammerspoon, and, of course, \"Alt-Tab\" (https://alt-tab-macos.netlify.app/). I am even contemplating starting to use a dedicated window manager, such as Aerospace (https://github.com/nikitabobko/AeroSpace/). But all of this is a massive time investment.", "context": "macOS user", "use_case": "macOS automation and window tweaks", "switched_from": "", "story": "Resizing windows on macOS Tahoe \u2013 the saga continues"}, {"id": 749082306, "item_id": 46817644, "url": "https://news.ycombinator.com/item?id=46817644", "by": "philsnow", "date": "2026-01-29", "stance": "neutral", "quote": "MacOS + launchd + hammerspoon", "excerpt": "> dump to s3 so I can paste around links to screenshots everywhere for work This has got to be the \"todo list app\" for people who aren't app devs; mine [0] is for MacOS + launchd + hammerspoon and I use Shottr for annotation [0] https://github.com/philsnow/shots-filed", "context": "", "use_case": "automation", "switched_from": "", "story": "Flameshot"}, {"id": 746603969, "item_id": 46662748, "url": "https://news.ycombinator.com/item?id=46662748", "by": "wlonkly", "date": "2026-01-17", "stance": "recommend", "quote": "controlled by a Hammerspoon[2] script[3] that calls its CLI on the appropriate display events", "excerpt": "I have the 27\" from that series. In my experience, after I fixed the RGB issue, I also fixed the flickering issue. And to fix the RGB issue, I used BetterDisplay[1], controlled by a Hammerspoon[2] script[3] that calls its CLI on the appropriate display events. The free version of BetterDisplay is sufficient, I really don't use any of its other features. The flickering seems to be gamma related, and is triggered by Ni", "context": "Dell monitor user on macOS", "use_case": "automating display fixes", "switched_from": "", "story": "Dell UltraSharp 52 Thunderbolt Hub Monitor"}, {"id": 733762145, "item_id": 45860134, "url": "https://news.ycombinator.com/item?id=45860134", "by": "al_borland", "date": "2025-11-08", "stance": "warn", "quote": "it felt more like fewer batteries were included, which made the ramp up seem steeper.", "excerpt": "The only thing I really miss at work after moving from Windows to macOS is AutoHotKey. I tried Hammerspoon. I thought having a more normal language (lua) would make it easier, but it felt more like fewer batteries were included, which made the ramp up seem steeper. Trivial things in AHK seemed like they needed a lot of extra supporting functions to enable it in HS. Some rose colored glasses could be involved here as ", "context": "moved from Windows to macOS at work", "use_case": "macOS automation", "switched_from": "AutoHotkey", "story": "Ask HN: Windows/Linux software that has no real equivalent on macOS?"}]}