Releases: OpenSource03/harnss
v0.22.0-beta.1 — Split View, Chat Folders & Glass Tinting
What's New
Warning
This release is super experimental and is not recommended for production use.
✨ Split View
Run multiple chat sessions side by side — up to four panes at once. Drag a session from the sidebar into the chat area or right-click and choose "Open in Split." Each pane has its own engine controls, tool drawers, and scroll state, so you can reference one conversation while working in another.
📂 Chat Organization
Organize your sessions with folders and pinning. Create folders in the sidebar, drag sessions into them, and pin your most-used chats to keep them at the top. Sessions are also grouped by branch automatically when you're working across multiple git branches.
🎨 Native Glass Tinting
On macOS, the transparent glass effect now tints natively with your space color instead of using a CSS overlay — the result is smoother, more natural, and follows your light/dark theme. When the window loses focus, a subtle veil fades in. Windows gets matching Mica integration.
🛠 Tool Docking Islands
Tool panels (terminal, browser, files, Jira board) can now be docked as floating islands above or below the chat. Drag panels between positions, stack them in columns, and resize freely. Each split pane gets its own tool strip. The layout remembers your arrangement across sessions.
🔐 ACP Authentication
Connecting to ACP agents that require authentication now works end-to-end — Harnss detects when a server needs credentials, shows an auth dialog, and completes the handshake automatically.
⚡ Faster Chat Rendering
Switching sessions and spaces is noticeably snappier. Messages closest to the bottom render first, and older messages hydrate in the background. Large diffs use a proper viewer with collapsible unchanged regions.
🌳 Worktree Bar
A new bar above the composer shows your active git worktrees as branch chips. Click to switch, or create and remove worktrees inline without leaving the chat.
⚙️ Per-Session Settings
Model, effort level, and permission mode are now saved per session. When you switch back to a conversation, your settings are restored exactly as you left them.
🎨 Visual Polish
- Tool icons — each tool card shows a colored glyph so you can scan results at a glance
- ANSI colors — terminal output in bash tool cards renders with proper color codes
- Assistant turn dividers — timestamps between turns make long conversations easier to scan
- Diff stats — edit and write cards show lines added/removed at a glance
- Inline space creation — create and customize spaces directly in the sidebar instead of a modal
🐛 Bug Fixes
- Fixed terminal resizing causing flicker during panel drags
- Fixed pre-release updates being enabled by default — now opt-in only
- Fixed chat scroll losing its position when switching sessions quickly
⚠️ This is a pre-release. You may encounter rough edges — please report issues on GitHub.
Full Changelog: v0.21.5...v0.22.0-beta.1
0.21.5
fix: enable shell mode for ACP agent spawn on Windows On Windows, `npx` is a `.cmd` batch wrapper. Node's `spawn()` doesn't resolve `.cmd` extensions, causing ENOENT even when npx is on PATH. Adding `shell: true` on win32 lets cmd.exe handle the resolution. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.21.4 — Agent Control, Transcripts & Streaming Performance
What's New
🤖 Background Agent Control
- Stop running agents — a stop button now appears next to each running background agent, letting you cancel them at any time
- Live progress summaries — agents now show AI-generated descriptions of what they're working on, updated in real time
- Current tool indicator — see exactly which tool an agent is using right now and how long it's been running
📄 Agent Transcripts
When a background agent completes, you can now view its full transcript — every tool call, result, and text response — in a detailed modal. Great for understanding what the agent did and debugging unexpected results.
⚡ Faster Streaming
Streaming responses during long conversations are noticeably snappier. Invisible content updates (like thinking) now run at a fraction of the rate, and several rendering hot paths have been optimized to reduce unnecessary work during active streams.
Full Changelog: v0.21.3...v0.21.4
v0.21.3 — Codex Permissions, Terminal & Edit Display Fixes
Changes
⚙️ Codex Permission Policies
Codex sessions now respect your chosen approval and sandbox policies. Previously these settings weren't forwarded — now they're applied from the first message onward.
🐛 Bug Fixes
- Fixed the terminal replaying garbled text after switching between spaces — historical output no longer triggers stray escape-sequence responses
- Fixed multi-hunk edits to a single file incorrectly displaying as "N files" in collapsed tool cards and the changes panel
Full Changelog: v0.21.2...v0.21.3
v0.21.2 — Multi-File Codex Edits & Queued Message Fixes
Changes
🐛 Bug Fixes
- Multi-file Codex edits now show all files — when Codex edited multiple files at once (e.g. updating both a Hebrew and English translation file), only the first file's changes appeared in the UI. All files in the edit are now rendered individually with their own diff viewers.
- Queued messages stay visible above the input bar — previously, messages waiting to be sent could end up hidden behind the input area. They now appear correctly in the message list alongside other messages.
Full Changelog: v0.21.1...v0.21.2
v0.21.1 — Chat Virtualization Fixes
Changes
🐛 Bug Fixes
- Fixed chat content sometimes appearing misaligned or overlapping after switching sessions
- Fixed switching between spaces occasionally triggering a race condition that could show the wrong session
- Fixed streaming text from a previous session briefly flashing when opening a new chat
- Fixed message bubbles and tool summaries occasionally breaking out of their expected layout
Full Changelog: v0.21.0...v0.21.1
v0.21.0 — Virtualized Chat, Mermaid Diagrams & Shared Lib Extraction
Warning
This is a pre-release and can only be downloaded manually due to potential issues found out after testing.
What's New
⚡ Much Faster Chat
Long conversations are dramatically faster now. We replaced the old rendering approach with a proper virtualized list — only the messages you can actually see are rendered at any time. Previously, a 500-message chat would keep hundreds of React components in memory. Now it's just the ~20 visible ones, regardless of how long the conversation gets. Scrolling is smoother, switching sessions is snappier, and the app uses less memory overall.
📊 Mermaid Diagrams #29
When Claude draws a diagram using a mermaid code block, it now actually renders as a visual diagram — flowcharts, sequence diagrams, pie charts, git graphs, and more. Diagrams adapt to your light/dark theme automatically and are cached so they don't re-render on scroll. While Claude is still typing, you see the raw source; once the message is complete, the diagram appears.
📂 Deep Folder Inclusion (@#)
You can now use @#foldername in the composer to include the full contents of a folder — not just the file tree, but every file inside it. Regular @folder still gives you the structure overview. Use @# when you want Agent to actually read everything in a directory. If the folder is large (over ~50k tokens), Harnss will warn you before sending.
⌨️ /clear Command #15
Type /clear in the composer and hit Enter to instantly open a fresh chat. Quick way to start over without reaching for the sidebar.
🛡 Better Error Feedback
Permission prompts (allow/deny tool use) now show a notification if something goes wrong responding to them, instead of failing silently. Fixes several edge cases where permission state could get stuck.
🐛 Bug Fixes
- Fixed a bug where switching out of plan mode could sometimes reset the permission level incorrectly
- Fixed markdown characters occasionally getting eaten during streaming (apostrophes, backticks, etc.)
- Clipboard copy now works correctly in all cases including sandboxed contexts
- Codex web search cards now show meaningful details (queries used, URLs opened) instead of blank tool inputs
- And many other small irritating bugs I don't remember to mention
Full Changelog: v0.20.0...v0.21.0
v0.20.0 — Startup Performance & Draft Preservation
What's New
⚡ Startup Performance
- Flash-free window launch — window starts hidden (
show: false) and appears only afterready-to-show, eliminating the white flash on startup - Non-blocking analytics init — PostHog initialization in the main process is now fire-and-forget instead of
await-blockingapp.whenReady() - Deferred analytics sync — renderer-side
syncAnalyticsSettings()moved from module-level to auseEffectso IPC calls don't block first paint - Lazy model cache revalidation — model list revalidation (which spawns a Claude SDK subprocess) is deferred by 3 seconds, reducing startup IPC contention while cached models serve the initial render
- Relaxed session prefetch timing — idle callback timeout raised from 1.5s → 5s and fallback timeout from 250ms → 3s, with 50ms yields between sequential loads to let the main process event loop breathe
🎨 Draft Preservation
- BottomComposer component — new wrapper keeps the InputBar always mounted (hidden via
aria-hidden+inert) while a permission prompt is active, preserving any unsent text the user was composing - Test coverage — static-render tests verify both states: InputBar visible when no permission is pending, and InputBar hidden-but-mounted alongside the PermissionPrompt
Full Changelog: v0.19.1...v0.20.0
v0.19.1 — Streaming Stability & Thinking Animation Fix
Changes
🐛 Streaming Stability
- Overlap-tolerant chunk merging — new
mergeStreamingChunk()handles cumulative snapshots, overlapping deltas, and exact replays from upstream without duplicating text - Background session streaming — background Claude handler now uses the same merge logic, preventing text duplication when switching between sessions
🎨 Thinking Animation
- Extracted thinking animation state machine — moved from inline ThinkingBlock logic into a pure, testable
thinking-animation.tsmodule - Removed coalescing timer — the v0.19.0 interval-based chunk coalescing caused replay/duplication under rapid thinking updates; replaced with a simpler append-only model
Full Changelog: v0.19.0...v0.19.1
v0.19.0 — Session Prefetch, Scoped Permissions & Dark Theme Overhaul
What's New
⚡ Session Prefetch & Switching Performance
- Session payload cache — prefetches up to 6 recent sessions via
requestIdleCallbackso switching is instant with no disk I/O - Metadata sidecar files — session listing reads tiny
.meta.jsonfiles instead of parsing full multi-MB session files - Async session I/O — migrated all
fs.existsSync/readFileSynccalls tofs.promises.*for non-blocking session operations - Consolidated metadata sync — merged 4 separate
setSessions(prev => prev.map(...))effects into a single batched update startTransitionwrapping — session switch state updates are wrapped in React transitions for smoother UI
🔐 Scoped Permission Rules
- "Always allow" dropdown — split button on the permission prompt with per-destination scope (session, local project, shared project, user-global)
- Permission rule forwarding —
updatedPermissionsflows through the SDK permission bridge so rules persist to the chosen settings file - Local settings source — all SDK query paths now include
"local"insettingSourcesfor.claude/settings.local.jsonsupport
🎨 Dark Theme & Glass Morphism Overhaul
- Light glass tuning — separate gradient math for light glass mode with softer titlebar veils, adjusted shadow opacity curves, and
color-mix(in oklab, white 97%, var(--background) 3%)surface color - Refined top scroll fade — lighter, shorter gradient (h-20/h-24), reduced radial shadow spread, and fine-tuned opacity breakpoints for both island and flat layouts
- Transparency toggle —
glass-enabledclass now respects aharnss-transparencylocalStorage key, applied early in preload before React mounts - Darker window background — Electron window base color changed from
#18181bto#040404for true dark appearance - ShadCN Select component — new Radix-based
<Select>replaces all native<select>elements in settings panels for consistent styling
🛠 Tool & UI Polish
- Bash output truncation — long bash results (200+ lines) collapse with a "Show full output" toggle
- Engine icons in sidebar — session items show per-engine/agent icons instead of generic message bubbles
- AskUserQuestion redesign — tighter spacing, smaller type scale, and cleaner answer display
- Icon picker fix — dropdown-to-popover transition uses
onCloseAutoFocusprevention instead of fragilesetTimeout - Message unqueue — new
unqueueMessageaction lets users remove queued messages before they're sent
📜 Scroll System Refactor
getTopScrollProgresshelper — extracted smoothstep scroll-progress calculation to a pure, tested function inchat-scroll.ts- Synchronous viewport sync — programmatic scrolls (jump-to-bottom, prepend anchor restore) now immediately update top-progress and scrolled-from-top state
useLayoutEffectfor session reset — scroll position resets happen in layout phase to prevent flicker on session switch- Stale viewport ref guard —
getViewport()checksisConnectedto avoid operating on detached DOM nodes
🐛 Bug Fixes
- Git status loading race — separate
loadingRequestIdRefprevents stale requests from clearing the loading spinner - Switch request guard —
switchRequestIdRefdiscards late-arriving disk loads when the user rapidly switches sessions - Non-blocking save on switch —
saveCurrentSession()is now fire-and-forget (void) during session switches to avoid blocking the UI
Full Changelog: v0.18.1...v0.19.0