---
name: hd-open-url-mac
description: >
  macOS platform companion to hd-open-url — the Apple-specific half of "open a URL
  in a native browser". The six ways to open a URL (Hydrogen webview tab, HD window,
  Pup, native browser, the Browser Picker, headless curl), the decide-for-the-user
  rule, the /open-url + /open-in-profile + prefs API all live in hd-open-url
  (adom/hd-bootstrap); THIS skill carries only the macOS native-browser mechanics:
  launching via LaunchServices (`open` / `open -a "<App Name>"` / `--new-window`
  fresh windows), macOS browser-profile dirs, and the control-URL discovery file
  (~/.adom/hd-control-url). Mirror of hd-open-url-windows (chrome.exe/msedge.exe by
  path). Trigger words — open url macos, open -a, native browser mac, Safari Chrome
  Arc Edge, fresh window mac, browser profiles mac, hd-control-url.
---

# hd-open-url (macOS) — opening URLs in native macOS browsers

This is the **macOS half** of `hd-open-url`. The decision framework — the six ways to
open a URL, "decide for the user — DON'T hand them the picker", the
`/open-url` · `/open-in-profile` · `/browser-picker/prefs` API, the fresh-window
rationale for auth flows — is host-agnostic and lives in the generic **hd-open-url**
skill. Read that first; this skill only covers how the **native-browser path (#4)**
launches on a Mac.

## Control-URL discovery — `~/.adom/hd-control-url`

Same as the generic skill: read the live base URL from `~/.adom/hd-control-url`
(`BASE="$(cat ~/.adom/hd-control-url)"`) — never hard-code the port. On macOS that file
resolves to the **`adom-host` gateway** from inside the workspace machine, because the
Apple `vz` VM does NOT mirror host loopback (`127.0.0.1` inside the machine is NOT the
Mac, and HD's host services bind `0.0.0.0`). See `hd-api-mac` for the gateway detail.

## Native browsers launch via LaunchServices (`open` / `open -a`)

The `/open-in-profile` and direct native-browser paths drive macOS browsers through
LaunchServices, not by resolving an `.exe`:

- **Default / shell-open:** `open <url>` (LaunchServices picks the user's default
  browser) — `open_in_browser_profile` / `screenshot.rs`.
- **Named browser:** `open -a "<App Name>" <url>`. `screenshot.rs` maps
  `chrome→"Google Chrome"`, `edge→"Microsoft Edge"`, `firefox→"Firefox"`,
  `brave→"Brave Browser"`; **Safari** and **Arc** are likewise app-name targets. Using
  the app *name* (not a path) handles user-relocated installs uniformly.
- **Fresh window (`fresh:true`):** to force a brand-new window/process HD resolves a
  concrete browser binary and passes `--new-window` (Chromium) / `-new-window` (Firefox)
  before the URL — `open -a … <url>` alone opens a tab, not a window (`lib.rs`
  fresh-window branch). A freshly-launched window auto-foregrounds, so this is the path
  for **Claude/Adom auth pages the user must complete** (the generic skill defaults the
  fresh toggle ON for those).

## macOS browser-profile dirs

`GET /browser-profiles` enumerates the user's installed browsers + profiles so
`/open-in-profile {browser, profileDir}` can target the **work** profile (where saved
logins live). On macOS those profiles live under the app's Application Support dir
(e.g. `~/Library/Application Support/Google/Chrome/<Profile>`,
`…/Microsoft Edge/<Profile>`), as opposed to the Windows `%LOCALAPPDATA%\…\User Data`
layout. Discover them via the endpoint rather than assuming a path or browser — don't
hard-code `chrome`/`edge`.

## NOT here (lives in the Windows companion)

Launching `chrome.exe` / `msedge.exe` by resolved path (`find_browser_exe`), the
`%LOCALAPPDATA%\…\User Data\<Profile>` profile-dir layout, and the Windows
`--new-window` / `--profile-directory` exe invocation are the Windows native-browser
path — see `hd-open-url-windows`. On macOS it's LaunchServices (`open` / `open -a`) with
app-name targets.
