Skip to content

v0.2.5

Pre-release
Pre-release

Choose a tag to compare

@AbdelrahmanBerchan AbdelrahmanBerchan released this 14 Apr 03:00
· 109 commits to main since this release
d644b80

Axis Browser v0.2.5

Shell / layout

  • Web panel depth: #content-area::after double box-shadow (inset with 8px padding) for a lifted web panel — diffuse + contact layers bumped for clearer depth without looking heavy.

Transparent sites

  • URL bar vs page glass: With transparent sites on, the top bar now uses the same backdrop-filter as #app (backdropMain: blur + saturation) instead of the weaker urlBarBackdrop, and --axis-ts-urlbar-* on :root tracks blurMain / satMain. Tint alphas use glassAlpha so the bar’s color layer lines up with the shell glass you see through transparent pages.

Settings — Ambient audio

  • Mute ambient when tab audio is playing (ambientMuteWhenTabAudio, off by default): when enabled, ambient gain goes to 0 while any tab has audible page audio (playing and not tab-muted); restores when playback stops, the tab is muted, or the tab closes.

Privacy & security

  • HTTPS-only mode (httpsOnlyMode, off by default): when enabled, navigating to an HTTP (non-HTTPS) URL shows a confirmation before loading. http://localhost, 127.0.0.1, and IPv6 loopback are allowed without a prompt. Toggle in Settings → General and axis://settings (Looks & Feel).
  • JavaScript (javascriptEnabled, on by default): when turned off, tab webviews are created with javascript=no (Chromium); existing tabs are rebuilt so the change applies immediately. Many sites require JS.

Paste and Match Style

  • Paste and Match Style (paste-match-style, default ⌘⇧V / Ctrl+Shift+V): pastes plain text from the clipboard so it adopts the surrounding style (no rich formatting). Works in the shell (URL bar, find box, settings fields) and in the active page. Edit → Paste and Match Style and the shortcuts editor list it like other actions.
  • Context menus: Paste and Match Style appears in the URL bar and web page context menus after Paste (when pasting is allowed, e.g. editable fields or clipboard has text for the URL bar).

Select All

  • Select All (select-all, default ⌘A / Ctrl+A): selects all text in the focused field (URL bar, find box, settings inputs, etc.) or all page content in the active tab. Listed in Edit → Select All, Settings → Shortcuts, and respects disable/remap like other actions. Cmd/Ctrl+A is handled in the renderer (not as a global OS shortcut) so shell text fields keep correct behavior.

Print support

  • Print Page (print, default ⌘P / Ctrl+P): opens the OS print dialog for the current page (with background graphics enabled). Available via File → Print…, right-click → Print… context menu, the configurable shortcut, and the shortcuts editor. Pin Tab shortcut moved to ⌘⇧P / Ctrl+Shift+P to free the standard print binding.
  • Fast print path: print calls the guest webContents.print() directly via IPC instead of going through the slow <webview>.print() DOM bridge.

Keyboard shortcuts

  • Mute / Unmute Tab (toggle-mute-tab, default ⌘⇧M / Ctrl+Shift+M): toggles webview audio mute for the current tab; listed in Settings → Shortcuts, axis://settings shortcuts pane, and View → Mute / Unmute Tab.
  • Disable / re-enable shortcuts: any shortcut can be disabled (stored override null); disabled actions appear under a Disabled section with Enable to restore defaults. axis://settings embedded shortcuts tab matches the standalone Settings UI, including Disable and conflict handling.

Help menu

  • Help in the application menu (macOS menu bar / Windows & Linux menu bar): View License (LICENSE.md), Report an Issue (issues), Report a Vulnerability (Security), Donate (Patreon), Visit GitHub Page (repo). All open in Axis as a new tab, not in the OS default browser.

Link context menu

  • Right-click a link (native page menu): besides Open Link in New Tab and Copy Link Address, http/https links also get Open Link in New Window (secondary Axis window + tab) and Open Link in Incognito Window (new private window + tab).

Memory & stability

  • Listener leak fixes: session configuration (preload scripts, permission handlers, certificate verification) now runs once per app lifecycle (configureSession()) instead of repeating inside createWindow().
  • web-contents-created unlimited listeners: every new WebContents gets setMaxListeners(0) (unlimited), preventing MaxListenersExceededWarning regardless of how many tabs/iframes are open.
  • Full webview listener cleanup: all 17+ event listeners attached by setupWebviewEventListeners are now stored as named references and removed via cleanupWebviewListeners() before a webview is destroyed — on tab close (pinned & unpinned) and webpreference rebuild (JS toggle). Timers and the did-change-load-progress WebContents listener are also cleaned up.
  • Removed broken trySetMaxListeners: the old workaround called webview.getWebContents() which was removed in modern Electron, silently failing. Replaced by the main-process web-contents-created approach.

Site loading — critical fixes

  • did-fail-load now checks isMainFrame (root cause of sites failing to load): previously, any sub-frame failure (ad iframes, tracking pixels, analytics scripts) was treated as a main page failure — hiding the loading bar, incrementing retry counts, and even showing error pages or reloading the webview. Now only main-frame failures trigger error handling; sub-frame errors are ignored.
  • did-fail-load ERR_ABORTED fix: error code -3 (ERR_ABORTED) returns immediately without touching loading state. Redirecting pages no longer get their loading bar killed mid-redirect.
  • Per-tab retry counters: errorRetryCount and dnsRetryCount were global (shared across all tabs). A failure in one tab poisoned the retry budget for every other tab. Now each tab has its own independent retry counter.
  • did-finish-load sub-frame guard: the finish handler no longer resets isWebviewLoading or the refresh button when a sub-frame finishes — only the main frame completing marks the page as loaded.
  • Triple-navigation fix in createNewTab: opening a URL in a new tab previously set webview.src up to three times. Now only navigate() triggers the single load; the tab starts with a blank URL so switchToTab skips its own navigation.
  • Removed harmful onBeforeRequest / onBeforeSendHeaders handlers: the no-op onBeforeRequest handler added latency to every request without doing anything. The onBeforeSendHeaders handler was setting non-standard Cache-Control request headers (max-age=31536000) on every document request, which could confuse CDNs and servers. Both removed.
  • Certificate verification on all sessions: setCertificateVerifyProc was only set on the default session, not on persist:main (used by all tab webviews) or incognito. Now all three sessions trust certificates, preventing SSL-related loading failures.
  • Removed outdated hardcoded user agent: the webview was hardcoded to Chrome/120.0.0.0 while Electron 39 uses a much newer Chromium. Sites detecting the old UA could serve degraded content or refuse to load. Now uses Electron's real UA.
  • Consolidated disable-features flags: appendSwitch('disable-features', ...) was called 3 times, each overwriting the previous. Only the last call took effect, losing feature flags from the first two. Now a single call contains all disabled features.

Console noise suppression

  • --disable-logging flag: added to suppress Chromium native stderr output (covers sysctlbyname, blink.mojom, SSL handshake messages).
  • process.stderr.write filter: catches remaining stderr noise (GUEST_VIEW_MANAGER_CALL, ERR_BLOCKED_BY_RESPONSE, sysctlbyname, blink.mojom, interface_endpoint_client).
  • console.error / process.emitWarning filters: suppress known-harmless Electron IPC and CORS errors.
  • sysctlbyname kern.hv_vmm_present: this is a harmless macOS kernel message from Chromium's GPU process; it does not affect page loading or stability. It is printed by native C++ code before Node.js loads, so it cannot be intercepted from JavaScript.

Full Changelog: v0.2.4...v0.2.5

Screen.Recording.2026-04-13.at.8.23.51.PM.mov