Corin v0.4.0: An Editor-Grade Redesign and Real Namespace Control
Corin v0.4.0 rebuilds the desktop knowledge workstation: editor-grade dark and light themes, Milkdown WYSIWYG documents, real namespace management, Human vs Agent provenance, and a fix for the duplicate-memory bug. Pairs with Uteke v0.17.0.
Corin is CodeCora's desktop knowledge workstation: a Tauri 2 and Svelte 5 app that connects to a local or remote Uteke server over HTTP and gives your agent memory a real interface. You browse memories, write documents, and walk the knowledge graph that links them. Everything runs against your own Uteke instance.
Today we shipped v0.4.0, the project's largest release and its first since July. It rebuilds the interface from a UX audit, adds the namespace tooling the app was missing, and fixes a memory bug that had been quietly duplicating content on every edit.
The interface, rebuilt
v0.4 started with a visual audit, not a feature list. The default theme is now an editor-grade dark palette in the Linear and Raycast school, with a calm light theme alongside it. Switching themes changes the palette only: typography, spacing, and radius stay identical so both themes feel like the same app.
Navigation collapsed to three destinations. Home, Memories, and Documents live in a 56px rail, and maintenance moved into Settings where it belongs. The graph view got real capacity: it seeds 300 nodes, loads more up to a ceiling of 800, and shows readable content labels instead of the raw memory UUIDs the server used to send. Labels stay hidden until you toggle them, because a force-directed graph with 300 visible labels is unreadable.
Documents switched to Milkdown (Crepe) for WYSIWYG editing. The editor follows the app theme, and typing [[ starts a memory-link autocomplete, so cross-referencing a memory from a document is now a few keystrokes instead of a copy-paste of IDs. A command palette (Ctrl or Cmd plus K) ties it together with unified search, navigation, and actions from anywhere in the app.
Managing namespaces instead of filtering them
Namespaces existed in Corin from the start, but only as a filter. If a namespace drifted, you fixed it with HTTP calls. v0.4.0 adds a proper management surface: inline rename and merge, deletion with an explicit strategy for the memories inside (refuse, merge into another namespace, or deprecate so nothing is hard-deleted), explicit creation, and active versus deprecated counts.
These actions depend on namespace APIs in the Uteke server, so Corin gates them by server version. On an older server the controls render disabled with a tooltip that says why. Uteke v0.17.0 shipped on September 6 with the namespace API and a fix for graph edge inserts, and we recommend running it. The gate exists so Corin degrades honestly instead of failing silently.
Provenance: who wrote what
Every memory in Corin is now classified as Human or Agent. Anything created through the app is stamped human; agent-written and legacy rows read as Agent. Badges appear on cards and the detail panel, and editing a memory keeps its original author. When you are auditing what an autonomous agent wrote versus what you typed yourself, that distinction is the whole point.
The trust work goes further: pin memories so they float to the top of the list, a memory timeline for history, cross-entity linking between memories and documents, and a Maintenance tab that runs a type backfill, flags duplicates for review, and imports or exports the full store as JSONL. An activity heatmap on Home shows your memory workload over the year.
The bug we had to fix loudly
The worst bug in this release was ours. The memory editor's duplicate pre-check ran through a call that inserts. Every save created a second copy of the memory, and every edit left a stray copy of the edited content behind. The pre-check is now a read-only recall and the insert happens exactly once. If you spotted mystery duplicates in earlier versions, that was it.
The rest of the fix list is smaller but the same theme of honesty: desktop clients no longer drop metadata, pinned, and type fields between the HTTP client and the UI; the web handler no longer serializes absent fields as nulls (which Uteke's update endpoint treats as delete-this-field); the command palette can no longer open underneath the memory editor; and updater signatures are enabled again, so signed auto-updates ship properly in this release.
Running v0.4.0
Corin is MIT licensed on GitHub, with builds for macOS (Apple Silicon and Intel), a Windows x64 installer, and .deb and .rpm packages. It needs a running Uteke server; v0.17.0 is the recommended pairing. If you already run an older Corin, the in-app updater works again as of this release.
Corin is young. It has six stars today, and we are fine saying that. If local-first memory tooling for agents is your kind of problem, this release is a good point to look: the repository is github.com/codecoradev/corin, the memory engine is github.com/codecoradev/uteke, and the full changelog lives in the repo.
What's next
The near-term backlog is public in the issue tracker: a related-memories panel in the memory detail view, upgrade prompts for older Uteke servers, and continued graph work. The pattern we are following is the one this release set: make the honest path the easy path, and gate anything that would otherwise fail silently.