Pin OMATERM/omadots to native-frozen forks (upstream went Docker-only)

Upstream omacom-io/omaterm deleted the native install path on 2026-06-01
and went Docker-only (omaterm.org/install now installs Docker + a container
launcher). That would split this headless box into a host (Once/once-add/
omarchy-send) and a container (agents) with the baked CLAUDE.md/skill unseen
by an in-container agent.

Instead, keep the unified-host native install by sourcing OMATERM from a
pinned fork:
- All 7 install-native.sh URLs -> 28allday/omaterm @native-frozen
  (self-consistent: its setup_git_checkout clones the same frozen branch).
- dotfiles pinned via 28allday/omadots @native-frozen.
- Native first-login flow unchanged (mktemp + /dev/tty sed + exec bash -l
  OMATERM-last closer); only the source moved off the deleted upstream path.
- AI agents still come live from mise, so they stay current.

Updated the rationale comment, baked CLAUDE.md, and README fork disclosure.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
28allday 2026-06-01 21:22:26 +01:00
parent 307901c0d2
commit f280e8a5f7
2 changed files with 22 additions and 15 deletions

View file

@ -8,8 +8,11 @@ or `dd`) and you get a reproducible, minimal Arch server that's ready for
self-hosting in minutes. self-hosting in minutes.
> **Not affiliated with OMATERM or Once.** `omalocal` is an *ISO builder*. It > **Not affiliated with OMATERM or Once.** `omalocal` is an *ISO builder*. It
> bundles and runs the official upstream installers; it does not vendor or fork > bundles and runs the official upstream installers. The one exception: since
> them. > upstream OMATERM went Docker-only (2026-06), omalocal installs OMATERM from a
> pinned fork ([`28allday/omaterm`](https://github.com/28allday/omaterm), branch
> `native-frozen`) that preserves the native, host-level install. AI agents are
> still pulled live from mise, so they stay current.
--- ---

View file

@ -406,7 +406,7 @@ cat <<'BANNER'
and messaging (the firewall already opens 53317). and messaging (the firewall already opens 53317).
Installers (run any of these later if you skip): Installers (run any of these later if you skip):
curl -fsSL https://raw.githubusercontent.com/omacom-io/omaterm/refs/heads/master/install-native.sh | bash curl -fsSL https://raw.githubusercontent.com/28allday/omaterm/native-frozen/install-native.sh | bash
curl https://get.once.com | ONCE_INTERACTIVE=false sh curl https://get.once.com | ONCE_INTERACTIVE=false sh
curl -fsSL https://raw.githubusercontent.com/28allday/omarchy-send/main/install.sh | bash curl -fsSL https://raw.githubusercontent.com/28allday/omarchy-send/main/install.sh | bash
@ -419,7 +419,7 @@ case "$ans" in
echo echo
echo " Skipped. To set up later, run:" echo " Skipped. To set up later, run:"
echo " curl https://get.once.com | ONCE_INTERACTIVE=false sh" echo " curl https://get.once.com | ONCE_INTERACTIVE=false sh"
echo " curl -fsSL https://raw.githubusercontent.com/omacom-io/omaterm/refs/heads/master/install-native.sh | bash" echo " curl -fsSL https://raw.githubusercontent.com/28allday/omaterm/native-frozen/install-native.sh | bash"
echo echo
;; ;;
*) *)
@ -486,12 +486,16 @@ esac
# OMATERM now also installs the AI agents itself (node, opencode, claude-code, # OMATERM now also installs the AI agents itself (node, opencode, claude-code,
# codex, gemini are in its mise.packages), so there's no separate agent step. # codex, gemini are in its mise.packages), so there's no separate agent step.
# #
# We call install-native.sh directly rather than omaterm.org/install: the vanity # We pull install-native.sh from our PINNED FORK (28allday/omaterm, branch
# URL is now a dispatcher that interactively asks "native or Docker?" — which would # `native-frozen`), NOT upstream. As of 2026-06-01 upstream omacom-io/omaterm
# stall this otherwise unattended first-run flow. install-native.sh is the native # deleted the native install path and went Docker-only (omaterm.org/install now
# branch of that dispatcher, is self-contained (it clones the omaterm repo into its # installs Docker + an `omaterm` container launcher), which would split this
# own tmpdir), and is exactly what a headless Arch box wants. Same URL pattern the # headless box into a host (Once/once-add/omarchy-send) + container (agents)
# dispatcher itself uses; override the branch with OMATERM_REF if needed. # world. native-frozen is the last good native installer, self-consistent (its
# internal `setup_git_checkout` clones the fork's own native-frozen branch, so
# the package lists/configs match) — it installs OMATERM + its AI agents
# natively on the host, keeping everything on one PATH. Agents still come live
# from mise, so they stay current. See project memory for the freeze rationale.
# #
# OMATERM's installer ends by exec'ing `bash -l`, whose .bashrc auto-starts tmux # OMATERM's installer ends by exec'ing `bash -l`, whose .bashrc auto-starts tmux
# (omadots aliases `t`='tmux attach || tmux new -s Work'). Its exact closer is # (omadots aliases `t`='tmux attach || tmux new -s Work'). Its exact closer is
@ -518,19 +522,19 @@ if [ "$setup_server" = 1 ]; then
echo " into your new shell." echo " into your new shell."
echo echo
omaterm_installer="$(mktemp)" omaterm_installer="$(mktemp)"
if curl -fsSL https://raw.githubusercontent.com/omacom-io/omaterm/refs/heads/master/install-native.sh -o "$omaterm_installer"; then if curl -fsSL https://raw.githubusercontent.com/28allday/omaterm/native-frozen/install-native.sh -o "$omaterm_installer"; then
# Neutralise the /dev/tty redirect on OMATERM's final `exec bash -l`. # Neutralise the /dev/tty redirect on OMATERM's final `exec bash -l`.
sed -i 's@exec bash -l </dev/tty >/dev/tty 2>&1@exec bash -l@' "$omaterm_installer" sed -i 's@exec bash -l </dev/tty >/dev/tty 2>&1@exec bash -l@' "$omaterm_installer"
# No </dev/tty here: let OMATERM (and its closing exec) inherit our pts fds. # No </dev/tty here: let OMATERM (and its closing exec) inherit our pts fds.
bash "$omaterm_installer" || { bash "$omaterm_installer" || {
echo " OMATERM install did not complete — retry later with:" echo " OMATERM install did not complete — retry later with:"
echo " curl -fsSL https://raw.githubusercontent.com/omacom-io/omaterm/refs/heads/master/install-native.sh | bash" echo " curl -fsSL https://raw.githubusercontent.com/28allday/omaterm/native-frozen/install-native.sh | bash"
} }
rm -f "$omaterm_installer" rm -f "$omaterm_installer"
else else
rm -f "$omaterm_installer" rm -f "$omaterm_installer"
echo " Could not download the OMATERM installer — retry later with:" echo " Could not download the OMATERM installer — retry later with:"
echo " curl -fsSL https://raw.githubusercontent.com/omacom-io/omaterm/refs/heads/master/install-native.sh | bash" echo " curl -fsSL https://raw.githubusercontent.com/28allday/omaterm/native-frozen/install-native.sh | bash"
fi fi
fi fi
OMALOCAL_FIRSTRUN OMALOCAL_FIRSTRUN
@ -717,7 +721,7 @@ Installed by `omalocal.sh`, a single-script patcher that takes a stock Arch ISO
On the user's first interactive login a self-removing `~/.bash_profile` hook offers to set up the server. Once is installed first; OMATERM is installed last because its installer ends with `exec bash -l` and drops the user straight into their new shell: On the user's first interactive login a self-removing `~/.bash_profile` hook offers to set up the server. Once is installed first; OMATERM is installed last because its installer ends with `exec bash -l` and drops the user straight into their new shell:
- **Once** (https://once.com)`curl https://get.once.com | ONCE_INTERACTIVE=false sh` — Basecamp's self-hosted app deployment platform. - **Once** (https://once.com)`curl https://get.once.com | ONCE_INTERACTIVE=false sh` — Basecamp's self-hosted app deployment platform.
- **Omaterm** (https://omaterm.org)`curl -fsSL https://raw.githubusercontent.com/omacom-io/omaterm/refs/heads/master/install-native.sh | bash` — terminal-first toolkit: starship, neovim, tmux, mise, docker, lazygit, yay, plus AI agents (claude-code, codex, opencode, gemini), etc. OMATERM installs the AI agents itself (they're in its `mise.packages`), so there's no separate agent step. We call `install-native.sh` directly because `omaterm.org/install` is now a dispatcher that interactively prompts native-vs-Docker; the native branch is what a headless Arch box wants. - **Omaterm** (https://omaterm.org)`curl -fsSL https://raw.githubusercontent.com/28allday/omaterm/native-frozen/install-native.sh | bash` — terminal-first toolkit: starship, neovim, tmux, mise, docker, lazygit, yay, plus AI agents (claude-code, codex, opencode, gemini), etc. OMATERM installs the AI agents itself (they're in its `mise.packages`), so there's no separate agent step. We pull `install-native.sh` from our pinned fork (`28allday/omaterm`, branch `native-frozen`) because upstream went Docker-only on 2026-06-01 and deleted the native path; the frozen fork keeps OMATERM + its agents installed natively on the host (one PATH alongside `once`/`once-add`/`omarchy-send`), rather than in a separate container. Agents still come live from mise.
If the user declined, install them manually with those same two commands. If the user declined, install them manually with those same two commands.
@ -1118,7 +1122,7 @@ echo " ssh $USERNAME@<this-host-ip> (or ssh $USERNAME@$HOSTNAME)"
echo echo
echo " On your first login you'll be offered the omalocal setup. To set" echo " On your first login you'll be offered the omalocal setup. To set"
echo " them up manually at any time:" echo " them up manually at any time:"
echo " curl -fsSL https://raw.githubusercontent.com/omacom-io/omaterm/refs/heads/master/install-native.sh | bash" echo " curl -fsSL https://raw.githubusercontent.com/28allday/omaterm/native-frozen/install-native.sh | bash"
echo " curl https://get.once.com | ONCE_INTERACTIVE=false sh" echo " curl https://get.once.com | ONCE_INTERACTIVE=false sh"
echo "==================================================================" echo "=================================================================="
echo echo