All notable changes to this project will be documented in this file.
This project adheres to Keep a Changelog and follows Semantic Versioning.
- Add titlebar section visibility settings with per-section toggles for command bar, quick actions, resource usage, and workspace switcher.
- Add right-click context menu on titlebar to quickly toggle section visibility.
- Add titlebar visibility configuration panel in Settings dialog under Appearance.
- Add tabSetEnableMaximize user setting to control FlexLayout maximize button visibility.
- Add ASCII art logo component for empty states, replacing the Anvil icon.
- Replace Anvil icon with ASCII art logo in App empty state and ForjaEmptyState component.
- Fix false notification badges appearing on sidebar during session restoration by gating on actual user input.
- Fix notification badges triggering for plain terminals and unrestored tabs instead of only AI CLI exits.
- Fix text selection blocked in Monaco read-only preview mode by removing pointer-events and user-select CSS overrides.
- Fix xterm rendering artifacts on reattach by deferring refresh after fit and clearing screen on dimension change.
- Fix layout bleed between projects by resetting tiling layout before loading new project state and guarding against concurrent switches.
- Fix workspace switcher closing the window when deleting an inactive workspace instead of only the active one.
- Fix inflated context percentage in telemetry by using 1M context window for Opus models instead of 200k.
- Add session telemetry display in status bar with real-time token usage, cost, context bar with semantic colors, and auto-detection of 200k vs 1M context windows.
- Add Discord webhook notifications with PTY output summarization, ANSI stripping, noise filtering, and head+tail truncation for Discord's 2000 char limit.
- Add Discord webhook configuration to settings UI with URL validation and enable/disable toggle.
- Add notification hooks setup for CLI integration (Claude, Codex, Gemini, Cursor, gh-copilot) with graceful jq degradation.
- Add OSC 9/99/777 notification handlers to terminal for ConEmu, key=value, and Urxvt notification sequences with 1s debounce.
- Add beta disclaimer dialog on first launch.
- Strip ephemeral file-preview blocks from persisted layouts to prevent self-reinforcing restore-auto-load-save cycle.
- Create Fumadocs documentation site (
@forja/docs) with Next.js 15 and MDX support. - Create Next.js marketing site (
@forja/site) with static export and Catppuccin Mocha theme. - Create Expo remote control app (
@forja/mobile) with WebSocket client and session management.
- Restructure project as pnpm monorepo with
@forja/desktop,@forja/site,@forja/docs,@forja/mobile,@forja/shared, and@forja/tsconfigworkspaces. - Remove window opacity feature from frontend and backend, restoring GPU zero-copy flags for all platforms.
- Add backpressure handling to IPC streams with batched PTY event broadcasting and circuit breaker for slow WebSocket clients.
- Replace transparent backgrounds with theme base colors in terminal, Monaco editor, and CSS overrides to eliminate alpha compositing overhead.
- Move build and CLI scripts to monorepo root
scripts/directory.
- Fix terminal wrapper background color mismatch with xterm theme in padding area.
- Fix notifications firing only once per tab by replacing one-shot guard with buffer delta snapshots.
- Preserve terminal block tabset positions on project switch instead of recreating all blocks in first tabset.
- Disable transparency on Wayland tiling WMs (Hyprland, Sway, Niri, i3, River) to prevent pointer freeze.
- Fix monorepo restructure issues: move public assets, update gitignore patterns, remove old site directory.
- Add External API server with Unix socket (named pipe on Windows) for programmatic control of Forja from shell scripts, hooks, and external tools.
- Add WebSocket bridge for remote control over the local network with token-based authentication, rate limiting (10 msg/s), and connection limit (5 clients).
- Add real-time PTY output streaming via WebSocket subscribe/unsubscribe protocol.
- Add CLI client (
forja) for controlling a running Forja instance from the terminal (ping, notify, open, sessions, send, output, screenshot, new-session). - Add CLI mode handler so the packaged
forjabinary doubles as both GUI launcher and CLI client. - Add Discord bot (
forja-bot) with slash commands and!forjamessage prefix for remote session management. - Add PTY subscriber system for broadcasting terminal output events to external consumers.
- Add WebSocket bridge UI controls: titlebar menu toggle, Ctrl+Shift+R keyboard shortcut, and status bar indicator with port and client count.
- Add comprehensive External API documentation with examples in bash, Python, Node.js, and PowerShell.
- Persist and restore tiling layout JSON per project.
- Persist browser URL in layout via debounced config sync.
- Add tabset context menu with close option.
- Add isSwitchingProject guard to projects store.
- Add updateBlockConfig and closeTabset to tiling store.
- Wire ui-save-gate and webview bridge into main.
- Add webview keyboard bridge for app shortcuts.
- Add UI save gate to suspend saves during cache clear.
- Add keyboard navigation to file tree.
- Replace tab cycling with global cross-pane Ctrl+Tab.
- Register pane focus callbacks in all block components.
- Add global tab cycling to tiling layout store.
- Add pane focus registry for cross-pane tab cycling.
- Add clearUiCache and safer ensureGitignore handling.
- Add Sessions and Plugins groups to command palette.
- Hide Collapse All Folders when file tree is closed.
- Add developer commands and hide context-less items.
- Add focus mode to hide UI chrome with Ctrl+Shift+M.
- Persist and restore terminal tabs across project switches.
- Add serializeTabsForSave and remove unused tabLastActiveAt.
- Replace tab switching shortcut with project switching via Ctrl+Shift+number.
- Integrate workspace system into App and main entry points.
- Enhance terminal session with auto-close and block components.
- Enhance tiling layout and tab management with rename support.
- Add tab inline edit and name overlay components.
- Add workspace switcher, empty state and titlebar integration.
- Add workspace color and icon utilities, enhance CLI registry.
- Enhance workspace, tiling-layout, projects and terminal-tabs stores.
- Add workspace system with project config and buffer persistence.
- Open file-tree panel at compact minimum size.
- Scope-aware plugin filtering in right sidebar.
- Add WIP alert to chat panel and remove redundant close button.
- Add plugin scope type and validation.
- Add clear cache button to resource usage popover.
- Add cache clear and config reset functionality.
- Add tiling layout block components.
- Add tiling layout core components.
- Add tiling layout core library and store.
- Coalesce PTY writes with RAF to prevent viewport jumping.
- Fix memory leaks and reduce unnecessary re-renders.
- Disable titlebar drag region in focus mode.
- Prevent stale layout and zombie tabs on project switch.
- Prevent orphan panes and stale layout on project switch.
- Guard PTY resize against invalid dimensions.
- Update focus mode shortcut to Ctrl+Alt+F.
- Preserve cliSessionId on workspace restore.
- Keep backend PTY alive when frontend cache evicts terminal.
- Make chat and settings work without active project.
- Add tiling layout system with core library, store, block components, and tab management.
- Add workspace system with project config, buffer persistence, switcher, empty state, and titlebar integration.
- Add focus mode to hide UI chrome (Ctrl+Alt+F).
- Add keyboard navigation to file tree (arrow keys, Enter, Home/End).
- Add global cross-pane tab cycling with Ctrl+Tab.
- Add tabset context menu with close option.
- Add tab inline edit and name overlay components.
- Add Sessions and Plugins groups to command palette.
- Add developer commands and hide context-less items in command palette.
- Add clear cache button to resource usage popover.
- Add cache clear and config reset functionality in backend.
- Add UI save gate to suspend saves during cache clear.
- Add webview keyboard bridge for app shortcuts.
- Add plugin scope type and validation.
- Add scope-aware plugin filtering in right sidebar.
- Add WIP alert to chat panel.
- Persist and restore tiling layout JSON per project.
- Persist and restore terminal tabs across project switches.
- Persist browser URL in layout via debounced config sync.
- Replace tab switching shortcut with project switching via Ctrl+Shift+number.
- Open file-tree panel at compact minimum size.
- Hide Collapse All Folders button when file tree is closed.
- Replace old terminal pane and split layout system with tiling layout.
- Integrate tiling layout into App shell and panel components.
- Migrate font sizes to dynamic scale across all UI components.
- Rename agent-chat label from "Chat" to "AI Assistant".
- Unify Ctrl+W to always close active tab.
- Remove Alt key shortcut numbers from project icons.
- Remove tab hibernation from lite mode config.
- Remove opencode from CLI registry, detector, settings, and assets.
- Use copilot standalone binary instead of gh extension.
- Guard PTY resize against invalid dimensions.
- Keep backend PTY alive when frontend cache evicts terminal.
- Prevent orphan panes and stale layout on project switch.
- Prevent stale layout and zombie tabs on project switch.
- Preserve cliSessionId on workspace restore.
- Make chat and settings work without active project.
- Disable titlebar drag region in focus mode.
- Coalesce PTY writes with requestAnimationFrame to prevent viewport jumping.
- Fix memory leaks and reduce unnecessary re-renders.
- Add performance guardrails and lazy-load Monaco editors.
- Coalesce git refresh by project with TTL caching.
- Make app metrics sampling demand-driven.
- Make file refresh selective by project and path.
- Remove sync icon IO from main process.
- Fix black screen on Wayland-based Linux systems (Pop!_OS 24.04 / COSMIC) (#11). Use
ELECTRON_OZONE_PLATFORM_HINT=autoinstead ofappendSwitch("ozone-platform")which is processed too late in Electron 32. - Add programmatic Ozone platform hint fallback in
electron/main.tsto ensure AppImage builds also get Wayland auto-detection (not just.deb). - Fix false "Claude Code CLI not found" dialog when reopening app from desktop entry. Detect Node version manager paths (nvm, fnm, volta, asdf, mise) in
resolveShellPath()so CLI binaries installed vianpm install -gare found even without shell profile initialization.
- Add Go to Project command palette and keyboard shortcuts.
- Add terminal background opacity reactivity.
- Add uninstall plugin option to right sidebar context menu.
- Integrate marketplace view in right sidebar and panel.
- Add plugin marketplace UI with store and components.
- Add plugin installer and marketplace IPC handlers.
- Add plugin registry client.
- Add registry and marketplace plugin types.
- Add window opacity IPC handler.
- Integrate background opacity and fix terminal icon.
- Inject opacity CSS in plugin webview and fix settings input.
- Add plugin webview opacity CSS builder.
- Add background opacity via CSS variables.
- Add Windows forbidden paths and fix watcher path join.
- Centralize config paths for cross-platform support.
- Add cross-platform binary detection and PTY support.
- Open external links in system browser from markdown preview.
- Add plugin pin with context menu and panel persistence.
- Add IPC handlers for plugin pin persistence.
- Preserve project icon and order on session restore.
- Preserve expanded subdirectories on file tree refresh.
- Add open in files and open in editor context menu items.
- Add open in files and open in editor IPC handlers.
- Add pluginOrder config and IPC handlers.
- Add interactive features to tasks plugin.
- Add sidebar badge API and plugin reorder support.
- Redesign pomodoro timer with persistence and collapsible settings.
- Keep plugin webview alive when panel is closed.
- Add missing sidebar API to CTS plugin preload.
- Prevent right panel opening empty without active plugin.
- Add forja-plugin-tasks example plugin.
- Add project events, permissions check, and bridge improvements to PluginHost.
- Add tab drag-and-drop reorder with dnd-kit.
- Add pomodoro timer as example plugin and scaffolding template.
- Add PluginHost webview, permission dialog, and UI integration.
- Add frontend plugin store, types, and theme utility.
- Add IPC handlers, webview preload, and config schema.
- Add permission system and secure bridge API.
- Add plugin types, manifest validation, and directory loader.
- Make plugin-preload self-contained and fix preload path.
- Prevent PTY kill on tab reorder.
- Limit file tree sidebar max width to 500px.
- Add per-project UI state save/restore.
- Add per-project UI state persistence.
- Only open localhost links from terminal clicks.
- Add XCompose cedilla fallback for pt_BR locale.
- Add collapsible right panel to main layout.
- Add right panel store and remove terminal collapse state.
- Add XCompose cedilla support for pt_BR locale.
- Add right sidebar component.
- Strip HTML comments from markdown renderer.
- Remap c-acute to c-cedilla in terminal input.
- Handle Ctrl+Shift+R in reload shortcut block.
- Delegate Ctrl+Shift+V paste to native browser event instead of manual handler.
- Prevent dead key character duplication on Linux.
- Block reload shortcuts (Ctrl+R, Cmd+R, F5) in production builds.
- Add dev-only lite mode toggle in titlebar.
- Remap sidebar/project/browser shortcuts to avoid terminal conflicts.
- Initialize performance store on app mount.
- Add Performance section to settings dialog.
- Add tab hibernation for lite mode (unmount inactive xterm).
- Add performance Zustand store for lite mode state.
- Expose performance mode via IPC for frontend.
- Add performance settings to UserSettings type.
- Make file watcher depth configurable for lite mode.
- Make metrics polling interval configurable for lite mode.
- Add lite-mode detection with hardware-aware startup.
- Reduce PTY ring buffer from 2MB to 512KB.
- Remove enable-wayland-ime to prevent duplicate dead-key input.
- Prevent duplicate characters during dead-key composition.
- Fix broken CHANGELOG formatting from release script.
- Add IME dead-key support for cedilla on Linux.
- Add theme and lineHeight to settings dialog.
- Add theme switcher to command palette.
- Integrate theme system into app.
- Add Zustand theme store.
- Add theme and lineHeight to UserSettings.
- Add theme applicator with CSS variable mapping.
- Add theme registry with resolve logic.
- Add 10 popular editor theme definitions.
- Add 4 core theme definitions.
- Add theme schema types and validation.
- Tighten browser pane lifecycle.
- Remove sync icon IO from main process.
- Make app metrics sampling demand-driven.
- Coalesce git refresh by project with TTL caching.
- Make file refresh selective by project and path.
- Add performance guardrails, lazy-load monaco editors.
- Handle Ctrl+Shift+C/V for terminal copy/paste.
- Add context menu and inline rename to terminal tabs.
- Add keyboard shortcuts for fullscreen and browser toggle.
- Add tooltips to tab bar action buttons.
- Add terminal fullscreen toggle.
- Add edit button to markdown preview pane.
- Add browser screenshot to clipboard.
- Autofocus terminal on session open and tab switch.
- Show spinner only when project is actively thinking.
- Replace file preview empty state with Forja branding and shortcuts.
- Add session picker via command palette.
- Add sessions mode to command palette store.
- Add isLocalhostUrl helper with URL parsing.
- Notify only active project on session state change.
- Scope git diff selection per project on switch.
- Exclude git-ignored files from quick open.
- Show dot directories in file tree.
- Error page overlay for browser pane load failures.
- Hide custom window controls on macOS.
- Scope browser pane state per project (was global, staying visible across all projects when switching).
- Embedded browser pane inside the preview panel with Electron
<webview>tag. - Browser navigation toolbar with back, forward, reload, and address bar.
- Globe toggle button in titlebar to open/close the browser pane.
- Ctrl+Shift+B keyboard shortcut to toggle the browser pane.
- URL validation blocking dangerous schemes (javascript, file, data, vbscript, blob).
- Auto-open browser pane when localhost/127.0.0.1 URLs are detected in terminal output.
- Localhost URL detector with ANSI escape code stripping for PTY output.
- Browser IPC bridge namespace in Electron preload.
- Zustand store for browser pane state management.
- Watch for file content changes (
changeevent) in file-watcher, not just add/unlink. - Add
invalidateProjectCacheto file-cache for clearing stale entries by project path. - Auto-reload file preview when external file changes are detected via
files:changedIPC. - Support
skipCacheoption inread_file_commandIPC handler.
- Standardize hover buttons with
rounded-mdandbg-ctp-surface0.
- Prevent terminal resize when tab is hidden to avoid PTY corruption from 0x0 dimensions.
- Adjust sidebar icon spacing and reorder bottom buttons for better visual hierarchy.
- Add filesystem watcher for project directory with chokidar (depth: 3, 1000ms debounce).
- Add file tree refresh button (RefreshCw) in sidebar header.
- Add
refreshTreeaction to file-tree store for manual and automatic tree refresh. - Listen for
files:changedIPC events to auto-refresh file tree on disk changes. - Start/stop file watcher on project activate/remove.
- Move chat panel inside sidebar resizable panel for better layout integration.
- Keep preview pane always open with empty state when no file is selected.
- Replace deprecated Vitest poolOptions with maxWorkers for proper CPU limiting.
- Refactor keyboard shortcuts with Shift modifier for tab management (Ctrl+Shift+T/W).
- Add Ctrl+1-9 to switch tabs by position.
- Add thinking/notified indicators for sidebar projects.
- Improve terminal context menu split pane handling and icon alignment.
- Correct copy/paste shortcuts to Ctrl+Shift+C/V in context menu.
- Add terminal context menu and split pane close headers.
- Trigger session-ready notification on thinking-to-ready transition.
- Add session-ready notifications via IPC.
- Switch frontend tests to happy-dom and limit pool sizes.
- Clean old AppImages on build and show version in desktop entry.
- Lazy-load file tree children on directory expand.
- Add terminal split preferences to config and PTY.
- Add per-project file preview save/restore.
- Add get_settings_path IPC handler.
- Add Context section to settings and switch UI labels to English.
- Make projectPath optional with fallback to ~/.config/forja.
- Add Import dropdown to context hub settings UI.
- Add importItem to context hub with IPC handler.
- Persist project name and icon edits to config.json.
- Add icon_path to RecentProject and updateRecentProject.
- Add 10 commands to command palette with grouped layout.
- Add drag-and-drop project reorder in sidebar.
- Persist sidebar open/close state across sessions.
- Add sidebar persistence and project reorder to config.
- Update App layout with chat panel and project sidebar.
- Add project sidebar, settings dialog, and context sync status.
- Add chat panel with slash command menu.
- Add agent chat hook and update CLI/PTY hooks.
- Add agent chat, context hub, and projects stores.
- Add slash commands, chat context, and PTY dispatcher libs.
- Update config, settings, and register new IPC handlers.
- Add agent chat backend with IPC handlers.
- Add context synchronization system.
- Add project icon resolver.
- Add ring buffer, PTY notifications, and CLI detector.
- Add CLI icons and app favicon.
- Wire cache and focus callback into main process.
- Add LRU file content cache.
- Add conditional metrics polling and CLI detection cache.
- Add shallow tree loading with on-demand subdirectory fetch.
- Add IPC call deduplication and git status TTL cache.
- Open settings.json via file preview instead of custom editor.
- Add removeProjectTree action to file tree store.
- Add context menu to file tree nodes.
- Add resource usage popover in titlebar.
- Add file operations module (rename and delete).
- Add MonacoEditor and MonacoDiffEditor wrappers.
- Add Monaco workers, Catppuccin theme, and language detection.
- Add Monaco CSP, file writer, and git content at HEAD.
- Use relative paths for CLI icons and fix UI details.
- Allow WASM execution in CSP for syntax highlighting.
- Set vite base to relative path for production build.
- Improve session restoration with workspace fallback.
- Integrate DevMetrics in statusbar for dev mode.
- Add DevMetrics component and useAppMetrics hook.
- Add app-metrics module with dev-mode IPC.
- Add session persistence and update CLI icons.
- Add git diff viewer and image preview.
- Add settings editor, inline edit, and update dialogs.
- Add and update Zustand stores.
- Add utility libs and hooks.
- Add user settings and enhance backend modules.
- Integrate multi-CLI and workspace lifecycle in app shell.
- Add multi-CLI components and workspace UI.
- Add workspace store and multi-CLI session support.
- Add CLI registry, IPC layer, and detection hook.
- Add backend with IPC, PTY, config, and file watcher.
- Integrate multi-window, error boundaries, and session state.
- Add session state store, strip-ansi utility, and new components.
- Add multi-window support, CLI check, and new IPC commands.
- Add config manager and file watcher modules.
- Add plaintext fallback when Shiki fails to load.
- Integrate session type and zoom features.
- Support session type in PTY spawn command.
- Add new session dialog with session type selection.
- Add terminal zoom store with keyboard shortcuts.
- Add command palette with file search and commands.
- Add flatten file tree utility.
- Add command palette and app dialogs stores.
- Add Command UI primitive component.
- Update app shell with dialogs, shortcuts, and layout.
- Add file preview pane with syntax highlighting.
- Add terminal integration with PTY and tab management.
- Add UI primitives (button, dialog, hover-card, resizable).
- Add PTY management, file reader, and git info commands.
- Add UI components.
- Add app shell with Catppuccin Mocha theme.
- Add app entry, file tree and system metrics.
- Lazy load FilePreviewPane, memo CodeViewer, extract keyboard hook.
- Optimize store selectors, metrics interval, and git status.
- Optimize rendering in statusbar, terminal and titlebar.
- Add lazy loading, virtualization and memo.
- Optimize Shiki lazy loading, ring buffer and platform utils.
- Add virtual list dep and configure chunk splitting.
- Optimize metrics init, PTY buffer and git info.
- Add unique instance ID to prevent tab ID collisions.
- Add ARIA attributes, tabpanel roles, and focus-visible styles.
- Enable sandbox, validate sessions, and filter PTY env.
- Improve keyboard navigation and ARIA attributes.
- Add DOMPurify sanitization for HTML rendering.
- Prevent command injection and path traversal.
- Open workspace in current window from EmptyState.
- Prevent new session modal when no project is open.