This release isn't a feature push. It's a reliability and performance pass — the kind of work that makes you stop noticing aricode in a good way. If you'd been getting brief hangs during tool calls, or had a model call die on a flaky network, or wanted the file tree to open instantly on a monorepo, this is for you.
The chat hang is gone
The biggest visible change: that brief macOS spinning cursor that flashed every time the agent ran a tool is fixed. The cause was a synchronous git status call running on the main process every time the file tree refreshed — which it did several times per multi-step tool message. Git is now invoked asynchronously, the file tree refresh is debounced so a burst of mid-turn updates coalesces into one reload, and the session list updates silently in the background instead of flashing "Loading…".
If you'd noticed your sidebar appearing to "reload the repo" on every message, that's what was happening — and it doesn't anymore.
Long conversations stay smooth
Message bubbles are now memoized: when a tool result lands or status changes, only the bubbles that actually changed re-render. Before, every state update was forcing a full markdown re-parse on every prior message in the conversation, which scaled badly with long sessions. The fix is invisible if you've never noticed it, but it's the thing keeping a 50-message conversation feeling as snappy as a fresh one.
Faster opening of large repos
Open a monorepo with deep node_modules, output/, or test-fixture trees and the file tree used to stall while it walked everything. Now there's a hard cap — 5000 nodes total, 500 entries per directory — with a clear "… N more entries (truncated)" marker so you know it's not silent loss. The agent's own tools (list_files, search) still see everything; the cap is purely on the sidebar walk.
The model dropped your connection? aricode now retries
If you've ever seen Model error: terminated (cause: SocketError: other side closed) kill a turn — that's the upstream API closing the TCP connection mid-response. It happens. Provider rate-limit kickers, reverse-proxy idle timeouts, internal hiccups. v0.5.3 classifies this (along with UND_ERR_SOCKET, UND_ERR_HEADERS_TIMEOUT, and friends) as transient and auto-retries with exponential backoff. You'll see a brief pause and then the request continues, instead of the whole turn failing.
The retry layer also walks the error's cause chain, so it sees the real reason behind undici's terse top-level "terminated" message.
File edits are now actually safe
A handful of long-standing rough edges in the edit pipeline are fixed:
- Atomic writes. Files are written to a temp path and renamed into place. A crash mid-write can't leave a half-written file on disk, and a parallel reader (your editor, another tool) never sees a torn file.
- Encoding preserved. CRLF line endings, UTF-8 BOM, and the presence-or-absence of a trailing newline all survive the edit. No more silent diff churn from line-ending normalization.
- Concurrent-edit detection. If a file changes externally between when aricode read it and when it tries to write, the write is rejected with a clear error instead of silently overwriting your change.
- All-or-nothing hunks. Multi-hunk edits used to apply hunks 1..N-1 and then surface an error when N failed — leaving the file half-edited. Now the entire batch either lands or none of it does.
- Tighter fuzzy match. The fuzzy-match safety threshold was raised so the agent won't accidentally land an edit on a sibling function with a similar shape.
For when something does go wrong
Three new things in Aridesk for the times you need to debug a session:
- Diagnostics tab. A live view of model calls, tool calls, MCP errors, edit conflicts, and crashes as they happen. Recent errors get their own column so you can scan for problems at a glance.
- Diagnostic bundle export. One click produces a single
.jsonwith recent events, redacted config, and the active session — the artifact you'd attach to a bug report. API keys and OAuth tokens are stripped before bundling, so you can share it freely. - Token meter. A tiny gauge in the top bar showing context-window fill projection from the latest model response. Goes amber at 70%, red at 90% — so you see compaction coming.
None of these add overhead when you're not watching them: the structured event log is buffered and flushed in the background, and message rendering is unchanged from a perf standpoint.
The smaller things
- Chat formatting is tighter. Paragraph, list, and code-block spacing was reduced; lists no longer compound margins on every item.
- API keys, GitHub tokens, JWTs, and Bearer tokens are stripped from any error text before it reaches the UI or the event log.
- Uncaught exceptions and unhandled promise rejections are now captured to the event log instead of dying silently — so when you file a bug report, the failure context is attached.
- Stream idle watchdog: if a provider sends the initial response then stops sending data, aricode detects it within 60 seconds and surfaces a clear timeout, instead of hanging indefinitely.
- Per-server MCP tool timeouts (default 30s, configurable per server in
mcp.json). - Checkpoint manager auto-prunes by both count and memory budget so a long edit-heavy run can't OOM.
Why this release matters
Reliability is invisible when it works and infuriating when it doesn't. v0.5.3 is the release where the things that ought to "just work" — the network coming back, the file edit landing intact, the UI not freezing on every tool call — actually do.
If you'd previously bounced off aricode because of beachball hangs, or had a long session die because of a single dropped connection, this is the release to come back to.
Get the update
Update aricode and restart any open sessions. The desktop app picks up the perf changes immediately. For the SDK, run npm install aricode@latest.
For the full release-by-release history, see the changelog. For the broader story behind aricode's direction, the v0.5.0 launch post is still the place to start.
Ready to try v0.5.3?
If you'd been getting hangs during tool use, this is the fix. Open a real codebase and run a tool-heavy task to feel the difference.
Read the docs →