0.9.12 - 20 Nov 2014


This release of Hammerspoon will break your existing ~/.hammerspoon/init.lua file. All of the extensions are now using camelCase for their APIs, instead of the previous underscore separated names.

Please review the API documentation at http://www.hammerspoon.org/docs/ and update your init.lua. You will find that no APIs have changed their behaviour, and porting your configuration file is usually just a case of changing some_function_name() to someFunctionName().

This will be the first and only dramatic overhaul of the API before 1.0 is released. We are using the Semantic Versioning guidelines, so post-1.0 there will be no API-breaking changes without the major version number changing.

We thought long and hard about this change and felt that a few minutes of disruption to the small number of users at this stage, would be worth it to have cleaner APIs for all users in the future. We’re sorry that this causes some extra work for you, but we hope you too will prefer the new style!


  • Changed: Extensions can now be loaded from ~/.hammerspoon/ as well as the previous locations. All require() paths are now printed to the console at startup.


  • Changed: All extensions are now using camelCase for their APIs, which will break all existing user configs (sorry!)
  • Changed: hs.ipc no longer explodes if another instance of Hammerspoon is running. It will still fail to initialise, but it won’t bring down the whole app.
  • Changed: hs.milight now has two constants that specify the minimum and maximum brightness levels

0.9.11 - 14 Nov 2014


  • Bug fixes
  • Documentation improvements


  • Changed: hs.window animation duration is now a variable in the extension. Set hs.window.animation_duration to 0 to disable all animations.
  • Changed: hs.hotkey.bind and hs.eventtap.event.newkeyboardevent() now accept unicode characters for ⌘, ⌥, ⌃ and ⇧
  • Changed: hs.eventtap.event.newmouseevent() no longer has a third parameter, as that data can always be derived from the first
  • Changed: hs.eventtap now has convenience wrappers for emitting mouse clicks and keystrokes
  • Changed: hs.location now supports callbacks on location changes
  • Changed: hs.location and hs.wifi should now work on pre-10.10 systems
  • Added: hs.layout
  • Added: hs.milight