Skip to content

Releases: heyuforia/volt

v0.4.4

21 Mar 06:53

Choose a tag to compare

What's New

Split Terminal Panes

  • Split terminals horizontally (Ctrl+Shift+D) or vertically (Ctrl+Shift+E)
  • Draggable dividers to resize panes
  • Click to focus individual panes (purple outline indicator)
  • Close individual split panes via floating × button (top-right, appears on hover)
  • Drag pane handle to extract it back to its own tab
  • Shift+drag a terminal tab onto another to merge into a split
  • Pane count badge [N] shown in tab bar when split

Terminal Search

  • Ctrl+F opens search bar in the active terminal
  • Incremental search with highlighted matches (yellow = all matches, purple = active)
  • Previous/next match navigation (Shift+Enter / Enter)
  • Case sensitivity and regex toggles
  • Result count display ("3 of 12")

File Tree Drag-and-Drop

  • Drag files and folders within the tree to move them
  • Ghost element follows cursor during drag
  • Drop target folders highlighted with purple outline
  • Auto-expand collapsed folders after 600ms hover
  • Circular move prevention (can't drop folder into its own child)
  • Name conflict detection with confirmation dialog
  • Undo toast after move ("Moved X → Folder" with Undo button)

Multi-Instance Support

  • Run multiple Volt windows for different folders simultaneously
  • Opening the same folder in a second instance still focuses the existing one

Other Improvements

  • Individual remove button on recent folders in welcome screen
  • Welcome screen shortcuts updated to show Ctrl+F and Ctrl+Shift+D
  • Fix macOS terminal keyboard input (arrow keys, backspace, delete)
  • Fix PTY UTF-8 splitting for multi-byte characters
  • Fix drag-drop folder detection
  • Sidebar width persists across sessions
  • Launch emulator binary directly instead of Flutter CLI wrapper
  • Reset emulator status bar button when emulator process exits
  • Fix open_url command injection vulnerability
  • Fix LSP race condition and watcher noise
  • Enable word wrap for all files
  • Clickable diagnostics, regex search toggle
  • Fix markdown preview checkboxes, code language classes, list start numbers
  • Clickable file paths in terminal output (open in editor at line number)
  • Clickable web URLs in terminal (open in browser)
  • Dim gitignored files in file tree

v0.4.1

20 Mar 04:35

Choose a tag to compare

Fix: macOS terminal keyboard input

Fixed an issue where arrow keys, backspace, and delete keys were not working in the terminal on macOS. The WKWebView was intercepting keyboard events before they reached xterm.js. Added native macOS setup to make the WKWebView the first responder on launch.

Note: The editor (CodeMirror) was unaffected — this fix is specific to the terminal (xterm.js).

v0.4.0

18 Mar 20:33

Choose a tag to compare

What's Changed

  • Enable word wrap for all files and remove wrap toggle button
  • Fix open_url command injection, LSP race condition, and watcher noise
  • Reset emulator status bar button when emulator process exits
  • Launch emulator binary directly instead of flutter CLI wrapper
  • Fix PTY UTF-8 splitting, drag-drop folder detection, and sidebar persist

v0.3.6

16 Mar 02:43

Choose a tag to compare

What's Changed

  • Enable word wrap for all files and remove wrap toggle button
  • Fix open_url command injection, LSP race condition, and watcher noise
  • Reset emulator status bar button when emulator process exits

v0.3.5

15 Mar 04:11

Choose a tag to compare

What's New

Clickable Terminal Links

  • Web URLs (http/https) open in your default browser
  • File paths (e.g. src/main.rs:42) open in Volt's editor at the correct line

Clickable Diagnostics

  • Click any error or warning in the Problems panel to jump directly to the file and line

Word Wrap Toggle

  • Alt+Z or the Wrap button in the breadcrumb bar to toggle soft line wrapping per file

Regex Search

  • New .* toggle in Find in Files (Ctrl+Shift+F) enables case-insensitive regex patterns
  • Invalid regex shows a clear error message

Clickable Breadcrumbs

  • Click any folder segment in the breadcrumb bar to open it in your OS file manager

Loading Indicator

  • Spinner shown in the file tree while a folder is loading (visible on large projects)

Settings Validation

  • Font size (8-32), scrollback (500-50,000), and auto-save delay (500-10,000ms) are validated before saving

Performance

  • Git status results are cached with a 2-second TTL, reducing redundant git status calls during rapid tree refreshes

Accessibility

  • Respects prefers-reduced-motion OS setting — all animations and transitions are suppressed

Fixes

  • Markdown preview no longer strips checkboxes, code language classes, or ordered list start numbers

Volt 0.3.0

12 Mar 13:53

Choose a tag to compare

What's Changed since v0.2.2

Real-Time File Tree

  • Directory watcher emits live Create/Remove/Rename events — no manual refresh needed
  • Expanded folder state and scroll position preserved across tree refreshes
  • Debounced directory change events (300ms) to batch rapid filesystem operations
  • Context menu actions (new/delete/rename) now preserve tree state
  • Noisy paths (.git, node_modules, etc.) filtered from watcher events
  • Fixed tree flashing on refresh by deferring innerHTML clear until new data is ready

Git Integration

  • Gitignored files now render at 50% opacity in the file tree (like VSCode)
  • Parses git status --ignored output to detect gitignored paths

Editor

  • Scroll position preserved across markdown preview toggle

Bug Fixes

  • Fixed tab bar losing scroll position when tabs are re-rendered
  • Fixed stale search results appearing after starting a new search (generation guard for races)
  • Fixed settings panel crash when save error fires after panel is closed
  • Fixed save cooldown timers leaking when folder is closed

Error Handling & Resilience

  • Watcher creation failures logged instead of silently ignored
  • WebView2 .unwrap() chains replaced with ? operator + error logging
  • Config corruption detected at startup with user notification via toast
  • Search returns a truncation flag instead of relying on frontend magic-number check
  • File watches use LRU eviction instead of hard error at limit
  • Terminal resize clamping, LSP config load failures, and file manager errors now logged
  • JSON parse calls in Vite config wrapped in try-catch to prevent build failures

Security

  • Removed space from emulator ID validation allowlist (cmd /C injection vector)

Accessibility

  • Added role="tree" to file explorer for screen reader navigation
  • ARIA attributes on tab bar, sidebar, dialogs, status bar, and tree items

CSS & UI

  • Replaced ~30 hardcoded hex colors with CSS custom properties for maintainability
  • Improved placeholder contrast

Build & Versioning

  • package.json is now the single source of truth for the app version
  • Version auto-syncs to Cargo.toml and tauri.conf.json on every build via Vite plugin

Documentation

  • Added macOS Gatekeeper workaround (xattr -cr) to README installation section
  • Updated screenshot

Full Changelog: v0.2.2...v0.3.0

v0.2.2

09 Mar 14:54

Choose a tag to compare

What's Changed since v0.2.0

Atomic File Saves & Error Visibility

  • Atomic writes via temp file + rename in fs.rs — prevents data loss on crash/bluescreen mid-save
  • Used for both save_file() and save_config()
  • Added console.warn to ~57 silent catch blocks across all JS files so failures show in DevTools

Performance Improvements

  • Parallelized search_in_files with std::thread::scope (no new deps)
  • Cached canonicalized project root and ~/.volt dir in validate_path
  • O(1) git folder status lookups via dirty-directory prefix Set
  • Cached lowercased file paths in Quick Open, reduced object allocations
  • Single-pass diagnostic counts in analyzer status bar and panel

Security: Path Validation Hardening

  • Added validate_path() to read_directory, read_file, save_file, read_image_file, swap file commands, list_all_files, and search_in_files
  • Reordered openFolder to set PROJECT_ROOT before loadDirectory

LSP Document Sync

  • Full didOpen/didChange/didClose/didSave notification pipeline
  • Message queuing until LSP initialization completes, 300ms debounce on changes
  • Re-sends open documents on analyzer restart, plus rename handling
  • Fixed LSP URI encoding for paths with spaces, #, and special characters
  • Deduplicated rootUri construction via existing path_to_uri helper

Config & Git Improvements

  • In-memory config cache to avoid redundant disk reads
  • Debounced fire-and-forget config saves to prevent race conditions
  • Wrapped git_status in spawn_blocking to avoid blocking the async runtime

Search & File Tree Fixes

  • Exposed dot-files (.gitignore, .env, etc.) in Quick Open and Search while still skipping hidden directories
  • Filtered .volt-swap/.volt-tmp from Quick Open/Search
  • Highlighted all query occurrences per line in Find in Files, not just the first

CSS & UI Polish

  • Extracted 16 CSS colors into :root custom properties for maintainability
  • Injected version from package.json via Vite define instead of hardcoding
  • Added Ctrl+Shift+O shortcut to close the current folder
  • Fixed shell quoting to use PowerShell escaping on Windows

Testing

  • Added 27 unit tests covering parse_porcelain, detect_language, is_binary, find_ascii_case_insensitive, uri_to_relative, path_to_uri, lsp_language_id

Documentation

  • Updated README with image preview, git status indicators, drag-and-drop, context menu extras, lspServers config, and missing keyboard shortcuts

Full Changelog: v0.2.0...v0.2.2

v0.2.0

09 Mar 12:28

Choose a tag to compare

What's New

Security Hardening

  • Add Content-Security-Policy (script-src 'self') to block inline script injection
  • Add path containment for destructive file operations (create/delete/rename) via project root tracking
  • Validate emulator IDs against safe character allowlist to prevent command injection
  • Tighten DOMPurify markdown preview with explicit tag/attribute allowlists
  • Shell-quote file paths pasted into terminals to prevent accidental execution

Resource Limits

  • Cap concurrent terminals (20), file watches (10K), recursive file listing (100K files), terminal resize (500×200)

Terminal

  • Handle Shift+Enter for Claude Code newline support (sends ESC+LF sequence)
  • Add zero-dimension guard to resize_terminal to prevent invalid PTY resize calls

Search & File Tree

  • Move search_in_files and list_all_files to async with spawn_blocking for non-blocking file I/O
  • Add recursion depth limit (64) to prevent stack overflow from symlink loops
  • Add undo toast after file/folder renames with 5-second auto-dismiss

v0.1.3

09 Mar 11:41

Choose a tag to compare

Changes

  • Handle Shift+Enter in terminal for Claude Code newline support
  • Fix bold text not rendering in markdown preview
  • Darken inactive tab background for stealthier look
  • Use neutral gray for inactive tabs (no purple hue)
  • Fix duplicate file tree rendering and slow git status

v0.1.2

08 Mar 22:25

Choose a tag to compare

What's New in v0.1.2

Image Preview

  • Image file support — clicking an image file (PNG, JPG, GIF, WebP, BMP, ICO, AVIF, TIFF) in the file tree opens a preview tab with the image, its dimensions, and file size
  • Checkerboard background — transparent images display against a checkerboard pattern so transparency is visible
  • 20MB limit — large images are gracefully rejected with an error message

Git Status Indicators

  • File status badges — modified (M), untracked (U), added (A), and deleted (D) files show colored labels in the file tree
  • Colored file names — modified files are yellow, untracked/added files are green, deleted files are red with strikethrough
  • Folder indicators — folders containing dirty files show a yellow dot
  • Auto-refresh — git status updates on folder open, tree refresh, and file save

Terminal

  • Ctrl+Backspace fix — word-delete now works correctly in both PowerShell prompts and VT apps (Claude Code, vim, etc.) on Windows
  • Instant tab switching — removed 200ms click delay on tab activation; tabs now respond immediately to clicks while still supporting double-click to rename

Full Changelog: v0.1.1...v0.1.2