Repository navigation
Releases: mirror-mind-ai/mirror-desktop
Release list
v0.4.0-alpha.3 — Timing the Start of a Turn
digest: >
Nothing changes on screen. The app now times the start of every turn, step by step, so the wait
of up to 40 seconds before the agent answers on a long Conversation can be measured where it
happens.
v0.4.0-alpha.3 - Timing the Start of a Turn
Date: 2026-11-04
Highlights
- No visible change. This version measures; it does not yet make anything faster.
- Every turn's start is timed. From the moment the turn is admitted to the moment Pi starts its
agent, each step is recorded in the Journey's timing ledger (CR194). - Still Intel only, and not signed.
Where We Started
After Send, Pi takes about 2 seconds to have the message on a small Journey and up to 42 seconds on
a long one. Measured apart on copies, Pi, the session and the Mirror context explain about 10 of
those seconds. The rest happens only in the running app.
What Changed
- The Pi worker marks each step as it finishes: admission, session baseline, journal running,
extensions, Mirror context, workspace, spawn, prompt write, first output and agent start. One
turn_startrecord per turn goes intosettlement-timings, also when the turn ends before the
agent starts. A failed write never fails the turn (CR194).
What Does Not Change
The same Mirror core and the same Pi as v0.4.0-alpha.2. Nothing in a home's database or in the
app's preferences changes.
Conscious Exclusions
- No fix yet. The fix follows the measurement.
- The timing ledger keeps 256 records per Journey, so it now holds about half as many
settlements as before. - No signing, notarization or Apple Silicon build yet.
What We Learned
In development, on a small session, the Mirror context already takes 6 of the 8 seconds, and every
native step together takes a tenth of a second. Measuring the running app is cheaper than guessing
from its parts.
Next Horizon
Read the timings of long Conversations in production, then fix the step that grows (CR194).
v0.4.0-alpha.2 — The Message Comes Back
digest: >
A message cancelled in the first seconds comes back to the composer again. The persona named at
the top of the answer had made an empty answer look written, so the message was lost.
v0.4.0-alpha.2 — The Message Comes Back
Date: 2026-11-04
Highlights
- Cancel right after sending, and the message is yours again. It returns to the composer with
the notice "Message returned to the composer", ready to edit or send again (CR193). - No empty answer is left behind. A cancelled turn whose answer held only the persona no longer
stays in the conversation. - Still Intel only, and not signed.
Where We Started
CR183 (v0.3.0-alpha.9) gave back a message whose turn was cancelled before any answer. CR188
(v0.3.0-alpha.12) then started naming the persona at the top of the answer as soon as the Mirror
delivers its context, which happens before Pi takes the message, often 20 to 40 seconds after Send.
The Navigator found in Nautilus that the message was lost again and the composer stayed empty.
What Changed
- The persona marker no longer counts as an answer. A cancelled turn with no prose, no interrupted
fragment and no work gives its message back, and its persona-only answer is dropped (CR193).
What Does Not Change
The same Mirror core and the same Pi as v0.4.0-alpha.1. Nothing in a home's database, the app's data
folder or its preferences changes.
Conscious Exclusions
- The wait before Pi takes the message is not shortened here; it is why this window is so easy
to hit and may get its own change. - The journal records of these short cancels still stop one step before
interrupted; this did
not cause the loss and is read separately. - No signing, notarization or Apple Silicon build yet.
What We Learned
Two changes that each passed their own check can still meet badly: one decided "unanswered" by an
empty answer, the other began writing into that answer earlier. The decision now lives in one named
function, tested with the persona present.
Next Horizon
The Navigator's check in production, then RS027 and the launch.
v0.4.0-alpha.1 — Nautilus for Mirror
digest: >
The first Nautilus for Mirror. Mirror Desktop TS becomes Nautilus, a new app with its own name,
identifier, data folder, update channel and the Nautilus spiral back as its icon, and a script
carries the 0.3 app's state across, Conversations, Pi, settings and key included.
v0.4.0-alpha.1 — Nautilus for Mirror
Date: 2026-11-04
Highlights
- Nautilus for Mirror. The app is called Nautilus for Mirror in the Dock, Finder and window,
and Nautilus in its menu. Its words say Nautilus, and the violet spiral it had as Nautilus
Harness is its icon again. - A new app, beside the old one. Its bundle identifier is
ai.mirrormind.nautilus, so it has
its own data folder and its own update channel (updates.mirrormind.sh/nautilus). Mirror Desktop
TS stays installed and works as before, as the way back. - The state comes across.
scripts/carry_03_state.mjscopies the 0.3 app's data folder into
Nautilus's: every home's Journeys, Conversations and Pi sessions, Pi and Claude Code as
installed, the model settings, the OpenRouter key and the avatar. It also repairs, on proof, the
older history the 0.2 carry had left failing its checks (CR192). - Still Intel only, and not signed.
Where We Started
v0.3.0-alpha.16 closed the Mirror Desktop TS line. The Navigator chose to rename the app and to move
every machine coordinate with the name (CV-013), so that new people arrive with the identifiers the
product will keep.
What Changed
- Name, identifier and channel (CV-013.DS-002, slice 1): release line 0.4 under
ai.mirrormind.nautilus; the release gate knows three lines and refuses any crossing. - The words (slice 2): the interface, native messages, the microphone permission and the
release route's output say Nautilus. - Labels in data (slice 3): prompts open with
[Nautilus Journey authority], Pi sessions end
· Nautilus · Generation N, and new Mirror Conversations carry the interfacenautilus(CR171).
Older prompts and labels are still read, and Mirror's learning reads both labels. - The icon: the Nautilus Harness spiral (
0c4684cb), with itsDEVand a newEVALbadge. - Carrying the state (CV-013.DS-003): a dry-run-first, all-or-nothing script that never writes
the 0.3 folder, clones files on APFS and moves only the structural session paths.
What Does Not Change
The same Mirror core and the same Pi as v0.3.0-alpha.16. The Mirror home does not move and its
database is not touched. The 0.3 channel keeps answering for the installations still on it.
Conscious Exclusions
- No automatic move from 0.3. Mirror Desktop TS is not offered this version: a different app
cannot be installed over it. Nautilus is installed from its DMG and the state is carried by hand. - The repository and package names stay
mirror-desktopfor now. - The sites still say Mirror Desktop until CV-013.DS-005.
- No signing, notarization or Apple Silicon build yet.
What We Learned
A rename is cheap in words and costly in coordinates: identifiers, folders, channels, stored labels
and the hashes that guard history all carry the old name. Rehearsing the carry on a clone of
production found two defects before they could reach anyone: a copy that did not clone, and history
receipts the previous carry had left stale.
Next Horizon
The Navigator's cutover (CV-013.DS-004), then the sites (DS-005): nautilus.mirrormind.sh, and the
Mirror site pointing to Nautilus.
v0.3.0-alpha.16 — The Last of the Line
digest: >
The last version on the Mirror Desktop TS line. It changes nothing in the app; it exists so that
an app left open on alpha.15 can show it arrive without a restart. Next comes Nautilus for Mirror.
v0.3.0-alpha.16 — The Last of the Line
Date: 2026-11-04
Highlights
- The last Mirror Desktop TS version. The app is becoming Nautilus for Mirror, which comes
as a new app with its own name, identifier and update channel. - Nothing changes in the app. This version carries no new behaviour.
- It proves alpha.15's promise. An app left open on alpha.15 should show this version in its
chip without being restarted. - Still Intel only, and not signed.
Where We Started
v0.3.0-alpha.15 (CR191) taught the chip to ask the update channel again while the app stays open.
That can only be seen in the field with a version published after it.
What Changed
- Only the version number. The source is v0.3.0-alpha.15's, with the roadmap records for CV-013
(Nautilus for Mirror) added beside it.
What Does Not Change
The same Mirror core and the same Pi as v0.3.0-alpha.15. Nothing in a home's database or in the
app's preferences changes. This line's update channel keeps answering, so an installation that has
not moved to Nautilus yet keeps working and can still be updated to here.
Conscious Exclusions
- No rename here. Renaming inside this line would leave the identifier, data folder and channel
under the old name; CV-013 moves all of them together as a new line. - No signing, notarization or Apple Silicon build yet.
What We Learned
Some behaviour can only be proven by the next release: a check for new versions needs a new version
to find. A release with no change of its own is a fair price for that evidence.
Next Horizon
Nautilus for Mirror (CV-013): line 0.4 with identifier ai.mirrormind.nautilus and its own
channel, a script that carries this app's state across, and its own site at nautilus.mirrormind.sh.
v0.3.0-alpha.15 — Noticed While Open
digest: >
A new version is now noticed while the app stays open: the version chip asks again every four
hours, and when the window comes back after more than an hour.
v0.3.0-alpha.15 — Noticed While Open
Date: 2026-11-04
Highlights
- A new version shows up without closing the app. The version chip asks the update channel
again every four hours, and when the window comes back after more than an hour. - Nothing else changes in how updating works. The notice is the same chip, installing is still
your choice, and it still waits for the turn to finish. - Still Intel only, and not signed.
Where We Started
The update channel was asked once, when the window loaded. The app is used continuously and rarely
closed, so a release published later could go unnoticed for days (CR191).
What Changed
- CR191. While the app is open, the chip looks at the clock every five minutes and asks the
channel when four hours have passed since the last check, or when the window regains focus or
becomes visible after more than an hour. A Mac that slept through its timers is covered by the
return to the window. - One check at a time, and silent. A later check shows no "checking" state, and a failed one
(offline, channel down) shows nothing; the next moment asks again. - The chip keeps what the person is looking at. A later check never interrupts an installation
or an error message being read, keeps an update already shown, and moves a shown notice to a
newer version when one appears.
What Does Not Change
The same Mirror core and the same Pi as v0.3.0-alpha.14. Nothing in a home's database or in the
app's preferences changes. The update channel and its manifests are unchanged. Mirror Desktop 0.2
is not offered.
Conscious Exclusions
- No system notification. The notice stays in the chip; a notification outside the app was not
asked for. - The intervals are not a setting. Four hours and one hour were agreed with the Navigator.
- No signing, notarization or Apple Silicon build yet.
What We Learned
The check at load assumed an app that is opened and closed like a document. A workspace that stays
open for days needs its own clock, and a sleeping Mac means the clock alone is not enough: coming
back to the window is the moment that matters.
Next Horizon
One more release, published while this one stays open, to see the notice arrive without a
restart; then CV-013, the rename to Nautilus for Mirror.
v0.3.0-alpha.14 — Only the Canonical Set
digest: >
The app opens with only Conversation beside each Journey. The Agent Field (until now the Context
Map) and the Agent Canvas become the first extensions, off by default and turned on in a new
Settings tab, Extensions.
v0.3.0-alpha.14 — Only the Canonical Set
Date: 2026-11-04
Highlights
- A Journey opens on its Conversation alone. With no extension turned on, the surface tabs are
not drawn. - Settings › Extensions turns on the Agent Field and the Agent Canvas, each adding its
tab beside Conversation. Both are off by default, on every installation. - Two names change: the Context Map is now the Agent Field, and Agent's Canvas is now Agent
Canvas. - Still Intel only, and not signed.
Where We Started
CV-012 decided that the app ships a small canonical set (Journeys, personas and their
conversations) and that everything else becomes an extension the person turns on or off. The
extension mechanism does not exist yet, and the launch should not show functions that will later
leave the core: hiding them now avoids taking them away afterwards (CV-012.DS-001).
What Changed
- CV-012.DS-001, the Extensions tab. A seventh Settings tab says that extensions are still
being built and that its options bridge what exists today to how it will work. It holds two
switches whose state reads in words as well as in colour. - The tabs beside Conversation follow the switches. A switcher with only Conversation left is
not drawn, and a Journey remembered on a surface that is now off opens on its Conversation. - The Agent Canvas is read only while it is shown, so turning it off also stops reading the
drawing from disk. - A Journey document clicked in a conversation opens in the Agent Field when it is on, and
outside the app, like any other local file, when it is off.
What Does Not Change
The same Mirror core and the same Pi as v0.3.0-alpha.13. Nothing in a home's database or in a
Journey's files changes; the switches are kept with the app's preferences for each home, and the
surfaces keep their stored ids. Ariad and the Tactical and Strategic altitudes were already hidden
and stay so. Mirror Desktop 0.2 is not offered.
Conscious Exclusions
- The extension mechanism itself (installing, versioning, contributing surfaces) is CV-012's
later work, after the launch. - Switches for Ariad and the altitudes are not offered; they are not ready to be turned on.
- No signing, notarization or Apple Silicon build yet.
What We Learned
The design that shipped was neither of the two proposed: not a switch per function, not a method
switch above them, but a tab that says honestly that the mechanism is still on its way. And two of
the five functions the launch had to hide were already hidden, which left exactly the two the
Navigator named.
Next Horizon
CV-013, the rename to Nautilus for Mirror, the last step before promotion.
v0.3.0-alpha.13 — The Person at the Top Right
digest: >
A correction sent in the first seconds of a turn now waits and is taken; the person is shown at
the top right and named on their own turns; Chapters moves into the ⋯ menu; the reset dialog says
plainly what resetting does and when it helps.
v0.3.0-alpha.13 — The Person at the Top Right
Date: 2026-11-04
Highlights
- A correction sent right after Send is taken. It waits, pending, until the turn can receive
it, instead of being refused. - The person is at the top right and on their turns. A round button with the photo or initial
shows the person's name, and their turns carry that name instead of "You". - Chapters is in the
⋯menu, and the reset dialog explains what a reset does, when it helps,
and that Cancel is the safe default. - Still Intel only, and not signed.
Where We Started
A correction sent in the first three seconds of a turn was refused, while one sent later was
taken (CR187). Pi was not the one refusing: the app asked before its own invocation could take the
correction. The header carried a Chapters glyph and no sign of whose Mirror this is; the person's
turns said "You" beside a hard-coded "N"; and the reset dialog did not say plainly that the agent
would forget the Conversation (CR190).
What Changed
- CR187. While the invocation does not exist yet, has no Pi process yet, or has not sent the
turn's prompt, the app answers "not yet" and writes nothing. The correction stays pending and is
asked again every quarter second until it is taken, the turn ends (it is then recorded as
unconsumed) or two minutes pass. A correction never reaches Pi ahead of the prompt it corrects,
and a refused correction now keeps its reason. - CR190, the person. The name is the one typed at setup ("What should your Mirror call you?"),
or one written in Settings › You › Name, or the home's user read as a name (alisson-valereads
"Alisson Vale"). Its initial replaces the "N" in the transcript, the turn navigator and Settings. - CR190, the header. At the top right:
⋯, then the person button. Chapters is the first item
of the⋯menu, separated from Reset agent context, and says in the item why it is unavailable
when the Conversation has no chapters. - CR190, the reset dialog. It says the agent starts with no memory of the Conversation, that the
past generation stays readable but cannot be made active again, and that the Mirror's memories are
untouched. It says when to reset, points to Compact now when the context is only long, has
Settings' Close button, and makes Cancel the focused, emphasized action. - CR188, a remainder. The model's
◇ personaline no longer flashes in the live agent comments.
What Does Not Change
The same Mirror core and the same Pi as v0.3.0-alpha.12. Nothing in a home's database changes; the
written name is kept with the app's preferences for that home. Mirror Desktop 0.2 is not offered.
Conscious Exclusions
- The Mirror's written name is not read from the core. Its Desktop API does not expose the user
identity; an extend-only core read can later replace the name taken from the home's user. - The 41 seconds between Send and Pi's prompt that CR187 observed are not reduced here.
- No signing, notarization or Apple Silicon build yet.
What We Learned
The refusal looked like Pi's and was the app's: reading Pi's source showed it queues a correction
at any point, which moved the repair to where the app asked too early. And a name the setup screen
already asked for was being thrown away; the Navigator's question found it before the field in
Settings became the only way to give it.
Next Horizon
CV-012.DS-001, launching with only the canonical set, then CV-013, the rename to Nautilus for
Mirror, before promotion.
v0.3.0-alpha.12 — The Persona Above the Answer
digest: >
Each answer names the persona it speaks as above the text, from the context the Mirror delivered,
instead of a signature trailing the answer.
v0.3.0-alpha.12 — The Persona Above the Answer
Date: 2026-11-03
Highlights
- The persona is named above the answer, from the start of the turn, and stays there after the
turn ends, after reopening the Conversation and after relaunching the app. - No signature trailing the answer. A
◇ personaline the model writes at the end is no
longer shown in the text. - Still Intel only, and not signed.
Where We Started
On the 0.3 line the Mirror asks the model to sign its answer, and the model signs on the last line.
The surface read only a signature on the first line, so the row above each answer said "Agent" and
the signature trailed the text (CR188). Since the cutover, 94 of 126 answers in production signed
last, none first, and 32 not at all.
What Changed
- Before Pi starts, the app tells the surface which persona the Mirror's context speaks as, and the
turn keeps it when it settles. - When a Conversation is loaded, the persona is read from Pi's own record of the context each turn
was given. Only the persona's name is read; the context is not. - An answer from before, with no context recorded, still shows the persona from its own signature,
on its first or last line.
What Does Not Change
The same Mirror core and the same Pi as v0.3.0-alpha.11. Which persona the Mirror chooses is the
core's decision and is unchanged. Mirror Desktop 0.2 is not offered.
Conscious Exclusions
- The Mirror's choice of persona still follows one keyword, and naming a persona in the prompt
does not choose it (CR189, recorded as a core debt; the core's persona work may replace it). - A correction sent in the first seconds of a turn is still refused (CR187).
- No signing, notarization or Apple Silicon build yet.
What We Learned
The first repair read the persona from Pi's record, assuming the end of a turn reads it again. It
does not: since CR184 a turn settles on the conversation already on screen. Two checks in the
development app failed before the persona was written where the settled turn keeps it.
Next Horizon
CR187 and the rest of the RS026 queue.
v0.3.0-alpha.11 — Settings by Intent
digest: >
Settings are grouped by what the person wants to do, setup offers Claude through Claude Code, and
a Journey whose project path starts with ~/ has its agent work in that project.
v0.3.0-alpha.11 — Settings by Intent
Date: 2026-11-03
Highlights
- Settings grouped by intent. Models, Mirror, You, Sound & Voice, Updates and Diagnostics.
Settings opens on Models. - Claude in setup. The step that connects a model provider offers Claude through Claude Code,
as Settings already did, and an installed Claude lets setup go on. - The agent works in the Journey's project when its path is written from the home folder
(~/…), instead of in a new folder under~/Mirror Journeys/. - Still Intel only, and not signed.
Where We Started
Models were spoken of in three tabs (Agent, Connections, Runtime), and the Mirror home's path sat in
a diagnostic list (CR175). A Journey whose project path was ~/Code/szen_play had its turn refused
that folder as not absolute, so the agent wrote under ~/Mirror Journeys/ (CR186).
What Changed
- Models holds the providers, the default model and thinking, and Model Intents. Mirror
holds the bound home, its database, the binding control, the OpenRouter key and what the Mirror
learned. You holds the avatar and the appearance. Diagnostics holds the runtime channel
and the current session controls. - Setup's provider step shares the Connect block with Settings.
- A registered project path starting with
~/, or a bare~, names the home folder for the turn
and for the Journey's documents, canvas and projections. A~userpath is still refused.
What Does Not Change
The same Mirror core and the same Pi as v0.3.0-alpha.10. Sound & Voice and Updates are unchanged.
Mirror Desktop 0.2 is not offered.
Conscious Exclusions
- A correction sent in the first seconds of a turn is still refused (CR187, next).
- A folder already created under
~/Mirror Journeys/is left in place. - No signing, notarization or Apple Silicon build yet.
What We Learned
The Mirror keeps a project path as the person wrote it, so every reader of that path has to
expand it; one of 76 paths in production was written with ~, and that was enough to send a
Journey's agent elsewhere.
Next Horizon
CR187 and the rest of the RS026 queue.
v0.3.0-alpha.10 — A Turn Ends Quietly
digest: >
The end of a turn no longer freezes a long conversation: the transcript is not drawn again, and
the app stops reading and parsing the whole stored conversation several times per turn.
v0.3.0-alpha.10 — A Turn Ends Quietly
Date: 2026-11-03
Highlights
- No flash when the agent finishes. The conversation stays in place at the end of a turn
instead of being drawn again from the top. - No freeze after the answer. In a conversation of production's size (6,196 messages, 34 MB
stored), the longest pause on the page at the end of a turn fell from 12 s to 0.21 s. - Still Intel only, and not signed.
Where We Started
In long conversations, the Conversations area flashed hard when the agent finished, and the app
seemed stuck for several seconds afterwards (CR184). The output also felt slow during a turn
(CR185).
What Changed
- A finished turn is settled on the conversation already on screen, plus the Mirror's confirmation,
instead of on a copy read back from disk that lacked what the screen derives from Pi. - Each save sends only the loaded chapter. Keeping the earlier history, messages and the record of
agent actions, is now done by the native save, which already read the stored file. Before, the
page read and parsed the whole conversation before every save. - The checks before and after the Mirror records a turn read only identity and the turn ledger,
not the messages. - A save at production's size went from 32.6 MB to about 1 MB.
- The Working glow now fades on its own layer and respects the reduced-motion preference in the
conversation list too.
What Does Not Change
The same Mirror core and the same Pi as v0.3.0-alpha.9. The stored conversation keeps every
message and every record of agent actions; loading earlier chapters reads them back. Mirror
Desktop 0.2 is not offered.
Conscious Exclusions
- The native save still takes a few seconds on a very large conversation, off the page's main
thread. - The page still does measurable work per frame while text streams. It is not felt, so it is
not changed. - No signing, notarization or Apple Silicon build yet.
What We Learned
The slow frames first measured during a turn were the recording's Screenshots instrument, not the
app. And one of two changes made together tripled the cost it meant to cut; they had to be
measured apart.
Next Horizon
CR182 and the rest of the RS026 queue.