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:
When does it run? After transcription, on keyword detection, or manually.
Should it run? Gate on memo length, time of day, or transcript content.
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 stepsLLM
.llmGenerate text using any configured LLM provider. Supports auto-routing across 6 providers.
providerExplicit provider or auto-routepromptTemplate string with variablessystemPromptSystem instructionstemperature0.0–1.0 (default 0.7)maxTokensOutput limit (default 1024)costTierbudget / balanced / capableTranscribe
.transcribeConvert audio to text using quality-tiered models running on-device.
qualityTierfast (Apple) / balanced (Whisper S) / high (Whisper L)fallbackStrategyautomatic / onTimeout / noneoverwriteExistingReplace current transcriptSpeak
.speakText-to-speech output. Walkie-talkie mode — Talkie talks back.
textText to synthesize (supports templates)providersystem / openai / elevenlabs / local (Kokoro)voiceVoice identifierrateSpeech rate (0.0–1.0)playImmediatelyPlay now or just generate fileCommunication
3 stepsNotification
.notificationDisplay a macOS system notification.
titleNotification titlebodyNotification bodysoundPlay sound (boolean)iOS Push
.iOSPushSend a push notification to your iPhone via CloudKit.
titleNotification titlebodyNotification bodyincludeOutputAttach workflow output to notification.emailCompose and send email via Mail.app.
to / cc / bccRecipients (supports templates)subjectEmail subjectbodyEmail bodyisHTMLHTML formatted emailApple Apps
3 stepsApple Notes
.appleNotesCreate a note in the Notes app.
folderNameTarget foldertitleNote titlebodyNote contentattachTranscriptAppend transcript to bodyApple Reminders
.appleRemindersCreate a reminder with optional due date and priority.
listNameTarget reminder listtitleReminder titledueDateSupports date math: {{NOW+1d}}prioritynone / low / medium / highApple Calendar
.appleCalendarCreate calendar events with date, time, duration, and location.
titleEvent titlestartDateStart date (template or ISO)durationDuration in secondslocationEvent locationisAllDayAll-day eventIntegrations
3 stepsShell Command
.shellExecute 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 stdintimeout1–300 seconds (default 30)environmentEnvironment variablesWebhook
.webhookSend HTTP requests to external endpoints.
urlTarget URLmethodGET / POST / PUT / PATCH / DELETEheadersCustom HTTP headersbodyTemplateCustom JSON body templateauthBearer token or API keyCloud Upload
.cloudUploadUpload memo audio to S3 or Cloudflare R2.
providers3 / r2bucketBucket namepathTemplateUpload path with templatescredentialIdStored AWS credential referenceOutput
2 stepsClipboard
.clipboardCopy text to the macOS pasteboard.
contentText to copy (default {{OUTPUT}})Save File
.saveFileWrite output to a local file. Supports path aliases like @Obsidian.
filenameSupports templates: {{DATE}}-{{TITLE}}.mddirectoryPath or @alias (e.g., @Obsidian/notes)contentFile contentappendIfExistsAppend instead of overwriteLogic
2 stepsConditional
.conditionalBranch workflow execution based on a condition expression.
conditione.g., {{OUTPUT}} contains "urgent"thenStepsSteps to run if trueelseStepsSteps to run if falseTransform
.transformExtract, format, or process text data without an LLM.
operationextractJSON / extractList / formatMarkdown / regex / templateparametersOperation-specific params (pattern, maxLength, etc.)Triggers
3 stepsKeyword Trigger
.triggerGate workflow on phrase detection in the transcript.
phrasesTrigger phrases (e.g., "hey talkie")searchLocationend / anywhere / startcontextWindowSizeWords to extract around matchstopIfNoMatchGate workflow if no match foundExtract Intents
.intentExtractDetect structured actions and commands from transcript using LLM, keywords, or hybrid.
extractionMethodllm / keywords / hybridrecognizedIntentsSupported intents with synonymsconfidenceThreshold0.0–1.0 (default 0.5)Execute Workflows
.executeWorkflowsDynamically run workflows for each detected intent. The routing layer.
intentsKeyKey containing intents arraystopOnErrorStop on first failureparallelRun concurrentlyTemplate Variables
Every step configuration field supports {{VARIABLE}} syntax. Variables are resolved at runtime before each step executes.
| Variable | Description |
|---|---|
{{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:
| Expression | Result |
|---|---|
{{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.
| Provider | Budget | Balanced | Capable | Context |
|---|---|---|---|---|
| Gemini | Flash Lite | Flash | 2.5 Pro | 1M |
| OpenAI | GPT-4.1 Mini | GPT-4.1 | o3 | 1M |
| Anthropic | Haiku 4.5 | Sonnet 4.6 | Opus 4.6 | 200K |
| Groq | Llama 3.3 70B | Llama 8B | — | 128K |
| Grok | Grok 3 Mini Fast | Grok 3 Mini | Grok 3 | 131K |
| MLX (Local) | Llama 3.2 1B | Qwen 2.5 3B | Mistral 7B | 8–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.
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.
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
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:
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}}.