Inbox

Sending a voice note

Send someone a voice note in matt's own cloned voice, as the platform's own voice note, on Discord, Instagram or Slack. It is made from his words by the voice provider (Inworld by default, Fish Audio too) and goes through the platform's engine and the account's one session, never the browser (rules 142, 143). A voice note only goes out when matt asks for one.

How the owner asks for it: "send <person> a voice note saying …", "voice note him that …", "send a vn to the group saying …"

Run it from a fresh context

Say: "go on docs/useCases/inbox/voiceNote.md for <person or chat>". The agent reads this page and runs the steps.

The steps

#StepToolDone when
1Read the chat the voice note goes todiscordRead { channel }, instagramDms { with } or slackRead { chat }, with jsonthe last messages both ways are known, and nothing new is waiting on matt that the note would talk over
2Take what he asked to say, in his words, only cleaned for spelling; when he asks you to write it, read the whole chat and write it at the length he asks (a 40 s note is about 100 to 110 words), building on what they are talking about and never re-explaining what he already told them (rule 149)the agent, from his message and the whole chatthe words to say, as text, at the length asked; not every note three short lines
3Gate it as a voice note, unless matt dictated the exact wordsvoice { text, to, with, context, spoken: true }the gate passes; if it refuses words the agent drafted, rewrite them; when matt dictated the exact words, skip this step and use mattsWords in steps 4 and 5 (rule 144)
4Dry run itdiscordVoice, instagramVoice or slackVoice { account, chat, text, mattsWords when they are his dictated words }the dry run names the chat, the words and that the clone is ready
5Send itdiscordVoiceLive, instagramVoiceLive or slackVoiceLive { account, chat, text, mattsWords when they are his dictated words, approvedBy: "matt", confirmLive: true }the platform answers sent with the message or file id
6Tell the owner what went outthe reply to the ownerthe words said, how long it ran, and where

On Discord the chat flag is channel, on Instagram with. If there is no clone yet on the provider, cloneVoice lists matt's own voice notes and cloneVoice with apply makes it once; cloneSpeak says a test line. provider picks inworld or fishAudio (default LOG_VOICE_PROVIDER, else inworld). When matt dictates the exact words ("say this: …", or the words straight from his message), they are his own speech: pass mattsWords, which skips the voice gate's read (it grades speech as typed text and refuses it) and still refuses AI artifacts (rule 144). Words the agent drafted are never sent with mattsWords. The voice note is made from text only, never from an audio file. A refusal stops it, and nothing is tried again until the owner says so (rule 94). A send refused with accountBehind means the account's catch-up was refused: tell matt, and only on his word run inboxResume { platform, account, by: "matt" }, then send again once it has caught up (rule 150). On X it is twitterVoice / twitterVoiceLive { account, with: "<handle>", text }: an X Chat voice message, sent the way X Chat's own app sends one (the m4a encrypted with the conversation key, uploaded to the conversation's media store, one AUDIO attachment), with X Chat opened by the account's saved PIN; with no PIN it is refused xchatPinMissing, and matt saves it with log twitter chat pin in a terminal (rule 151). An X Chat group takes its id as with (g and digits), the same as a dm to the group takes it as userId (rule 153). A 401 from X while uploading is the upload built the wrong way, not a refusal: it is fixed and sent again in the same turn, never left for later. The parts go to the resume_upload_url X's Initialize answers, under the same message id the voice note is then sent with. Only a rate limit, a block or the governor's cap is a refusal that stops (rule 94); when matt says to reset the cap, it is reset and the catch-up resumed with inboxResume.

A voice note after a cold opener (rule 156) goes one step further than the opener, never back over it. The opener already forwarded their tweet and said what was mad about it, so the voice note doesn't name the tweet again. It asks what comes next ("are you building that for yourself or are you gonna sell it?"). It also never talks as if they had answered: no "then" or "though", as in "is that something you're building yourself then". On 2026-11-05 every voice note that restated the tweet was held for repeating the opener (buildsOn 0.60), and every one that read as a reply was held for talking as if the chat were live (fitsTheRoom 0.37 to 0.49). Gate it inside the send, where the gate sees the opener: a voice check run on its own scores it as a cold first message. A queued voice item that is held is rewritten and put back with twitterQueueEdit, which needs the queue's run stopped first (jobCancel), then run again.

Fast, and in his spoken words. The live send says and converts the note while the account catches up and the gate reads it. A note that passes goes straight out, without waiting for it to be made (about 20 s saved on a 12 s note); one the gate refuses is never sent. Most of the wait is a refused draft, so get it right first time:

  • Answer what they last said. aj asked "is anyone else making content rn?", and the note that passed opened on that ("nah not really, man. That's why I'm on log though").
  • Write it the way matt talks, loose and short. A tidy list of three things ("connect your Twitter, your Discord, your Instagram"; "finds them, messages them and replies to them") is flagged as an AI tell (VerbTricolon).
  • Explain log only with what matt has said about it: you plug Claude into your socials, it reads everything, you tell it to go find people and it messages them for you.

The first send after a restart can wait up to a minute while the account catches up from its gap.