更新日志

同步自 GitHub Releases

v0.6.2

What's new

A workspace for the conversations you're using now

The title bar is now a temporary session workspace rather than a pinboard. Opening, creating or forking a conversation adds it next to the session you were just using; drag the pills to arrange them, and use × to remove one from the workspace without closing the session or interrupting its work. Pinned conversations remain long-term favorites in the sidebar, independent of this working set.

The workspace remembers its order across restarts and restores only the active conversation on demand. Other members stay available without loading every session into memory. Rename and context-menu actions also work for members that have been unloaded.

An optional left-side session rail offers the same workspace in a compact vertical form. Hover or focus a marker to expand its conversation pill, use arrow keys to move between members, or remove one with Delete or Backspace. Enable it in Settings → Appearance; the rail and title-bar session display can be toggled independently.

Worth knowing after the update: pinning no longer adds a conversation to the title bar. Open it from the sidebar to add it to the workspace. Turning off both workspace displays clears that working set, but does not delete conversations or stop running tasks.

One sidebar scroll, with history revealed as you need it

The sidebar now has one continuous scroll instead of separate scroll areas inside each project. Each group starts with six sessions; Show more reveals another sixteen at a time, keeping large projects from overwhelming the navigation without trapping wheel input inside a group.

Search uses the full session catalog, not just the currently visible batch. Clearing a search restores your previous group and visibility state. Group headers, the new-conversation action and the settings entry keep their familiar positions.

Model and thinking depth, in one place

The model picker now includes a thinking-depth slider at the bottom. Choose a model and adjust its supported reasoning level in the same panel, without reopening two separate menus. The composer chip shows both choices, and models with only one supported level display a disabled single-level control.

Chinese labels where they belong

Built-in tool names now follow the interface language in tool cards, live activity previews and completed-work summaries. Built-in slash commands also have Chinese names, descriptions and argument hints, and can be searched by their Chinese names. The actual /compact, /name, /export and /settings commands are unchanged; skills, templates, MCP and extension names stay as supplied.

Image-display calls remain available in the folded tool details but no longer repeat show_image in the completed-work summary — the image itself already shows the result.

Changes

History and links stay where they belong

  • Relative file links in Markdown open through the system instead of navigating the app window away from the conversation. Web links open in the browser.
  • Restored channel subscriptions wait for the initial history to be ready before delivering wakeups. A startup wakeup can no longer replace the conversation's earlier messages with only its newest response.
  • Context-compaction dividers and their summaries remain visible after reopening a session. Manual compaction no longer adds a redundant notice above the composer.

A quieter, more consistent interface

  • Model and permission selectors share the title bar's pill-shaped interaction style.
  • Scroll-edge fades replace hard separators around the title bar and sidebar footer; the sidebar divider fades at both ends.
  • Clicking empty space inside the composer focuses the text field, and long input uses a slimmer scrollbar.
  • Workspace pills and rail markers animate smoothly as conversations are added or removed, while respecting reduced-motion preferences.

Download: macOS (Apple Silicon / Intel) · Windows x64 · Linux x64 (AppImage) — see assets below. Existing installs will offer the update from the title bar or Settings → About (on adhoc-signed macOS builds the button opens this page instead). On Linux, chmod +x the AppImage before first launch.

Full Changelog: https://github.com/Jaxton07/percho/compare/v0.6.1...v0.6.2

v0.6.1

What's new

Busy projects no longer take over the sidebar

Daily and project groups now keep their session lists to eight visible rows. Longer lists scroll inside their own group, with subtle edge fades showing when more history is available above or below. Group headers stay in the main sidebar flow, so scrolling on a header still moves the full navigation instead of getting trapped in an empty inner scroller.

Expanding and collapsing a group now uses a restrained height-and-opacity transition. Collapsed content is no longer reachable by keyboard or pointer input, and reopening a group starts its list from the top. A new-conversation action is also available directly from the sidebar, with the same behavior as the title-bar action.

Session names and history stay complete

Automatically generated session titles now remain in the sidebar catalog after an idle session is unloaded from memory. Opening and unloading a session can no longer make its row fall back to an older or generic title.

History replay now reads the complete session tree rather than the compacted model context. Compaction can still reduce what is sent back to the model, but it no longer hides earlier messages when you reopen the conversation in Percho.

Drop files straight into the composer

Files dragged from Finder, Explorer or a Linux file manager can now be dropped anywhere in the writable conversation window and attached through the existing @file flow. Percho resolves native paths through Electron's sandbox-safe preload bridge, ignores invalid entries and removes duplicates without changing the original path.

Thanks to @YIKUAIBANZI for reporting and implementing the native file-drop path.

Changes

Safer window and sidebar behavior

  • On Windows, closing the window now asks for confirmation when Percho has running work that would be terminated. macOS keeps its existing close-to-hide behavior.
  • Sessions remain present in the sidebar after automatic memory cleanup instead of disappearing until the next full history refresh.
  • Session rows no longer show a duplicated native title tooltip.
  • Nested sidebar scrolling, fade state and collapse behavior have dedicated automated coverage using real Chromium wheel input.

Download: macOS (Apple Silicon / Intel) · Windows x64 · Linux x64 (AppImage) — see assets below. Existing installs will offer the update from the title bar or Settings → About (on adhoc-signed macOS builds the button opens this page instead). On Linux, chmod +x the AppImage before first launch.

Full Changelog: https://github.com/Jaxton07/percho/compare/v0.6.0...v0.6.1

v0.6.0

What's new

A real home for every session

Percho's navigation has moved into a permanent, collapsible sidebar. Recent conversations, project sessions and drafts now live in one searchable place; projects and the Daily group can be folded independently, and the sidebar can collapse all the way to zero when you want the canvas back.

The title bar has a simpler job now: it is a pinboard. Only sessions you pin appear there, in the order you choose, whether or not they are currently loaded. Session rows share the same right-click actions for rename, pin, diagnostics and delete, while project rows can be pinned or removed without leaving the current conversation.

This also changes startup behavior: Percho now opens on a clean new-conversation screen instead of restoring every previously open tab. History is always in the sidebar and loads on demand. Behind that UI, Percho keeps the active session plus up to three recently used idle sessions warm; running work, approvals, queued follow-ups, unread completions, drafts and channel subscriptions are protected from unloading. Reopening an unloaded session restores its messages, todos, queue and permission mode.

New-session state is now one renderer-owned draft instead of a collection of special-case tabs. The draft appears in the sidebar, survives navigation inside the running app, and becomes the real session when the first message is sent. Rapid clicks, duplicate opens and a session being unloaded while you navigate are all resolved with latest-selection-wins semantics, so stale requests can no longer steal focus or leave a ghost active session behind.

Worth knowing after the update: the old tabs.json open-tab list is no longer restored. No conversation data is removed — select any previous session from the sidebar. Per-session permission modes are now persisted, while new and forked sessions still start in Default mode.

Mermaid diagrams and math, rendered in the conversation

Mermaid blocks are no longer source-only cards. Flowcharts, sequence diagrams, state diagrams and the rest of Mermaid 11 render inline, load lazily, and come with a restrained preview/source switch, copy action and full-screen view. Multi-line labels render correctly, and invalid syntax becomes a visible, expandable error card instead of an unexplained blank rectangle.

KaTeX is included explicitly as well, so math renders once, with the right fonts and styles, instead of falling back to source or appearing doubled. Regular code blocks are unchanged.

Session work is easier to control

Several small requests around sessions now have first-class UI:

  • Search models by model name, provider name or id; use arrow keys and Enter without leaving the picker.
  • Rename and pin sessions from their context menu, including historical sessions that are not currently loaded.
  • Open, reveal or copy changed-file paths from both the end-of-turn file row and the diff drawer. Relative paths, file:// URLs and line anchors are normalized against the session's project.
  • Close means hide on macOS: the red window button and Cmd+W keep the app and running sessions alive; clicking the Dock icon restores the same window.
  • Sidebar groups now remember an intentional “everything collapsed” state, new drafts appear where sessions live, and the model picker no longer pushes the whole window sideways on narrow layouts.

Channel collaboration survives unloading and restarts

Channel-watch subscriptions now have real lifecycle semantics. A subscribed session is protected from automatic memory cleanup, and its topics and per-file cursors are persisted. If another agent writes while Percho is closed or the session is not loaded, reopening reconciles the cursor and delivers the missed change exactly once.

The watcher also closes several race windows around startup, unsubscribe, shutdown and self-writes. User-requested close/delete still wins; the protection only prevents automatic cleanup from silently dropping a live subscription.

The diff drawer no longer reshapes a long conversation

Opening file changes used to animate the drawer's width inside the same flex row as the chat. Every frame changed the Markdown column width, reflowed long messages and triggered bottom-pinning work — the more content a session had, the worse the animation felt.

The drawer is now a fixed-width overlay animated only with transform and opacity. In a measured 25-file / 1269-line session, the chat width stayed fixed and the animation triggered zero follow-to-bottom scrolls (down from 42–50). Click the conversation to keep comparing it with the diff; close from the title bar, the drawer button or Escape.

A new Percho identity

The app and LAN observer now use the new monochrome, three-dimensional pyramid mark with golden-ratio construction lines. The empty conversation screen uses the same mark, and both READMEs have a newly designed banner plus a cleaned-up, matching set of product screenshots and demos. Old unused icon and capture assets are gone.

Changes

Faster, safer session plumbing

  • Session state, event forwarding and cleanup now converge on one registry entry instead of parallel maps.
  • The 87 invoke channels have one typed source of truth, from which shared types, preload bindings and main-process handlers are derived.
  • LAN projection runs the same transcript reducer as the desktop renderer, and plugin manifests are validated from one shared definition.
  • Opening a session now applies the same tool whitelist as creating it; optimistic model, thinking and permission changes share rollback behavior.

This is mostly invisible, but it removes several places where create/open paths, working directories, IPC signatures or projected transcript behavior could drift apart.

Smaller fixes and polish

  • Mermaid controls use the same quiet, monochrome interaction language as the rest of Percho.
  • Date-group tests are anchored to local midnight and no longer fail depending on the CI runner's hour or timezone.
  • README feature descriptions, screenshots and Chinese/English image order are synchronized with the current product.

Download: macOS (Apple Silicon / Intel) · Windows x64 · Linux x64 (AppImage) — see assets below. Existing installs will offer the update from the title bar or Settings → About (on adhoc-signed macOS builds the button opens this page instead). On Linux, chmod +x the AppImage before first launch.

Full Changelog: https://github.com/Jaxton07/percho/compare/v0.5.8...v0.6.0

v0.5.8

What's new

Scrolling back through a long session — no more being pulled to the bottom

Fixes a regression introduced in 0.5.7. Open a session you've been running for a while and scroll up into its history, and the view kept dragging you back down to the newest messages. The mount window that made session switching instant had also taken scroll anchoring away from the browser and done the compensation by hand — and the hand-rolled version only knew the height that was inserted at the exact moment of the update. Markstream's rows arrive in two steps (a 600px placeholder first, their real height 100–300ms later — a real long session collapses by ~4400px while it settles), so every settle silently dragged the scroll position down; landing at the bottom then re-armed "follow", which pinned the view there.

Scroll anchoring belongs to the browser again: it compensates both the rows inserted above the viewport and the heights that settle afterwards. The hand-rolled path is down to one real gap — Chromium does not adjust the anchor when the scroll offset is exactly 0 (there is nothing above to adjust to), where a drift check fills in the difference and does nothing otherwise.

Measured with real wheel events (55 steps of scrolling up, asserting that the row at the top of the viewport only ever moves toward earlier messages): the 0.5.7 build violated that 11 times, this build 0 times. Switching between sessions is still instant (first frame 37–51ms on long real sessions), and a bottom-pinned view still stays pinned while new messages stream in.


Download: macOS (Apple Silicon / Intel) · Windows x64 · Linux x64 (AppImage) — see assets below. Existing installs will offer the update from the title bar or Settings → About (on adhoc-signed macOS builds the button opens this page instead).

v0.5.7

What's new

Switching to a long session, instantly

Keep a session running for a few hours, switch to a short one, then switch back: the return trip froze for about a second. Nothing was loading — a tab switch never re-reads the session file or crosses the process boundary — the renderer was mounting every message in the conversation in one commit. Hundreds of tool cards each measured their own layout (each with its own ResizeObserver), every historical code block initialized monaco, and ~14k DOM nodes landed at once. One measured session spent ~900ms in a single long task, and the wait grew with the conversation.

Two changes, aimed at the two halves of that cost:

  • A mount window — a session mounts its last 40 rows; older rows fill in 30-row chunks as you scroll toward the top, and prepending content above the viewport never moves what's on screen. The window only grows, so scrolling back down is free.
  • Tool cards measure together — overflow measurement moved from per-card effects to one scheduler: every card reads layout in a single pass, then all of them update in one render, sharing a single ResizeObserver.

Measured on a production build: switching into a 1600-message (3200-row) session now paints its first frame in 16–20ms, and real long sessions land at 37–51ms with no long tasks at all. Scrolling into history adds rows without jank, and switching away and back costs the same every time.

Linux: AppImage builds, in the official releases

Percho now ships a Linux x64 build next to macOS and Windows — the release pipeline builds an AppImage on Ubuntu, in-app updates work as they do elsewhere, and the docs cover first-run details (chmod +x the AppImage; install libfuse2 on Ubuntu 22.04+/24.04+ if it refuses to start).

Thanks @matsuzaka-yuki for the AppImage target and the packaging legwork (#46).

Extensions can finally talk to you

Extensions drive their UI through ctx.ui, and until now every method in it was a no-op here. A plugin that asked a question got "user cancelled" back instantly — with no way for anyone to answer, and a model that carried on believing the user had declined.

ctx.ui is wired to real GUI now, following the official RPC semantics:

  • select / input / editor / confirm open a dialog quartet — keyboard driven, queued per session, with timeout and fail-closed cancellation.
  • notify becomes a toast, rate-limited (8s dedupe, at most 3 at a time, overflow collapses) so a chatty plugin can't bury the interface.
  • setEditorText lands in the composer draft with a one-off source hint, and permission prompts move onto the borderless card language used everywhere else.

Pasted-image thumbnails also stopped squeezing the conversation: they float above the composer now instead of pushing the messages you were reading out of view.

Subagents, with a volume knob

  • A subagent's thinking frontmatter finally takes effect: values are validated (invalid ones are dropped with a warning in Settings rather than silently ignored), with precedence Settings override → agent definition → SDK default chain.
  • Settings gained a per-agent thinking-depth dropdown (7 levels, default "follow the agent definition"), and the run card echoes the level that actually ended up in effect after the SDK clamps it.
  • subagentPreferBuiltin — prefer the built-in subagent over a third-party extension — is a persisted preference with a Settings toggle now. It applies without a restart, and Settings warns you when a third-party subagent extension is loaded while built-in precedence is on.

Changes

Streaming text and code blocks, quieter

Streaming markdown no longer shimmers: the library's per-commit fade created temporary opacity/will-change spans, and the constant compositor churn read as flickering text — fade is off, so deltas land in stable text nodes. Read-only code blocks also stopped drawing editor decorations (occurrence, selection and bracket highlighting, unusual-character markers) that looked like leftover selections in something that can't be edited.

Failures surface where you are looking

Session actions (switch model, change thinking depth, create a session) used to write a global error field that nothing ever cleared: one failure stuck in the store, leaked into other sessions, and bypassed the unified error system. Those failures push a toast with the cleaned-up cause instead, and model/thinking changes roll back and re-persist on failure — so the UI never claims a model that didn't take effect.

UI plugins: quota, and a footer slot

useQuota() is new: it reports opencode-go plan quota (rolling / weekly / monthly windows, refreshed at turn end and every 60s) for quota rings, and returns null when there's no subscription so plugins can hide themselves. useContextUsage(sessionId) and useLanguage() are now declared in the plugin type definitions — they were already available, just invisible to plugin authors — and there's a new composer.footer inline region next to the context ring for small widgets.

Thanks @Q1y1ng for the quota hook and the new region (#51).

Packaging

Pull-request CI now runs an electron-builder --dir smoke, so packaging regressions (config parsing, files/asarUnpack globs, icons, native module unpacking) fail on the PR instead of on the release tag, and builder-debug.yml no longer leaks into release assets.


Download: macOS (Apple Silicon / Intel) · Windows x64 · Linux x64 (AppImage) — see assets below. Existing installs will offer the update from the title bar or Settings → About (on adhoc-signed macOS builds the button opens this page instead). Linux builds are new: chmod +x the AppImage before the first launch.

v0.5.6

What's new

Permission modes, per session — default or full access, with an audit trail

A new permission chip in the composer toolbar (right after the + button) switches each session between two modes:

  • 默认 (Default) — the behavior you know: risky tools ask first, per the built-in rules.
  • 完全访问 (Full access) — everything runs without asking, and every high-risk command is appended to permission-audit.jsonl (with session id and boundary; the log self-trims at 1MB, keeping the most recent entries).

The mode is deliberately ephemeral — held in memory per session, never persisted — so new, reopened and forked sessions always start back at Default, and a switch takes effect immediately. The old global "内置权限门控" toggle in Settings is gone (a hidden escape hatch remains for hand-edited config files).

Google Vertex AI, properly — interactive login for built-in providers

Vertex AI endpoints reject API keys outright (401 — API keys are not supported by this API), but until now the GUI's only entry was "configure endpoint + key": configured, green — and guaranteed to fail. The ADC / service-account paths that CLI users get via /login had no GUI equivalent at all.

Built-in providers now drive interactive logins end-to-end:

  • Providers like Vertex show a 登录 button on their row; OAuth is preferred where available, with the api-key login flow as fallback.
  • The login dialog distinguishes OAuth vs text-prompt flows (title and waiting state), and empty-submitting a text prompt now matches CLI semantics — which also fixes a Bedrock credential-chain hang.

A wordmark drawn the way da Vinci would

The empty-state Percho lettering is rebuilt as a geometric construction: hollow outlined strokes, φ golden-ratio verticals, the circumscribed square-and-circle around the o, a construction circle for the P bowl, cap/x-height/base rule lines and a small costruzione geometrica annotation. It's measured from real glyph ink boxes, baked as static SVG, and colored through dedicated --lg-* tokens for both themes — with no more accidental native tooltip when your cursor lingers on it.

Changes

  • Top bar polish: dragging a tab pill now keeps its actual width instead of snapping to a fixed widest-form ghost; the new-session icon is a bigger, clearer plus; and streaming message text no longer flickers as deltas land (the fade-in is compressed from 280ms to a visually-instant 8ms).
  • Composer toolbar realigned: the context ring moves in before the model picker, and all six controls now share one center line.

Download: macOS (Apple Silicon / Intel) · Windows x64 — see assets below. Existing installs will offer the update from the title bar or Settings → About (on adhoc-signed macOS builds the button opens this page instead).

v0.5.5

What's new

Daily space — somewhere to think out loud, outside any project

Not every conversation belongs to a codebase. The project page is now the Spaces page with a built-in 日常 (Daily) space pinned at the top of the sidebar — a home for quick questions, research rabbit holes and "just curious" chats that don't belong to any project:

  • Daily sessions run in a fixed workspace (~/.percho/daily) instead of a project directory — auto-trusted (no trust dialog), no git, no project-level skills or AGENTS.md loaded. Your user-level skills still work.
  • Everything you already know carries over: date-grouped session list, search, per-row diagnostics copy & delete, and the same draft flow (a session only lands on disk once you actually send something).
  • The daily space never appears as a project and can't be deleted; dev builds get their own isolated daily session list automatically.

Small touches that make the split readable at a glance: daily sessions get a coffee-cup avatar (white-on-canvas, the inverse of the black letter tiles used for projects) in the tab bar and the session rail, unnamed daily chats fall back to the title "日常", and the empty-state space chip under the composer lets a draft hop between Daily ↔ any project both ways — with the branch picker hidden while Daily is selected (it's not a git repo).

Select text to quote it — or continue it in a new session

Selecting text anywhere in the conversation now pops up a floating toolbar:

  • 添加到对话 — drops the selection into your current draft as a quote chip
  • 新会话继续 — forks the last assistant message into a new session and seeds its draft with the quote, perfect for spinning off a side question without polluting the current thread

Quotes live as floating white chips on their own row above the composer (truncated with a tooltip for the full text), and are sent as blockquotes at the front of your message. If the send fails, the chips roll back — nothing is lost.

Composer rework

The input box got a quiet overhaul alongside quotes: quote chips occupy a dedicated top row that only appears when needed, slash/@ chips stay inline with your text, the textarea no longer remounts as chips come and go, and the whole box is half a line taller with top-aligned text and a softer 20px radius.

Changes

Settings: UI plugins merged into Appearance

The settings sidebar shrinks from nine categories to eight: UI 插件 is now a tab inside 外观 (Appearance), split into 基础 / UI 插件 sub-pages. Plugin rows are redesigned as borderless soft cards with an 8px status dot (enabled / untrusted / error), an outlined "内置" chip for built-ins, and a mono error detail block; with the master switch off, the list collapses to a single "N plugins · open directory" row.

Neutral grays, de-blued

The hover/selection gray moves from blue-tinted slate to a neutral zinc, the switch-off track gets its own token, and a new --color-ok semantic token backs the plugin status dots — the whole interface reads a little calmer.


Download: macOS (Apple Silicon / Intel) · Windows x64 — see assets below. Existing installs will offer the update from the title bar or Settings → About (on adhoc-signed macOS builds the button opens this page instead).

v0.5.4

What's new

Voice alerts — a recall chime for when you're away

A new built-in voice-alerts plugin plays a short spoken chime when Percho needs you back at the desk, built for the "walked away, screensaver on" case:

  • Task done — a chime after all open sessions have stayed quiet for a few seconds
  • Approval waiting — a chime when a permission approval has been sitting unanswered (takes priority over the "done" chime; the same batch of requests only chimes once, a new request escalates)

Both are debounced through a global quiet window: if any session picks up work again within the window (e.g. two sessions ping-ponging over a collaboration channel wake each other up), the pending chime is cancelled. Only when everything actually goes quiet do you get one sound, not one per loop. Timers keep running while the screen is locked or the app is in the background (backgroundThrottling disabled), and a system sleep simply resumes where it left off — nothing is lost.

Enable it under Settings → UI 插件 → 语音提醒 (built-in plugin, one confirm). Toggling the plugin off is the off switch.

This also ships a new headless plugin type in the UI plugin system (activate() / cleanup lifecycle, no components required) plus audio asset support (mp3/m4a/… inlined at build time) — the foundation for future notification, sound-effect and monitoring plugins.

Per-turn work timer

Each turn now shows a live work timer (like Codex / Claude Code): starts ticking when the turn starts, beats once a second while running, and freezes at the final duration when the run ends. It sits first in line next to the file-change chip; turns with no changes get a bare timer row. Historical turns derive their timings from the session log — no storage changes.

LAN observer: stability & polish

  • Heartbeats are now named SSE ping events with a client-side watchdog — half-open connections (mobile lock screen, network switch) recover in seconds instead of hanging until TCP timeout; "reconnecting" pill no longer flashes on sub-second blips
  • Mid-stream joins / reconnects no longer duplicate in-flight assistant text (healing is now byte-count based and renders only the growing tail)
  • Meta dot rows match the desktop two-line layout; the composer button is now context-aware (stop while running, send when you typed — with follow-up queueing)

Changes

Vision proxy removed

The bolt-on vision proxy (external image recognition for text-only models) has been removed end-to-end. Multimodal input is table stakes on current models, and native multimodal is strictly better than second-hand narration. The composer now gates image input for text-only models cleanly: the attach button disables, pastes get a toast, and a send with leftover images keeps your draft instead of silently dropping it.

If you used the vision proxy, the leftover vision.json (which contains an API key) in your userData folder can be deleted manually.

Composer & chat polish

  • Slash commands now trigger anywhere in the text (after a space), not just at the start; picking a command preserves the rest of your text as its argument, and Esc dismisses the menu without clearing input
  • Code blocks redesigned as borderless floating cards (rounded, soft shadow, copy button top-right); language badge hidden; first-line grey-highlight and the selected-line right-edge bar are gone
  • Deliberately aborting a run no longer produces a spurious "model request failed" error card
  • Fixed: turn-diff chip overlapping collapsed tool groups; the image thumbnail × hidden behind the message list; Monaco worker 404 spam in dev
  • Keyboard focus rings unified (low-saturation accent outline)

Distribution: Homebrew tap retired

The Homebrew tap (jaxton07/tap/percho) — a stopgap from the ad-hoc signing era — has been retired. Download from GitHub Releases (below) or use the built-in updater; existing installs keep working, brew just won't see new versions.

Also in this release

  • Bundled collaboration skills no longer assume the host project has an INDEX.md — index reading/updating is now conditional, so they behave in any project
  • README refreshed with new screenshots; project docs index & pitfall library now live in the repo (docs/)

Download

Platform File
macOS (Apple Silicon) percho-mac-arm64.dmg
macOS (Intel) percho-mac-x64.dmg
Windows percho-windows-x64.exe (installer) or percho-windows-x64.zip

Ad-hoc signed (no Developer ID). On macOS, if Gatekeeper blocks the app, right-click it and choose Open (or run xattr -cr "/Applications/Percho.app" as a fallback). Windows may still show a SmartScreen prompt — click "More info" → "Run anyway".

Full Changelog: https://github.com/Jaxton07/percho/compare/v0.5.3...v0.5.4

v0.5.3

What's new

Context evaporation is now the default (ACP compression removed)

The ACP context-compression stack (kernel, tools, IPC, UI) has been removed from this release. Context Evaporation — the regenerable-tool-output tiered manager introduced alongside ACP in 0.5.2 — is now the default context manager, with Settings → 上下文管理 offering a clean evaporation / off choice.

In evaporation mode, regenerable tool output (measured at ~87% of context volume) is replaced at four waterline tiers — 60% / 85% / 95% of min(context window, 256K budget) — by stubs that carry their own restore instructions, keeping the conversation lean while staying fully reproducible when re-read. The decision machine is monotonic (full → snip → stub only escalates), protects the tail of the window and recent errors, and backs off with hysteresis so batches stop before the waterline instead of thrashing against it.

Cross-session collaboration channels

A new built-in channel-watch extension enables agent-to-agent communication across sessions over the project's .local/agent-work/ channel/<topic>/ directories:

  • Sessions subscribe to a channel; channel messages appended by other sessions wake the subscriber with an actionable notification (debounced, de-duplicated, self-write suppressed, ping-pong capped)
  • The new channel_post tool makes the message the intent: one post = one wake-up, instead of N wake-ups per task as files were written — plain file edits no longer produce notifications
  • Coordinating skills (design-handoff for the initiating session, channel-pickup for the implementing one) ship with the app; the initiator now subscribes immediately after creating the channel, so the notification link works in both directions
  • Toggle: Settings → General (on by default)

Unified error system — silent failures now visible

Confusing dead-ends now surface as structured, actionable errors in one place:

  • In-conversation error cards for failed turns: classified by a pattern table (title / suggestion / action), with retry, compact and copy-detail actions; auto-retry turns only card after they really give up
  • Composer inline error bar with draft recovery and one-click resend
  • Global toasts for background failures that used to be swallowed
  • Stream-guard trips are surfaced as warning cards instead of a silently truncated response
  • Transient "retrying" status row while the SDK auto-retries a failing provider call

Image preview: always on top + keyboard navigation

  • The full-screen image viewer now renders on a layer above everything else, so the floating "back to bottom" button no longer sits on top of the zoomed image
  • Multi-image previews support ← / → to step through the previous / next image without closing, Esc to close, and an n / total counter in the corner

Streaming performance (P0)

Fast models streaming 50–100+ deltas per second used to re-render the whole app per event. Streaming events are now coalesced per animation frame, selection and row-model subscriptions are stabilized, and historical meta groups memoize by element identity — turn-delta cascades no longer starve the main thread or drop frames during the status-line and CenterOrb animations.

Crash auto-recovery

If the renderer dies while the main process survives (a crash the error boundary cannot catch), the app now reloads automatically; 3 crashes within 30 seconds stop and offer a dialog. Alongside it, bulky tool results (repeated image base64 snapshots, 500KB × 4 per event) are slimmed at the single emit point, and log/trace capture got hardening (giant-event truncation, byte-based rotation, batched writes) — the trace blow-up class of incident can no longer wedge the app.

Provider settings fixes

  • Empty-model validation now uses the built-in provider list, so clearing models on an existing custom provider is caught instead of landing a dead zero-model provider; baseUrl validation matches the setter's http(s):// policy
  • The "clear saved key" checkbox chain is removed — deleting credentials now happens through the row's "remove credential" / "delete" actions only
  • Pure baseUrl overrides for built-in providers consistently stay in the override form (no more form swap after saving)

Extension / MCP integration fixes

  • ctx.ui.theme now provides a real Theme instance instead of an empty cast — extensions that call theme.fg() etc. (e.g. pi-mcp-adapter's status bar, which crashed into permanent "not connected") work again
  • On Windows, the ~/.percho/ui-plugins link now falls back to a junction (no admin rights or Developer Mode needed), so the UI plugin docs stay reachable

Also in this release

  • pi SDK 0.84.0 → 0.84.3
  • LAN observer: 401 auth failure now reaches the token-gate error state
  • Long unbroken strings (URLs, tokens) no longer overflow message bubbles
  • Session-list copy icon vertically centered; copy diagnostics bubble z-ordered above rows
  • Default-empty evaporation config: zero behavior change until a tier is configured or enabled

Download

Platform File
macOS (Apple Silicon) percho-mac-arm64.dmg
macOS (Intel) percho-mac-x64.dmg
Windows percho-windows-x64.exe (installer) or percho-windows-x64.zip

macOS users can also brew install --cask jaxton07/tap/percho.

Ad-hoc signed (no Developer ID). On macOS, if Gatekeeper blocks the app, right-click it and choose Open (or run xattr -cr "/Applications/Percho.app" as a fallback). Windows may still show a SmartScreen prompt — click "More info" → "Run anyway".

Full Changelog: https://github.com/Jaxton07/percho/compare/v0.5.2...v0.5.3

v0.5.2

What's new

Percho branding in empty states and splash

  • The new-session welcome screen now shows Percho instead of pi, and the app-opening splash word is capitalized (Percho)

Diff sidebar, refreshed

The file-change sidebar got a lighter, floating look:

  • Cards are now borderless with soft shadows — the open card lifts with a stronger shadow, closer to a floating panel than a boxed list
  • Added/deleted lines now color the entire row (both line-number gutters and the code), opencode-style, instead of only the gutter column
  • Removed the hard divider between the card header and its diff body

File-change chip no longer crowds the activity dots

While a run is still working, the "N files changed" chip at the end of the turn kept its compact up-pull and could touch the activity dots above it — the chip now keeps normal spacing during the run and snaps to the compact layout only when the turn finishes.

Thinner chat scrollbar

The message list scrollbar was slimmed from 8px to 4px, matching the minimal todo-panel scrollbar — the content area feels lighter and the right edge stays quiet.

Download

Platform File
macOS (Apple Silicon) percho-mac-arm64.dmg
macOS (Intel) percho-mac-x64.dmg
Windows percho-windows-x64.exe (installer) or percho-windows-x64.zip

macOS users can also brew install --cask jaxton07/tap/percho.

Ad-hoc signed (no Developer ID). On macOS, if Gatekeeper blocks the app, right-click it and choose Open (or run xattr -cr "/Applications/Percho.app" as a fallback). Windows may still show a SmartScreen prompt — click "More info" → "Run anyway".

Full Changelog: https://github.com/Jaxton07/percho/compare/v0.5.1...v0.5.2