v0.10.0 0f4e9eb

CHANGELOG.md RawHistoryFolder

Changelog

All notable changes to this project will be documented in this file.

[Unreleased]

[0.10.0] - 2025-09-24

Added

  • Print functionality: Added Ctrl+Shift+P shortcut to open native print dialogs from any pane. Ctrl+P is blocked at WebKit level to prevent conflicts with pane mode shortcuts
  • WebKit native favicon detection: Implemented WebKit's built-in favicon database for automatic favicon detection and URI storage. Enhanced favicon support for all formats (PNG, SVG, ICO) without external dependencies

Changed

  • Homepage redesign: Brutal design with component-scoped styling, dynamic height matching, inline domain-URL layout with fade effects, and tighter spacing

Fixed

  • WebView teardown and memory management: Implemented comprehensive cleanup system to prevent crashes during WebView destruction. Added JavaScript teardown functionality with cleanup handlers for all event listeners, intervals, and global state. Enhanced pane cleanup with proper controller detachment and GTK widget detachment sequencing. Added WebView validity checks before JavaScript evaluation and improved workspace manager pane closing logic with better popup handling
  • Ctrl+W pane closing: Fixed Ctrl+W shortcut to properly close active panes including popups. Implemented active WebView detection and proper popup vs regular pane handling via OnWorkspaceMessage for consistent cleanup
  • WebView script injection segfault: Fixed segmentation violation when injecting JavaScript into destroyed WebViews during message handling. Added IsDestroyed() safety check to prevent GTK widget corruption
  • Alt+Arrow workspace navigation: Fixed Alt+Arrow keys not working for pane navigation after WebView focus changes. Implemented C-level to GTK4 shortcut bridge that ensures workspace navigation works consistently across all panes
  • Global shortcuts protection: Fixed window shortcuts (Ctrl+L, Ctrl+F, F12) not working in new panes due to overly aggressive webpage protection. Window shortcuts now properly bubble up to GTK while pane shortcuts remain blocked from webpages. Resolves omnibox and developer tools not responding to keyboard shortcuts in newly created panes
  • Omnibox keyboard event isolation: Fixed keyboard event leakage from omnibox to underlying webpages that caused unintended page actions (e.g., typing 's' in omnibox triggering GitHub search). Implemented WebKit-level main-world event blocking that activates when omnibox opens, preventing page JavaScript from receiving keyboard events while preserving native GTK shortcuts (Ctrl+L, Ctrl+F, etc.) and omnibox functionality
  • Active pane detection: Replaced complex pane ID abstraction with persistent webview IDs, fixing omnibox unresponsiveness after navigation. Omnibox now works immediately after page navigation without requiring mouse movement
  • Workspace architecture: Simplified focus tracking by removing URI change handlers and pane ID injection complexity, improving reliability and reducing codebase by 85 lines
  • WebView ID propagation: Added webview ID request/response mechanism for stub builds to ensure JavaScript side knows its webview ID for proper focus validation
  • Workspace theme integration: Fixed white borders on inactive panes by implementing dynamic border colors based on GTK theme preference (dark mode: #333333 borders, light mode: #dddddd borders)
  • GTK window background: Added theme-aware window and pane background colors to prevent white bleeding through transparent elements
  • Print dialog window handling: Fixed GTK window destroy errors during WebView cleanup by only destroying windows when CreateWindow was actually enabled
  • Modifier key logging noise: Filtered out Ctrl, Shift, Alt, and Super key presses from accelerator miss logging to reduce console spam

[0.9.0] - 2025-09-22

Added

  • Zellij-style workspace management: Complete pane splitting system with binary tree layout, focus tracking, and Zellij-inspired keybindings (Ctrl+P for pane mode, arrow keys for splits, 'x' to close)
  • Multi-pane WebView architecture: Container-based widget management with proper reparenting, lifecycle handling, and per-pane controllers
  • Window-level global shortcuts: Centralized shortcut handling to prevent conflicts between multiple WebView instances
  • Workspace configuration: New config section with Zellij controls toggle, pane mode bindings, tab shortcuts, and popup behavior settings
  • Configurable workspace styling: Pane border appearance (width, color, transition duration, radius) now customizable via config with proper viewport stability
  • Popup handling for tiling WM: Complete popup window support where popups open as workspace panes instead of floating windows, respecting tiling window manager design principles
  • Universal popup auto-close: Popup windows (OAuth, window.open(), etc.) automatically close when JavaScript calls window.close(), providing standard browser behavior adapted for workspace panes
  • Advanced popup deduplication system: Intelligent duplicate popup prevention with SHA256 fingerprinting and 200ms debounce window to eliminate popup spam
  • OAuth auto-close integration: RFC 6749 compliant OAuth callback detection with automatic popup closure for seamless authentication flows
  • Cross-WebView popup communication: localStorage-based parent-popup bridge enabling proper window.opener functionality in tiling workspace environment
  • WebView identity tracking: Unique WebView ID system for precise popup targeting and enhanced debugging capabilities

Improved

  • WebKit integration now forces GPU compositing by default while still honoring explicit config overrides.
  • Smooth scrolling is enabled (when supported) so wheel and gesture animations feel closer to Chromium/Firefox.
  • Title updates, zoom persistence, and domain zoom lookups are now done off the GTK main thread with results marshalled back safely, eliminating UI hitches during navigation.
  • Added optional DOM-level zoom (enabled by default) to avoid native viewport rescaling; falls back to WebKit zoom if the CSS path fails.
  • DOM zoom now seeds the saved level before the first paint and reuses it during document-start scripts, preventing pages from flashing back to 100%.
  • Native accelerator bridge debounces duplicate GTK key events earlier, so Ctrl±/Ctrl+0 only fires once per physical key press.
  • Omnibox-triggered navigations now reuse the navigation controller, so saved zoom levels are applied before first paint and redundant lookups are avoided.
  • Configuration loading writes the missing use_dom_zoom flag into existing config files so DOM zoom defaults persist without manual edits.
  • Omnibox UI now relies on shared Tailwind theme tokens and the injected color-scheme service for light/dark parity.
  • Omnibox overlay now self-heals if hostile pages remove the injected shadow host, ensuring Ctrl/Cmd+L works everywhere.
  • Navigation shortcuts changed from Alt+Arrow to Ctrl/Cmd+Arrow for better workspace compatibility.
  • GUI components now support workspace-aware focus management with pane-specific event handling.
  • Global zoom shortcuts: Unified zoom handling at window level (Ctrl+/=/0/-) ensuring zoom applies to currently active pane in multi-pane workspace
  • Workspace focus management: Enhanced focus throttling (100ms) and active state tracking to prevent infinite loops and conflicts between panes
  • Popup management: Intelligent popup vs tab detection based on window features, with improved auto-close logic for OAuth and login flows
  • Console logging: WebView ID context injection for better debugging and log correlation across multiple panes

Changed

  • Zoom shortcuts architecture: Moved from per-WebView registration to centralized window-level handling for consistency with other global shortcuts

[0.8.0] - 2025-09-17

Added

  • GTK color scheme bridge: Dedicated document-start module keeps WebKit theme in sync with GTK preferences and exposes unified runtime updater
  • Color scheme build pipeline: Separate Vite entry produces reusable color-scheme.js asset shared between native and injected contexts
  • Complete Svelte 5 GUI migration: Omnibox and find components migrated from raw JavaScript to modern Svelte 5 with runes
  • Tailwind CSS v4 integration: Unified design system with PostCSS and JIT compilation
  • TypeScript keyboard service: Centralized shortcut management with full type safety
  • Click-anywhere-to-close: Omnibox closes when clicking outside for better UX
  • Homepage Svelte 5 component: New standalone homepage with history display and keyboard shortcuts reference
  • Page generator system: Vite plugin for generating dumb:// protocol pages (homepage, config, about) with extensible architecture
  • History deletion API: New DELETE endpoint at /history/delete?id=N for removing individual history entries
  • Database migrations: Embedded migrations now run automatically at startup to keep sqlite schema in sync
  • Inline CSS type declarations: Ambient module definitions for raw CSS imports improve TypeScript ergonomics in injected bundles
  • Global Shadow DOM system: Unified shadow host utility for component isolation with shared ShadowRoot and CSS reset management
  • Unified page-world bridge: Integrated API bridge with event-driven communication between page-world and isolated-world contexts

Improved

  • Asset MIME detection: Expanded scheme handler lookup covers fonts, images, and JSON to prevent incorrect text/plain responses
  • Toast theming: Runtime theme observer syncs toast styling with the browser's dark mode state for consistent visuals
  • Shadow host styling: Injected GUI now adopts Tailwind design tokens inside the shared shadow root with automatic dark-mode mirroring
  • Omnibox/Find system: Complete migration from 500-line raw JavaScript to modular Svelte 5 components
  • Toast notifications: Migrated from raw JavaScript to Svelte 5 components with proper animations
  • GUI build pipeline: Vite-based bundling with hot reload and TypeScript support
  • Keyboard shortcuts: Fixed Ctrl+F not working by adding missing 'f' key to keyboard dispatcher
  • State management: Proper cleanup between omnibox and find modes prevents state conflicts
  • Homepage UX: Enhanced layout with 70/30 flex ratio, compact keyboard shortcuts table, and statistics display
  • Interactive delete: History entries show trash icon on hover with smooth fade-out animation on deletion
  • Top 5 most visited: New section displaying frequently accessed sites with visit counts
  • Performance: Instant shortcut response with pre-mounted DOM elements

Changed

  • Homepage icons: Replaced Lucide dependency with inline SVG/Unicode fallbacks to shrink bundle size while debugging upstream build issues
  • Major architecture shift: Removed HTTP API routes in favor of direct WebKit message bridge communication for better performance and reduced complexity
  • API token support: Added optional API security configuration with token-based authentication system
  • Shadow DOM improvements: Enhanced isolation with WeakSet tracking to prevent duplicate reset injection and global shadow host utility for component sharing
  • Message handler refactoring: Unified keyboard shortcut forwarding between native handlers and GUI components with DOM event bridge
  • Omnibox suggestions: Native Go-based suggestion computation with search shortcuts and history integration, eliminating HTTP fetch dependencies
  • Toast styling: Migrated from Tailwind CSS classes to inline styles within component scope for better Shadow DOM compatibility and isolation
  • JS to Svelte migration: Replaced legacy inline injected scripts (see pkg/webkit/ucm_js_cgo.go.deprecated) with structured Svelte components mounted via the shared shadow root.

Fixed

  • Service worker residue: Homepage clears stale caches and unregisters old service workers to avoid 404s for legacy _app assets
  • Keyboard debounce: Native accelerator bridge filters duplicate shortcut events within 120ms for DOM and CGO handlers
  • Ctrl+F shortcut: Added missing 'f' key case in keyboard_cgo.go dispatcher
  • Browser freeze: Removed infinite loop in mode switching reactive effects
  • State persistence: Proper cleanup when switching between Ctrl+L and Ctrl+F modes
  • Homepage protocol: Fixed dumb://homepage not working after GUI migration with proper Svelte 5 component and API integration
  • Omnibox positioning on homepage: Fixed omnibox stuck in top-left corner by isolating homepage CSS styles and strengthening omnibox positioning with explicit fixed positioning and CSS isolation
  • Find mode persistence: Fixed find view persisting after pressing Esc when reopening with Ctrl+L by ensuring toggle() resets mode to 'omnibox'
  • Favicon display: Fixed missing favicons in homepage history after Svelte 5 migration by adding FaviconURL field to API response and implementing proper fallback display logic
  • Homepage API communication: Migrated from HTTP fetch to WebKit message bridge for all homepage API calls (history, stats, search) with proper callback handling and timeout management
  • Omnibox accessibility: Added keyboard navigation support with Tab/Enter activation for suggestion items and proper ARIA attributes for screen readers
  • Omnibox suggestions race conditions: Fixed timing issues where suggestions arrived before API was ready by implementing pending suggestions queue and proper event bridging between page-world and isolated-world contexts

[0.7.0] - 2025-09-14

Added

  • Content blocking system: Native WebKit ad blocking with EasyList integration, cosmetic filtering, and filter cache management
  • Filter cache purging: New --filter-cache/-F flag in purge command
  • WebKit debug system: Comprehensive debugging support with configurable categories for troubleshooting WebKit internal errors
  • Enhanced error handling: Robust content filter injection with retry mechanisms and graceful fallbacks
  • Parallel compilation: Multi-core GCC compilation support for faster builds

Improved

  • Content filter timing: Optimized script injection timing to prevent interference with WebKit preconnect operations
  • Anti-breakage scriptlets: Safer JavaScript modifications that avoid WebKit internal conflicts
  • Build system: Added parallel compilation with automatic core detection and success indicators
  • Persistent TLS certificate validation system:
    • Three-option certificate dialog: "Go Back", "Proceed Once (Unsafe)", and "Always Accept This Site"
    • Database-backed certificate storage: SQLite-based persistence for user certificate decisions with SHA256 certificate hashing
    • Smart decision handling: Automatic application of stored decisions without repeated prompts
    • Temporary vs permanent choices: "Proceed Once" expires after 24 hours, "Always Accept" persists indefinitely
    • Seamless user experience: No more repetitive certificate warnings for trusted sites
  • Performance-optimized WebKit memory configuration system:
    • New WebkitMemoryConfig configuration section with performance-focused defaults for faster page loading
    • Aggressive caching strategy: web_browser cache model with page cache enabled for instant back/forward navigation
    • Balanced memory pressure management: Conservative (40%), strict (60%), and kill (80%) thresholds optimized for performance vs stability
    • Smart garbage collection: 2-minute JavaScript GC intervals with process recycling after 50 page loads
    • Reduced monitoring overhead: 45-second memory monitoring intervals to minimize performance impact
    • Environment variable overrides: All memory settings configurable via DUMBER_* environment variables (DUMBER_CACHE_MODEL, DUMBER_MEMORY_CONSERVATIVE, etc.)
  • Early crash handling initialization: Moved crash handler setup to application entry point for better crash recovery

Changed

  • Modernized GTK dialog system: Migrated from deprecated GTK 4.10 dialog functions to modern GtkAlertDialog API
    • Future-proof implementation: Eliminated all deprecation warnings by replacing gtk_message_dialog_* and gtk_dialog_* functions
    • Async-first architecture: Native async dialog handling with proper event loop integration
    • Improved accessibility: Better screen reader support and GTK4 theme integration
  • Major main.go refactoring: Massive code reduction from 1071 lines to 61 lines (~95% reduction)
    • Extracted browser application logic to dedicated internal/app/browser package for better separation of concerns
    • Streamlined entry point: Clean main function focusing only on CLI vs GUI mode detection and application bootstrapping
    • Improved maintainability: Modular architecture with clear responsibilities between CLI and browser components
  • Refactored memory configuration architecture:
    • Integrated WebKit memory settings into unified config system with Viper environment variable bindings
    • Eliminated redundant environment variable parsing in favor of centralized configuration management
    • Simplified webview initialization with direct config-to-WebKit conversion
  • Improved CLI logs command description: Enhanced help text for better user experience

[0.6.0] - 2025-09-12

Added

  • Smart AV1 codec negotiation system for YouTube high-resolution streaming:
    • Resolution-aware MediaCapabilities API reporting: Intelligent codec capability reporting based on video resolution, enabling YouTube to select optimal codecs for different quality levels
    • YouTube format manifest manipulation: Real-time format list reordering to prioritize AV1 for ≤1080p content while allowing VP9 fallback for higher resolutions
    • Graduated codec preference system: Smart localStorage preference (2048) instead of forced AV1 (8192), giving YouTube flexibility for optimal codec selection
    • 4K HDR 60fps AV1 support: Successfully enables YouTube delivery of premium quality 4K HDR content with AV1 codec, HDR10 (PQ) color space, and BT.2020 wide color gamut
    • Configurable AV1 resolution limits: New av1_max_resolution config option with environment variable support (DUMBER_AV1_MAX_RES)
    • Automatic codec fallback logic: Seamless VP9 fallback for resolutions where AV1 performance may be suboptimal
    • High bitrate streaming support: Enables premium quality streaming (650+ Mbps) with proper buffer management
    • Fixes previous limitation where forcing AV1 would cap YouTube playback at 1080p maximum
  • Page refresh functionality with standard keyboard shortcuts:
    • Ctrl+R / Cmd+R: Reload current page
    • Ctrl+Shift+R / Cmd+Shift+R: Hard reload (bypass cache)
    • F5: Alternative reload key
    • WebKit integration with proper webkit_web_view_reload() and webkit_web_view_reload_bypass_cache() calls
  • Twitch theater mode and fullscreen stability fix:
    • Complete removal of codec interference on Twitch: Eliminates aggressive codec control that caused theater mode and fullscreen freezing
    • Native Twitch codec selection: Allows Twitch to handle codec negotiation without browser intervention
    • Fixes theater mode freeze and fullscreen black screen issues on Twitch

Fixed

  • Zoom level toast no longer shows on every page navigation within the same domain:
    • Added smart detection to differentiate user-initiated vs programmatic zoom changes
    • Toast now only appears when manually adjusting zoom or entering a new domain
    • Prevents annoying notifications during regular browsing within the same site
  • Links with target="_blank" now load in current window instead of being ignored:
    • Added WebKit create signal handler to intercept new window requests
    • Redirects popup/new tab links to current window for seamless single-window browsing
    • Maintains user experience consistency in tab-less browser architecture

[0.5.0] - 2025-09-12

Added

  • Hardware video acceleration with automatic GPU detection:
    • Multi-vendor GPU detection (AMD, NVIDIA, Intel) using glxinfo, lspci, and sysfs
    • Automatic VA-API driver selection (radeonsi for AMD, vdpau for NVIDIA, iHD for Intel)
    • WebKitGTK integration with GStreamer hardware acceleration backends
    • Environment variable configuration support (LIBVA_DRIVER_NAME, GST_VAAPI_ALL_DRIVERS)
    • Legacy VA-API fallback mode for compatibility with older systems
    • Video decoding acceleration for H.264, HEVC, VP9, and AV1 codecs
    • Significantly reduced CPU usage during video streaming (Twitch, YouTube, etc.)
    • Smart conflict prevention between legacy and modern VA-API implementations
  • TLS certificate error handling with user confirmation dialog:
    • Comprehensive certificate information display (subject, issuer, validity dates)
    • Interactive warning dialog for untrusted certificate authorities
    • Certificate exception management with per-host persistence
    • Manual load triggering after user accepts certificate exceptions
    • Proper integration with WebKitGTK 6.0 network session API
  • Zoom level toast notifications:
    • Real-time zoom level display with format: "Zoom level: ±X% (Y%)"
    • Smart debouncing to prevent notification spam during rapid zoom changes
    • Automatic cleanup of stuck or colliding toast messages
    • 150ms debounce timer with 2-second display duration
    • Emergency cleanup function for orphaned toast elements
  • Comprehensive XDG-compliant logging system:
    • Complete application output capture (Go logs, fmt prints, WebKit C logs)
    • XDG Base Directory specification compliance (~/.local/state/dumber/logs/)
    • Automatic log rotation with size/age-based cleanup and compression
    • WebKit CGO log capture with GLib log handler integration
    • CLI log management commands (dumber logs list, logs tail, logs clean)
    • File-only logging for cache operations to prevent dmenu interference
    • Multi-output support with timestamped, tagged log entries
    • Configurable log levels, formats (text/JSON), and retention policies

Fixed

  • WebView background set to black to improve user experience during page loads
  • Multiple linting issues and code quality improvements (reduced from 211 to ~150 issues)
  • Omnibox responsive scaling and layout issues:
    • Fixed over-aggressive viewport scaling that made omnibox disproportionately large at high zoom levels
    • Resolved input field overflow extending beyond container boundaries
    • Improved box-sizing model to prevent layout issues
    • Added conditional separator display (hidden when no search results)
    • Omnibox now scales proportionally with webpage content across all zoom levels
  • Dmenu history favicon display:
    • Complete favicon caching system for fuzzel/dmenu integration with real website icons
    • ICO file support using go-ico library for perfect Windows icon conversion to PNG
    • Smart brightness detection and color inversion for dark theme visibility
    • All cached favicons normalized to consistent 32x32 PNG format for uniform display
    • Anti-aliasing preservation during color inversion to prevent edge noise and pixelation
    • Asynchronous favicon downloading and caching with 7-day freshness and 30-day cleanup
    • Fuzzel icon protocol integration (\0icon\x1f<path>) for native icon display
    • Favicon URLs extracted from webpage metadata and stored in database during navigation
    • Fallback system removed to ensure consistent sizing - shows real favicons or no icon
    • XDG Base Directory compliance for favicon cache storage

[0.4.0] - 2025-09-10

Added

  • High-performance fuzzy cache system for dmenu history:
    • Binary serialization with memory-mapped files for zero-copy access
    • Trigram indexing (3-character sequences) for fast candidate filtering
    • Prefix trie (compressed tree structure) for prefix matching
    • Pre-sorted entry indices for O(1) top entries retrieval
    • Smart cache invalidation with filesystem persistence and background refresh
    • Comprehensive fuzzy matching algorithms: Jaro-Winkler similarity, Levenshtein distance, tokenized matching
    • Weighted scoring system combining URL, title, recency, and visit count scores
    • XDG Base Directory Specification compliance (cache stored in state directory)
    • Atomic operations for concurrent access control
    • Dependency injection using interfaces and gomock for testing
  • Purge command for cleaning up dumber data and cache files:
    • Selective purging with flags: --database, --history-cache, --browser-cache, --browser-data, --state, --config
    • Clear distinction between history cache (dmenu fuzzy search) and browser cache (WebKit)
    • Browser data includes cookies, localStorage, sessionStorage
    • Confirmation prompt with --force flag to skip
    • Targets all data locations: SQLite database, WebKit cache/data, dmenu fuzzy cache, configuration files
  • Ctrl+Shift+C keyboard shortcut to copy current URL to clipboard:
    • Cross-platform clipboard support with wl-copy (Wayland) and xclip (X11) fallback
    • Reusable toast notification system for user feedback
    • Injectable JavaScript component for consistent styling across all websites
    • Native backend integration for reliable clipboard access

Changed

  • Dmenu performance dramatically improved: 200ms → 4ms (98% faster)
  • GetTopEntries optimized from O(n log n) to O(1) using pre-sorted indices
  • Cache build time reduced to ~300μs for typical history datasets

Fixed

  • Dark theme detection now properly reads GNOME desktop interface color-scheme setting (org.gnome.desktop.interface color-scheme) instead of only checking gtk-application-prefer-dark-theme
  • Eliminated O(n log n) sorting bottleneck on every dmenu call
  • Memory-efficient compact entry storage with minimal footprint
  • Concurrent cache access with proper read/write locking
  • Process no longer hangs when closing window with Cmd+Q or window close button - implemented proper GTK4 close-request signal handling and OS signal handling for graceful shutdown

[0.3.0] - 2025-01-11

Added

  • WebKit memory controls (opt‑in):
    • Env vars to tune memory/perf trade‑offs without code changes:
      • DUMBER_CACHE_MODEL, DUMBER_ENABLE_PAGE_CACHE
      • DUMBER_ENABLE_MEMORY_MONITORING, DUMBER_MEMORY_LIMIT_MB, DUMBER_MEMORY_POLL_INTERVAL
      • DUMBER_MEMORY_CONSERVATIVE, DUMBER_MEMORY_STRICT, DUMBER_MEMORY_KILL
      • DUMBER_GC_INTERVAL, DUMBER_RECYCLE_THRESHOLD
    • Version‑guarded CGO wrappers for memory pressure and GC hooks; safe no‑ops on unsupported WebKitGTK builds.
  • Find in page (Ctrl/Cmd+F):
    • Omnibox refactored into a reusable component with dedicated "find" mode.
    • Highlighting: yellow for all matches; active match in orange for clarity.
    • Match list with context (right side stops at nearest punctuation: . , ; : -).
    • Navigation UX:
      • ArrowUp/Down move selection and scroll the overlay list (page scroll disabled while open).
      • Enter centers on the active match and closes; Shift+Enter goes to previous; Alt+Enter centers without closing.
      • Hover focuses input and selects list items; click outside closes the overlay.
      • Faded overlay with subtle blur when reviewing matches; opacity restores on input focus/typing.
    • Programmatic API: OpenFind(initial), FindQuery(q), CloseFind() on WebView.

Changed

  • Performance‑first defaults retained:
    • Cache model set to “WebBrowser”, page cache enabled, DevTools available.
    • No implicit memory pressure or GC enabled by default; all memory tuning is opt‑in.

Removed

  • Deprecated offline app‑cache calls eliminated (no‑ops) to avoid warnings and brittle builds.

Fixed

  • Homepage Recent History layout:
    • Show single-line entries as “{Title} – {Domain} – {URL}”.
    • Truncate long URLs with a gradient fade; prevent horizontal overflow.
    • Adjusted styling so URL is darker for readability.
  • Search shortcuts and config interop:
    • Backend SearchShortcut now serializes url/description with JSON tags.
    • Frontend normalizes field casing and extracts base URLs, handling %s and {query} templates.
    • Omnibox shortcut parsing now URL-encodes queries and supports %s placeholders.
  • Input and navigation reliability (GTK4/WebKitGTK 6):
    • Capture-phase key controller to ensure accelerators fire consistently.
    • Do not consume normal left/right clicks; only mouse buttons 8/9 trigger back/forward.
    • Added Alt+ArrowLeft/Right navigation and enabled two-finger swipe back/forward when supported.
    • Added Ctrl+scroll zoom in/out; refined accelerator matching so Ctrl− works across layouts.
    • Removed layout-specific hacks; added diagnostic logs for raw minus key events.
  • Zoom persistence:
    • Added WebView zoom-changed hook; save per-domain zoom to SQLite on every change.
    • Log on successful save: “saved X.XX for domain.tld” and on load: “loaded X.XX for domain.tld”.
    • Load and log initial zoom level on startup and on every navigation.
  • Build/dev ergonomics:
    • Makefile loads .env.local; supports overriding GOMODCACHE, GOCACHE, GOTMPDIR for sandboxed builds.
  • WebKit CGO hardening and API compatibility:
    • Apply memory pressure settings to WebKitNetworkSession (correct signature) when enabled.
    • Guarded C wrappers remove deprecation warnings across header variants; builds succeed on WebKitGTK 6.

[0.2.0] - 2025-09-10

Added

  • WebKitGTK 6 (GTK4) migration for the built‑in browser window:
    • WebView constructed via g_object_new(WEBKIT_TYPE_WEB_VIEW, …) with a fresh WebKitUserContentManager.
    • WebKitNetworkSession with persistent cookies (SQLite) and cache directories.
  • Native UCM messaging restored via script-message-received::dumber (JSCValue*), removing the JS fallback bridge.
  • Rendering mode controls:
    • CLI flag --rendering-mode=auto|gpu|cpu and DUMBER_RENDERING_MODE env.
    • In‑app status endpoint dumb://homepage/api/rendering/status.
  • Native zoom shortcuts at the WebKit layer (Ctrl/Cmd+=, +, −, 0) and GTK4 input controllers for keyboard/mouse.
  • AZERTY keyboard fix: treat underscore as minus for zoom‑out.
  • Runtime theme synchronization: watch GTK gtk-application-prefer-dark-theme and update page color‑scheme live.
  • Makefile target check-webkit to print pkg-config versions of GTK4/WebKitGTK 6.0/JSC 6.0.
  • Documentation updates:
    • README now targets WebKitGTK 6 (GTK4) and lists GStreamer package requirements for Arch and Debian/Ubuntu.
    • CLAUDE notes updated with migration status, GPU/Vulkan path, runtime theme sync, and persistence.

Changed

  • Build flags and includes now target webkitgtk-6.0, gtk4, and javascriptcoregtk-6.0.
  • GTK4 APIs for windowing and event handling (GtkEventController, GtkGestureClick) replace GTK3/GdkEvent paths.

Removed

  • Legacy WebKit2GTK constructors and container APIs.
  • JavaScript fallback for UCM message bridging.

Fixed

  • Header/enum compatibility for hardware acceleration policy and cookie policy across WebKit header variants.
  • Linker error for on_theme_changed and gpointer usage in signal connections.
  • Crashy paths mitigated by default “media safe” startup (can be disabled via DUMBER_MEDIA_SAFE=0).

Notes

  • GPU rendering path leverages GTK4’s renderer (Vulkan/OpenGL). Mode auto uses GPU when available and falls back gracefully to CPU.
  • WebKitGTK relies on GStreamer; install recommended packages for audio/video (see README).

[0.1.0] - 2025-09-09

Added

  • Initial project scaffolding, build system, and dependencies.
  • Unified CLI + GUI architecture with search shortcuts and fuzzy parsing.
  • Wails v3‑alpha browser integration (early phase).
  • Global keyboard controls with script injection (zoom/devtools, etc.).
  • Native WebKit2GTK backend migration:
    • Custom dumb:// scheme and /api endpoints: /config, /history/recent, /history/search, /history/stats.
    • UserContentManager omnibox injection and theme initialization.
    • Persistent WebsiteDataManager with cookies.sqlite; per‑domain zoom and title persistence.
    • Keyboard/mouse accelerators (including mouse back/forward); debounced triggers.
    • Homepage switched to first‑party API fetches; removed @wailsio/runtime usage.
  • Documentation and licensing: README enhancements and LICENSE added.

Changed

  • Replaced Wails runtime with native WebKit2GTK CGO bindings and homepage API.
  • Improved asset resolution and logging for the dumb://homepage scheme.

Fixed

  • Eliminated duplicate accelerator triggers via debouncing.
  • Corrected asset resolution and URL normalization in scheme handler.
source
1# Changelog
2
3All notable changes to this project will be documented in this file.
4
5## [Unreleased]
6
7## [0.10.0] - 2025-09-24
8
9### Added
10- **Print functionality**: Added Ctrl+Shift+P shortcut to open native print dialogs from any pane. Ctrl+P is blocked at WebKit level to prevent conflicts with pane mode shortcuts
11- **WebKit native favicon detection**: Implemented WebKit's built-in favicon database for automatic favicon detection and URI storage. Enhanced favicon support for all formats (PNG, SVG, ICO) without external dependencies
12
13### Changed
14- **Homepage redesign**: Brutal design with component-scoped styling, dynamic height matching, inline domain-URL layout with fade effects, and tighter spacing
15
16### Fixed
17- **WebView teardown and memory management**: Implemented comprehensive cleanup system to prevent crashes during WebView destruction. Added JavaScript teardown functionality with cleanup handlers for all event listeners, intervals, and global state. Enhanced pane cleanup with proper controller detachment and GTK widget detachment sequencing. Added WebView validity checks before JavaScript evaluation and improved workspace manager pane closing logic with better popup handling
18- **Ctrl+W pane closing**: Fixed Ctrl+W shortcut to properly close active panes including popups. Implemented active WebView detection and proper popup vs regular pane handling via OnWorkspaceMessage for consistent cleanup
19- **WebView script injection segfault**: Fixed segmentation violation when injecting JavaScript into destroyed WebViews during message handling. Added IsDestroyed() safety check to prevent GTK widget corruption
20- **Alt+Arrow workspace navigation**: Fixed Alt+Arrow keys not working for pane navigation after WebView focus changes. Implemented C-level to GTK4 shortcut bridge that ensures workspace navigation works consistently across all panes
21- **Global shortcuts protection**: Fixed window shortcuts (Ctrl+L, Ctrl+F, F12) not working in new panes due to overly aggressive webpage protection. Window shortcuts now properly bubble up to GTK while pane shortcuts remain blocked from webpages. Resolves omnibox and developer tools not responding to keyboard shortcuts in newly created panes
22- **Omnibox keyboard event isolation**: Fixed keyboard event leakage from omnibox to underlying webpages that caused unintended page actions (e.g., typing 's' in omnibox triggering GitHub search). Implemented WebKit-level main-world event blocking that activates when omnibox opens, preventing page JavaScript from receiving keyboard events while preserving native GTK shortcuts (Ctrl+L, Ctrl+F, etc.) and omnibox functionality
23- **Active pane detection**: Replaced complex pane ID abstraction with persistent webview IDs, fixing omnibox unresponsiveness after navigation. Omnibox now works immediately after page navigation without requiring mouse movement
24- **Workspace architecture**: Simplified focus tracking by removing URI change handlers and pane ID injection complexity, improving reliability and reducing codebase by 85 lines
25- **WebView ID propagation**: Added webview ID request/response mechanism for stub builds to ensure JavaScript side knows its webview ID for proper focus validation
26- **Workspace theme integration**: Fixed white borders on inactive panes by implementing dynamic border colors based on GTK theme preference (dark mode: #333333 borders, light mode: #dddddd borders)
27- **GTK window background**: Added theme-aware window and pane background colors to prevent white bleeding through transparent elements
28- **Print dialog window handling**: Fixed GTK window destroy errors during WebView cleanup by only destroying windows when CreateWindow was actually enabled
29- **Modifier key logging noise**: Filtered out Ctrl, Shift, Alt, and Super key presses from accelerator miss logging to reduce console spam
30
31## [0.9.0] - 2025-09-22
32
33### Added
34- **Zellij-style workspace management**: Complete pane splitting system with binary tree layout, focus tracking, and Zellij-inspired keybindings (Ctrl+P for pane mode, arrow keys for splits, 'x' to close)
35- **Multi-pane WebView architecture**: Container-based widget management with proper reparenting, lifecycle handling, and per-pane controllers
36- **Window-level global shortcuts**: Centralized shortcut handling to prevent conflicts between multiple WebView instances
37- **Workspace configuration**: New config section with Zellij controls toggle, pane mode bindings, tab shortcuts, and popup behavior settings
38- **Configurable workspace styling**: Pane border appearance (width, color, transition duration, radius) now customizable via config with proper viewport stability
39- **Popup handling for tiling WM**: Complete popup window support where popups open as workspace panes instead of floating windows, respecting tiling window manager design principles
40- **Universal popup auto-close**: Popup windows (OAuth, window.open(), etc.) automatically close when JavaScript calls window.close(), providing standard browser behavior adapted for workspace panes
41- **Advanced popup deduplication system**: Intelligent duplicate popup prevention with SHA256 fingerprinting and 200ms debounce window to eliminate popup spam
42- **OAuth auto-close integration**: RFC 6749 compliant OAuth callback detection with automatic popup closure for seamless authentication flows
43- **Cross-WebView popup communication**: localStorage-based parent-popup bridge enabling proper `window.opener` functionality in tiling workspace environment
44- **WebView identity tracking**: Unique WebView ID system for precise popup targeting and enhanced debugging capabilities
45
46### Improved
47- WebKit integration now forces GPU compositing by default while still honoring explicit config overrides.
48- Smooth scrolling is enabled (when supported) so wheel and gesture animations feel closer to Chromium/Firefox.
49- Title updates, zoom persistence, and domain zoom lookups are now done off the GTK main thread with results marshalled back safely, eliminating UI hitches during navigation.
50- Added optional DOM-level zoom (enabled by default) to avoid native viewport rescaling; falls back to WebKit zoom if the CSS path fails.
51- DOM zoom now seeds the saved level before the first paint and reuses it during document-start scripts, preventing pages from flashing back to 100%.
52- Native accelerator bridge debounces duplicate GTK key events earlier, so Ctrl±/Ctrl+0 only fires once per physical key press.
53- Omnibox-triggered navigations now reuse the navigation controller, so saved zoom levels are applied before first paint and redundant lookups are avoided.
54- Configuration loading writes the missing `use_dom_zoom` flag into existing config files so DOM zoom defaults persist without manual edits.
55- Omnibox UI now relies on shared Tailwind theme tokens and the injected color-scheme service for light/dark parity.
56- Omnibox overlay now self-heals if hostile pages remove the injected shadow host, ensuring Ctrl/Cmd+L works everywhere.
57- Navigation shortcuts changed from Alt+Arrow to Ctrl/Cmd+Arrow for better workspace compatibility.
58- GUI components now support workspace-aware focus management with pane-specific event handling.
59- **Global zoom shortcuts**: Unified zoom handling at window level (Ctrl+/=/0/-) ensuring zoom applies to currently active pane in multi-pane workspace
60- **Workspace focus management**: Enhanced focus throttling (100ms) and active state tracking to prevent infinite loops and conflicts between panes
61- **Popup management**: Intelligent popup vs tab detection based on window features, with improved auto-close logic for OAuth and login flows
62- **Console logging**: WebView ID context injection for better debugging and log correlation across multiple panes
63
64### Changed
65- **Zoom shortcuts architecture**: Moved from per-WebView registration to centralized window-level handling for consistency with other global shortcuts
66
67## [0.8.0] - 2025-09-17
68
69### Added
70- **GTK color scheme bridge**: Dedicated document-start module keeps WebKit theme in sync with GTK preferences and exposes unified runtime updater
71- **Color scheme build pipeline**: Separate Vite entry produces reusable `color-scheme.js` asset shared between native and injected contexts
72- **Complete Svelte 5 GUI migration**: Omnibox and find components migrated from raw JavaScript to modern Svelte 5 with runes
73- **Tailwind CSS v4 integration**: Unified design system with PostCSS and JIT compilation
74- **TypeScript keyboard service**: Centralized shortcut management with full type safety
75- **Click-anywhere-to-close**: Omnibox closes when clicking outside for better UX
76- **Homepage Svelte 5 component**: New standalone homepage with history display and keyboard shortcuts reference
77- **Page generator system**: Vite plugin for generating dumb:// protocol pages (homepage, config, about) with extensible architecture
78- **History deletion API**: New DELETE endpoint at `/history/delete?id=N` for removing individual history entries
79- **Database migrations**: Embedded migrations now run automatically at startup to keep sqlite schema in sync
80- **Inline CSS type declarations**: Ambient module definitions for raw CSS imports improve TypeScript ergonomics in injected bundles
81- **Global Shadow DOM system**: Unified shadow host utility for component isolation with shared ShadowRoot and CSS reset management
82- **Unified page-world bridge**: Integrated API bridge with event-driven communication between page-world and isolated-world contexts
83
84### Improved
85- **Asset MIME detection**: Expanded scheme handler lookup covers fonts, images, and JSON to prevent incorrect `text/plain` responses
86- **Toast theming**: Runtime theme observer syncs toast styling with the browser's dark mode state for consistent visuals
87- **Shadow host styling**: Injected GUI now adopts Tailwind design tokens inside the shared shadow root with automatic dark-mode mirroring
88- **Omnibox/Find system**: Complete migration from 500-line raw JavaScript to modular Svelte 5 components
89- **Toast notifications**: Migrated from raw JavaScript to Svelte 5 components with proper animations
90- **GUI build pipeline**: Vite-based bundling with hot reload and TypeScript support
91- **Keyboard shortcuts**: Fixed Ctrl+F not working by adding missing 'f' key to keyboard dispatcher
92- **State management**: Proper cleanup between omnibox and find modes prevents state conflicts
93- **Homepage UX**: Enhanced layout with 70/30 flex ratio, compact keyboard shortcuts table, and statistics display
94- **Interactive delete**: History entries show trash icon on hover with smooth fade-out animation on deletion
95- **Top 5 most visited**: New section displaying frequently accessed sites with visit counts
96- **Performance**: Instant shortcut response with pre-mounted DOM elements
97
98### Changed
99- **Homepage icons**: Replaced Lucide dependency with inline SVG/Unicode fallbacks to shrink bundle size while debugging upstream build issues
100- **Major architecture shift**: Removed HTTP API routes in favor of direct WebKit message bridge communication for better performance and reduced complexity
101- **API token support**: Added optional API security configuration with token-based authentication system
102- **Shadow DOM improvements**: Enhanced isolation with WeakSet tracking to prevent duplicate reset injection and global shadow host utility for component sharing
103- **Message handler refactoring**: Unified keyboard shortcut forwarding between native handlers and GUI components with DOM event bridge
104- **Omnibox suggestions**: Native Go-based suggestion computation with search shortcuts and history integration, eliminating HTTP fetch dependencies
105- **Toast styling**: Migrated from Tailwind CSS classes to inline styles within component scope for better Shadow DOM compatibility and isolation
106- **JS to Svelte migration**: Replaced legacy inline injected scripts (see `pkg/webkit/ucm_js_cgo.go.deprecated`) with structured Svelte components mounted via the shared shadow root.
107
108### Fixed
109- **Service worker residue**: Homepage clears stale caches and unregisters old service workers to avoid 404s for legacy `_app` assets
110- **Keyboard debounce**: Native accelerator bridge filters duplicate shortcut events within 120ms for DOM and CGO handlers
111- **Ctrl+F shortcut**: Added missing 'f' key case in keyboard_cgo.go dispatcher
112- **Browser freeze**: Removed infinite loop in mode switching reactive effects
113- **State persistence**: Proper cleanup when switching between Ctrl+L and Ctrl+F modes
114- **Homepage protocol**: Fixed dumb://homepage not working after GUI migration with proper Svelte 5 component and API integration
115- **Omnibox positioning on homepage**: Fixed omnibox stuck in top-left corner by isolating homepage CSS styles and strengthening omnibox positioning with explicit fixed positioning and CSS isolation
116- **Find mode persistence**: Fixed find view persisting after pressing Esc when reopening with Ctrl+L by ensuring toggle() resets mode to 'omnibox'
117- **Favicon display**: Fixed missing favicons in homepage history after Svelte 5 migration by adding FaviconURL field to API response and implementing proper fallback display logic
118- **Homepage API communication**: Migrated from HTTP fetch to WebKit message bridge for all homepage API calls (history, stats, search) with proper callback handling and timeout management
119- **Omnibox accessibility**: Added keyboard navigation support with Tab/Enter activation for suggestion items and proper ARIA attributes for screen readers
120- **Omnibox suggestions race conditions**: Fixed timing issues where suggestions arrived before API was ready by implementing pending suggestions queue and proper event bridging between page-world and isolated-world contexts
121
122## [0.7.0] - 2025-09-14
123
124### Added
125- **Content blocking system**: Native WebKit ad blocking with EasyList integration, cosmetic filtering, and filter cache management
126- **Filter cache purging**: New `--filter-cache/-F` flag in purge command
127- **WebKit debug system**: Comprehensive debugging support with configurable categories for troubleshooting WebKit internal errors
128- **Enhanced error handling**: Robust content filter injection with retry mechanisms and graceful fallbacks
129- **Parallel compilation**: Multi-core GCC compilation support for faster builds
130
131### Improved
132- **Content filter timing**: Optimized script injection timing to prevent interference with WebKit preconnect operations
133- **Anti-breakage scriptlets**: Safer JavaScript modifications that avoid WebKit internal conflicts
134- **Build system**: Added parallel compilation with automatic core detection and success indicators
135- **Persistent TLS certificate validation system**:
136  - **Three-option certificate dialog**: "Go Back", "Proceed Once (Unsafe)", and "Always Accept This Site"
137  - **Database-backed certificate storage**: SQLite-based persistence for user certificate decisions with SHA256 certificate hashing
138  - **Smart decision handling**: Automatic application of stored decisions without repeated prompts
139  - **Temporary vs permanent choices**: "Proceed Once" expires after 24 hours, "Always Accept" persists indefinitely
140  - **Seamless user experience**: No more repetitive certificate warnings for trusted sites
141- **Performance-optimized WebKit memory configuration system**:
142  - **New `WebkitMemoryConfig`** configuration section with performance-focused defaults for faster page loading
143  - **Aggressive caching strategy**: `web_browser` cache model with page cache enabled for instant back/forward navigation
144  - **Balanced memory pressure management**: Conservative (40%), strict (60%), and kill (80%) thresholds optimized for performance vs stability
145  - **Smart garbage collection**: 2-minute JavaScript GC intervals with process recycling after 50 page loads
146  - **Reduced monitoring overhead**: 45-second memory monitoring intervals to minimize performance impact
147  - **Environment variable overrides**: All memory settings configurable via `DUMBER_*` environment variables (`DUMBER_CACHE_MODEL`, `DUMBER_MEMORY_CONSERVATIVE`, etc.)
148- **Early crash handling initialization**: Moved crash handler setup to application entry point for better crash recovery
149
150### Changed
151- **Modernized GTK dialog system**: Migrated from deprecated GTK 4.10 dialog functions to modern `GtkAlertDialog` API
152  - **Future-proof implementation**: Eliminated all deprecation warnings by replacing `gtk_message_dialog_*` and `gtk_dialog_*` functions
153  - **Async-first architecture**: Native async dialog handling with proper event loop integration
154  - **Improved accessibility**: Better screen reader support and GTK4 theme integration
155- **Major main.go refactoring**: Massive code reduction from 1071 lines to 61 lines (~95% reduction)
156  - **Extracted browser application logic** to dedicated `internal/app/browser` package for better separation of concerns
157  - **Streamlined entry point**: Clean main function focusing only on CLI vs GUI mode detection and application bootstrapping
158  - **Improved maintainability**: Modular architecture with clear responsibilities between CLI and browser components
159- **Refactored memory configuration architecture**:
160  - Integrated WebKit memory settings into unified config system with Viper environment variable bindings
161  - Eliminated redundant environment variable parsing in favor of centralized configuration management
162  - Simplified webview initialization with direct config-to-WebKit conversion
163- **Improved CLI logs command description**: Enhanced help text for better user experience
164
165## [0.6.0] - 2025-09-12
166
167### Added
168- **Smart AV1 codec negotiation system for YouTube high-resolution streaming**:
169  - **Resolution-aware MediaCapabilities API reporting**: Intelligent codec capability reporting based on video resolution, enabling YouTube to select optimal codecs for different quality levels
170  - **YouTube format manifest manipulation**: Real-time format list reordering to prioritize AV1 for ≤1080p content while allowing VP9 fallback for higher resolutions
171  - **Graduated codec preference system**: Smart localStorage preference (`2048`) instead of forced AV1 (`8192`), giving YouTube flexibility for optimal codec selection
172  - **4K HDR 60fps AV1 support**: Successfully enables YouTube delivery of premium quality 4K HDR content with AV1 codec, HDR10 (PQ) color space, and BT.2020 wide color gamut
173  - **Configurable AV1 resolution limits**: New `av1_max_resolution` config option with environment variable support (`DUMBER_AV1_MAX_RES`)
174  - **Automatic codec fallback logic**: Seamless VP9 fallback for resolutions where AV1 performance may be suboptimal
175  - **High bitrate streaming support**: Enables premium quality streaming (650+ Mbps) with proper buffer management
176  - Fixes previous limitation where forcing AV1 would cap YouTube playback at 1080p maximum
177- Page refresh functionality with standard keyboard shortcuts:
178  - **Ctrl+R** / **Cmd+R**: Reload current page
179  - **Ctrl+Shift+R** / **Cmd+Shift+R**: Hard reload (bypass cache)
180  - **F5**: Alternative reload key
181  - WebKit integration with proper `webkit_web_view_reload()` and `webkit_web_view_reload_bypass_cache()` calls
182- **Twitch theater mode and fullscreen stability fix**:
183  - **Complete removal of codec interference on Twitch**: Eliminates aggressive codec control that caused theater mode and fullscreen freezing
184  - **Native Twitch codec selection**: Allows Twitch to handle codec negotiation without browser intervention
185  - Fixes theater mode freeze and fullscreen black screen issues on Twitch
186
187### Fixed
188- Zoom level toast no longer shows on every page navigation within the same domain:
189  - Added smart detection to differentiate user-initiated vs programmatic zoom changes
190  - Toast now only appears when manually adjusting zoom or entering a new domain
191  - Prevents annoying notifications during regular browsing within the same site
192- Links with `target="_blank"` now load in current window instead of being ignored:
193  - Added WebKit `create` signal handler to intercept new window requests
194  - Redirects popup/new tab links to current window for seamless single-window browsing
195  - Maintains user experience consistency in tab-less browser architecture
196
197## [0.5.0] - 2025-09-12
198
199### Added
200- Hardware video acceleration with automatic GPU detection:
201  - Multi-vendor GPU detection (AMD, NVIDIA, Intel) using glxinfo, lspci, and sysfs
202  - Automatic VA-API driver selection (radeonsi for AMD, vdpau for NVIDIA, iHD for Intel)
203  - WebKitGTK integration with GStreamer hardware acceleration backends
204  - Environment variable configuration support (LIBVA_DRIVER_NAME, GST_VAAPI_ALL_DRIVERS)
205  - Legacy VA-API fallback mode for compatibility with older systems
206  - Video decoding acceleration for H.264, HEVC, VP9, and AV1 codecs
207  - Significantly reduced CPU usage during video streaming (Twitch, YouTube, etc.)
208  - Smart conflict prevention between legacy and modern VA-API implementations
209- TLS certificate error handling with user confirmation dialog:
210  - Comprehensive certificate information display (subject, issuer, validity dates)
211  - Interactive warning dialog for untrusted certificate authorities
212  - Certificate exception management with per-host persistence
213  - Manual load triggering after user accepts certificate exceptions
214  - Proper integration with WebKitGTK 6.0 network session API
215- Zoom level toast notifications:
216  - Real-time zoom level display with format: "Zoom level: ±X% (Y%)"
217  - Smart debouncing to prevent notification spam during rapid zoom changes
218  - Automatic cleanup of stuck or colliding toast messages
219  - 150ms debounce timer with 2-second display duration
220  - Emergency cleanup function for orphaned toast elements
221- Comprehensive XDG-compliant logging system:
222  - Complete application output capture (Go logs, fmt prints, WebKit C logs)
223  - XDG Base Directory specification compliance (`~/.local/state/dumber/logs/`)
224  - Automatic log rotation with size/age-based cleanup and compression
225  - WebKit CGO log capture with GLib log handler integration
226  - CLI log management commands (`dumber logs list`, `logs tail`, `logs clean`)
227  - File-only logging for cache operations to prevent dmenu interference
228  - Multi-output support with timestamped, tagged log entries
229  - Configurable log levels, formats (text/JSON), and retention policies
230
231### Fixed
232- WebView background set to black to improve user experience during page loads
233- Multiple linting issues and code quality improvements (reduced from 211 to ~150 issues)
234- Omnibox responsive scaling and layout issues:
235  - Fixed over-aggressive viewport scaling that made omnibox disproportionately large at high zoom levels
236  - Resolved input field overflow extending beyond container boundaries
237  - Improved box-sizing model to prevent layout issues
238  - Added conditional separator display (hidden when no search results)
239  - Omnibox now scales proportionally with webpage content across all zoom levels
240- Dmenu history favicon display:
241  - Complete favicon caching system for fuzzel/dmenu integration with real website icons
242  - ICO file support using go-ico library for perfect Windows icon conversion to PNG
243  - Smart brightness detection and color inversion for dark theme visibility
244  - All cached favicons normalized to consistent 32x32 PNG format for uniform display
245  - Anti-aliasing preservation during color inversion to prevent edge noise and pixelation
246  - Asynchronous favicon downloading and caching with 7-day freshness and 30-day cleanup
247  - Fuzzel icon protocol integration (`\0icon\x1f<path>`) for native icon display
248  - Favicon URLs extracted from webpage metadata and stored in database during navigation
249  - Fallback system removed to ensure consistent sizing - shows real favicons or no icon
250  - XDG Base Directory compliance for favicon cache storage
251
252## [0.4.0] - 2025-09-10
253
254### Added
255- High-performance fuzzy cache system for dmenu history:
256  - Binary serialization with memory-mapped files for zero-copy access
257  - Trigram indexing (3-character sequences) for fast candidate filtering  
258  - Prefix trie (compressed tree structure) for prefix matching
259  - Pre-sorted entry indices for O(1) top entries retrieval
260  - Smart cache invalidation with filesystem persistence and background refresh
261  - Comprehensive fuzzy matching algorithms: Jaro-Winkler similarity, Levenshtein distance, tokenized matching
262  - Weighted scoring system combining URL, title, recency, and visit count scores
263  - XDG Base Directory Specification compliance (cache stored in state directory)
264  - Atomic operations for concurrent access control
265  - Dependency injection using interfaces and gomock for testing
266- Purge command for cleaning up dumber data and cache files:
267  - Selective purging with flags: `--database`, `--history-cache`, `--browser-cache`, `--browser-data`, `--state`, `--config`
268  - Clear distinction between history cache (dmenu fuzzy search) and browser cache (WebKit)
269  - Browser data includes cookies, localStorage, sessionStorage
270  - Confirmation prompt with `--force` flag to skip
271  - Targets all data locations: SQLite database, WebKit cache/data, dmenu fuzzy cache, configuration files
272- Ctrl+Shift+C keyboard shortcut to copy current URL to clipboard:
273  - Cross-platform clipboard support with wl-copy (Wayland) and xclip (X11) fallback
274  - Reusable toast notification system for user feedback
275  - Injectable JavaScript component for consistent styling across all websites
276  - Native backend integration for reliable clipboard access
277
278### Changed
279- Dmenu performance dramatically improved: 200ms → 4ms (98% faster)
280- GetTopEntries optimized from O(n log n) to O(1) using pre-sorted indices
281- Cache build time reduced to ~300μs for typical history datasets
282
283### Fixed
284- Dark theme detection now properly reads GNOME desktop interface color-scheme setting (`org.gnome.desktop.interface color-scheme`) instead of only checking `gtk-application-prefer-dark-theme`
285- Eliminated O(n log n) sorting bottleneck on every dmenu call
286- Memory-efficient compact entry storage with minimal footprint
287- Concurrent cache access with proper read/write locking
288- Process no longer hangs when closing window with Cmd+Q or window close button - implemented proper GTK4 `close-request` signal handling and OS signal handling for graceful shutdown
289
290## [0.3.0] - 2025-01-11
291
292### Added
293- WebKit memory controls (opt‑in):
294  - Env vars to tune memory/perf trade‑offs without code changes:
295    - `DUMBER_CACHE_MODEL`, `DUMBER_ENABLE_PAGE_CACHE`
296    - `DUMBER_ENABLE_MEMORY_MONITORING`, `DUMBER_MEMORY_LIMIT_MB`, `DUMBER_MEMORY_POLL_INTERVAL`
297    - `DUMBER_MEMORY_CONSERVATIVE`, `DUMBER_MEMORY_STRICT`, `DUMBER_MEMORY_KILL`
298    - `DUMBER_GC_INTERVAL`, `DUMBER_RECYCLE_THRESHOLD`
299  - Version‑guarded CGO wrappers for memory pressure and GC hooks; safe no‑ops on unsupported WebKitGTK builds.
300 - Find in page (Ctrl/Cmd+F):
301   - Omnibox refactored into a reusable component with dedicated "find" mode.
302   - Highlighting: yellow for all matches; active match in orange for clarity.
303   - Match list with context (right side stops at nearest punctuation: . , ; : -).
304   - Navigation UX:
305     - ArrowUp/Down move selection and scroll the overlay list (page scroll disabled while open).
306     - Enter centers on the active match and closes; Shift+Enter goes to previous; Alt+Enter centers without closing.
307     - Hover focuses input and selects list items; click outside closes the overlay.
308     - Faded overlay with subtle blur when reviewing matches; opacity restores on input focus/typing.
309   - Programmatic API: `OpenFind(initial)`, `FindQuery(q)`, `CloseFind()` on `WebView`.
310
311### Changed
312- Performance‑first defaults retained:
313  - Cache model set to “WebBrowser”, page cache enabled, DevTools available.
314  - No implicit memory pressure or GC enabled by default; all memory tuning is opt‑in.
315
316### Removed
317- Deprecated offline app‑cache calls eliminated (no‑ops) to avoid warnings and brittle builds.
318
319### Fixed
320- Homepage Recent History layout:
321  - Show single-line entries as “{Title} – {Domain} – {URL}”.
322  - Truncate long URLs with a gradient fade; prevent horizontal overflow.
323  - Adjusted styling so URL is darker for readability.
324- Search shortcuts and config interop:
325  - Backend SearchShortcut now serializes `url`/`description` with JSON tags.
326  - Frontend normalizes field casing and extracts base URLs, handling `%s` and `{query}` templates.
327  - Omnibox shortcut parsing now URL-encodes queries and supports `%s` placeholders.
328- Input and navigation reliability (GTK4/WebKitGTK 6):
329  - Capture-phase key controller to ensure accelerators fire consistently.
330  - Do not consume normal left/right clicks; only mouse buttons 8/9 trigger back/forward.
331  - Added Alt+ArrowLeft/Right navigation and enabled two-finger swipe back/forward when supported.
332  - Added Ctrl+scroll zoom in/out; refined accelerator matching so Ctrl− works across layouts.
333  - Removed layout-specific hacks; added diagnostic logs for raw minus key events.
334- Zoom persistence:
335  - Added WebView zoom-changed hook; save per-domain zoom to SQLite on every change.
336  - Log on successful save: “saved X.XX for domain.tld” and on load: “loaded X.XX for domain.tld”.
337  - Load and log initial zoom level on startup and on every navigation.
338- Build/dev ergonomics:
339  - Makefile loads `.env.local`; supports overriding `GOMODCACHE`, `GOCACHE`, `GOTMPDIR` for sandboxed builds.
340 - WebKit CGO hardening and API compatibility:
341   - Apply memory pressure settings to `WebKitNetworkSession` (correct signature) when enabled.
342   - Guarded C wrappers remove deprecation warnings across header variants; builds succeed on WebKitGTK 6.
343
344## [0.2.0] - 2025-09-10
345
346### Added
347- WebKitGTK 6 (GTK4) migration for the built‑in browser window:
348  - WebView constructed via `g_object_new(WEBKIT_TYPE_WEB_VIEW, …)` with a fresh `WebKitUserContentManager`.
349  - `WebKitNetworkSession` with persistent cookies (SQLite) and cache directories.
350- Native UCM messaging restored via `script-message-received::dumber` (JSCValue*), removing the JS fallback bridge.
351- Rendering mode controls:
352  - CLI flag `--rendering-mode=auto|gpu|cpu` and `DUMBER_RENDERING_MODE` env.
353  - In‑app status endpoint `dumb://homepage/api/rendering/status`.
354- Native zoom shortcuts at the WebKit layer (Ctrl/Cmd+=, +, −, 0) and GTK4 input controllers for keyboard/mouse.
355- AZERTY keyboard fix: treat underscore as minus for zoom‑out.
356- Runtime theme synchronization: watch GTK `gtk-application-prefer-dark-theme` and update page color‑scheme live.
357- Makefile target `check-webkit` to print `pkg-config` versions of GTK4/WebKitGTK 6.0/JSC 6.0.
358- Documentation updates:
359  - README now targets WebKitGTK 6 (GTK4) and lists GStreamer package requirements for Arch and Debian/Ubuntu.
360  - CLAUDE notes updated with migration status, GPU/Vulkan path, runtime theme sync, and persistence.
361
362### Changed
363- Build flags and includes now target `webkitgtk-6.0`, `gtk4`, and `javascriptcoregtk-6.0`.
364- GTK4 APIs for windowing and event handling (GtkEventController, GtkGestureClick) replace GTK3/GdkEvent paths.
365
366### Removed
367- Legacy WebKit2GTK constructors and container APIs.
368- JavaScript fallback for UCM message bridging.
369
370### Fixed
371- Header/enum compatibility for hardware acceleration policy and cookie policy across WebKit header variants.
372- Linker error for `on_theme_changed` and gpointer usage in signal connections.
373- Crashy paths mitigated by default “media safe” startup (can be disabled via `DUMBER_MEDIA_SAFE=0`).
374
375### Notes
376- GPU rendering path leverages GTK4’s renderer (Vulkan/OpenGL). Mode `auto` uses GPU when available and falls back gracefully to CPU.
377- WebKitGTK relies on GStreamer; install recommended packages for audio/video (see README).
378
379## [0.1.0] - 2025-09-09
380
381### Added
382- Initial project scaffolding, build system, and dependencies.
383- Unified CLI + GUI architecture with search shortcuts and fuzzy parsing.
384- Wails v3‑alpha browser integration (early phase).
385- Global keyboard controls with script injection (zoom/devtools, etc.).
386- Native WebKit2GTK backend migration:
387  - Custom `dumb://` scheme and `/api` endpoints: `/config`, `/history/recent`, `/history/search`, `/history/stats`.
388  - UserContentManager omnibox injection and theme initialization.
389  - Persistent WebsiteDataManager with cookies.sqlite; per‑domain zoom and title persistence.
390  - Keyboard/mouse accelerators (including mouse back/forward); debounced triggers.
391  - Homepage switched to first‑party API fetches; removed @wailsio/runtime usage.
392- Documentation and licensing: README enhancements and LICENSE added.
393
394### Changed
395- Replaced Wails runtime with native WebKit2GTK CGO bindings and homepage API.
396- Improved asset resolution and logging for the `dumb://homepage` scheme.
397
398### Fixed
399- Eliminated duplicate accelerator triggers via debouncing.
400- Corrected asset resolution and URL normalization in scheme handler.

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close