Skip to content

Muse

Muse is the friend you talk to. It isn’t a separate assistant with its own memory — it’s the voice of your Twin: every fact, preference, routine and soul trait your Twin has learned is what Muse draws on when it answers, and every conversation you have with it feeds straight back into that same Twin. Route: /muse, plus a mini version that lives right on the Living Desktop (the muse widget — see Every widget) and a full bridge to Telegram so the same Muse answers from your phone.

Threads

Every being always has (at least) one muse-kind Thread — it’s created lazily the first time you open /muse or send a message (ensureMuseThread()), and it’s named after whatever you called your Muse during Arrival, or “Muse” if you kept the default. You can start additional muse threads (a fresh topic, a clean slate) and switch between them; each is its own Thread row with its own message history.

GET /api/threads?kind=muse → Thread[]
POST /api/threads → Thread { kind: 'muse' }
GET /api/threads/:id/messages → Message[]
POST /api/threads/:id/messages → Message { content, attachments } — triggers the reply
DELETE /api/threads/:id

Posting a message returns immediately with your own persisted Message; the reply is not in the response — it streams in over the WebSocket (see below), which is what lets the same reply also reach a Telegram-paired phone or a second open tab.

GET /api/threads without kind is a general inbox across every conversation you’re in — muse threads, citizen DMs, agent threads — not just this one kind, and every thread now carries an explicit replyPolicy for who answers in it. See The messaging centre for the inbox shape, the policy, and how a conversation between citizens can be asked to carry on by itself.

Sending something

The composer (apps/web/src/muse/Composer.tsx) takes text, image/file attachments, and — where the browser supports it — voice (see below). Enter sends, Shift+Enter inserts a newline, Esc clears the draft — see Keyboard shortcuts.

An empty thread doesn’t show a blank box — it shows Suggested prompts (Suggested.tsx), six fixed starting points (“Get to know me”, “What’s happening today?”, “What do you remember?”, “Remind me later”, …) that double as a quiet tour of what Muse can actually do: remember, search the web, raise a reminder.

Voice: Muse speaks, and listens

Both halves are browser features, and they have completely different privacy stories. The product does not blur that, and neither does this page.

Speaking is on your device

Turning on spoken replies (Settings → Voice) uses the browser’s own speechSynthesis, rendering audio from voices already installed on your machine. Nothing is uploaded, nothing is recorded, no account is involved, it costs nothing, and it works in Firefox and Safari as well as Chrome. Speech starts at the first sentence boundary of a streaming reply, so Muse begins talking while it is still writing.

The voice suits the being. Soul.voice is prose written for a language model — “measured and lyrical; precise words; comfortable leaving a silence; never in a hurry” — and it is also the only description of cadence the world has. Novaterra reads it: cadence words first, then the being’s personality, then its mood as the smallest effect. A being in rain speaks a little more slowly and is still recognisably itself. Two beings in the same room are given distinguishable voices.

Nothing here ever starts on its own. Speech is reachable only from a setting you turned on or a button you pressed; opening a conversation is silent, because the speaker seeds itself with every message that already existed. It is off by default under prefers-reduced-motion.

Listening is not

SpeechRecognition reads like a local API. It is not one. Chrome opens a connection to Google’s speech service and streams your microphone to it; Edge does the same to Microsoft’s, Safari to Apple’s. Firefox has no recogniser at all. There is no flag that makes it local, and that is a direct contradiction of the sentence the rest of this product is built on.

So Novaterra does the only honest thing available to it: the microphone does not open until you have read a screen that names the company receiving your audio. The sheet says what we do not do — Novaterra never receives that audio, never records it and never stores it, only the words, and only once you send them — states the part we cannot fix, and offers the way out in the button itself: “I’ll type instead” beside “Turn on voice input”. While the microphone is live the composer says so, and lists every way to close it: press again, send, Esc, leave the tab, or go quiet for twelve seconds.

That copy is generated from the engine’s own description of itself, not written beside it. Two consequences, both deliberate: a new recogniser cannot ship without its own honest sentence, because the screen has nowhere else to get one — and when a recogniser that runs on your own machine lands, the screen disappears on its own rather than sitting there saying something that is no longer true. That local engine does not exist yet; the seam it will slot into does.

Watching it think

While a reply is in flight, the UI shows two distinct states, both driven by WebSocket events on the thread’s own topic:

  • Thinking — between your message landing and the first token, before anything has streamed.
  • Streamingmessage.delta events append text into the in-progress reply live, and any tool Muse decides to call renders as a tool chip (ToolChip.tsx) that goes pending → running → done/error in place, driven by message.tool events — you see “Searching the web…” resolve into a small results preview before the prose that used it even finishes streaming.

When the full reply is done, one message.created event replaces the streaming state with the persisted Message, and — because the assistant’s own conversational memory extraction runs asynchronously right after — a young thread’s placeholder title (“Muse”) may rename itself to something like “Weekend trip planning” a few seconds later; the UI simply refetches the thread list four seconds after each assistant reply to catch that.

What’s next

  • How Muse thinks — the system prompt, the tool loop, streaming, and what happens without a key or with the budget spent.