ecode 0.9.0 is one of the largest releases in the project's history. It significantly expands ecode's Git tooling, editor customization, terminal capabilities, debugging workflow, system integration, and performance, while also incorporating a large amount of stability and rendering work from eepp.
Major additions include the ability to run the complete ecode GUI directly inside compatible terminals, VS Code-compatible user snippets, an integrated Git conflict resolver and Git History browser, a centralized searchable Settings interface, Zen Mode, persistent and navigable Markdown previews, configurable file associations, richer debugger layouts, Git diff indicators, improved font and text rendering controls, and a substantially upgraded integrated terminal.
Highlights
Run the full ecode GUI inside a terminal
ecode can now run its complete graphical interface directly inside a terminal that supports the Kitty graphics protocol.
Launch it with:
EEPP_RUNTIME=terminal ecodeThis is not a separate TUI implementation or a simplified terminal frontend. ecode runs through the same eepp application, widget, editor, rendering, and input architecture used by the native desktop application.
In terminal runtime mode, eepp renders the application into an offscreen framebuffer and presents the resulting RGB frames through the Kitty graphics protocol. Terminal input is translated back into the normal eepp input pipeline, including keyboard, mouse, focus, and resize events.
The runtime includes:
- Full ecode GUI rendering inside the terminal
- Kitty graphics framebuffer presentation
- Persistent Kitty image updates
- Tile-based damage detection and unchanged-frame suppression
- Adaptive zlib compression and chunked Base64 frame streaming
- Kitty keyboard protocol input
- SGR pixel mouse input
- Focus events
- Terminal pixel-size resize handling
- Cross-platform terminal lifecycle support
- Hidden native graphics-context hosts where required by the platform
Because this is implemented at the eepp runtime layer rather than specifically in ecode, the same terminal runtime architecture can also be used by other eepp GUI applications.
And, yes: ecode can now run inside ecode. Launching EEPP_RUNTIME=terminal ecode from ecode's own integrated terminal renders a fully interactive ecode instance inside the terminal of another ecode instance. Apart from being a fun demonstration, it is also a useful illustration of the fact that terminal mode is a real application runtime rather than a separate text-based frontend.
This enables workflows that normally require a native graphical session while retaining the ergonomics of terminal environments, including terminal multiplexers, remote shells, and terminal-managed tabs and sessions.
As far as we know, ecode is the first native GUI code editor to ship this capability as a built-in application runtime rather than through a separate terminal frontend or browser-based wrapper.
simplescreenrecorder-2026-10-08_00.54.17.mp4
Zen Mode
ecode now includes a Zen Mode for distraction-free editing.
Zen Mode can be toggled from the View menu, through its keyboard command, or started directly with:
ecode --zen-modeWhile active, ecode hides the side panel, status bar, menu controls, tab bar, and document information, leaving the editor content as the focus. Leaving Zen Mode restores the previously configured visibility of those interface elements.
This also provides a much lighter single-file editing experience when ecode is launched from a file manager or used as a quick editor.
VS Code-compatible user snippets
ecode now supports user-defined snippets in addition to snippets provided by language servers.
Snippets can be loaded from language-specific and global configuration, project-local .ecode files, and compatible .vscode snippet files.
The implementation supports:
- JSONC snippet files
- Language and scope filtering
- Hot reload
- Source-aware completion ranking
- Exact prefix replacement
- Context-aware indentation
- Multi-cursor insertion
- Tab stops and final cursor positions
- Linked placeholders
- Placeholder choices
- Variables and transformations
- Common case-conversion modifiers
- Workspace-relative include and exclude globs
A new Insert Snippet provider is also available from the Universal Locator, making snippets searchable even when they are not triggered through autocomplete.
Importing VS Code snippets can be disabled independently while keeping personal and .ecode snippets enabled.
Major Git workflow improvements
ecode's Git integration has been substantially expanded.
A new integrated three-pane conflict-resolution workflow provides:
- Ours, result, and theirs views
- An editable shared result document
- Conflict navigation
- Accept-current, accept-incoming, and related conflict actions
- Live diff highlighting
- Synchronized scrolling
- Conflict staging and resolution
- Restoring and discarding conflicted files
- Continue, commit, and abort actions for paused Git operations
- Session restoration for conflicts already in progress
Git History is now available directly from the source-control interface and as a detached tab. It supports browsing HEAD, local branches, remote branches, and tags without checking them out, and includes:
- Incremental history loading
- Expandable merge commits
- A synthetic Working Tree / Index entry for uncommitted changes
- Commit metadata and full messages
- Changed-file statistics
- Multi-file commit diffs
- Unified and side-by-side diff modes
- Show in Git History
- Checkout, merge, fast-forward merge, cherry-pick, and revert actions
- Branch and tag creation
- Local, remote-branch, and tag deletion
- Copy commit ID and commit message actions
- Add Tag & Push
- Persistent history table layout and column widths
The Git status view now supports multi-selection for stage, unstage, discard, open, and diff operations. Multiple selected files can be opened together in a single multi-file diff view.
Untracked files can now be deleted directly from Git status after confirmation, including correctly handling Git-quoted paths.
Diff views gained shared multi-file controls, aggregate change statistics, global expand/collapse actions, and a configurable default between unified and side-by-side presentation.
Remote branch handling now excludes symbolic entries such as origin/HEAD, removes stale local tracking references after remote deletion, and prunes stale refs while pulling.
Git diff indicators
ecode can now display Git additions, modifications, and removals directly in the editor gutter and minimap.
Diff computation runs asynchronously against the repository baseline and handles unsaved changes, newly added files, repository changes, stale jobs, and external file reloads.
The feature and its debounce interval are configurable from ecode settings.
Persistent Markdown previews and local navigation
Markdown previews are now much closer to document browsers rather than static renderings.
Local Markdown links can be followed relative to the current document, including relative file:// paths. ecode previews maintain optional Back/Forward history, expose navigation actions from the context menu, and support Mod+[ / Mod+] history shortcuts.
Markdown preview tabs are now restored between sessions. When navigating away from a preview and then going back, ecode preserves the live editor binding and can continue rendering unsaved source content from the associated document.
Markdown and HTML views also gained document-level text selection, including forward and reverse dragging across independent rich-text elements, autoscroll, Copy, Select All, and selection-aware context menus.
Centralized Settings interface
ecode now provides centralized, searchable User Settings and Project Settings panels.
Settings are organized into categories and subsections, supported options update in real time, editable values are validated, and the older settings menus have been simplified to retain only contextual actions.
Plugin settings are integrated into the same interface. Plugins can expose structured options including:
- Boolean settings
- Choices
- Editable values
- Lists
- Secrets
- JSON objects
- Grouped settings
Raw JSON configuration remains available for advanced use cases.
The Settings UI is also constructed lazily, reducing startup work and avoiding the cost of creating large settings menus before they are opened.
Cross-platform file associations
ecode can now manage file associations from the Settings panel on Windows, macOS, Linux, and FreeBSD/XDG environments.
The interface exposes extensions known by ecode's syntax definitions and applies association changes asynchronously.
On XDG systems it can also install the ecode desktop entry required for the associations.
Integrated terminal upgrades
Separately from the new application-level terminal runtime, ecode's integrated terminal received a major architectural and compatibility update.
Terminal emulation and parsing now run away from the UI thread, reducing the amount of terminal work that can block editor rendering.
The shared terminal implementation used by ecode gained:
- Kitty Graphics Protocol support
- Kitty keyboard protocol support
- Improved graphics streaming and frame replacement
- Application cursor and keypad mode fixes
- More complete modified-key handling
- Improved frame-damage detection
- Better scrollback synchronization
- Selection preservation while output arrives
- More reliable scrollbar interaction
- Correct Shift override behavior for application mouse reporting
- Improved mouse-wheel handling
- Better search highlighting
- Smarter find-bar placement so matches are not obscured
- Correct focus reporting without unexpectedly jumping scrollback to the bottom
- Improved IME positioning when switching between editor and terminal focus
- Improved drag selection bounds and vertical autoscroll when selecting beyond the terminal viewport
A large amount of terminal rendering and protocol processing was also optimized to reduce allocations and redundant work.
Font, text, and rendering improvements
ecode now exposes configurable OpenType shaping features separately for editor text and general UI text.
Supported feature tags include:
ligacaltcligdlig
Changes are applied immediately and persisted in the configuration.
The system-font resolver was substantially improved. Native fallback matching is now used on supported platforms, including Fontconfig, DirectWrite, and Core Text, with lazy missing-glyph resolution and cached fallback results.
Font discovery no longer needs to eagerly enumerate every installed font during startup.
The font picker can now select both font and size for ecode's UI, editor, and terminal font settings.
The rendering stack also gained subpixel/LCD text rendering improvements used by terminal and HTML surfaces, including single-pass rendering and fixes for scaled glyph atlases.
Custom fallback fonts no longer replace ecode's built-in CJK fallback font, and several native font-family/style resolution issues were fixed.
AI Assistant improvements
The AI Assistant can now fetch and cache a dynamic model catalog, while keeping bundled models as an offline fallback.
New model metadata and controls include:
- Reasoning capability information
- Configurable reasoning effort
- Updated model selection after catalog refresh
- Provider-aware model discovery
- API keys for arbitrary configured providers
- Provider prioritization when credentials are available
- Improved title-generation model selection
- Persisted reasoning configuration in chats
Model-catalog loading is deferred from the startup critical path.
ACP Agent message chunk ordering was also fixed, and empty assistant messages are no longer sent to providers that reject them.
Customizable debugger layouts
Debugger tabs can now be moved and split between the bottom panel and a reusable right-side panel.
The debugger remembers:
- Tab placement
- Split layout
- Panel state
- Table column widths
Column widths can use pixel or percentage sizing, and project-relative source paths are now shown in debugger stack frames.
simplescreenrecorder-2026-10-08_01.00.48.mp4
Editor improvements
- Added configurable Tab Out behavior for moving a single cursor past selected closing characters instead of inserting indentation. It is disabled by default and does not change selection or multi-cursor indentation behavior. #951
- Added
-r/--read-onlyfor opening command-line files in read-only mode. The state is preserved when files are forwarded to an existing ecode instance. #954 - Improved the Home / move-to-start-of-content behavior to match common editor behavior more closely. #935
- Added an exit command to
UIConsole, allowing the console to be hidden through the command system. #937 - Line wrapping is now enabled by default for new installations.
- Fixed commands that incorrectly executed against the editor where they were registered instead of the currently active editor.
- Fixed restoration of the correct find/replace state.
- Fixed splitter bookkeeping when editor or generic-widget tabs are moved between splits, preventing focus, title, selection, and callback state from falling out of sync. #958
- Fixed the cursor jumping to an old viewport position when clicking inside a scrolled editor split. #958
- Fixed a range of HiDPI / pixel-density inconsistencies affecting the editor, console, diff and merge views, font picker, tooltips, and AI Assistant UI.
- Improved bulk document insertion and IME-location updates.
- Improved editor initialization when opening many documents.
- Improved multi-file diff loading and creation.
- Improved caret placement around shaped ligatures.
- Improved read-only state handling and lock toggling.
- Improved editor wrap-content and scrollbar sizing.
Search and project indexing
- Hardened asynchronous document search against stale results, rapid query changes, cancellation races, document replacement, and editor destruction. #956
- Fixed a global-search crash that could occur when switching between asynchronous replace-in-files and normal document/global search before the replace model had finished loading.
- Fixed an autocomplete crash caused by document-symbol workers racing document lifecycle updates.
- Newly created directories are now indexed after the initial project scan, making their contents immediately available to the Universal Locator.
- Live project indexing now applies
.gitignore,.prjallowed, and.prjdisallowedfiltering consistently to files and directories added after project load. - Improved asynchronous filesystem-event processing with batching, modification coalescing, safer listener removal, and main-thread model updates.
- Added cross-directory move handling while preserving tree selections, descendant paths, lazy destination branches, and the paths of already-open documents.
- Fixed stale filesystem-model indexes and queued-delete use-after-free conditions that could crash project/file views.
- Improved synchronization between project-tree mutation and active searches.
- Fixed live project-tree updates for files and directories added directly to the project root, including files moved into the project from outside the tree.
Git and diff improvements
- Added multi-file Git status actions for stage, unstage, discard, open, and diff.
- Added multi-file diff tabs with aggregate changed-file and line statistics.
- Added a configurable default diff presentation: Unified or Side by Side.
- Added deletion of untracked files and groups directly from Git status.
- Added discard support for conflicted files and conflict groups.
- Added Add Tag & Push.
- Improved local, remote, and tag management from Git History.
- Fixed stale and symbolic remote branch entries.
- Fixed merge-view copy commands in read-only source panes.
- Improved Git plugin initialization and asynchronous UI lifetime handling.
- Git diff gutter/minimap state now refreshes correctly after an external file reload.
- Local branches without a matching fetched remote ref are now clearly identified as local-only.
- Fixed binary renames being incorrectly represented as untracked files in Git status.
- Fixed remote-branch checkout for nested branch names and ensured newly created local branches receive the correct upstream tracking configuration.
- Improved image diff views: source images and generated diffs are displayed at native pixel dimensions when possible, with corrected HiDPI sizing and reliable mode-button hit testing.
Debugger improvements
- Added customizable bottom/right debugger layouts with movable and splittable tabs.
- Persist debugger panel state, table column widths, and splitter layouts.
- Display project-relative paths in stack frames.
- Fixed a crash when attaching to a local PID with an incomplete debugger command.
- Fixed cases where the debugger plugin did not initialize correctly.
- Fixed debugger status-panel serialization.
- Fixed response delivery to multiple debugger listeners so payload data is preserved for every listener.
Screenshots
ecode now includes a configurable screenshot command, available from the Window settings and bound to Print Screen by default.
Screenshot destination, file-name pattern, and image format can be configured. Successful captures can be opened in ecode's integrated image viewer, and the notification also offers an action to open the containing folder.
File and application integration
- Replaced ecode's filesystem-watcher-based local IPC with a cross-platform message-oriented IPC implementation using Unix-domain sockets on POSIX systems and named pipes on Windows.
- Open-file forwarding remains profile-scoped and preserves the existing first/latest-instance behavior.
- Added cross-platform file-association management. #192
- Improved file association handling on macOS.
- The Project Tree now remembers Show Hidden Files between sessions.
- Improved recursive directory deletion portability.
- Added cross-directory filesystem move support for open projects.
- Fixed saving
.vapifiles whilevala-language-serveris active. #939
macOS improvements
ecode now uses eepp's native macOS global menu-bar integration instead of the previous hand-written Cocoa menu.
Native menus preserve ecode's lazy submenus, shortcuts, checkboxes, radio items, enabled/visible state, and semantic About, Preferences, Quit, Window, Help, and Services integration.
Duplicate shortcut execution between AppKit and SDL was also fixed.
Additional macOS work includes improved Core Text font-family and face resolution, faster native font lookup, file-association fixes, and updated nightly build handling.
Windows and clipboard improvements
- Fixed crashes and path corruption involving Unicode executable and working-directory paths on Windows. #953
- Improved Windows clipboard reliability by retrying writes when the clipboard is temporarily unavailable.
- Added SDL 3 MIME-based non-text clipboard support.
- Fixed bidirectional clipboard support in Emscripten builds.
- Improved MSVC build compatibility in several shared components.
Performance
A significant part of this release comes from eepp-level optimization work that directly benefits ecode.
Notable improvements include:
- Optimized
UICodeEditorminimap rendering and several common rendering hot paths; the implementation work measured roughly a 10% render-time improvement in representative ecode scenarios. - Deferred construction of large settings menus and settings-panel entries until they are actually needed.
- Reduced allocations during editor creation, project saving, document insertion, selection handling, UI updates, and multi-file diff preparation.
- Moved common
Variantvalues to inline storage, reducing heap churn in table/tree-heavy interfaces such as Git History, debugger views, and project models. - Accelerated UTF-8 / UTF-32 conversion and codepoint counting using a reduced simdutf integration while retaining scalar fast paths where appropriate.
- Reused regular-expression match data and bounded the regular-expression pattern cache.
- Improved native system-font resolution so fallback work is performed lazily instead of eagerly enumerating all fonts.
- Optimized syntax tokenization for common small result sets.
- Improved stylesheet matching, invalidation batching, and UI hot paths.
- Optimized terminal output processing, frame-damage detection, graphics decoding, and Kitty image streaming.
- Reduced startup work by moving AI model-catalog loading and other non-critical initialization off the first-frame path.
- Reduced redundant rich-text rebuilds, inline-fragment invalidations, and HTML table layout work, improving Markdown/HTML preview rendering and resize behavior.
- Optimized asynchronous UI resource dispatch to avoid heap allocation in the common path while preserving the correct scene context.
Stability and correctness
- Hardened asynchronous document search and cancellation. #956
- Fixed split-view callbacks and focus tracking after moving tabs between editor splits. #958
- Fixed a Windows Unicode-path crash and an AI Assistant teardown fault during partial initialization. #953
- Reworked plugin shutdown so editor commands, listeners, clients, UI objects, and queued callbacks are detached safely on the main thread before resource destruction.
- Prevented plugin reloads and stale command dispatch during application shutdown.
- Fixed an autocomplete document-symbol race that could corrupt its internal document set.
- Fixed stale
FileSystemModelindexes, queued-delete use-after-free conditions, and several project-tree mutation races. - Fixed a global-search / replace-in-files timing crash.
- Fixed an Oniguruma fallback-pattern deallocation bug that could corrupt the heap in regex users including snippet parsing.
- Fixed custom fallback fonts replacing the built-in CJK fallback.
- Fixed a font fallback use-after-free during missing-glyph resolution.
- Fixed terminal scrollback, selection, focus, application-cursor, and mouse-report synchronization issues.
- Fixed terminal search highlight and find-bar placement issues.
- Fixed opening/closing a terminal context menu unexpectedly moving scrollback.
- Fixed duplicate mouse-wheel events and several multi-window input-routing regressions in shared UI code.
- Fixed
UIDropDownpositioning, sizing, and table sort-indicator issues. - Fixed multiple asynchronous UI lifetime hazards in Git History and other ecode controllers.
- Fixed
UIConsolekeyboard/wheel scrolling and moved-entry cache handling. - Fixed several memory, resource-lifetime, and shutdown issues in shared graphics, font, HTTP, and UI infrastructure.
- Added regression coverage for the multi-instance shutdown crash reported in #959, including worker-released texture cleanup across engine restarts.
- Fixed additional project-root path canonicalization and filesystem-event regressions affecting live project updates.
HTML and Markdown preview improvements
The eepp HTML/CSS stack received extensive work that improves ecode's Markdown and HTML rendering surfaces.
Changes include:
- Added persistent Markdown preview tabs with local-link navigation and Back/Forward history.
- Added document-level text selection to Markdown and HTML views, including copy, select-all, context menus, nested-content selection, and autoscroll.
- Fixed text selection being accidentally started by unrelated editor or scrollbar drags.
- Improved mixed-font baseline alignment in rich-text content.
- Fixed Markdown view styling so it inherits the correct base-theme CSS.
- Improved large-page loading to avoid long UI stalls.
- Improved render culling.
- Improved CSS cascade ordering for deferred stylesheets.
- Fixed CSS comments inside declarations and statement at-rules.
- Improved inline, inline-block, float, flex, and replaced-element layout.
- Fixed percentage margins and percentage-sized inline SVG rendering.
- Improved SVG HiDPI rendering.
- Improved form-control sizing and styling.
- Improved background shorthand parsing, sizing, clipping, and multi-layer behavior.
- Improved borders, border radii, patterned borders, and paint ordering.
- Improved whitespace collapsing and rich-text positioning.
- Improved font-weight, fallback-font, and
@font-faceresolution. - Fixed several rich-text float placement and layout loops.
Interface and usability
- Added optional smooth scrolling support across shared scrollable UI widgets.
- Improved dropdown sizing and placement.
- Improved table sorting indicators and prevented accidental sorts after header dragging.
- Improved shared table/tree interactions so selections survive sorting and context-menu opening more reliably, with better column-header dragging behavior.
- Improved settings-panel mouse interaction, keyboard navigation, focus behavior, and validation.
- Improved native font picker behavior for external fonts and asynchronously discovered fonts.
- Improved multi-file diff controls and changed-file summaries.
- Improved UI event lifetime handling and mouse-wheel bubbling.
- Added secondary modifier support to the shared input/keybinding system.
- Updated English, German, French, and Chinese translation resources for the new settings and features.