Contents

MōBrowser 2.16.0

In this update, we added Intel Mac builds, Annotation Mode for turning UI feedback into coding prompts, window menus and built-in updates on Windows, click-through windows, and proprietary H.264, HEVC, and AAC playback. Native dialogs and workspace actions now work on Linux as well.

What’s new 

Intel Macs 

MōBrowser applications can now be built for Intel Macs. Build and pack as usual on an Intel Mac, or pass --x64 on an Apple Silicon Mac to cross-build:

# On an Apple Silicon Mac, build and pack for Intel.
npm run build -- --x64
npm run pack -- --x64

# On an Intel Mac, the default build is already Intel.
npm run build
npm run pack

Each architecture is written to its own build/dist/mac-<arch> directory and packed into its own update channel (osx for Apple Silicon, osx-x64 for Intel), so the two never collide and both can be served from a single update URL.

An Intel build does not run on Apple Silicon under Rosetta. Ship both architectures if you support both.

Annotation Mode 

When you run an app with npm run dev, you can now point at a control, describe the change you want, and copy a prompt that an AI coding agent can apply. The prompt includes the annotation text, a selector, the source location when it can be resolved, and an optional screenshot.

On macOS and Windows, a development toolbar appears beside the window and provides Annotation Mode and Developer Tools. You can also start Annotation Mode with Option+Cmd+A on macOS or Ctrl+Shift+A on Windows. Hide or show the toolbar with Option+Cmd+T or Ctrl+Shift+T.

The toolbar and Annotation Mode are available only in development mode. They never appear in packaged applications.

Window menus on Windows 

Each BrowserWindow on Windows can now have its own native menu bar. Attach a menu with setMenu(), and pass null to remove it:

import { BrowserWindow, Menu } from '@mobrowser/api';

const win = new BrowserWindow()
win.setMenu(new Menu({
  items: [
    new Menu({
      label: 'File',
      items: [
        'closeWindow'
      ]
    })
  ]
}))

Different windows can display different menus at the same time. win.menu reports the menu currently attached to that window.

Built-in updates on Windows 

Packaged Windows applications installed with the native installer can now use the same built-in update flow as macOS. Set app.updateServerUrl and add the checkForUpdates role to a window menu:

win.setMenu(new Menu({
  items: [
    new Menu({
      label: 'Help',
      items: [
        { role: 'checkForUpdates' }
      ]
    })
  ]
}))

The item moves from Check for Updates… to Checking/Downloading… and then Restart to Update. Native Windows dialogs report progress. The role is omitted when app.updateServerUrl is not set. Custom update flows that use the auto-update API are unchanged.

Click-through windows 

A window can now ignore mouse events so clicks and hover pass through to whatever is behind it. This is useful for overlays and partially transparent windows:

win.setIgnoreMouseEvents(true)

When the window is click-through, it no longer receives pointer movement by default. Pass { forward: true } if the page still needs mousemove, mouseenter, and mouseleave events so your code can re-enable input over interactive regions:

win.setIgnoreMouseEvents(true, { forward: true })
win.setIgnoreMouseEvents(false)

The option does not perform pixel-alpha hit testing. Your application remains responsible for toggling ignore mode over painted controls. Click-through windows are supported on macOS and Windows.

Native dialogs and workspace on Linux 

Message dialogs, open/save file dialogs, and the workspace helpers now work on Linux, in addition to macOS and Windows:

import { app, workspace } from '@mobrowser/api';

await app.showMessageDialog({
  parentWindow: win,
  title: 'MyApp',
  message: 'Version 1.0.0',
  buttons: [{ label: 'Close', type: 'primary' }]
})

workspace.openUrl('https://teamdev.com/mobrowser')
workspace.openPath('/home/me/Documents/file.pdf')
workspace.showPath('/home/me/Documents/file.pdf')

Asynchronous media device selection 

The selectMediaDevice handler can now be async, so you can look up a preferred camera or microphone before returning its id:

import { BrowserWindow, SelectMediaDeviceParams } from '@mobrowser/api';

const win = new BrowserWindow()
win.browser.handle('selectMediaDevice', async (params: SelectMediaDeviceParams) => {
  return params.devices[0].id
})

Fixes and improvements 

  • Restored screen-capture protection on macOS. Calling setScreenCaptureProtectionEnabled(true) again prevents the window from appearing in screenshots and screen recordings.
  • Customer CycloneDX SBOMs now identify more Chromium and Velopack components with authoritative versions and Package URLs. Placeholder values such as git, master, and None are no longer reported as versions. Components without authoritative upstream metadata remain versionless or without a PURL.