---
name: cross-platform-dev
description: How adom-native-browser ships across Windows and macOS - Windows-first, Kyle ports to Mac. Read before adding platform-specific code.
---

# Cross-platform dev flow (Windows-first → Kyle ports to Mac)

Adom's standard flow, applied to this repo: **John builds and ships on Windows; Kyle ports to macOS
as a fast-follow.** John is a Windows user, Kyle is the Mac user. Design accordingly so Kyle's port is
a thin layer, never a rewrite.

> **Shipping a bridge update so ab picks it up** (build the manifest + zip, the `.zip`-blocked-use-`.bin`
> trap, the canonical URL, `bridge_install` vs `refresh_bridges`) is general bridge-author knowledge and
> lives on the bridges hub: the **`shipping-a-bridge`** skill at
> [adom/adom-bridge-sdk](https://wiki.adom.inc/adom/adom-bridge-sdk). Read it before cutting a
> new `bridge/` version.

## The rule

Keep the **bridge** (`bridge/server.js`), the **native host** (`host/native-host.js`), and the
**extension** (`extension/`) **OS-agnostic** - plain Node + standard MV3 APIs. Isolate everything
Windows-specific to the **install/registration layer** only:

| Concern | Windows (build first) | macOS (Kyle ports) |
|---|---|---|
| Native-messaging host manifest | `HKCU\Software\<vendor>\NativeMessagingHosts\inc.adom.native_browser` | `~/Library/Application Support/<Google/Chrome \| Microsoft Edge>/NativeMessagingHosts/inc.adom.native_browser.json` |
| Host launcher | `native-host.bat` → `node native-host.js` | `native-host.sh` → `node native-host.js` (chmod +x) |
| Bridge cache path | `%LOCALAPPDATA%\Adom Bridge\bridges-cache\native-browser\` | `~/Library/Application Support/Adom Bridge/bridges-cache/native-browser/` |
| Extension force-install | `HKLM\...\ExtensionInstallForcelist` | configuration profile / MDM `ExtensionInstallForcelist` |
| Discovery file | `os.homedir()/.adom/bridges/native-browser/host.json` | identical (uses `os.homedir()` - already cross-platform) |

## Implications

- Never put `process.platform === 'win32'` branches in `bridge/` or `host/` core logic. If you need a
  platform path, derive it from `os.homedir()` (already cross-platform) - don't hardcode `%...%`.
- The `--silent-debugger-extension-api` launch-flag wiring and registry writes are Windows-only by
  nature; keep them in `install/` so Kyle swaps that folder, not the engine.
- When you add a Windows install step, add a one-line "macOS equivalent" note next to it so the port
  is mechanical.
