The logbook

Changelog

Newest first, keyed by date. The version string stays 0.9.0 until go-public; the build stamp is the real identifier. Built nightly, stamped every time. This is the curated log, and the full engineering history ships with 1.0.

The slickness wave

Motion that earns its frames: eased scroll, gliding cursor, color emoji, native drag-and-drop; all with kill switches, all zero-cost at rest.

Added

  • Eased scroll-to: ⌘Home/End, block navigation, and search jumps glide on a critically-damped spring instead of teleporting. Wheel input and typing always cancel the glide. [terminal] scroll_animation_ms (default 150; 0 = instant).
  • The cursor glides between cells: short same-row hops land in ~30 ms so typing feels instant; long jumps take ~100 ms. Instant snaps on pane switch, alt-screen, and resize. At rest the paint is byte-identical and books zero frames.
  • Color emoji (macOS): emoji clusters render as real Apple Color Emoji tiles; 🚀 is a rocket, ZWJ families draw as one glyph. Text-presentation symbols stay monochrome. Every failure falls back to the outline path.
  • Drag a URL, text selection, or web image onto a pane and it pastes (macOS) — dragged content lands as a bracketed paste at the focused pane; web images are cached to disk and pasted as paths.
  • Scrollback scrollbar: a fading right-edge thumb shows where the viewport sits while scrolled back.
  • Unfocused-pane dim: panes without focus get a subtle theme-background wash so the active split is unmistakable. [appearance] unfocused_pane_dim (default 0.15).
  • Visual bell: the ringing pane’s border pulses accent and fades over 400 ms.
  • Chrome motion: the command palette and search-everywhere open with a fast fade-and-drop; the cursor blink crossfades its edges instead of snapping.

Every animation respects its config kill switch, and idle terminals still book zero repaints; motion is paid for only while it’s happening.

July 10, 2026releasestamp fbdb1d6

The live-drive release

The MCP surface grows to 38 tools; agents can now drive workspaces, tabs, panes, and even spawn other agents through one socket.

Added

  • MCP catalog: 28 → 38 tools. The agent-cockpit expansion:
    • Workspace-targeted tab verbs: open_tab honors workspaceId (a background workspace stays background), close_tab reaches any workspace, select_tab brings any tab forward.
    • Pane-granular verbs: list_panes (the split tree with per-pane cwd and alt-screen state), split_pane, focus_pane, close_pane, read_pane.
    • Agent primitives: wait_for_output (block until a regex appears), wait_for_idle (grid quiet for N ms), create_workspace, and spawn_agent_pane; agents spawning agents as one API call.
  • Notifications carry their source and jump on click: every pane-sourced notification shows ↗ Workspace · Tab; clicking activates the workspace, selects the tab, and focuses the exact pane. Titles are snapshotted at delivery so entries outlive their source.
  • Shift+Enter inserts a newline in TUIs instead of submitting; apps speaking the kitty keyboard protocol get the spec CSI 13;2u; everyone else gets meta-Return.
  • SSH panes can emit notifications, and plugin notifications reach the workspace rail with pane attribution.

Fixed

  • Typing after a workspace switch no longer lands in an invisible widget; chrome focus is released on every switch path so the terminal re-homes input.
  • Duplicate workspace ids repair themselves at session load; new workspaces mint UUIDs.
  • Notification cards pin to the sidebar width; titles truncate, bodies wrap.
July 9, 2026releasestamp fdc5ddc

The gap wave + the notification chain

Agent notifications work end-to-end, fonts fall back per-glyph through the OS cascade, and a long-standing UI freeze is cured at the root.

Added

  • Agent notifications, end-to-end. Two root fixes: Novalis now answers terminal focus reporting (DECSET 1004; agent CLIs suppress notifications while they believe the terminal is focused), and parses the kitty desktop-notification protocol (OSC 99). Proven against a real agent CLI’s captured bytes, pinned as a regression test.
  • Dynamic per-glyph font fallback: a missing glyph walks the CoreText cascade to the OS-picked face; zero hardcoded font names. Sextant block characters are procedurally synthesized.
  • SGR attributes render properly: bold, italic, underline, strikethrough, dim, conceal.
  • Real selection colours, OSC 4/10/11 SET support, the unread bell badge + ⌘⇧U, and wide-char clipping fixes.

Fixed

  • The workspace rail reorders only when a command actually ran (OSC 133;C); never on chatter.
  • TUI scroll no longer loses most of a hard wheel flick; momentum carries over.
  • A rare full-UI freeze under heavy child-process churn is cured at the root (the signal pipe’s blocking sender is gone).
June 2, 2026milestone

The pure-Rust rewrite

One binary. The webview shell and the TypeScript frontend are gone; Novalis is now a single pure-Rust app drawn on the GPU.

The biggest architectural cut in the project’s history: the hybrid webview-shell era ends. Novalis is now a single pure-Rust binary: an egui app drawn on wgpu (Metal on macOS, DX12 on Windows, Vulkan on Linux).

  • No webview, no IPC, no JS runtime. Input arrives as native events and goes straight to the PTY; the grid is painted directly into the GPU frame.
  • Repaint-driven, not polled: PTY activity wakes the compositor; an idle terminal costs nothing.
  • The terminal engine (grid, VTE parsing, PTY, OSC interception) lives in its own crate, libnovalis, with the app shell as a thin layer above it.
  • The previous frontend is preserved on an archive branch for the curious.

Everything since (blocks, agents, teams, the MCP surface, the theme system) is built on this foundation.