Show HN: Voicecard – a CLI that resolves contradictions in rambling voice notes

1 pointsposted 4 hours ago
by zuuna

1 Comments

zuuna

4 hours ago

Voicecard is a small CLI that reads a voice-note transcript and outputs only the tasks you actually meant as JSON. The whole point: when you change your mind mid-note or come to a different conclusion in a discussion it keeps the final version instead of just noting down everything you've said.

echo "I'm going to the store to get grapes today, no actually I'm getting apples." | voicecard

{"items": [{"kind": "card", "text": "Get apples from the store"}]}

Not "grapes and apples," and not just "grapes". Most tools gives you one of those two. I built this because I dictate notes on the go and change my mind halfway through a sentence or just think of more and more info to several tasks I've spoken of which need to be categorized correctly. Transcription tools transcribe and summarize, they do not notice you overturning yourself or actually reason about what you said.

It runs against a local Ollama model by default (qwen2.5:7b handles it fine) or with your own OpenAI-compatible API key. No server of mine, no account, no telemetry. Transcript in, JSON out.

Before posting I tested the annoying cases: full retractions ("add milk... wait, we still have milk, scratch that" should produce nothing, not a task about not needing milk), chained reversals ("apples. no, grapes. actually no, apples"), and filler words that sound like corrections but aren't like "actually" used as a transition into a new thought. Plus negative controls. Inventing corrections would be worse than one that misses them.

One result surprised me: the small 7B local model handles most of this. 15 of 18 adversarial cases and the three misses are documented in the README, including one my own fix caused: an example I added to handle retractions now over reads the filler word "wait" and dropped an item in one test. Fixing a prompt failure by example can cause a different one. I compared it against a "frontier" model (ox-alpha, a current stealth LLM, via a free API tier). It got rate-limited on 3 of 7 calls in the same run so I can't give clear numbers here.

I also fed it a test meeting transcript I wrote: a PM and two devs argue about ONE feature ticket and realize it should be split into two tickets. It split the tickets correctly, put the right details in each and ignored a proposal that got argued down mid-meeting. It also dropped one explicitly stated assignee and kinda distorted the reason one ticket was pushed back. I'll keep working on that, I need the metadata for a finished product.

As I said it takes text in, not audio. Transcription is a solved by plenty of good Whisper wrappers. The part that interested me is working out what was actually meant.

Longer term I'd like to wire this into Jira/Linear/Monday-style boards and possibly into a git-native project management tool I run (Zuuna). None of that is needed to use it. This could get extremely powerful once the AI knows your stack/project/whatever you talk about and actually KNOWS where this belongs (untested for now).

Since this is running on my homelab I also save on API calls. I make about ~3-5 notes a day when outside, that's easily a hundred notes a month and a few bucks on API costs. First I let it run on another device (which is usually sleeping when I am out and about) and used an n8n cron to hold and send them once ready. I can freely send it from my iPhone via Shortcuts (basically a POST to the n8n URL with an IF for hairpinning issues). I get notified via webhook what the AI decided, which tickets got filed (ticket number and title) or if it got sorted into an entirely different category (like personal notes etc.).

Tell me what you think!

// AI (CC) assisted heavily in building it and especially the test cases, mainly because I was too lazy to actually write the scenarios myself.