Automation

Workflows

21 step types, 6 LLM providers, and a template system that turns voice into structured actions — all running locally on your Mac.

What are Workflows?

Workflows are automation pipelines that process your voice memos. When you finish a recording, workflows can automatically transcribe, extract information, send notifications, create reminders, run shell commands, or trigger external actions.

Each step produces an output that subsequent steps can reference via template variables. This means you can chain an LLM summary into a shell command, then save the result to a file — all triggered by a single voice memo.

Anatomy of a Workflow

Every workflow has three parts:

Triggers

When does it run? After transcription, on keyword detection, or manually.

Conditions

Should it run? Gate on memo length, time of day, or transcript content.

Steps

What does it do? Steps run in order. Each step can use output from previous steps.

Step Types

Talkie includes 21 built-in step types across 7 categories. Every field supports template variables like {{TRANSCRIPT}} and {{OUTPUT}}.

AI Processing

3 steps

LLM

.llm

Generate text using any configured LLM provider. Supports auto-routing across 6 providers.

providerExplicit provider or auto-route
promptTemplate string with variables
systemPromptSystem instructions
temperature0.0–1.0 (default 0.7)
maxTokensOutput limit (default 1024)
costTierbudget / balanced / capable

Transcribe

.transcribe

Convert audio to text using quality-tiered models running on-device.

qualityTierfast (Apple) / balanced (Whisper S) / high (Whisper L)
fallbackStrategyautomatic / onTimeout / none
overwriteExistingReplace current transcript

Speak

.speak

Text-to-speech output. Walkie-talkie mode — Talkie talks back.

textText to synthesize (supports templates)
providersystem / openai / elevenlabs / local (Kokoro)
voiceVoice identifier
rateSpeech rate (0.0–1.0)
playImmediatelyPlay now or just generate file

Communication

3 steps

Notification

.notification

Display a macOS system notification.

titleNotification title
bodyNotification body
soundPlay sound (boolean)

iOS Push

.iOSPush

Send a push notification to your iPhone via CloudKit.

titleNotification title
bodyNotification body
includeOutputAttach workflow output to notification

Email

.email

Compose and send email via Mail.app.

to / cc / bccRecipients (supports templates)
subjectEmail subject
bodyEmail body
isHTMLHTML formatted email

Apple Apps

3 steps

Apple Notes

.appleNotes

Create a note in the Notes app.

folderNameTarget folder
titleNote title
bodyNote content
attachTranscriptAppend transcript to body

Apple Reminders

.appleReminders

Create a reminder with optional due date and priority.

listNameTarget reminder list
titleReminder title
dueDateSupports date math: {{NOW+1d}}
prioritynone / low / medium / high

Apple Calendar

.appleCalendar

Create calendar events with date, time, duration, and location.

titleEvent title
startDateStart date (template or ISO)
durationDuration in seconds
locationEvent location
isAllDayAll-day event

Integrations

3 steps

Shell Command

.shell

Execute CLI commands with a security allowlist. Access to jq, curl, gh, claude, python, node, and more.

executablePath (checked against allowlist)
argumentsCommand args (sanitized)
stdinPipe input via stdin
timeout1–300 seconds (default 30)
environmentEnvironment variables

Webhook

.webhook

Send HTTP requests to external endpoints.

urlTarget URL
methodGET / POST / PUT / PATCH / DELETE
headersCustom HTTP headers
bodyTemplateCustom JSON body template
authBearer token or API key

Cloud Upload

.cloudUpload

Upload memo audio to S3 or Cloudflare R2.

providers3 / r2
bucketBucket name
pathTemplateUpload path with templates
credentialIdStored AWS credential reference

Output

2 steps

Clipboard

.clipboard

Copy text to the macOS pasteboard.

contentText to copy (default {{OUTPUT}})

Save File

.saveFile

Write output to a local file. Supports path aliases like @Obsidian.

filenameSupports templates: {{DATE}}-{{TITLE}}.md
directoryPath or @alias (e.g., @Obsidian/notes)
contentFile content
appendIfExistsAppend instead of overwrite

Logic

2 steps

Conditional

.conditional

Branch workflow execution based on a condition expression.

conditione.g., {{OUTPUT}} contains "urgent"
thenStepsSteps to run if true
elseStepsSteps to run if false

Transform

.transform

Extract, format, or process text data without an LLM.

operationextractJSON / extractList / formatMarkdown / regex / template
parametersOperation-specific params (pattern, maxLength, etc.)

Triggers

3 steps

Keyword Trigger

.trigger

Gate workflow on phrase detection in the transcript.

phrasesTrigger phrases (e.g., "hey talkie")
searchLocationend / anywhere / start
contextWindowSizeWords to extract around match
stopIfNoMatchGate workflow if no match found

Extract Intents

.intentExtract

Detect structured actions and commands from transcript using LLM, keywords, or hybrid.

extractionMethodllm / keywords / hybrid
recognizedIntentsSupported intents with synonyms
confidenceThreshold0.0–1.0 (default 0.5)

Execute Workflows

.executeWorkflows

Dynamically run workflows for each detected intent. The routing layer.

intentsKeyKey containing intents array
stopOnErrorStop on first failure
parallelRun concurrently

Template Variables

Every step configuration field supports {{VARIABLE}} syntax. Variables are resolved at runtime before each step executes.

VariableDescription
{{TRANSCRIPT}}Full transcription of the memo
{{TITLE}}Memo title (sanitized for filenames)
{{DATE}}Date in YYYY-MM-DD format
{{DATETIME}}Date and time in YYYY-MM-DD_HH-mm format
{{OUTPUT}}Output from the previous step
{{WORKFLOW_NAME}}Name of the current workflow
{{stepOutputKey}}Output from any named step (by its outputKey)

Date Math

For steps that accept dates (Reminders, Calendar), you can use relative expressions:

ExpressionResult
{{NOW+1d}}Tomorrow
{{NOW+2h}}2 hours from now
{{NOW+30m}}30 minutes from now
{{NOW+1w}}1 week from now

Format: {{NOW±N<unit>}} where unit is d (day), h (hour), m (minute), or w (week).

LLM Providers

The LLM step supports 6 providers with 3 cost tiers each. When autoRoute is enabled, Talkie selects the best available provider at runtime.

ProviderBudgetBalancedCapableContext
GeminiFlash LiteFlash2.5 Pro1M
OpenAIGPT-4.1 MiniGPT-4.1o31M
AnthropicHaiku 4.5Sonnet 4.6Opus 4.6200K
GroqLlama 3.3 70BLlama 8B128K
GrokGrok 3 Mini FastGrok 3 MiniGrok 3131K
MLX (Local)Llama 3.2 1BQwen 2.5 3BMistral 7B8–32K

Auto-routing priority: Groq → Gemini → OpenAI → Anthropic → MLX. The system picks the first provider with a valid API key, respecting your cost tier preference.

MLX runs entirely on-device

No API key needed. Models run on Apple Silicon via the Neural Engine. Best for: simple extraction, formatting, and privacy-critical workflows where nothing should leave the machine.

Shell Security

Shell steps enforce a strict allowlist/blocklist model. Only approved executables can run. Arguments are sanitized to prevent injection.

Allowed

Text: echo, cat, head, tail, wc, sort, grep, sed, awk, tr

Data: jq, base64, shasum

HTTP: curl

Dev CLIs: gh, claude, npx

Runtimes: python3, node, bun

macOS: osascript, open, pbcopy, pbpaste

Utilities: date, uuidgen, file, which

Blocked

Destructive: rm, rmdir, mv

Privilege: sudo, su, doas

Permissions: chmod, chown

Processes: kill, killall

Raw shells: sh, bash, zsh, fish

Network: ssh, scp, sftp, nc

Disk: diskutil, mount, umount

You can add custom executables in Settings → Workflows → Allowed Commands. All arguments are sanitized: null bytes removed, length-limited to 500KB, and injection patterns (command substitution, shell operators) are detected and logged.

Execution Pipeline

Steps execute sequentially. Each step goes through the same lifecycle:

1
CheckIs the step enabled?
2
EvaluateDoes the condition pass?
3
ResolveReplace {{VARIABLES}} in all config fields
4
ValidateFor shell steps: check executable against allowlist
5
ExecuteRun the step
6
StoreSave output to context under the step's outputKey

The workflow context accumulates outputs from every step. Reference any previous step's output by its outputKey — e.g., if a step has outputKey: "summary", later steps can use {{summary}}.