v0.9.0 636c44c

CHANGELOG.md RawHistoryFolder

Changelog

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

[Unreleased]

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