All loops
ProductivityEasy 5 min· claude-sonnet-4-5
Voice memo → Linear ticket
Drop an .m4a, get a spec doc and a Linear issue with acceptance criteria.
NOT DEPLOYEDNOT DEPLOYED
0186ms
Trigger
cron(0 7 * * *) fired · every day · 07:00
021266ms
Agent
claude-sonnet-4-5 · in 1166 tok · out 588 tok
03296ms
Tools
linear-mcp/linear:issue.update → 200 OK · 226ms
0476ms
Verify
schema check · json-schema draft-2020 passed
05166ms
Output
inbox triage · 6 emails auto-sorted
0646ms
Notify
audit log written · runbook link attached
SUCCESS
0%
0 runs
P50
0ms
median
P95
0ms
tail
AVG COST
—
per run
LAST OK
never
—
LAST FAIL
never
none
Latency · last 30 runs0 samples
no runs yet
Latest output · what your users see
Standup · Platform team
- @norashipped locker health-check endpoint
- @arunreviewing PR #184 (retry jitter)
- @linblocked on Stripe webhook signature rotation
- @devpicking up SEC-914 (S3 bucket audit)
// press Test to run once · Watch live to keep streaming · Deploy to make it real
The problem
You think clearly in the shower, but every idea gets lost between hearing it and typing it into Linear.
The outcome
Speak for 90 seconds, get a Linear ticket with title, description, and acceptance criteria — already in the right team and project.
Ingredients & skills
Secrets
- ANTHROPIC_API_KEY
- OPENAI_API_KEY
- LINEAR_API_KEY
Providers
- Anthropic
- OpenAI Whisper
- Linear
MCP servers
- linear-mcp
#meetings#linear#voice
How it works
Whisper transcribes your voice memo, Claude rewrites it as a structured spec, the Linear MCP server creates the issue with acceptance criteria attached.
Step 1
1 — Transcribe
Whisper API. Cheaper and faster than running it locally.
typescript
const fd = new FormData();
fd.set("file", audioFile);
fd.set("model", "whisper-1");
const { text } = await fetch("https://api.openai.com/v1/audio/transcriptions", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}` },
body: fd,
}).then((r) => r.json());Step 2
2 — Spec rewriter
Force JSON output via tool use so the Linear MCP call never fails on parsing.
typescript
const spec = await claude.tools.call("write_spec", { transcript: text });
// spec: { title, description, acceptance_criteria: string[], team: string }Step 3
3 — Create the Linear issue
Use the Linear MCP server so the secret stays in the locker.
claude_desktop_config.json
{
"mcpServers": {
"linear": { "command": "npx", "args": ["@linear/mcp-server"], "env": { "LINEAR_API_KEY": "${LINEAR_API_KEY}" } }
}
}One-line deploy
The button above runs the same command with your saved config. This is the raw CLI form.
bash
locker deploy voice-to-linear --trigger uploadRelated loops
Productivity
Internal search MCP for your tools
One MCP server that searches Notion + Linear + Slack from inside Claude Desktop.
Productivity
Screenshot diff → changelog entry
Detect visual diffs in product screenshots, auto-write a changelog blurb.
Productivity
Morning calendar prep brief
Get a 1-page brief on every meeting today by 06:30.