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.
> **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
> them.
> bundles and runs the official upstream installers. The one exception: since
> 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).
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 -fsSL https://raw.githubusercontent.com/28allday/omarchy-send/main/install.sh | bash
@ -419,7 +419,7 @@ case "$ans" in
echo
echo " Skipped. To set up later, run:"
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
;;
*)
@ -486,12 +486,16 @@ esac
# 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.
#
# We call install-native.sh directly rather than omaterm.org/install: the vanity
# URL is now a dispatcher that interactively asks "native or Docker?" — which would
# stall this otherwise unattended first-run flow. install-native.sh is the native
# branch of that dispatcher, is self-contained (it clones the omaterm repo into its
# own tmpdir), and is exactly what a headless Arch box wants. Same URL pattern the
# dispatcher itself uses; override the branch with OMATERM_REF if needed.
# We pull install-native.sh from our PINNED FORK (28allday/omaterm, branch
# `native-frozen`), NOT upstream. As of 2026-06-01 upstream omacom-io/omaterm
# deleted the native install path and went Docker-only (omaterm.org/install now
# installs Docker + an `omaterm` container launcher), which would split this
# headless box into a host (Once/once-add/omarchy-send) + container (agents)
# 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
# (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
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`.
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.
bash "$omaterm_installer" || {
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"
else
rm -f "$omaterm_installer"
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
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:
- **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.
@ -1118,7 +1122,7 @@ echo " ssh $USERNAME@<this-host-ip> (or ssh $USERNAME@$HOSTNAME)"
echo
echo " On your first login you'll be offered the omalocal setup. To set"
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 "=================================================================="
echo