{"_id":"@adrianlynch/browserfi","_rev":"8-194041cb49b42a53c30d1950d751b371","name":"@adrianlynch/browserfi","dist-tags":{"latest":"1.2.1"},"versions":{"0.1.0":{"name":"@adrianlynch/browserfi","version":"0.1.0","keywords":["browser","chromium","macos","aerospace","profiles"],"author":{"name":"Adrian Lynch"},"license":"MIT","_id":"@adrianlynch/browserfi@0.1.0","maintainers":[{"name":"adrianlynch","email":"adrian@adrianlynch.dev"}],"homepage":"https://github.com/adrianlynch/browserfi#readme","bugs":{"url":"https://github.com/adrianlynch/browserfi/issues"},"os":["darwin"],"bin":{"browserfi":"dist/cli.js"},"dist":{"shasum":"3edb94664cb7cfb336cbc4a6c71e884bf9f6eedc","tarball":"https://registry.npmjs.org/@adrianlynch/browserfi/-/browserfi-0.1.0.tgz","fileCount":6,"integrity":"sha512-7MAL5yQJGruAOY8YDgw+FEHu7eqdrT6piyuDiQiqKf0AEn24ls5wVSYwx4NGbMs+V79Vu+JQndMQ8lrCXdWSOg==","signatures":[{"sig":"MEUCIBxhEASOx6+HLZM3wPbQNJasQ1tEfh3oWT+U/mXOXLaqAiEAgYj4Lbeasg/SwQwlohzKUcrTtpeFn8a0UW96KS9Uin4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75801},"type":"module","engines":{"node":">=20"},"gitHead":"544627cab5c3b1f1fe7aa4f64e7ea9f9854e16d6","scripts":{"build":"tsc && chmod +x dist/cli.js","check":"tsc --noEmit","prepack":"npm run build","pack:dry":"npm pack --dry-run"},"_npmUser":{"name":"adrianlynch","email":"adrian@adrianlynch.dev"},"repository":{"url":"git+https://github.com/adrianlynch/browserfi.git","type":"git"},"_npmVersion":"11.11.0","description":"Per-context browser app bundles for macOS.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ink":"^7.0.2","react":"^19.2.6","smol-toml":"^1.6.1","ink-text-input":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0","@types/react":"^19.2.14"},"_npmOperationalInternal":{"tmp":"tmp/browserfi_0.1.0_1778138270898_0.7003209362771337","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@adrianlynch/browserfi","version":"0.1.1","keywords":["browser","chromium","macos","aerospace","profiles"],"author":{"name":"Adrian Lynch"},"license":"MIT","_id":"@adrianlynch/browserfi@0.1.1","maintainers":[{"name":"adrianlynch","email":"adrian@adrianlynch.dev"}],"homepage":"https://github.com/adrianlynch/browserfi#readme","bugs":{"url":"https://github.com/adrianlynch/browserfi/issues"},"os":["darwin"],"bin":{"browserfi":"dist/cli.js"},"dist":{"shasum":"7949be8affd7f96d51f3b70e84867c85914e3c06","tarball":"https://registry.npmjs.org/@adrianlynch/browserfi/-/browserfi-0.1.1.tgz","fileCount":6,"integrity":"sha512-Yi0u1oJPh61rTQDZJsrA7RRP8r9rs/30VPYT6FgtuPYnXfSuat80NGKvLO5IntyBXbJfWvoafVq35WVfCTDz8g==","signatures":[{"sig":"MEYCIQD72gaZabh46Auu47oiBz/AgSvK9hyhY9CygN+HeKAgTwIhANqf35u88yhZJTOAOyABNph7TaIGl0PKurhJKUGLgv1Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75799},"type":"module","engines":{"node":">=20"},"gitHead":"3018f05701adcaf77665c3e7efffe8d6cf9f4464","scripts":{"build":"tsc && chmod +x dist/cli.js","check":"tsc --noEmit","prepack":"npm run build","pack:dry":"npm pack --dry-run"},"_npmUser":{"name":"adrianlynch","email":"adrian@adrianlynch.dev"},"repository":{"url":"git+https://github.com/adrianlynch/browserfi.git","type":"git"},"_npmVersion":"11.11.0","description":"Per-context browser app bundles for macOS.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ink":"^7.0.2","react":"^19.2.6","smol-toml":"^1.6.1","ink-text-input":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0","@types/react":"^19.2.14"},"_npmOperationalInternal":{"tmp":"tmp/browserfi_0.1.1_1778138417580_0.7759072028968261","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@adrianlynch/browserfi","version":"0.1.2","keywords":["browser","chromium","macos","aerospace","profiles"],"author":{"name":"Adrian Lynch"},"license":"MIT","_id":"@adrianlynch/browserfi@0.1.2","maintainers":[{"name":"adrianlynch","email":"adrian@adrianlynch.dev"}],"homepage":"https://github.com/adrianlynch/browserfi#readme","bugs":{"url":"https://github.com/adrianlynch/browserfi/issues"},"os":["darwin"],"bin":{"browserfi":"dist/cli.js"},"dist":{"shasum":"690a103315d33b6f4a423b7e4647baabb611e7e9","tarball":"https://registry.npmjs.org/@adrianlynch/browserfi/-/browserfi-0.1.2.tgz","fileCount":6,"integrity":"sha512-wEpyKK+0KgyDm9Wetmcq61S70rGW3e7m+NiKX6MrmchJhtsrWYwHxOnf/efgwFYvTdeDuihtPBZUmKTvBplq/w==","signatures":[{"sig":"MEQCIFQgWD722dQkj4TMPjwTJMrzfAWI74Oz9QcukHxS2/PzAiBETLEwK63yrcVQd7Q/KMXIm7lqiDsN6ft/2wfcLFtzRg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81151},"type":"module","engines":{"node":">=20"},"gitHead":"3b367b6a091d909d5496f939ef62a05e845d87de","scripts":{"build":"tsc && chmod +x dist/cli.js","check":"tsc --noEmit","prepack":"npm run build","pack:dry":"npm pack --dry-run"},"_npmUser":{"name":"adrianlynch","email":"adrian@adrianlynch.dev"},"repository":{"url":"git+https://github.com/adrianlynch/browserfi.git","type":"git"},"_npmVersion":"11.11.0","description":"Per-context browser app bundles for macOS.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ink":"^7.0.2","react":"^19.2.6","smol-toml":"^1.6.1","ink-text-input":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0","@types/react":"^19.2.14"},"_npmOperationalInternal":{"tmp":"tmp/browserfi_0.1.2_1778155502406_0.6101297604181088","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@adrianlynch/browserfi","version":"1.0.0","keywords":["browser","chromium","macos","aerospace","profiles"],"author":{"name":"Adrian Lynch"},"license":"MIT","_id":"@adrianlynch/browserfi@1.0.0","maintainers":[{"name":"adrianlynch","email":"adrian@adrianlynch.dev"}],"homepage":"https://github.com/adrianlynch/browserfi#readme","bugs":{"url":"https://github.com/adrianlynch/browserfi/issues"},"os":["darwin"],"bin":{"browserfi":"dist/cli.js"},"dist":{"shasum":"0605dc618c054e8e73b9f13cd59a2a29b0f3a0e8","tarball":"https://registry.npmjs.org/@adrianlynch/browserfi/-/browserfi-1.0.0.tgz","fileCount":6,"integrity":"sha512-qNCq09BqPxPkAXMTpxZqpyYakbd1Y5dpxZEjYV1JGVVwUQD4OWam1KGraJuU1yL2506z7CtgEl1bXqoUBg3bmg==","signatures":[{"sig":"MEYCIQCV05SJUZz4GHaHL+9rbD/W4m4UZWJ+OcMW6Gkf2M1kQQIhANj6bh9jb8DMasnppuqv68RXeT9806OJfX7TlQpwaUi6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90479},"type":"module","engines":{"node":">=20"},"gitHead":"d2452f079969144ea529eedc42556c316c58a6f3","scripts":{"build":"tsc && chmod +x dist/cli.js","check":"tsc --noEmit","colors":"node scripts/color-samples.mjs","prepack":"npm run build","pack:dry":"npm pack --dry-run"},"_npmUser":{"name":"adrianlynch","email":"adrian@adrianlynch.dev"},"repository":{"url":"git+https://github.com/adrianlynch/browserfi.git","type":"git"},"_npmVersion":"11.11.0","description":"Per-context browser app bundles for macOS.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ink":"^7.0.2","react":"^19.2.6","smol-toml":"^1.6.1","ink-text-input":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0","@types/react":"^19.2.14"},"_npmOperationalInternal":{"tmp":"tmp/browserfi_1.0.0_1778210644647_0.3628326624983105","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@adrianlynch/browserfi","version":"1.0.1","keywords":["browser","chromium","macos","aerospace","profiles"],"author":{"name":"Adrian Lynch"},"license":"MIT","_id":"@adrianlynch/browserfi@1.0.1","maintainers":[{"name":"adrianlynch","email":"adrian@adrianlynch.dev"}],"homepage":"https://github.com/adrianlynch/browserfi#readme","bugs":{"url":"https://github.com/adrianlynch/browserfi/issues"},"os":["darwin"],"bin":{"browserfi":"dist/cli.js"},"dist":{"shasum":"41416144657bd519897dbc6e5037945cb7fc3b8c","tarball":"https://registry.npmjs.org/@adrianlynch/browserfi/-/browserfi-1.0.1.tgz","fileCount":6,"integrity":"sha512-eGS0feCP67LBhfk/dp3qFv301nLzUv0YGO5ULLZxNSOSN5w5qbXRhSc4kJNofgme+bR/geSvz8QRAuuE60VzxA==","signatures":[{"sig":"MEQCIC33ucjUDuCfvwHiUUPdNPkybdrU1UT9CtzX3Cyttk15AiBAoukRPnt52+VoDe262MQbnzjP/PDF/InAUsre3+7zmA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91052},"type":"module","engines":{"node":">=20"},"gitHead":"53329c66002c9f44d75fe128c441b7214324bf93","scripts":{"build":"tsc && chmod +x dist/cli.js","check":"tsc --noEmit","colors":"node scripts/color-samples.mjs","prepack":"npm run build","pack:dry":"npm pack --dry-run"},"_npmUser":{"name":"adrianlynch","email":"adrian@adrianlynch.dev"},"repository":{"url":"git+https://github.com/adrianlynch/browserfi.git","type":"git"},"_npmVersion":"11.11.0","description":"Per-context browser app bundles for macOS.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ink":"^7.0.2","react":"^19.2.6","smol-toml":"^1.6.1","ink-text-input":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0","@types/react":"^19.2.14"},"_npmOperationalInternal":{"tmp":"tmp/browserfi_1.0.1_1778211228758_0.2455345306839123","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@adrianlynch/browserfi","version":"1.1.0","keywords":["browser","chromium","macos","aerospace","profiles"],"author":{"name":"Adrian Lynch"},"license":"MIT","_id":"@adrianlynch/browserfi@1.1.0","maintainers":[{"name":"adrianlynch","email":"adrian@adrianlynch.dev"}],"homepage":"https://github.com/adrianlynch/browserfi#readme","bugs":{"url":"https://github.com/adrianlynch/browserfi/issues"},"os":["darwin"],"bin":{"browserfi":"dist/cli.js"},"dist":{"shasum":"3edf5a60c02bf3a92d6229ad61f75c5a50b2c154","tarball":"https://registry.npmjs.org/@adrianlynch/browserfi/-/browserfi-1.1.0.tgz","fileCount":6,"integrity":"sha512-CZwlzJIBnHO0i3Z86FmsuY/rsfGkkiytN77ZVu8khOkZjqYll07gi0zsbq+1SX8SRmRwGZNS1s3rCMn0gZqhEQ==","signatures":[{"sig":"MEUCIQCRUrVivP9D132n0SpFUSPADFgP5+Y/MtkrvPlNLd687wIga7esn20WUFwrIVwZANQR5cdOROgX8AC6gszQnezSE/U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96175},"type":"module","engines":{"node":">=20"},"gitHead":"22134a192e60499ab88553399b38a8f48dd3c0de","scripts":{"build":"tsc && chmod +x dist/cli.js","check":"tsc --noEmit","colors":"node scripts/color-samples.mjs","prepack":"npm run build","pack:dry":"npm pack --dry-run"},"_npmUser":{"name":"adrianlynch","email":"adrian@adrianlynch.dev"},"repository":{"url":"git+https://github.com/adrianlynch/browserfi.git","type":"git"},"_npmVersion":"11.11.0","description":"Per-context browser app bundles for macOS.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ink":"^7.0.2","react":"^19.2.6","smol-toml":"^1.6.1","ink-text-input":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0","@types/react":"^19.2.14"},"_npmOperationalInternal":{"tmp":"tmp/browserfi_1.1.0_1778213957131_0.04791070828791866","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@adrianlynch/browserfi","version":"1.2.0","keywords":["browser","chromium","macos","aerospace","profiles"],"author":{"name":"Adrian Lynch"},"license":"MIT","_id":"@adrianlynch/browserfi@1.2.0","maintainers":[{"name":"adrianlynch","email":"adrian@adrianlynch.dev"}],"homepage":"https://github.com/adrianlynch/browserfi#readme","bugs":{"url":"https://github.com/adrianlynch/browserfi/issues"},"os":["darwin"],"bin":{"browserfi":"dist/cli.js"},"dist":{"shasum":"22e69887345fb78d1e76236ff5bec930f75a2429","tarball":"https://registry.npmjs.org/@adrianlynch/browserfi/-/browserfi-1.2.0.tgz","fileCount":6,"integrity":"sha512-AprtNesz1dd1238XDHMPWx8z4vLsabifexDPe0bcFURSNBY/vBVSQWbj6e8WJrf4TDNMV3lOt/YCWkKc2in93A==","signatures":[{"sig":"MEUCIAE3NajYgir8j8T9h0jdgkn6/WNxMK9NkbobzKml8fXHAiEAwK6U8jR537HmTSFJUBEAxQy92gHy0KHT4Nlr/oWi93o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102337},"type":"module","engines":{"node":">=20"},"gitHead":"2a160ae3729fdfc569a72bdc3f41fa408a77017b","scripts":{"build":"tsc && chmod +x dist/cli.js","check":"tsc --noEmit","colors":"node scripts/color-samples.mjs","prepack":"npm run build","pack:dry":"npm pack --dry-run"},"_npmUser":{"name":"adrianlynch","email":"adrian@adrianlynch.dev"},"repository":{"url":"git+https://github.com/adrianlynch/browserfi.git","type":"git"},"_npmVersion":"11.11.0","description":"Per-context browser app bundles for macOS.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ink":"^7.0.2","react":"^19.2.6","smol-toml":"^1.6.1","ink-text-input":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0","@types/react":"^19.2.14"},"_npmOperationalInternal":{"tmp":"tmp/browserfi_1.2.0_1778215970229_0.38839907719917277","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@adrianlynch/browserfi","version":"1.2.1","description":"Per-context browser app bundles for macOS.","type":"module","bin":{"browserfi":"dist/cli.js"},"scripts":{"build":"tsc && chmod +x dist/cli.js","check":"tsc --noEmit","colors":"node scripts/color-samples.mjs","prepack":"npm run build","pack:dry":"npm pack --dry-run"},"keywords":["browser","chromium","macos","aerospace","profiles"],"author":{"name":"Adrian Lynch"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/adrianlynch/browserfi.git"},"bugs":{"url":"https://github.com/adrianlynch/browserfi/issues"},"homepage":"https://github.com/adrianlynch/browserfi#readme","os":["darwin"],"engines":{"node":">=20"},"devDependencies":{"@types/node":"^24.0.0","@types/react":"^19.2.14","typescript":"^5.9.0"},"dependencies":{"ink":"^7.0.2","ink-text-input":"^6.0.0","react":"^19.2.6","smol-toml":"^1.6.1"},"gitHead":"2629589ba346263e42b4933f0065c5d7371a4e92","_id":"@adrianlynch/browserfi@1.2.1","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-i73JYsQ6z/54tkUR8wg1CUyMz8wwi5/95ts0YBu6Zmsl2b7+ld5rvn2ad2VPFvJdXiQm1H8OuOR3r53RJFsFKg==","shasum":"c8bcf6fd53507f762a6f778230bc72e5a3aa01c7","tarball":"https://registry.npmjs.org/@adrianlynch/browserfi/-/browserfi-1.2.1.tgz","fileCount":6,"unpackedSize":102847,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDSdEkU81vT52ic+4C6uTvNq3c7mOt/WLw7GFQSurA4BAIgbEvVdjK8cRTYmVPlWMXexYJcrfFxhSyZaE9jocGkt5E="}]},"_npmUser":{"name":"adrianlynch","email":"adrian@adrianlynch.dev"},"directories":{},"maintainers":[{"name":"adrianlynch","email":"adrian@adrianlynch.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/browserfi_1.2.1_1778467838592_0.9664385344022086"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-07T07:17:50.796Z","modified":"2026-05-11T02:50:38.849Z","0.1.0":"2026-05-07T07:17:51.058Z","0.1.1":"2026-05-07T07:20:17.704Z","0.1.2":"2026-05-07T12:05:02.536Z","1.0.0":"2026-05-08T03:24:04.797Z","1.0.1":"2026-05-08T03:33:48.902Z","1.1.0":"2026-05-08T04:19:17.322Z","1.2.0":"2026-05-08T04:52:50.374Z","1.2.1":"2026-05-11T02:50:38.746Z"},"bugs":{"url":"https://github.com/adrianlynch/browserfi/issues"},"author":{"name":"Adrian Lynch"},"license":"MIT","homepage":"https://github.com/adrianlynch/browserfi#readme","keywords":["browser","chromium","macos","aerospace","profiles"],"repository":{"type":"git","url":"git+https://github.com/adrianlynch/browserfi.git"},"description":"Per-context browser app bundles for macOS.","maintainers":[{"name":"adrianlynch","email":"adrian@adrianlynch.dev"}],"readme":"# browserfi\n\nPer-context browser app bundles for macOS. Each generated `.app` gets its own\nbundle id, display name, icon, and profile directory, so AeroSpace or any window\nmanager that routes by app id can send each browser context to its own\nworkspace.\n\n## Why\n\nA single browser app normally shares one bundle id, one profile, and one storage\nnamespace. That makes it hard to:\n\n- route different browser windows to different AeroSpace workspaces by app id,\n- keep multiple local dev servers from sharing localStorage and cookies,\n- use different signed-in sessions per project.\n\nbrowserfi duplicates the source browser `.app`, changes its metadata, installs a\nsmall launcher wrapper that pins the profile path, applies a custom icon, and\nre-signs the result ad-hoc.\n\n## Requirements\n\n- macOS\n- Node.js 20+\n- One or more supported browsers installed in `/Applications`\n- Built-in macOS tools: `codesign`, `PlistBuddy`, `sips`, `iconutil`, `xattr`,\n  and `lsregister`\n\nSupported browser adapters:\n\n- `chromium`\n- `chrome`\n- `chrome-canary`\n- `brave`\n- `edge`\n- `firefox`\n\nSafari is intentionally unsupported because it does not expose a clean\nper-launch profile directory flag.\n\n## Install\n\nFrom npm:\n\n```bash\nnpm install -g @adrianlynch/browserfi\n```\n\nFrom source:\n\n```bash\nnpm install\nnpm run build\n./dist/cli.js help\n```\n\nHomebrew support should be packaged as a tap formula that installs the npm\npackage or a built release artifact. The intended command is:\n\n```bash\nbrew install adrianlynch/tap/browserfi\n```\n\n## Quick Start\n\n1. Edit [.browserfi.toml](.browserfi.toml).\n2. Drop optional per-bundle icons into `icons/<key>.png|jpg|jpeg|icns`.\n3. Run the interactive UI:\n\n```bash\nbrowserfi\n```\n\nOr build everything directly:\n\n```bash\nbrowserfi build\n```\n\nRe-running is safe: existing bundles are skipped, icons are still re-applied,\nand changed bundles are re-signed. Pass `--force` to rebuild generated `.app`\nbundles from scratch while preserving profile data:\n\n```bash\nbrowserfi build --force\n```\n\nThe interactive UI shows a compact table with installed/missing status and a\ndetail panel for the selected bundle. Run `browserfi` with no command, or use\n`browserfi tui`, to open it. Use arrow keys to select a row, then:\n\n- `enter`/`e`: edit config values inline\n- `a`: add new app\n- `b`: build selected app\n- `d`: delete app\n- `w`: write AeroSpace rules\n- `q`: quit\n\nDeleting an app removes its generated `.app`, profile data, and config row\nafter confirmation.\n\nThe browser field is selected from supported browsers that are installed on the\nmachine. In the edit form, use `↑/↓` to move between fields and `enter` to open\nbrowser/workspace selectors. Press `s` to save. New apps get a filesystem-safe\n`key` generated from the display name; existing apps keep their current key when\nrenamed. The icon field accepts a `.svg`, `.png`, `.jpg`, `.jpeg`, or `.icns`\npath or URL; leave it blank to use the `icons/<key>.png|jpg|jpeg|icns` convention. The icon color pickers\nset `iconColor` and `iconBackgroundColor`, which customize SVG icons during\nbuild. If AeroSpace config is found, Browserfi shows workspace fields and lets\nyou choose from existing AeroSpace workspace names. If AeroSpace is not found,\nworkspace fields and AeroSpace actions are hidden.\n\nList configured bundles as a table:\n\n```bash\nbrowserfi list\n```\n\nMachine-readable and path-only output are also available:\n\n```bash\nbrowserfi list --wide\nbrowserfi list --json\nbrowserfi list --paths\n```\n\nPrint AeroSpace rules:\n\n```bash\nbrowserfi aerospace\n```\n\nWrite those rules into a managed block in your AeroSpace config:\n\n```bash\nbrowserfi aerospace --write\n```\n\nCreate a starter config:\n\n```bash\nbrowserfi init\n```\n\n## Config\n\nbrowserfi uses TOML because it is comfortable to edit by hand: comments are\nallowed, values are not indentation-sensitive, and repeated `[[bundles]]`\nsections read cleanly.\n\nConfig lookup order:\n\n1. `./.browserfi.toml`\n2. `./browserfi.toml`\n3. `$XDG_CONFIG_HOME/browserfi/browserfi.toml`, or `~/.config/browserfi/browserfi.toml`\n4. `~/.browserfi.toml`\n\n```toml\ninstallDir = \"/Applications\"\nprofilesDir = \"~/ChromiumProfiles\"\niconsDir = \"./icons\"\n\n[[bundles]]\nbrowser = \"chromium\"\nkey = \"user-console-monorepo\"\ndisplayName = \"User Console Monorepo\"\ndefaultUrl = \"https://example.com\"\nappType = \"browser\"\nworkspace = \"6_User_Console\"\n```\n\nEach bundle supports:\n\n- `browser`: one of the supported adapters; defaults to `chromium`\n- `key`: stable identifier used for profiles and icons\n- `id`: optional stable app identity; defaults to `key`\n- `displayName`: Finder, Dock, and menu bar name; also used for the `.app` filename\n- `defaultUrl`: optional `http` or `https` URL opened when the app starts\n- `appType`: optional Chrome-family launch type when `defaultUrl` is set: `browser` keeps the address bar and tabs, `app` hides them\n- `icon`: optional `.svg`, `.png`, `.jpg`, `.jpeg`, or `.icns` path or URL for this app\n- `iconColor`: optional SVG tint color, as a 6-digit hex value like `#34CDD7`\n- `iconBackgroundColor`: optional SVG background color, as a 6-digit hex value like `#111111`\n- `iconInset`: optional SVG/PNG/JPG artwork inset size: `none`, `small`, `medium`, or `large`; defaults to `none`\n- `workspace`: optional AeroSpace workspace for printed rules\n- `sourceApp`: optional override for the source `.app`\n- `installDir`, `profilesDir`, `iconsDir`: optional per-bundle path overrides\n- `bundleIdPrefix`, `executableName`: advanced overrides\n\nKeys and ids may contain only letters, numbers, dots, underscores, and hyphens.\nDisplay names must not be empty or contain `/`.\n\n`defaultUrl` works for every supported browser. `appType = \"app\"` is only\nsupported for Chrome-family browsers: Chromium, Chrome, Chrome Canary, Brave, and\nEdge. Firefox always opens the URL in normal browser mode.\n\nGenerated apps are written as `<displayName>.app`. Browserfi marks generated\nbundles in `Info.plist` with ownership metadata. If a target app name already\nexists, Browserfi only overwrites it when it is managed by the same config and\nsame bundle id. Apps from other Browserfi configs, or third-party apps such as\nGoogle Chrome, are rejected until the existing app is deleted manually.\n\n## Custom Icons\n\nSet `icon` on a bundle to use a specific SVG, PNG, JPG, or ICNS file. Local paths and\n`http(s)` URLs are supported:\n\n```toml\n[[bundles]]\nbrowser = \"chromium\"\nkey = \"user-console-monorepo\"\ndisplayName = \"User Console Monorepo\"\nicon = \"./icons/console.icns\"\n```\n\n```toml\n[[bundles]]\nbrowser = \"chromium\"\nkey = \"docs\"\ndisplayName = \"Docs\"\nicon = \"https://example.com/icon.svg\"\niconColor = \"#34CDD7\"\niconBackgroundColor = \"#111111\"\niconInset = \"small\"\n```\n\nIf `icon` is not set, Browserfi looks for a square PNG or JPG, ideally `1024x1024`,\nor a pre-built `.icns` in `icons/`, named after the bundle key:\n\n```text\nicons/<key>.png\nicons/<key>.jpg\nicons/<key>.jpeg\nicons/<key>.icns\n```\n\n`browserfi build` picks icons up by explicit path, URL, or convention. It\ndownloads URL icons during build, converts SVG, PNG, and JPG files to ICNS, replaces\n`Contents/Resources/app.icns`, deletes `CFBundleIconName` from `Info.plist`,\nre-signs ad-hoc, and refreshes Launch Services.\n\nImage icons are normalized onto a `1024x1024` canvas before conversion. Browserfi\npreserves SVG `viewBox` values, optionally insets SVG/PNG/JPG artwork so it does\nnot touch the macOS icon edges, optionally tints SVG non-`none` fills and strokes\nwith `iconColor`, and optionally paints `iconBackgroundColor` behind SVG artwork.\nSet `iconInset` to `none`, `small`, `medium`, or `large`; these map to `0px`,\n`96px`, `144px`, and `192px` padding on each side of the `1024x1024` canvas.\nICNS icons are used as supplied.\n\nThe legacy helper [build-icon.sh](build-icon.sh) can still build a simple\nmacOS-style PNG from an SVG:\n\n```bash\n./build-icon.sh <key> <svg-url-or-path>\n```\n\n## AeroSpace\n\nEach generated bundle is detectable by app id:\n\n```toml\n[[on-window-detected]]\nif.app-id = \"com.adrian.chromium-<id>\"\nrun = \"move-node-to-workspace <workspace>\"\n```\n\n`browserfi aerospace` prints rules for every bundle with a `workspace` value.\n`browserfi aerospace --write` updates a managed block in your AeroSpace config:\n\n```toml\n# BEGIN browserfi\n[[on-window-detected]]\nif.app-id = \"com.adrian.chromium-user-console-monorepo\"\nrun = \"move-node-to-workspace 6_User_Console\"\n# END browserfi\n```\n\nBy default, browserfi writes to whichever AeroSpace config exists:\n\n1. `~/.aerospace.toml`\n2. `$XDG_CONFIG_HOME/aerospace/aerospace.toml`, or `~/.config/aerospace/aerospace.toml`\n\nIf both exist, pass `--aerospace-config <path>` explicitly. Add `--reload` to run\n`aerospace reload-config` after writing.\n\n## Project Layout\n\n```text\nsrc/                    TypeScript CLI source\n.browserfi.toml         Local bundle config\nbrowserfi.example.toml  Starter config for browserfi init\nicons/                  Per-bundle icon files\nmake-bundles.sh         Legacy Bash implementation\nbuild-icon.sh           Legacy SVG-to-PNG icon helper\n```\n\n## Caveats\n\n- Bundles are re-signed ad-hoc, so first launch may require System Settings ->\n  Privacy & Security -> Open Anyway.\n- Browser auto-updaters usually update the original app only. Re-run\n  `browserfi build --force` after updating the source browser.\n- Firefox support uses `-profile <dir> -no-remote`; Chromium-family browsers use\n  `--user-data-dir=<dir>`.\n","readmeFilename":"README.md"}