Comment by incanus77

21 hours ago

Hammerspoon is the glue that holds my Mac together. For a starter list of things to do with this app, a partial list of the things that I'm using it for:

  - Dumping all open Safari tabs to an Obsidian doc
  - Adding 'hyper' (Ctrl-Opt-Cmd) keybinds to pop a new window for:
    - Safari
    - Finder
    - Terminal / Ghostty
    - VS Code
    - Notes
    - Editing Hammerspoon/AeroSpace/Sketchybar config
    - Reloading Hammerspoon config
    - Reloading Sketchybar
    - Quitting all Dock apps except Finder
    - Screen lock
    - System sleep
    - Opening front Finder folder in VS Code
    - Opening front Safari URL on Archive.today
    - Showing front Safari window tab count
    - Showing front app bundle ID
    - Posting notification about current Music track
    - Controlling my Logi Litra light (various color temps/brightnesses)
    - Starting/stopping a client work timer
  - Tying it to AeroSpace for:
    - Pushing a window to another monitor
    - Performing a two-up window layout
    - Swapping those two windows
    - Closing all other workspace windows
    - Gathering all windows to first workspace
  - Ensuring some background apps stay running if they crash
  - Prompting to unmount disk images if trashed
  - Binding into Skim to jump to specific sections of spec PDFs using terse Markdown URLs

I pretty much only use it for two (related) things these days:

- check the list of open Teams windows; if there's a non-standard one, assume I'm in a meeting and webhook to HomeAssistant to select the "active"[2] preset on my meeting light[0].

- download my work ical[1] and, if there's a pending meeting (<~15m), webhook-HASS for the "pending" present on the meeting light.

[0] Just a short strip of WS2812B connected to an ESP32 running WLED.

[1] Originally this was a simple HTTP to my shared link on outlook.com but then they started requiring authentication (because that's exactly what you want on a SHARED link, you gufftarts); had a look at the Azure SDK and ... bag of milky spanners that is; ended up having to import my work ical into Apple Calendar and then use the ical link for that in Hammerspoon. Oh how we laughed. Especially when I realised it only has about 40% of the actual meetings because somehow "my calendar" is actually 4 or 5 bastardised conglomerations of pain and the ical for "my calendar" is actually just for one of those. AND NOT THE USEFUL ONE EITHER.

[2] There's various - "camera" for "the one meeting I'm forced to have my camera on", "active" is "I probably have to talk", "passive" is "I'm not going to be talking", and "silent" for things like company presentations where it's just watching a boring Powerpoint over Teams.

  • I do something simular. I use the window titles to track the call lenghth and the icon in the menubar to track my teamsstatus. Works flawless.

Impressive ‘spooning!

I use it for one thing only, as a window manager, and for that purpose it has made MacOS eminently more usable for me.

> - Dumping all open Safari tabs to an Obsidian doc

I'd love to do this too. Would you mind sharing how you do it? Or is it trivially easy and not worth explaining? (I haven't looked too deeply into HS yet.)

  • It's not trivial, but roughly: use AppleScript/osascript to get the URLs, but mostly pass them to a ~50 line Bash script which:

      - Brings in the date path components for the dumped-to folder
      - Makes a hash of the URL for an Obsidian doc (each tab gets their own doc)
      - Uses Chrome command line (--headless --disable-gpu --dump-dom) to save a snapshot of the page contents
      - Uses it again with --screenshot to make a thumbnail
      - Create an Obsidian doc from a template
      - If it's a single tab dump, pass -o to the script, which opens it in Obsidian for review
    

    Lastly, I use the relatively-new Bases feature in Obsidian to make a nice "cards" view of the docs with their thumbnails.

    I'm hoping to clean it up at some point and maybe release it, but it's one of those classic one-shot systems that just works for me for now.

    • > - Uses Chrome command line (--headless --disable-gpu --dump-dom) to save a snapshot of the page contents > - Uses it again with --screenshot to make a thumbnail

      You could combine both of those into "run Archivebox somewhere and pass the URLs into that" (which is what I do for "URLs I save to Instapaper" - they go to my Linkhut, Pinboard, my Archivebox, and once I've fixed my code, to archive.org as well.)

      1 reply →

    • How does Hammerspoon help with this? Seems like just AppleScript and bash.

      Also if I may ask, how do you like Obsidian? I had never heard of it until now. Seems like a competitor to the Notes feature of iOS/macOS, but with its own subscription for syncing independently of iCloud?

      1 reply →

  • I have no idea how that person is doing it, but I suspect it could be using osascript. Here's how I do it from my homegrown Go bookmark tool:

      const fetchTabsScript = `
      tell application "Brave Browser"
          set output to ""
          repeat with w in windows
              repeat with t in tabs of w
                  set output to output & (URL of t) & "|||" & (title of t) & "\n"
              end repeat
          end repeat
          return output
      end tell
      `  
      
      func GetOpenTabs() ([]Tab, error) {
       cmd := exec.Command("osascript", "-e", fetchTabsScript)
       output, err := cmd.Output()
        // ...
      }