The Fast Way to Get into Your Next Zoom

September 29, 2020
Zoom Launch Confirmation Dialog from Safari

In my job, I consistently have 30+ remote meetings a week. I launch a lot of Zooms. 1

Mechanically, for each meeting, the process is usually something like:

  1. Open Google Calendar in Safari.
  2. Hit the “Today” button so the calendar snaps back to today and the current time.
  3. Click to open the event at the current time.
  4. Find the Zoom link in either the location or notes of the meeting.
  5. Click the link, and let it open the Zoom site in my browser.
  6. When the site tries to redirect to the app, click the Allow this Site to Open Zoom approval dialog. 2
  7. The Zoom app connects to my meeting.

My computer 3 already knows what my next meeting is, and what the Zoom link for it, so it would be nice to avoid most of the above.

So I hacked some code together. The end result:

  1. Activate my ‘meetings’ global hotkey to display 1-3 likely next meetings.
  2. Hit Enter as 99% of the time the right meeting is the first one in the list.
  3. The Zoom app connects to my meeting.

I chose to present meetings as a list instead of automatically opening the next meeting because there can be ambiguity in which meeting I intend to join - e.g. when my calendar is double-booked or I am joining a meeting late or early.

Using a hotkey to quickly pull up your next Zoom meeting

The new workflow is faster and takes less steps, but also requires a fraction of the reading and thinking.4

The Tech Details

There are two parts.

The first part is this fetchCalendarEvents.js script I’m using is pull from Coda, which in turn is pulling from Google Calendar. The script sorts, filters, and prints out JSON containing meetings at or around the current time.

    var results = [ ];
    const nearbyRows = rows.sort( (e1, e2) => {  
        if (e1.values.Start === e2.values.Start) return 0;
        if (e1.values.Start > e2.values.Start) return 1;
        else return -1;

    } ).filter(e => {
        const diff = DateTime.fromISO(e.values.Start).diff(now, 'hours');
        if (diff.hours < -.5 || diff.hours > 1) return false;
        return true;

    }).forEach(e => {
        results.push(
            {
                name: e.values.Event,
                until: DateTime.fromISO(e.values.Start).diff(now, 'hours').hours,
                zoom: e.values['Zoom Link']
            }
        );
    });

    console.log(JSON.stringify(results));

The second part is the Hammerspoon script that goes in your init.lua. It binds the global hotkey to a function which runs the calendar event fetching script, puts up a visual list on the screen, and then launches the Zoom app for the selected meeting.

-- Pick whatever hotkey you want.
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "m", function()

    local chooser = hs.chooser.new(function(choice)
        if (choice.subText == nil) then return end
        if (string.find(choice.subText, "https://") ~= 1) then return end
        hs.urlevent.openURLWithBundle(choice.subText, "us.zoom.xos")
    end)

    local command = "node fetchCalendarEvents.js"
    local response = hs.execute(command, false)
    local t = hs.json.decode(response)

    local meetings = hs.fnutils.map(t, 
        function(m)
            return {
            text = m.name,
            subText = m.zoom,
            id = m.name
            }
        end)
    chooser:choices(meetings)
    chooser:show()
    end)

And boom - I have instant access to my next Zoom.


  1. The constant struggle and relapse in and out of this meeting-heavy state is another post. ↩︎

  2. You can separately disable this “Allow…” dialog if you want, but it was only one step of several. ↩︎

  3. At some point, I will try to build the above in Shortcuts on iOS for my phone too - I expect it to be much less complicated than the above. ↩︎

  4. Calendar notifications can help shorten or remove steps 1 and 2, but often the calendar notification delivery time is not the time where I am ready to actually join. And then you still have all the other steps and dialogs to figure out. ↩︎