Attach an image to a model that can't see.
The industry-standard behavior is to remove it and answer anyway. You get a confident reply to a question the model never received.
I hate that. So octomind refuses instead. By name. Before the machine wakes and before anything is charged.
That's the whole stance behind what I just shipped: images and voice, live. Attach or paste a screenshot and the agent looks at it. Hold the mic and talk instead of typing. Send a photo or a voice note from Telegram, Slack, or WhatsApp and it lands in the same session your browser has open.
Nothing gets silently dropped
This is the part I care most about. Because it's where every other product fails.
If your model can't see, the attach button is already disabled. The tooltip names one that works.
If your machine is running an older image that predates attachments, the turn is refused too. Never sent and hoped for. Because an older agent would accept the frame, drop the picture, and reply as though nothing were missing.
Your upload stays valid through all of it. So retrying after a model switch never costs a second upload.
Refusing feels harsh. Silently dropping feels fine, right up until you're acting on an answer to a question that was never asked. I'd rather be the tool that says no up front.
Same session, same machine
Nothing here is a separate mode. That's the point.
A screenshot pasted at your desk at 09:14 and a voice note sent from your phone at 12:40 are the same session. On the same machine. With the same files. Open the tab again at six and all of it is still there.
Not a phone app that syncs to a web app that syncs to a bot. One session. One machine.
Voice you can fix before it sends
Speak, and the words arrive in the composer as text you can still edit. Nothing sends until you press send.
Transcription is very good and not perfect. The failure mode of auto-send is that a misheard word becomes an instruction. So I put guards in:
- Recording stops itself after 15 seconds of silence.
- It hard-stops at two minutes.
- A recording that comes out shorter than three words never wakes a machine.
You talk. You read it back. You fix it. Then it goes.
Replies can talk back
Replies can come back spoken in Telegram and WhatsApp, where a voice message is a real thing you can play with the phone in your pocket.
I don't read markdown out loud. A fenced block is announced as "a 12-line code block," not as a mouthful of backticks.
Spoken replies are off until you switch them on in Settings. And the text always comes too. Never instead.
What it costs
Images are on every plan, at no extra cost. No per-attachment charge. No storage charge. The disk is already part of your machine. Images cap at 5 MB, audio at 8 MB, four attachments to a message.
Voice is on paid plans. $0.010 a minute to listen. $0.025 a minute to speak. On top of the model, in the same spend view as everything else.
Routines from your chat apps
/routines now lists your routines, runs one immediately, pauses and resumes — from Telegram, Slack, or WhatsApp.
Completed runs deliver the full report into the chat rather than a bare "done." Long output is clamped to fit the platform instead of cut at a byte boundary. Times render in the routine's own timezone, not ours.
Each routine carries its own notification preference now. So an hourly check and a weekly report don't have to shout equally.
Machines are on octomind 0.47.0
0.46 was a deletion release. Verifier recovery tracking and mutation outcome contracts in. A net −1,884 lines of supervisor surface out. The benchmark said those mechanics weren't paying for themselves, so they went.
0.47 is the release that carries attachments on the wire.
Config format moves 5 → 7 → 8 across the two. The CLI migrates an existing machine's config on first run. There's nothing for you to edit.
New machines are on 0.47.0 now. Existing ones pick it up on their next rebuild, with files, sessions, and settings untouched. Voice doesn't wait on the upgrade at all. Transcription runs on my side, so the machine only ever receives text.
Fixed
A routine whose turn never started could settle early and report a run that hadn't happened. Endpoint routing also tightened how it validates domains.
The part I want argued
The refusal thing is the hill I'll die on. Every tool that strips your image and answers anyway is training you to distrust it. You can't tell it dropped anything. You just get a smooth, confident, wrong-shaped reply.
Refusing by name costs me a little friction up front. It buys you the one thing a silent drop never can: knowing your input actually arrived.
Full write-up: https://octomind.run/blog/images-and-voice
This article was originally published by DEV Community and written by Don Karter.
Read original article on DEV Community