Astrohacker TermSurf is a desktop host with a real browser in the pane. Run
roamari, open a URL, and the page appears alongside shells and other terminal
workflows.
Open a site in a browser pane:
roamari astrohacker.comOpen the same site under a named browser profile (separate cookies and logins):
roamari astrohacker.com --profile workTermSurf apps are native graphical apps that run inside your terminal with real GUIs based on web technologies. Two examples ship with the product:
Open the scientific calculator:
ahcalcThis public repository contains the open source client material synced from the private Astrohacker monorepo for source releases. It includes:
assets/— the canonical TermSurf mark (termsurf.svg) and its generatedtermsurf-<theme>-<size>.<format>/dock projections, plus product story screenshots underassets/screenshots/story/.docs/— product docs and public legal/records.scripts/— public build/install helpers and smoke scripts.rust/— TermSurf client/protocol/native support code.patches/— shipped fork patch archives, per-fork READMEs, andrelease-manifest.json(Chromium, Ghostty, Nushell, Reedline, plus historical WebKit/Gecko/Ladybird records).
Large upstream fork checkouts and build outputs are not committed here
(forks/ is intentionally empty/gitignored). You reconstruct local engine and
host workspaces from patches/ before a from-source build.
Product story shots from a real Astrohacker TermSurf window (multi-profile first, then composition, then solo surfaces).
This is Astrohacker TermSurf: a normal terminal window with a real Chromium browser running as a pane—same app, same window, not a separate browser you alt-tab to.
The Astrohacker Homebrew cask targets Apple silicon macOS and installs into
/Applications as Astrohacker TermSurf.app:
brew trust astrohackerlabs/astrohacker
brew tap astrohackerlabs/astrohacker
brew install --cask termsurfTo upgrade:
brew update
brew upgrade --cask termsurfMost people should use the Install section above. Building from this repo is for developers who want a patched engine and host from source.
| Included | Not included |
|---|---|
Client source under code/, scripts, docs, assets |
Pre-built engines or app bundles |
patches/ — full .patch archives + reconstruction notes |
Checked-in forks/ trees (Chromium, Ghostty, …) |
patches/release-manifest.json — exact bases, heads, ordered patch dirs |
Automatic one-command clone of Chromium (you reconstruct manually) |
scripts/build.nu only compiles workspaces that already exist under
forks/. If forks/chromium/src (or Ghostty, etc.) is missing, the script
skips that component — it does not download upstream or apply patches for
you.
Typical host: Apple silicon macOS, with:
- Xcode (and command-line tools)
- Zig, at the version Ghostty's
forks/ghostty/build.zig.zonnames inminimum_zig_version(same major.minor). Homebrew's plainzigtracks the newest release and may not match, so install the versioned keg-only formula.scripts/build.nufinds it, or stops and prints the exactbrew install zig@<major>.<minor>command. - Rust (
rustup) - Bun (for TermSurf apps that need it)
- Chromium
depot_toolsand a full Chromium source checkout workflow (large disk + long first build)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
curl -fsSL https://bun.sh/install | bashInstall Chromium depot_tools and follow Google’s Chromium macOS setup for
fetching source (this repo does not vendor Chromium).
-
Read
patches/README.mdand the machine-readable pinpatches/release-manifest.json(orderedpatch_directories,base,expected_head/expected_treeper shipped fork). -
For each fork you need, follow that fork’s README (clone/checkout base, create the product branch,
git amthe ordered archives):Fork Checkout path Docs Chromium (shipped engine) forks/chromium/srcpatches/chromium/README.mdGhostty (host / termsurf)forks/ghosttypatches/ghostty/README.mdNushell forks/nushellpatches/nushell/README.mdReedline forks/reedlinepatches/reedline/README.mdWebKit / Gecko / Ladybird under
patches/are historical only — not required for a current product build. -
Pattern (simplified; use the base SHA and archive list from the release-manifest + per-fork README, not invent paths):
# Run from the repository root after provisioning the fork and recorded base. let entry = (open patches/release-manifest.json | get forks | where name == ghostty | first) let root = $env.PWD let files = ($entry.patch_directories | each {|dir| glob ($root | path join $dir '*.patch') | sort } | flatten) git -C $entry.checkout switch -c $entry.branch $entry.base if not ($files | is-empty) { git -C $entry.checkout am ...$files }
Chromium’s base is an Electron Chromium tag/commit recorded in the manifest; fetch that tree with
depot_tools/ your usual Chromium workflow intoforks/chromium/src, then apply the Chromium series the same way. -
Confirm the reconstructed tree matches
expected_treeand the ordered patch identities/count match the selected archive. Recordgit rev-parse HEADseparately: replaying the same patches can change commit hashes, so equality withexpected_headalone is not the reconstruction oracle. In the internal Astrohacker monorepo,ah fork check <name>performs the full readiness check; see itspatches/AGENTS.mdfor preparation and export tooling.
Expect a large Chromium build (many GB, often hours on first compile).
After forks are reconstructed and (for Chromium) built as needed:
scripts/build.nu chromium # Chromium fork / roamari-chromiumd path
scripts/build.nu roamari
scripts/build.nu ahtermRelease-style local build (still requires reconstructed forks):
scripts/build.nu termsurf --releaseThe host app bundle (when the Ghostty/ahterm build component succeeds) is written to:
forks/ghostty/macos/build/Release/Astrohacker TermSurf.app
During development, launch the Ghostty-based host from the reconstructed Ghostty workspace:
cd forks/ghostty
^(nu ../../scripts/lib/zig-toolchain.nu) build -Demit-macos-app=false
cd macos
./build.nu --configuration Debug --action buildInside Astrohacker TermSurf, run a local roamari and point it at a built
engine (paths after a successful Chromium/roamari-chromiumd build):
./target/debug/roamari \
--browser ./forks/chromium/src/out/Default/roamari-chromiumd \
https://example.comSee LICENSE, NOTICE, and TRADEMARKS.md.







