v0.2.5
Pre-release
Pre-release
·
109 commits
to main
since this release
Axis Browser v0.2.5
Shell / layout
- Web panel depth:
#content-area::afterdouble 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-filteras#app(backdropMain: blur + saturation) instead of the weakerurlBarBackdrop, and--axis-ts-urlbar-*on:roottracksblurMain/satMain. Tint alphas useglassAlphaso 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 withjavascript=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 insidecreateWindow(). web-contents-createdunlimited listeners: every newWebContentsgetssetMaxListeners(0)(unlimited), preventingMaxListenersExceededWarningregardless of how many tabs/iframes are open.- Full webview listener cleanup: all 17+ event listeners attached by
setupWebviewEventListenersare now stored as named references and removed viacleanupWebviewListeners()before a webview is destroyed — on tab close (pinned & unpinned) and webpreference rebuild (JS toggle). Timers and thedid-change-load-progressWebContents listener are also cleaned up. - Removed broken
trySetMaxListeners: the old workaround calledwebview.getWebContents()which was removed in modern Electron, silently failing. Replaced by the main-processweb-contents-createdapproach.
Site loading — critical fixes
did-fail-loadnow checksisMainFrame(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-loadERR_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:
errorRetryCountanddnsRetryCountwere 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-loadsub-frame guard: the finish handler no longer resetsisWebviewLoadingor 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 setwebview.srcup to three times. Now onlynavigate()triggers the single load; the tab starts with a blank URL soswitchToTabskips its own navigation. - Removed harmful
onBeforeRequest/onBeforeSendHeadershandlers: the no-oponBeforeRequesthandler added latency to every request without doing anything. TheonBeforeSendHeadershandler was setting non-standardCache-Controlrequest headers (max-age=31536000) on every document request, which could confuse CDNs and servers. Both removed. - Certificate verification on all sessions:
setCertificateVerifyProcwas only set on the default session, not onpersist:main(used by all tab webviews) orincognito. 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.0while 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-featuresflags: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-loggingflag: added to suppress Chromium native stderr output (coverssysctlbyname,blink.mojom, SSL handshake messages).process.stderr.writefilter: catches remaining stderr noise (GUEST_VIEW_MANAGER_CALL,ERR_BLOCKED_BY_RESPONSE,sysctlbyname,blink.mojom,interface_endpoint_client).console.error/process.emitWarningfilters: 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