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 replyDELETE /api/threads/:idPosting 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.
- Streaming —
message.deltaevents append text into the in-progress reply live, and any tool Muse decides to call renders as a tool chip (ToolChip.tsx) that goespending → running → done/errorin place, driven bymessage.toolevents — 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.