Documentation menu

API Parity & Gaps

The single source of truth for which Electron modules and methods bunmaska implements, per platform (macOS, Linux, Windows). Honest, cell by cell.

We’re allergic to lying in tables, so here’s the honest map. Bunmaska implements ~21 of Electron’s main-process modules - about 70-80% of what a typical webview app actually uses - and now ships on three platforms: macOS (AppKit + WKWebView), Linux (GTK 4 + WebKitGTK 6), and Windows (WinCairo WebKit + Win32). No bundled Chromium on any of them.

Support is not uniform across platforms, and we won’t pretend it is. The table below is the source of truth.

Legend: ✅ full · ◐ partial (see notes) · ⚙️ engine-blocked (the OS WebKit lacks the API) · ✕ not implemented.

The matrix

ModulemacOSLinuxWindowsNotes
appLifecycle, paths, single-instance, locale. Dock/badge/about-panel are macOS-only and no-op elsewhere (as in Electron).
BrowserWindowsetPosition/setBounds move + size the window on Windows; macOS placement is best-effort (bottom-left origin) and Linux leaves placement to the compositor (GTK4), so setPosition is size-only there. Windows setMinimumSize is a no-op (needs WM_GETMINMAXINFO).
webContents (core)load/navigation/executeJavaScript/zoom/insertCSS/IPC send everywhere. setWindowOpenHandler({action:'allow'}) is unimplemented on all three (window.open is blocked by default).
webContents.printToPDF⚙️macOS via createPDFWithConfiguration. Linux: not yet wired. Windows: engine-blocked (no PDF sink in the WinCairo C API).
webContents.capturePage⚙️macOS via snapshot. Linux: planned (webkit_web_view_get_snapshot). Windows: engine-blocked (no UI-process snapshot).
webContents.sendInputEventTrusted input synthesis - the page sees isTrusted === true, which a script-dispatched event can’t. Windows only (WinCairo, via posted/sent Win32 messages); macOS + Linux throw UnsupportedPlatformError. Windows follow-ups: no keyboard modifiers, synthesized drags don’t carry button state, KeyboardEvent.code/scan-codes and F1-F24 aren’t wired, and coordinates are correct at 100% display scale only (per-monitor DPI pending).
ipcMain / ipcRendererhandle/on/invoke/send.
contextBridgeReal isolated content world on macOS/Linux. Windows runs in the page world (WinCairo exposes no named world) - the bridge works, but the isolation guarantee is weaker.
Menu / MenuItemContext menus + application menu bar on all three. Linux/Windows render role items as labels (their native shortcuts still work); accelerator text in labels is a follow-up.
dialogLinux: openDirectory/multiSelections ignored, severity is a no-op. Windows: custom button labels approximated (native MessageBoxW button sets).
clipboardtext / HTML / image on all three. Reads are async everywhere (GDK requires it).
TrayLinux: SNI tray, gated behind BUNMASKA_ENABLE_LINUX_TRAY, no context menu yet. Windows: icon + tooltip + left-click, context menu deferred.
NotificationmacOS delivers only from a real .app bundle (isSupported() is honest about it); click/close events not wired. Linux: close event only. Windows: balloon toast (rich toasts are a follow-up).
nativeImagepath/buffer/dataURL/PNG/JPEG/resize/crop. JPEG quality is honored on macOS only.
nativeThememacOS: read + themeSource override + live updated. Linux: read + live updated, but themeSource is TS-only (no native re-theme). Windows: read-only (live observation is a follow-up).
globalShortcutLinux: X11 only (isSupported() is false under Wayland).
shellopenExternal/openPath/showItemInFolder/beep. Linux showItemInFolder opens the parent folder without selecting.
protocol⚙️Custom scheme handlers serve on macOS/Linux. Windows: engine-blocked - the WinCairo C API exposes no scheme-handler entry point.
screenDisplay enumeration + scale factor work everywhere. getCursorScreenPoint and some secondary-display fields (work-area, rotation) are stubbed/approximated - a bun:ffi struct-return limitation.
powerMonitorsuspend/resume + lock/unlock on all three. getSystemIdleTime/isOnBatteryPower not implemented on any. Linux is gated behind BUNMASKA_ENABLE_LINUX_POWER.
powerSaveBlockerLinux: gated, and both blocker types map to screensaver inhibition.
safeStoragemacOS Keychain, Windows DPAPI. Linux: libsecret, gated behind BUNMASKA_ENABLE_LINUX_KEYRING (no plaintext fallback - encrypt/decrypt throw when unavailable).
sessiongetUserAgent/setUserAgent everywhere. clearStorageData: macOS clears all website data; Windows clears cookies + fetch caches; Linux not yet wired. No session.cookies object yet.
autoUpdaterThe check/download/verify/stage pipeline is real and cross-platform. The final install step is an experimental stub on every OS - apps supply their own for now.
accelerator · app-paths · requestSingleInstanceLockPure or fully-wired on all three.

Engine-blocked (⚙️) - why these can’t ship on a given OS

These aren’t laziness; the OS’s WebKit simply doesn’t expose the API:

  • Windows protocol / printToPDF / capturePage - the WinCairo WebKit2 C API has no custom-scheme-handler, no PDF sink (WKPageDrawPagesToPDF is Cocoa-only), and no UI-process snapshot (only the web-process WKBundlePage* variants). We confirmed each by parsing WebKit2.dll’s export table. They become available only if upstream WinCairo adds them.

Pending (inside shipped modules)

Real gaps we’re actively filling: session.cookies (get/set/remove) and session.clearStorageData on Linux; Linux capturePage via webkit_web_view_get_snapshot; richer webContents events; live nativeTheme observation on Windows; tray context menus on Linux/Windows; BrowserWindow.setMinimumSize on Windows; the isolated content world on Windows.

Out of scope by design

Chromium-internal surfaces - not coming, and that’s deliberate:

BrowserView / WebContentsView (single-process) · desktopCapturer · net / netLog · webRequest / proxy · crashReporter · contentTracing · utilityProcess · TouchBar · inAppPurchase · extensions · pushNotifications · Web Serial / WebHID / WebUSB.

If a cell you need is ◐, ⚙️, or in “pending,” now you know - before you’ve ported half your app. That’s the whole reason this page exists.