RELEASES
What's new in Codron
Every released version, with the changes that shipped in it. Already on Codron? Auto-update brings new versions in for you.
EARLIER · page 3 of 5
v0.8.0Jun 20, 2026Projects stop finishing at v1: an operator-set ambition tier drives a REASSESS pass that keeps finding the next valuable work
- · The big one: projects no longer park the moment their backlog empties. Dogfooding showed the methodology was quietly optimizing for 'reach a defensible v1 and stop': projects hit a self-declared 'complete' state in ~8-12 cycles and parked, even when the operator wanted a real product. The cause was structural: discovery scoped a tiny v1, the backlog only ever shrank (delete done items, never add), and an empty backlog was hard-wired to mean 'accomplished'. That made Codron collapse toward a one-shot coding agent. 0.8.0 replaces 'empty backlog = done' with a REASSESS gate.
- · AMBITION tier: you now tell Codron how far to push a project: `prototype` (prove it works, park early for your review), `product` (deepen until a real user would choose it and keep using it), or `service` (product PLUS reliability, edge cases, and regression hardening for a live deployment). Pick it when you create or promote a project, change it anytime in the project's settings tab. The agent reads it every cycle and never raises its own tier; when it thinks a project has earned more, it asks you. Existing projects default to `product`.
- · REASSESS: when the backlog would empty, the agent stops being a builder and becomes a critic. It re-reads the briefing and plan, then judges the project from MULTIPLE personas (the target users + alternatives from the plan's §2, plus a designer's and operator's eye) against the ambition ceiling: would each of them actually choose this and keep using it, and where's the biggest gap? It picks the single highest-value gap, refills the backlog, and keeps going, or, only at a genuine ceiling, escalates to ask you to raise the tier, or parks with a one-line justification. 'Valuable work' is defined by that yardstick, not a hardcoded checklist, so the work it finds fits the project instead of a template.
- · 'Accomplished' now means something real. Before, it meant 'my todo list happens to be empty'. Now it means 'I reached the ambition ceiling AND a REASSESS pass found no autonomous high-value work left', and the cycle has to say why (genuinely done, or blocked on something only you can provide: a paid account, a design call, credentials). Raising a parked project's tier in settings re-engages it automatically, so 'this is good, now make it great' is one click.
- · Validated live: a project that had parked at v1 (empty backlog, accomplished), bumped to the `service` tier, ran one cycle and refilled its backlog with service-grade hardening work it found on its own (graceful handling of bad LLM JSON instead of 500s, URL validation, empty-extraction edge cases, regression tests) and stayed engaged instead of re-parking. Work that genuinely needed the operator (vector-search migration, new input types) was listed separately as gated, not fabricated into busywork.
- · Feed card meta line leads with cost now (`6.7k · 1:56`, tokens then duration) and drops the relative timestamp; the same engagement's 'when' already shows on its left-panel timeline row, so repeating it in the feed was redundant.
v0.7.4Jun 20, 2026Cycle outcome becomes an explicit action the agent picks, not a self-reported confidence float
- · End-of-cycle `CONFIDENCE: 0.NN` becomes `OUTCOME: clear | verify | halt`. The float was fake precision: LLMs cluster their self-reports in the 0.80-0.95 band regardless of correctness, and the 0.83 vs 0.87 gap carried no real signal, yet the downstream behaviors it drove were only three buckets anyway: proceed to next cycle, request a reviewer cycle, or force a stop. So we now ask the agent to commit to that action directly. `clear` is the silent default. `verify` triggers the reviewer cycle (pair mode only; the prompt doesn't even offer the option when pair is off, so the agent can't pick something that won't run). `halt` replaces the old `< 0.60` forceStuck floor: same hard stop, just driven by an explicit agent decision rather than a heuristic cutoff.
- · Feed engagement card drops the `conf 0.87` text in favor of a small tinted outcome chip on attention-worthy cycles. `clear` rows stay quiet (no chip: adding one to every row would just be visual noise the eye learns to skip); `verify` is amber, `halt` is red. The eye picks the rows worth a second look out of the strip immediately, instead of decoding a float per row and asking "is 0.78 above or below the cutoff?".
- · Discovery and reviewer cycles drop the self-assessment line entirely. Their signal was never the number; it was the escalation.json the discovery cycle wrote, or the `.last-review.md` the reviewer cycle produced. Asking those cycles to also pick an OUTCOME would be duplicate plumbing; null in the column is the correct value there.
- · Telegram cycle-done alerts mirror the dashboard: only `verify` / `halt` cycles surface the chip in the meta line, `clear` cycles stay silent. The bot channel was getting `conf 0.91 / conf 0.88 / conf 0.94` noise every commit; now the rows that earn attention earn a chip and the rest just say `<commit-type> · <sha>`.
- · The legacy `confidence` column on `engagements` stays in place as a frozen historical column: 0.7.3 and earlier rows keep their floats so existing feeds aren't rewritten, but new cycles write null there and read off the new `outcome` column instead. No data migration; the swap is purely forward-looking.
v0.7.3Jun 20, 2026Project view header refresh: 3-col stats grid, aligned tabs, semantic action homes
- · Left-panel header redesigned. The dot-separated stat line (`11 engagements · 101k tok · 25m 04s`) becomes a 3-column grid, small uppercase label above each value (`ENGAGED / TOKENS / DURATION`), so the lifetime numbers are scannable instead of comma-chained. The duplicate lifecycle chip (`● ACCOMPLISHED`) goes away too: the same chip already lives in the top-bar ProjectSwitcher next to the project name, so repeating it on the left card just read as noise the moment both surfaces landed on screen.
- · Tab strip aligned with the stats grid. The three tabs render as `grid-cols-3` with the same `px-4 gap-3` as the stats above them, and the tab label is left-aligned within each cell, so `ENGAGED ↕ timeline`, `TOKENS ↕ docs`, `DURATION ↕ source` sit in three crisp columns down the panel head. The active-tab indicator (thin line) tracks the label width via an inline-block wrapper rather than spanning the full cell, keeping the indicator visually tied to the label.
- · Tab order is `timeline | docs | source` now, with `timeline` as the default landing surface; the live engagement heartbeat is the first thing you see when you open an active project, instead of static docs you'd have to scroll past to find what's happening.
- · Folder and repo-link icons move from the MissionCard into the Source tab's git header. That's their semantic home (alongside branch / pull / push), and the GitHub icon now always reserves a slot (rendered disabled with a `no git remote configured` tooltip when none is set), so the row's layout doesn't shift as you switch between projects with and without remotes. The Source tab header reads as `[left-side status: branch info / loading / cross-machine / not initialized] [right-side icons]` across every phase, so there's no half-empty strip floating above the body.
- · `+ add reference` lands inside the Docs tab as the last row of the list, instead of a stranded `+` button in the tab strip. The trigger now sits where the operator is already looking when they reach for it, same pattern as the rest of the docs rows, with `Plus` icon in the tag slot and `add reference` in the filename slot.
- · Center-panel tabs (`session / feed / preview / api / variables / settings`) get a uniform `min-w-16` so the six labels read as a uniform row instead of jagged box widths driven by label length. Each box stays content-sized rather than stretched to fill, with the active-tab bg highlight unchanged, preserving the full-rectangle hit target.
- · `fmtCount` (used for the lifetime token counter) extends past M to B. The formatter previously capped at megas, so a project crossing 1B would render as `1234.5M` and overflow the column; it now scales `1.5B` with stable widths at the boundaries (`9.9k → 10k`, `9.9M → 10M`, `999M → 1B`) so the DURATION column to its right never gets pushed.
v0.7.2Jun 20, 2026Scratch becomes a brainstorm surface, decisions take structured answers, and engine installs cascade direct → rescue → docs
- · Scratch is a read-only brainstorm/research surface now, not a coding sandbox. It used to spawn claude with full Edit/Write/Bash and would happily dive into building something, which then hit the 120s chat timeout and left half-edits behind. Scratch claude now runs with --disallowed-tools=Edit,Write,Bash and a prompt that steers research + recommends promoting to a project when it's time to build; the UI is re-skinned to the session chat's visual language (left-aligned messages, role dots, smooth streaming). A stop button replaces send while a reply streams: clicking it finalizes the pending assistant row, which is also the agent's cancel signal: the in-flight claude process is aborted via an AbortController keyed by the row, and whatever streamed so far stays with a stopped marker.
- · Decisions take structured per-question answers. When the agent escalates with multiple questions, you used to pick "answer in note" and hand-number your answers in one textarea, eyeballing the question list above. Now the agent emits the questions as structured data and the dashboard renders one input per question, each pre-filled with the agent's researched recommendation, so you edit only what you'd change and the note is assembled for you (one "Q: ... / A: ..." line per question). Telegram also lists the questions so a phone reply can answer them; both surfaces converge on the same final note. Decisions raised before this field existed fall back to the old parse-from-detail path.
- · Engine connections in Settings learn to actually install everything. Auto-install was npm-only (claude / codex / vercel); every other engine (gh, gcloud, ngrok, supabase, antigravity) just opened a docs link. The new cascade per engine × platform: (1) direct command (`npm i -g …`, `brew install …`, `winget install …`); (2) a claude -p rescue agent that probes which package manager exists on the machine, runs the right one non-interactively, and verifies with `<bin> --version`; handles distro variance and engines with no fixed command (gcloud, antigravity); (3) open the docs URL as the final fallback. Every row shows a single "install" button instead of branching to "install docs", and rescue output streams into the same log panel with a [rescue] prefix.
- · Docs becomes a tab in the project's left panel. The docs list (briefing / plan / skills / references) used to live inside MissionCard as its own section above the timeline/source tab strip, mixing a section with a tab strip below it. Docs is now the third tab next to timeline and source, and the default tab when you open a project so briefing/plan still land in view. The "+ add reference doc" button collapses to an icon-only "+" on the right of the tab strip, matching the folder/remote shortcuts; a few verbose labels trim down too: "NEEDS YOUR CALL" → "DECISIONS", "REFERENCE DOCS" → "REFERENCES".
- · Live "engaging…" heartbeat while a cycle is engaged. The event stream goes silent during phases with no tool calls (engine boot, and the final report / decision synthesis at cycle end), so the right-panel log looked frozen and read as "stuck / crashed". An always-animating indicator (staggered pulsing dots, pure CSS) now pins under the event list while the project is engaged, with a centered "engaging…" placeholder filling the pre-first-event gap. Conveys liveness even when no new event has landed.
- · Fix: preview pane no longer lands blank on tab re-entry. Switching to the preview tab unmounts/remounts PreviewPane, which detaches and re-attaches the WebContentsView. On same-URL re-attach we skip the reload and force a repaint into the new compositor surface via `webContents.invalidate()`, but `addChildView` allocates that surface asynchronously, so a single synchronous invalidate frequently fired before the surface existed and painted nothing. The pane stayed blank until you switched away and back. Now we re-issue invalidate across a few frames (0/50/150/400ms) so at least one lands after the surface is ready; invalidate is idempotent, so the extra calls are cheap no-ops once the frame is painted.
- · Fix: WebFetch and WebSearch were silently hanging in session and scratch chat. Both chats spawn `claude -p` with `--permission-mode=default`, which gates every tool call on a permission prompt. The spawn has no UI channel to answer that prompt, so any tool outside the implicit cwd-Read allowance silently hung and the model would hallucinate a "permission window" and ask the operator to click Allow. Switched to `bypassPermissions`; the read-only boundary still holds via `--disallowed-tools=Edit,Write,Bash`, so research tools (Read/Grep/Glob/WebFetch/WebSearch/Task) work without prompts and build tools stay blocked.
- · Variables view auto-masks secret values. Adding a secret-named key (`API_KEY`, `*_TOKEN`, etc.) used to leave it revealed while typing, and saving never re-hid anything you'd toggled open, so a token could sit in plain text on screen until you reloaded. New secret keys start hidden now, and saving re-masks every secret-keyed entry.
- · Top-bar AGENT chip stops nagging when everything's fine. A bare "AGENT" label + green dot read as orphaned noise; you already know Codron is alive because you're using it. The signal that matters is when the local agent dies and projects stop making progress. Renders nothing while running; the red dot + retry stays in the same slot so the failure case still surfaces in a familiar spot.
- · Cleanup: removed every em-dash (-) from rendered UI text (empty states, error messages, banners, titles, the variables tab, onboarding copy), replacing them with plain punctuation (period / semicolon / hyphen) that reads the same. Comments, LLM-prompt strings, regex literals, and en-dashes (like "1-3 minutes") are left alone.
v0.7.1Jun 19, 2026Preview lands clean on the first load: agent probes the dev-server socket before declaring ready
- · Preview no longer flashes a connection-refused error on the first frame. Dev servers (Next, Vite, Django, uvicorn, ...) print "Local: http://..." the instant they pick a port, typically a beat before the OS finishes binding the socket. Codron used to treat that log line as "ready", so the dashboard's first iframe load raced the bind, hit ERR_CONNECTION_RESET, and auto-retried while the operator saw an error page flash. The fix moves the wait to the source: the agent (and the local desktop supervisor) now opens a TCP connect against the printed host:port with exponential backoff (50 → 100 → ... capped at 1s, 10s ceiling) and only emits "ready" after the socket actually answers. Typical wait is 50-300ms; the renderer-side retry budget stays as a safety net but almost never fires now, and a pathological server that never accepts on the printed port surfaces ready after the 10s ceiling with a warning line in the log tail.
- · Marketing site /releases page folds older entries by default and paginates 10 per page. The latest release stays expanded at the top; everything below lands as one-line rows (chevron + version + date + highlight, right edge fades out instead of a bare ellipsis) you click to open. Two pages already at 19 historical entries; the page stops being a giant scroll dump as the changelog grows.
- · Env-vars-needed card no longer paints the entire howto in link color. The previous prefix-only regex wrapped the whole string in an <a> when it merely started with https://, so a howto like "https://platform.openai.com/... 에서 키 발급 후 .env 교체" rendered the Korean prose in link color and stuffed trailing text into the href. Only the URL portion is the link now; the rest is plain prose.
- · SHARE row in the preview panel sits at one weight. The localhost hint and the share button used to render 1px bigger than the adjacent SHARE chip, so the row read as visually mismatched. Both drop to 11px now, matching the chip.
- · Chat input no longer fires Send when you hit Enter to confirm an IME (Korean / Japanese / Chinese) composition. Composition-in-progress Enter is treated as IME commit, not message submit.
v0.7.0Jun 19, 2026The operator model: a multi-session workspace per project, and any session becomes the next engagement order
- · A project now opens as a multi-session workspace, not a single chat. Open as many sessions as you want as tabs, and split the surface into 1, 2, or 4 panes to think in parallel: compare two lines of attack side by side, drag a session from one pane to another, close a pane and the layout collapses back on its own. A session is your director's desk for one train of thought, not a transcript of the agent's work.
- · Session chat is local-only now. The conversation runs straight from the Codron desktop app against your project on your machine (read-only: it reads files to ground its answers but never edits, runs Bash, or changes anything), and the thread lives on your machine, not in the cloud. Nothing you think out loud in a session rides the database. Only the feed (engagements and field reports, the permanent record) stays synced. Thinking is local and ephemeral; the record is shared. As a bonus, chat keeps working even while the engagement agent is restarting, and a session survives quitting and reopening Codron.
- · + order turns a session into the next engagement. When a thread lands on what to do, hit + order: Codron reads the whole conversation and drafts a clean engagement order (an intent line plus concrete action items, written in the language you were thinking in) that you edit inline and drop into the queue. It flows into the next engagement cycle exactly like a typed order. The bridge from 'figure out what to build' to 'go build it' is now one button.
- · Bring context into a session. Attach images (paste or pick) and they open as a popup lightbox rather than taking over the whole window; @-mention a project doc (briefing, plan, skill, or reference) to pull it into the conversation so the session reasons against what's actually written down, not a paraphrase.
- · Source pane goes quiet on success. Pull and push no longer dump a wall of git output when they work; the synced chip is the signal. Output only surfaces when something actually needs your eyes.
- · Streaming and chrome polish across sessions: replies paint in a few sizeable chunks instead of a character-by-character trickle, per-message 'now' timestamps are gone (they were noise and made an in-flight reply look finished), Ctrl/Cmd+R reloads the window, and pending-order rows in the right panel are trimmed to a single line of intent: no icon, source tag, or timestamp.
v0.6.3Jun 17, 2026Mission card opens folder and repo, and the four signature workflows land on the site
- · Two new icon buttons on every mission card's status row: open folder (desktop-only, scoped to the host machine because the stamped projectPath won't resolve on the wrong OS) and open repository (visible whenever git_remote is stamped; SSH remotes like git@github.com:org/repo.git get normalized to https so the link just works in a browser, unrecognized forms hide the button instead of producing a broken URL). Even when the daily flow is hands-off the code, you still need to know where it lives.
- · Settings → Notifications shed the three checkboxes (Escalations / Long cooldown / Auth failures) that gated each Telegram event kind separately. The master Telegram toggle plus the per-project mute already cover quiet this channel and quiet this project; the per-category dimension was UI without a real use case. Cleaner card, less to read on first visit, and the agent no longer carries a per-project NotificationPrefs cache.
- · Fix: /decisions and /projects on Telegram no longer sometimes render twice after an unrelated settings save. The poll loop's getUpdates offset lived inside startLoop, so every user_settings restart reset it to undefined and the new loop asked Telegram for everything since the last confirmed offset, replaying the buffered command. The offset now lives on a ref in the outer scope and the settings notifier only fires when (enabled, botToken, chatId) actually moved. While here, slimmed /projects from a two-surface view (prose + buttons saying the same thing) to a one-line header with a status mix (e.g. `Projects (3) · 2▶ 1⏸`) and one button per project.
- · The pending-decision machine chip was a faint 11px tag, easy to miss which host you were about to authorize from. Promotes the chip to match the filter-chip styling (online dot, stronger contrast) and, when the desktop bridge sees the operator on a different host than the decision targets, flips it amber + adds a remote marker. Cross-host authorization still works as before; the chip just disambiguates the target before you click.
- · Fix: the Contact support modal opened snapped to the top of the window instead of centered. TopBar's backdrop-blur made the 40px header strip the containing block for any position:fixed descendant inside it, and SupportDialog renders through ProfileMenu which lives in the header. Now portals through document.body, same pattern the MissionCard modals already use.
- · Marketing site: the four conversion cards in WHY CODRON now carry the named workflows the site uses everywhere else: OvernightOps, Pocket Approvals, The Triage, Snap to Source. A new WORKFLOWS IN MOTION section between WhyCodron and BUILT-IN TOOLING animates the first three as DOM-driven mini-demos with a single shared 100ms tick (Snap to Source already animates as the preview-snap panel one section below). Storyboards for all four also landed under docs/marketing/storyboards/ so the same scripts can feed YouTube shorts and cold-email assets when those go out.
v0.6.2Jun 17, 2026Chat replies actually stream now: token-by-token typewriter, scrollbar polish
- · Chat streaming is genuinely live. v0.6.0 advertised streaming but it didn't actually arrive end-to-end: claude -p in its default text mode buffers stdout to process exit, so the dashboard saw the whole reply as one blob at the end. We now spawn claude with --output-format stream-json --include-partial-messages and accumulate the text_delta events, so the chat bubble fills in as the model generates, both the project intel chat and the scratch chat.
- · And smoothed it out. The agent flushes the pending row every ~80 ms (was 200 ms) and the dashboard adds a small typewriter that paces incoming text at ~280 chars/s with requestAnimationFrame between server updates, then snaps to the full body the moment status flips to 'ok'. Result: continuous typing instead of visible chunks.
- · Fix: stray hair-thin scrollbar at the right edge of the window on scratch + project detail pages. The TopBar's outer header carried a 1 px border-b but no explicit height, so the bar measured 41 px while <main> assumed 40 px, 1 px of body overflow, just enough for the OS to draw a faint document scrollbar. h-10 on the outer header lets box-border consume the border into the 40 px total and the page sits flush again.
- · The chat list's right-aligned bubbles + timestamps no longer touch the inner scrollbar; added ~16 px of breathing room on the right side of the scroll container for both project and scratch chats.
- · Home page trimmed a hair vertically (py-8 → py-6, safe-area pb-2rem → pb-1rem) so the Overview fits in a typical Electron window after v0.6.0's SCRATCHES section landed.
v0.6.1Jun 16, 2026Machine chip selection no longer snaps back on multi-machine accounts
- · Fix: the PROJECTS machine-chip filter on the home page now respects your click. On accounts with two or more machines, picking a different machine's chip used to 'snap back' to the local machine within a few seconds, making it hard to browse another host's projects. The dashboard refreshes every 5s to stay current with realtime, and the auto-focus effect was re-running on every refresh and stomping the selection; now it runs once on load and leaves your pick alone afterward.
v0.6.0Jun 16, 2026Scratches: chat your way into a project before committing to a briefing
- · New Scratches surface: project-less chat with the local Claude for the 'what should I even build' phase, before you've decided on a folder. Each scratch runs in a per-scratch sandbox dir with Edit/Write/Bash enabled (unlike the project chat, which is read-only) so you can prototype freely. When you're ready, hit Promote: the agent reads the whole conversation and drafts a { projectName, briefing, firstRole } that pre-fills the New project form; you pick the machine and engine and submit. The scratch deletes itself once the project is created.
- · Chat replies stream in real time on both the scratch chat and the project intel chat. Previously each reply popped in as one block when claude exited; now stdout streams into the pending row character-by-character with a small pulsing cursor at the end, matching the Claude Code extension feel.
- · + new scratch and + new briefing on the dashboard header are now a single + new menu, same vocabulary as the profile dropdown, scratch vs briefing branches one click deeper.
- · Overview decision triage collapses when several decisions stack. A single pending decision stays expanded (the common case); two or more land as collapsed cards with a chevron to expand individually, so usage and project rows aren't pushed off-screen by a wall of markdown.
- · Fix: a project synced from multiple machines no longer offers a needs-clone banner on a machine that already has the checkout. The shell now checks local disk first and offers a 'pull and switch to this machine' flow instead, which runs git pull and re-claims the row for this machine on the next sync. Previously clicking clone hit the agent's 'clone target exists' guard and stalled.
- · Fix: macOS auto-update no longer dead-ends on 'Code signature did not pass validation'. Squirrel.Mac refuses to install unsigned bundles (we ship unsigned today; see RELEASING.md), so on macOS the updater now skips downloadUpdate() and surfaces a Download .dmg button plus the one-shot xattr -cr command to run after replacing the app. Windows keeps its current auto-install flow.
- · Visual polish: unicode arrows (→ ← ↑ ↓ ▶) across decision / engagement / activity / source / scratch surfaces are replaced with lucide ArrowRight / ArrowLeft / ArrowUp / ArrowDown / Play icons so weight and stroke stay consistent at every size.
- · Marketing site: landing reordered into a funnel, the WHY CODRON section now argues conversion instead of teaching the concept, every page has its own canonical URL so Google indexes them separately, and the auth pages use noindex meta tags instead of a robots.txt block (which was hiding them from Search Console too).
UPDATE INFO
Codron auto-updates from download.codron.app. A new version triggers a Restart-to-apply toast in the running app. You can also re-download the installer from the download page at any time.