What was said, written down, remembered

A voice memo in the car, a screenshot with a caption, a scanned invoice already through OCR. These arrive as media and matter as text, so Memory OS turns them into ordinary semantic memories — embedded, indexed and retrievable next to everything else — and keeps a cryptographic fingerprint of the original bytes.

  • 3 endpoints
  • Transcript, provider or fingerprint
  • SHA-256 on every binary field
  • Webhook on every ingest

What this is, before what it does

This layer is text-first. It summarises and stores the caption, the OCR output, the transcript or the notes that you supply, and it fingerprints any binary you send alongside them. It does not look at your images and it does not watch your video. There is no native visual or video understanding in this product today.

Audio is the one exception, and only where a transcription provider is configured: with the Pcnaid provider or OpenAI set up, speech becomes text through them. With no provider, audio becomes a fingerprint and a note saying so.

We are putting that at the top rather than in a footnote, because “multimodal” is a word that has been asked to carry more weight than it can. What is here is genuinely useful. It is not what the word usually implies.

Three endpoints

Every one of them ends the same way: a semantic memory, embedded and indexed, with a meta.source saying where it came from and a fallback flag saying how well it went.

POST /v1/media/transcribe
A voice memo. Send base64 audio, a transcript you already have, or both. The result is transcribed, summarised, and stored as one semantic memory containing the transcript and the summary together.
POST /v1/media/multimodal
A mixed item. The payload is scanned for text, caption, ocr_text, transcript and notes; any image, audio, video or document field is fingerprinted. What is summarised is the text you supplied.
POST /v1/media/summarize
Plain text, up to 500,000 characters, summarised and stored under a source label of your choosing — which also becomes the webhook event name.

Set store: false on any of them and you get the transcription or summary back without anything being written. Useful for a preview screen, and for deciding whether a thing is worth remembering before you commit it.

Three ways a voice memo becomes a memory

The transcription path is chosen in a fixed order, and each outcome is recorded rather than smoothed over. You always know which of the three produced the memory you are reading.

You supply the transcript
A transcript_hint wins outright. No provider is called, nothing is estimated, and the result is recorded as provider user_supplied with the fallback flag clear. If your client already did speech-to-text on the device, this is the path you want.
A provider transcribes it
With the Pcnaid provider or OpenAI configured, the audio goes out for transcription and comes back as text. The stored memory takes a confidence of 0.82 and records which provider produced it.
Nothing can transcribe it
Rather than failing the request, the service computes a SHA-256 over the audio bytes and stores a memory that says plainly that transcription was unavailable, along with the fingerprint, the filename and the byte count. Confidence drops to 0.62 and the response carries note: fallback_used.

memories

A voice memo stored without a transcription provider

mem_type
semantic
meta.source
voice_memo
meta.provider
fallback
meta.fallback
true
meta.filename
site-visit-note.webm
sha256
3ab91f0c7d24e8b5…
confidence
0.62
note
fallback_used

POST /v1/media/transcribe → media.voice_memo.transcribed

A fingerprint is a small promise you can keep

Every binary field in a multimodal payload — image, audio, video or document — is hashed with SHA-256 and recorded with its byte count against the memory. That is not understanding, and we do not present it as understanding. It is three concrete things.

You can tell whether two submissions were the same file. You can prove later that the artefact you still hold is the one the memory was made from. And when a transcription or vision provider is configured afterwards, you have a stable handle to reprocess against instead of a gap where the original used to be.

When a payload has no usable text and no provider is reachable, the stored memory says so in as many words, and tells you that adding a provider key would change the outcome.

Limits, and which one bites first

Request body: 1 MB
The global body ceiling is one mebibyte by default, checked against the declared content length and again against the bytes actually streamed, so a chunked upload cannot slip past it. Base64 inflates audio by about a third, so this is the limit you will meet in practice. Raise MAX_REQUEST_BYTES deliberately if you intend to post real recordings.
Decoded audio: 25 MiB
After decoding, an audio payload above MEDIA_AUDIO_MAX_DECODED_BYTES is refused with 413 and a message naming both the decoded size and the limit. This is the service-level guard behind the transport one.
Text: 500,000 characters
The summarise endpoint accepts up to half a million characters of text in one call — long enough for a full meeting transcript that was captured somewhere else.
Events
Three webhook events fire on success: media.voice_memo.transcribed, media.multimodal.ingested and media.{source}.summarized — where the source is the label you sent, so a caption pipeline and a meeting pipeline can subscribe to different streams.

Once it is stored, it stops being media

The output of all three endpoints is an ordinary semantic memory. It is embedded by the same model, indexed by the same generated search vector, ranked by the same fusion, packed by the same budget and governed by the same tenancy boundary as a memory you typed by hand.

That is the whole design. There is no separate media search, no second index to keep in step, and no answer that can only be found if you remember the thing was a voice note. You ask about the invoice; the site visit you dictated in the car comes back with it.

Providers, fallbacks and bring-your-own keys

Give your agents a memory you can audit

Run the whole system on your own hardware under the MIT licence, or ask us about hosted access. Both start from the same place.