Docs / Connect and automate

Hooks

Run a shell command of your own when a meeting is coming up or something happens in a session: a spoken reminder, joining the call, a nudge when a transcription goes quiet.

On this page

Think of a hook as a coworker who nudges you: a voice that says "you have Weekly Sync in five minutes", a window that opens the call for you, a gentle "still there?" when a transcription has gone quiet for a while.

A hook runs a shell command of your own when one of six things happens in Azynote. You write the command, and Azynote hands it the details it needs, like the meeting's title or the session's folder, so the same command can say the right thing every time.

Hooks are saved per workspace, under Settings > Hooks.

Add a hook#

  1. Open Settings > Hooks. Each event has its own group on the page.
  2. Under the event you want, click Add a hook, or the + on one of its ready-made examples (see below). New hook at the top of the page does the same, and lets you pick the event.
  3. Fill in:
    • Name, so you recognise it in the list later.
    • When, the event that runs it. Changing this updates which variables are available.
    • Command, the shell command to run.
    • Runs until, either It finishes on its own, or another event that stops it. Pick another event for something that should keep running for a while, like a screen capture, until the transcription stops.
    • Enabled, on by default.
  4. Click Test to run it right away and see whether it worked (more on this below).
  5. Click Create.

A disabled hook stays in the list but never runs, so you can turn it off without losing the command.

Settings, Hooks: events in the order a meeting unfolds, each with its ready-made examples and an Add a hook link, and New hook at the top
Settings > Hooks. Each event lists its ready-made examples, with a + to add one.

The six events#

WhenFires
Meeting reminderOnce per calendar meeting, when its reminder is due. Uses the same timing as your meeting reminder setting, and fires even if meeting notifications are turned off, so a hook can replace the banner.
Meeting startsOnce per meeting, when it starts.
Transcription startsWhen a transcription starts.
Silence while transcribingEach time the "Did you forget to stop?" reminder appears, meaning nobody has spoken for a few minutes during a transcription.
Transcription stopsWhen a transcription stops.
OnePager generatedOnce per OnePager the AI writes.

Events on your Azynote calendar are instructions, not meetings, so they never fire a meeting event (see Scheduled instructions).

The two meeting events run in your workspace folder. The other four run in the session's own folder, so a command like pwd prints that session's folder without you passing anything.

Variables#

Azynote hands your command a few values as variables, depending on the event. Always wrap them in double quotes, like "$AZYNOTE_MEETING_TITLE", not single quotes: single quotes stop them from working. A value is always plain text, so a meeting title someone else wrote can never run as a command of its own.

Every event

VariableValue
$AZYNOTE_CTLThe command line of the Azynote that ran the hook, so a hook can drive it: "$AZYNOTE_CTL" transcription stop
$AZYNOTE_WORKSPACE_PATHThe workspace's folder

Meeting reminder and Meeting starts

VariableValue
$AZYNOTE_MEETING_TITLEThe meeting's title
$AZYNOTE_MEETING_STARTStart time, like 14:30
$AZYNOTE_MEETING_ENDEnd time, like 15:00
$AZYNOTE_MEETING_LOCATIONIts location, empty if none
$AZYNOTE_MEETING_URLThe video call link from the invite, empty if none
$AZYNOTE_MEETING_CALENDARThe calendar it is on
$AZYNOTE_MEETING_DESCRIPTIONThe invite's description as written, empty if none. Very long descriptions are cut after 8,000 characters.
$AZYNOTE_MEETING_RESPONSEYour answer to the invite: accepted, organizer, tentative, none (not answered yet) or declined. Empty for an event of your own, unknown when your calendar doesn't say which attendee is you.
$AZYNOTE_TRANSCRIBING"yes" while a transcription is running, "no" otherwise
$AZYNOTE_TRANSCRIBING_SESSION_IDThe session being transcribed, empty when none is
$AZYNOTE_SESSION_IDThe meeting's session, if you already opened the meeting from the calendar, empty if not
$AZYNOTE_MEETING_MINUTESMinutes until it starts (Meeting reminder only)

Transcription starts, Silence while transcribing, Transcription stops, OnePager generated

VariableValue
$AZYNOTE_SESSION_PATHThe session's folder
$AZYNOTE_SESSION_IDThe session's id
$AZYNOTE_SESSION_TITLEThe session's title, empty if it has none
$AZYNOTE_SUBJECTThe session's subjects, comma-separated
$AZYNOTE_SILENT_MINUTESMinutes without anyone speaking (Silence while transcribing only)
$AZYNOTE_MEETING_ENDED"yes" once the linked meeting's end time has passed, "no" otherwise (Silence while transcribing only)
$AZYNOTE_ONEPAGER_PATHThe OnePager just written (OnePager generated only)

The editor lists the variables for whichever event you have selected, so you always know what a command can use before you write it.

Ready-made examples#

Most events' groups on the Hooks page offer a ready-made example under your own hooks. Click Add on one and it opens in the editor, pre-filled, so you can read it, adjust it, and create it when you are happy with it. Nothing is added until you do.

  • Spoken meeting reminder (Meeting reminder): plays a short sound, then says "Heads up, you have [meeting] in [minutes] minutes." If you are already transcribing, you only hear the sound, so the voice stays out of your transcript. It only runs for meetings you accepted or organize.
  • Meeting start sound (Meeting starts): plays a short sound when a meeting you accepted or organize starts. To join the call as well, tick Join the call on the meeting alert: Azynote opens the call when you start the session.
  • Transcribe a prepared meeting (Meeting starts): starts transcribing when a meeting you accepted or organize begins, if its session already exists because you opened the meeting from the calendar ahead of time. It leaves the meeting alone while another transcription is running.
  • Spoken silence nudge (Silence while transcribing): asks "Still there?", or says your meeting has ended, once it has.
  • Start sound / Stop sound (Transcription starts / Transcription stops): a short system sound, so you know a transcription began or ended without looking at the screen.
  • Write the OnePager (Transcription stops): writes the session's OnePagers once the last of the transcription is done, so they are waiting for you after the call.

A few recipes#

Say the meeting title out loud, a few minutes before it starts

Event: Meeting reminder. Runs until: It finishes on its own.

case "$AZYNOTE_MEETING_RESPONSE" in
  accepted|organizer) ;;
  *) exit 0 ;;
esac
afplay /System/Library/Sounds/Glass.aiff
if [ "$AZYNOTE_TRANSCRIBING" != yes ]; then
  say "Heads up, you have $AZYNOTE_MEETING_TITLE in $AZYNOTE_MEETING_MINUTES minutes"
fi

It only speaks up for meetings you accepted or organize, and plays a sound first so the voice doesn't catch you off guard. While you are transcribing, a spoken line would end up in the transcript, so you only hear the sound.

Open the call automatically when the meeting starts

Event: Meeting starts. Runs until: It finishes on its own.

case "$AZYNOTE_MEETING_RESPONSE" in
  accepted|organizer) ;;
  *) exit 0 ;;
esac
if [ -n "$AZYNOTE_MEETING_URL" ]; then
  afplay /System/Library/Sounds/Ping.aiff
  open "$AZYNOTE_MEETING_URL"
fi

Every meeting runs its hooks, even ones you declined or haven't answered, so this checks your answer first and only opens calls you accepted or organize. The sound comes first, so a window opening on its own never surprises you.

A nudge when the room has gone quiet, that knows if the meeting has ended

Event: Silence while transcribing. Runs until: It finishes on its own.

if [ "$AZYNOTE_MEETING_ENDED" = yes ]; then
  say "Your meeting has ended. Still transcribing?"
else
  say "Still there? Nobody has spoken for $AZYNOTE_SILENT_MINUTES minutes"
fi

Capture the screen for the length of a transcription

Event: Transcription starts. Runs until: Transcription stops.

mkdir -p "$AZYNOTE_SESSION_PATH/screens" && ffmpeg -f avfoundation -i '1:0' -vf fps=1/10 -q:v 2 "$AZYNOTE_SESSION_PATH/screens/img_%03d.jpg"

This needs ffmpeg installed on your Mac first, for example with Homebrew (brew install ffmpeg). The 1 in '1:0' is the screen to capture; ffmpeg -f avfoundation -list_devices true -i "" lists the numbers on your Mac. Because it runs until Transcription stops, it keeps capturing for the whole transcription and stops itself when the transcription does, no separate step needed.

Testing a hook#

Before you save a hook, or any time you are editing one, click Test. Azynote runs the command right away in a scratch folder, with example values standing in for the real ones (a meeting titled "Weekly sync with Acme", and so on), and shows you whether it worked, along with its output. $AZYNOTE_CTL and $AZYNOTE_WORKSPACE_PATH are the real ones, so a test of a hook that drives Azynote really drives it.

For a hook set to run until another event, Test starts it the same way it would run for real, and a Stop button appears so you can end it whenever you like.

Good to know#

  • Declined meetings still run their hooks. Azynote shows no reminder for a meeting you declined, but its hooks still run, with $AZYNOTE_MEETING_RESPONSE set to declined, so your command decides what to do with it.

  • A spoken reminder is heard by the mic. If a hook speaks during a transcription, that line is picked up like anything else said in the room, so it appears in the transcript, the same as a teammate saying it out loud.

  • The silence nudge closes itself once it speaks. Because your Mac's own voice counts as speech, the "Did you forget to stop?" reminder usually clears itself a few seconds after a spoken nudge plays. With headphones on, nothing plays back through the mic, so it stays until you choose.

  • Hooks run with your permissions. A command runs the same way it would from your own Terminal, so only add ones you understand.

Something else? Write to support@azynote.com.

Something here unclear or out of date? Tell me at support@azynote.com.

AzartyLabAZARTY LAB

© 2026 AzartyLab. All rights reserved.