Everything you do in Azynote with a click or a shortcut, a script can do too. azynote-ctl sends one command to the Azynote that is running on your Mac, prints the answer and exits:
azynote-ctl transcription start --session 20261001110000
azynote-ctl transcription stop
azynote-ctl onepager generate --session 20261001110000
Use it from Terminal, from a hook, from a Shortcuts "Run Shell Script" action, or from any key or launcher that can run a command.
Set it up#
Azynote writes the command for you every time it starts, at ~/.azynote/bin/azynote-ctl. To type it as azynote-ctl from anywhere, add that folder to your shell's path once:
echo 'export PATH="$HOME/.azynote/bin:$PATH"' >> ~/.zshrc
Open a new Terminal window and try azynote-ctl status. Azynote has to be running: when it isn't, azynote-ctl says so and does nothing.
Hooks don't need this step. Every hook gets the full path as $AZYNOTE_CTL (see below).
Find your way around#
azynote-ctl commandslists every command, with one line on what it does.azynote-ctl help transcription startshows one command's flags.azynote-ctl statusshows what Azynote is doing right now: the transcription, dictation, the voice conversation, the window, the open session.
Flags are words, never JSON: --title "Weekly sync". A flag that takes several values is repeated: --subject-keys acme --subject-keys beta. A yes-or-no flag is on by itself and off with no- in front: --include-content or --no-include-content.
Control a transcription#
azynote-ctl transcription start --session 20261001110000
azynote-ctl transcription start --new --subject-keys acme --title "Kickoff"
azynote-ctl transcription pause
azynote-ctl transcription resume
azynote-ctl transcription mic pause
azynote-ctl transcription stop
start always needs to know which session: an existing one with --session, or a new one with --new (a new session belongs to a subject, so give its key). Azynote never guesses from what happens to be on screen. The session opens in the window, so you see it being transcribed.
Asking for what is already true is fine: stop when nothing is transcribing, or pause when already paused, succeeds and changes nothing. Asking for something Azynote wouldn't let you do with a click, like starting a second transcription while one is running, is refused with the reason.
transcription toggle is made for a single key: it pauses a live transcription and resumes a paused one. It never starts or stops one, so pressing it by accident can't end your meeting.
Stopping a transcription doesn't write the OnePager. onepager generate --session <id> does, the same way the sparkle button does, with the templates chosen for that session.
sync start runs Smart Sync on the open workspace, as Tools > Smart Sync does: every missing or outdated OnePager and one-liner, then the status of their subjects. It works in the background, so you can run it from a script at the end of the day. Add --show to watch it in its window. Closing that window doesn't stop the sync, and wait sync=completed --timeout 1800 waits until it's finished.
Wait for something to happen#
wait returns as soon as a value in status is the one you name, so a script never has to guess how long to sleep:
azynote-ctl transcription stop
azynote-ctl wait transcription=idle --timeout 600
azynote-ctl onepager generate --session 20261001110000
azynote-ctl wait onepager=completed --session 20261001110000 --timeout 300
It gives up after --timeout seconds (30 unless you say otherwise) and tells you what the value is instead.
Dictation, voice and the window#
azynote-ctl dictation toggle # the same as pressing ⌃⇧D
azynote-ctl voice toggle # start, then send: like ⌃⇧V
azynote-ctl window mini
azynote-ctl window pin on
azynote-ctl open settings --tab hooks
azynote-ctl open "azynote://workspaces/…/sessions/20261001110000"
Dictation types into the app that is in front when it starts, exactly like the shortcut. The voice commands drive the turn-by-turn conversation; when Voice is set to a live engine, they say so and leave it to the chat window. open takes the same azynote:// links to a session, a OnePager or a note that the chat gives you.
Ask the orb, and show what you want on screen#
azynote-ctl orb ask "What did Acme ask for on today's call?"
azynote-ctl wait orb=answered --timeout 180
azynote-ctl orb follow-up "Draft a short email to Karen with our next steps."
azynote-ctl wait orb=answered --timeout 180
azynote-ctl orb chat
orb ask opens the orb's card over the app in front, types the question in letter by letter and asks it, as a person would. The card opens at the mouse pointer, or at --x and --y (screen points) when you give them. The command returns once the question is asked, so wait orb=answered is how a script waits for the answer.
orb follow-uptypes a follow-up under the answer and asks it in the same thread. It works only while the card shows an answer.orb chatdoes what the chat button on the card does: the conversation continues in the chat window, on its thread.wait chat=openwaits for the window.orb closecloses the card, like its ×. An answer still coming is stopped.orb typetypes into the card without asking, so you can see what it offers for the text, like the list of actions after/.orb taptaps the orb itself: it opens what waits behind it (a meeting, the agent's notices, your catch-up after/brb), or the ask card.view calendar,view timeline,view tasksorview subjectsshows one of the main views, like Ctrl+1 to Ctrl+4.session tab note,session tab transcriptorsession tab onepagershows that tab of the open session, like clicking it. During a transcription,transcriptshows the live one.
As everywhere on this page, a command Azynote can't carry out right now is refused with the reason: a follow-up with no answer on the card, or a session tab with no session open. Together they make scripted demos and walkthroughs easy.
Set up a workspace's AI engine#
azynote-ctl ai preset acp
azynote-ctl acp command "goose acp"
azynote-ctl acp allow-all on
ai preset gemini,openai,local,acporcliroutes every AI capability of the workspace to one engine, the same as the preset in Settings, AI engines. If the embedding engine changes, the command says so: workspace search needs a reindex from Settings, Search, as Settings warns too.acp commandsets the command that launches your ACP agent in this workspace. It tells you if Azynote doesn't find it on your PATH.acp allow-all onoroffis Allow every tool in Settings, ACP (see Chat). With it on, the agent runs its tools without asking, its own shell included.
All three change only the workspace open in the window.
Use it from a hook#
Every hook gets $AZYNOTE_CTL, the command of the Azynote that ran the hook. Two ready-made examples on the Hooks page use it:
Transcribe a meeting you prepared, as soon as it starts (Meeting starts)
case "$AZYNOTE_MEETING_RESPONSE" in
accepted|organizer) ;;
*) exit 0 ;;
esac
if [ -n "$AZYNOTE_SESSION_ID" ] && [ "$AZYNOTE_TRANSCRIBING" != yes ]; then
"$AZYNOTE_CTL" transcription start --session "$AZYNOTE_SESSION_ID"
fi
$AZYNOTE_SESSION_ID is the meeting's session when you already opened the meeting from the calendar, empty when you haven't, so meetings you didn't prepare are left alone.
Write the OnePager when the transcription is done (Transcription stops)
"$AZYNOTE_CTL" wait transcription=idle --timeout 600 && \
"$AZYNOTE_CTL" onepager generate --session "$AZYNOTE_SESSION_ID"
The wait lets the last few seconds of speech finish transcribing before the OnePager is written.
Use it in a script#
Add --json to get the answer as JSON instead of text, with the state Azynote is in afterwards under status:
azynote-ctl --json status | jq -r '.status.transcription'
The exit code tells your script what happened:
| Code | Meaning |
|---|---|
0 | Done, or it was already that way |
1 | The command or a flag was wrong. The message says which. |
2 | Azynote isn't running |
3 | Azynote said no, and says why (a transcription is already running, no such session, and so on) |
4 | wait gave up after its timeout |
Good to know#
- It talks to your Azynote only. The command connects to Azynote on your own Mac, as you. Nothing goes over the network.
- Changes show up in the app right away. A subject or a note created from the command line appears in the window, like one created by an AI tool through the MCP server.
- Data commands work on the workspace open in the window.
workspace open <folder>switches it, the same way the workspace picker does, and is refused while you are transcribing. The engine and permission commands (ai preset,acp ...) work on that workspace too, and only on it. - Turning the mic on is for the command line only. The commands that start a transcription, dictation or a voice conversation are not offered to AI tools connected through the MCP server.
Every command#
This list comes straight from Azynote, so it always matches what azynote-ctl commands shows. Flags in square brackets are optional.
Driving the app#
| Command | What it does |
|---|---|
azynote-ctl transcription start [--session <session>] [--new] [--title <title>] [--subject-keys <subject-keys>] | Start transcribing into a session (--session) or a new one (--new, with --subject-keys and --title if you want one). |
azynote-ctl transcription pause | Pause every live source. |
azynote-ctl transcription resume | Resume every paused source. |
azynote-ctl transcription stop | Stop transcribing; the transcript is then cleaned (and improved, if that setting is on). |
azynote-ctl transcription toggle | For a single key: pause when live, resume when paused. |
azynote-ctl transcription mic <pause|resume> | Pause or resume the microphone only. |
azynote-ctl transcription system-audio <pause|resume> | Pause or resume system audio only. |
azynote-ctl onepager generate --session <session> | Queue the session's OnePagers, with the templates chosen for it, through the same queue as Cmd+G. |
azynote-ctl sync start [--show] | Bring the open workspace up to date in the background, as Smart Sync in the Tools menu does. |
azynote-ctl dictation start | Start dictating into the app in front, as ⌃⇧D does. |
azynote-ctl dictation insert | Stop listening and type the words into the app dictation started in. |
azynote-ctl dictation cancel | Drop what was heard; nothing is typed. |
azynote-ctl dictation toggle | For a single key: start when idle, insert when listening, as ⌃⇧D does. |
azynote-ctl voice start | Start a voice conversation and listen, as ⌃⇧V does. |
azynote-ctl voice send | Send what was said (Enter while listening), or listen again on your turn. |
azynote-ctl voice end | End the voice conversation (Esc). |
azynote-ctl voice toggle | For a single key: start when idle, send when listening or on your turn. |
azynote-ctl orb ask <question> [--x <number>] [--y <number>] | Open the orb's card over the app in front, type the question into it and ask, as a person would. |
azynote-ctl orb type <text> [--x <number>] [--y <number>] | Type into the orb's card a letter at a time without asking, so what it offers for the text shows. |
azynote-ctl orb tap | Tap the orb at rest, as a person does. |
azynote-ctl orb follow-up <question> | Type a follow-up under the orb's answer and ask it, in the same thread, as a person would. |
azynote-ctl orb chat | Open the orb's conversation in the chat window, on its thread, as the card's chat button does. |
azynote-ctl orb close | Close the orb's card, as its × does; an answer still coming is stopped. |
azynote-ctl window show | Bring Azynote's window forward. |
azynote-ctl window mini | Shrink Azynote to the floating chip. |
azynote-ctl window full | Leave mini mode. |
azynote-ctl window pin <on|off> | Keep the window on top of every other app (on), or not (off). |
azynote-ctl window stealth <on|off> | Hide the sidebar and controls for screen sharing (on), or show them (off). |
azynote-ctl open <link> | Follow an azynote:// link to a session, a OnePager or a note, as clicking it does. |
azynote-ctl view <calendar|timeline|tasks|subjects> | Show one of the main views, as Ctrl+1 to 4 do. |
azynote-ctl session tab <note|transcript|onepager> | Show one tab of the session on screen: its note, its transcript (the live one while transcribing) or its OnePager. |
azynote-ctl open settings [--tab <general|shortcuts|calendar|transcription|onepagers|snippets|hooks|ai-engines|chat|mcp|search>] | Open Settings, on a tab if given. |
azynote-ctl workspace open <path> | Switch the window to the workspace at this path, as the picker does. |
azynote-ctl ai preset <gemini|openai|local|acp|cli> | Route every AI capability of the open workspace to one engine, as the preset in Settings > AI engines does. |
azynote-ctl acp command <command> | Set the command that launches the ACP agent in the open workspace, like goose acp. |
azynote-ctl acp allow-all <on|off> | Let the ACP agent run every tool without asking (on), or ask first (off), in the open workspace. |
azynote-ctl status [--session <session>] | Print the app's state: transcription, dictation, voice, window, open session. |
azynote-ctl wait <condition> [--session <session>] [--timeout <number>] | Return once a status field has the value you name, like transcription=live. |
azynote-ctl debug screenshot | Capture Azynote's own windows, nothing else on screen, and print the image files. |
azynote-ctl debug logs [--since <since>] [--tag <tag>] | Print Azynote's recent log entries, oldest first. |
azynote-ctl debug ui | Print what the window shows: view, subject, session, open document. |
Your workspace's data#
The same actions AI tools get through the MCP server, on the workspace open in the window.
| Command | What it does |
|---|---|
azynote-ctl add attachment --subject <subject> --session-id <session-id> --source-path <source-path> [--target-name <target-name>] | Copy a file from your Mac into a session, as an attachment. |
azynote-ctl add subject link --subject-key <subject-key> --label <label> --url <url> | Add a labeled link to a subject. |
azynote-ctl add subject tag --subject-key <subject-key> --tag <tag> | Add a tag to a subject. |
azynote-ctl add task note --one-pager-path <one-pager-path> --task-text <task-text> --note <note> [--task-id <task-id>] | Add a short note under a task in a OnePager. |
azynote-ctl capture screen | Take a screenshot of every display and print where the images are. |
azynote-ctl complete task --one-pager-path <one-pager-path> --task-text <task-text> --completed [--task-id <task-id>] | Tick a task in a OnePager, or untick it with --no-completed. |
azynote-ctl create calendar rule --target-subject-key <target-subject-key> --field <field> --value <value> | Add a rule that files matching calendar events under a subject. |
azynote-ctl create note --subject <subject> --session-id <session-id> --title <title> --content <content> | Add a note to a session. |
azynote-ctl create session --subject-keys <subject-keys> [--title <title>] [--one-pager-preset-ids <one-pager-preset-ids>] [--date <date>] [--one-liner <one-liner>] [--default-title-date-format <default-title-date-format>] | Create a session in one or more subjects. |
azynote-ctl create subject --display-name <display-name> | Create a subject. |
azynote-ctl create workspace --name <name> --path <path> [--description <description>] [--bind] | Create a workspace in a folder and add it to the workspace picker. |
azynote-ctl delete asset --session-id <session-id> --file-path <file-path> | Delete one file from a session. |
azynote-ctl delete calendar rule --id <id> | Delete a calendar rule. |
azynote-ctl delete note --session-id <session-id> --filename <filename> | Delete a note from a session. |
azynote-ctl delete session --subject <subject> --session-id <session-id> | Delete a session and everything in it. |
azynote-ctl delete subject --subject-key <subject-key> | Delete a subject, with the sessions that belong only to it. |
azynote-ctl get current workspace | Print the workspace open in the window. |
azynote-ctl get memory | Print what you asked Azynote to remember in this workspace. |
azynote-ctl get note --session-id <session-id> --filename <filename> | Print a note. |
azynote-ctl get onepager --session-id <session-id> [--type-id <type-id>] | Print a session's OnePager. |
azynote-ctl get session --session-id <session-id> | Print a session's details: subjects, title, one-liner, templates. |
azynote-ctl get subject --subject-key <subject-key> | Print a subject's details: counts, tags, status, links. |
azynote-ctl get ui context | Print what the window shows: the session, the document and the subject. |
azynote-ctl link session to subject --subject-key <subject-key> --session-id <session-id> --new-subject-key <new-subject-key> | Add a session to one more subject. |
azynote-ctl list calendar rules | List the calendar rules. |
azynote-ctl list onepagers --subject <subject> [--max <number>] | List a subject's sessions that have OnePagers. |
azynote-ctl list recent onepagers [--limit <number>] | List the latest OnePagers across every subject. |
azynote-ctl list recent sessions [--days-back <number>] [--limit <number>] | List the latest sessions across every subject. |
azynote-ctl list session assets --session-id <session-id> --include-content | List a session's notes, transcripts, OnePagers and files. |
azynote-ctl list sessions --subject <subject> [--limit <number>] | List a subject's sessions. |
azynote-ctl list subjects [--limit <number>] | List the subjects, with the key each command takes. |
azynote-ctl list tasks --status <open|completed|all> [--subject-key <subject-key>] [--search <search>] [--limit <number>] | List the tasks in your OnePagers. |
azynote-ctl list workspaces | List the workspaces on this Mac. |
azynote-ctl remember --fact <fact> | Ask Azynote to remember a fact for future work in this workspace. |
azynote-ctl remove subject link --subject-key <subject-key> --index <number> | Remove a link from a subject. |
azynote-ctl remove subject tag --subject-key <subject-key> --tag <tag> | Remove a tag from a subject. |
azynote-ctl rename session --subject <subject> --old-session-id <old-session-id> --new-session-id <new-session-id> | Change a session's date and time, which is its id. |
azynote-ctl save onepager --subject <subject> --session-id <session-id> --type-id <type-id> --content <content> --intent <generated|generated_in_batch|agent|quick_capture|edited|seeded|task_complete|task_note> [--one-liner <one-liner>] | Save a OnePager you wrote yourself into a session. |
azynote-ctl unlink session from subject --subject-key <subject-key> --session-id <session-id> --subject-key-to-remove <subject-key-to-remove> | Take a session out of one of its subjects. |
azynote-ctl update calendar rule --id <id> [--target-subject-key <target-subject-key>] [--field <field>] [--value <value>] [--enabled] | Change a calendar rule. |
azynote-ctl update memory --memory <memory> | Replace what Azynote remembers in this workspace. |
azynote-ctl update note --session-id <session-id> --filename <filename> --content <content> [--title <title>] [--tags <tags>] | Replace a note's text, and its title or tags if given. |
azynote-ctl update session oneliner --session-id <session-id> --one-liner <one-liner> | Set or clear a session's one-liner. |
azynote-ctl update session subjects --subject-key <subject-key> --session-id <session-id> --new-subject-keys <new-subject-keys> | Set every subject of a session at once. |
azynote-ctl update session title --subject <subject> --session-id <session-id> [--title <title>] | Set or clear a session's title. |
azynote-ctl update subject display name --subject-key <subject-key> --new-display-name <new-display-name> | Rename a subject. |
azynote-ctl update subject link --subject-key <subject-key> --index <number> --label <label> --url <url> | Change one of a subject's links. |
azynote-ctl update subject status --subject-key <subject-key> --status-text <status-text> | Set or clear a subject's status text. |
azynote-ctl upload asset --subject <subject> --session-id <session-id> --source-path <source-path> [--target-filename <target-filename>] | Copy a file or folder from your Mac into a session, filed by its type. |
Something else? Write to support@azynote.com.