Skip to content

Fill the remaining tooling gaps in the default template - #9

Merged
defkode merged 1 commit into
mainfrom
template-tooling-gaps
Aug 30, 2026
Merged

defkode merged 1 commit into
mainfrom
template-tooling-gaps

Conversation

@defkode

@defkode defkode commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Closes #5.

Every addition was checked against a machine built from this template rather than read off the file — which turned out to matter, because two of the package names in it don't resolve on 26.04 at all.

Python, git-lfs, and friends via mise

Python comes from mise, not apt. Ubuntu's python3 has no pip and no working venv (ensurepip is not available), and apt install python3-pip doesn't fix it: /usr/lib/python3.14/EXTERNALLY-MANAGED means pip then refuses to install anything outside a venv — the same confusing failure, one step later. mise's precompiled Python installs in 4 seconds and ships a pip that works (verified with pip install requests, no flags). uv comes along for venvs and uv tool install, covering what pipx does at 50 apt packages.

git-lfs needs two lines, not one. Installing the binary leaves the bug in place: until git lfs install writes the clean/smudge filters, cloning an LFS repo still yields pointer files and nothing errors to say so. Confirmed by reading filter.lfs.clean before and after.

The mise tools get their own mise use -g line. Sharing the line with ruby@latest node@lts would let a failed shellcheck download take the language runtimes with it.

From apt, where mise has nothing to offer

lsof and bind9-dnsutils for "what holds port 3000" and "does this host resolve", plus rsync, zip, file, and moreutils (sponge).

Two package names that never worked

bind9-dnsutils, not dnsutils — and postgresql-contrib is dropped entirely. Neither name has a candidate on 26.04, and cloud-init doesn't behave like the CLI here: apt-get install dnsutils resolves the virtual name happily, but cloud-init pre-checks each name against APT, silently drops what it can't resolve, and then fails the entire package stage:

The following packages were not found by APT so APT will not attempt
to install them: ['postgresql-contrib', 'dnsutils']

postgresql-contrib has been in this template since the first commit, so that stage has been failing on every machine ever built from it. Nothing was lost by it — postgresql-18 ships the contrib extensions itself, and hstore, pg_trgm, citext, uuid-ossp, and pg_stat_statements are all in pg_available_extensions without the package (CREATE EXTENSION hstore succeeds on a machine built from this branch).

Not added

Per the issue: imagemagick (libvips covers it), memcached (Solid Cache), and more human TUIs. yq was considered and dropped — for reading YAML the already-installed Ruby is equivalent, and its one real advantage, comment-preserving in-place edits, didn't carry the entry. Two more from the issue turned out to be unnecessary: netcat-openbsd and tzdata are already present on a stock machine.

Verification

Built a fresh machine from this template (orbx up --template ./templates/default.yaml) and confirmed on it:

  • dig +short github.com resolves; nslookup, host, lsof, rsync, zip, file, sponge all present
  • Python 3.14.7, pip 26.2.1, working venv, pip install with no PEP 668 flags
  • uv, shellcheck, git-lfs on PATH under orbx run as well as orbx shell; filter.lfs.clean registered
  • Ruby 4.0.6 / Node 24.20 / Rails 8.1.3.1 intact — the second mise line costs the first nothing
  • cloud-init's package stage completes with no dropped names and no PackageInstallerError
  • per-user provisioning: 40 seconds end to end

Cost: ~3 MB of apt packages and 215 MB of mise tools, against the 636 MB Ruby and Node already occupy.

Tests: 5 new cases in test/template.bats, including regression guards that pin the bare dnsutils and postgresql-contrib names out. 78/78 bats pass, shellcheck clean.

Every addition here was checked against a machine built from this
template, not read off the file. That mattered: two of the names in it
do not resolve on 26.04 at all.

Python comes from mise rather than apt. Ubuntu's python3 has no pip and
no working venv ("ensurepip is not available"), and apt's python3-pip
does not fix it: /usr/lib/python3.14/EXTERNALLY-MANAGED means pip then
refuses to install anything outside a venv, which is the same confusing
failure one step later. mise's precompiled Python installs in 4 seconds
and ships a pip that works -- verified with `pip install requests`, no
flags. uv comes along for venvs and `uv tool install`, covering what
pipx does at 50 apt packages.

git-lfs needs two lines, not one. Installing the binary leaves the bug
in place: until `git lfs install` writes the clean/smudge filters,
cloning an LFS repo still yields pointer files and nothing errors to say
so. Confirmed by reading filter.lfs.clean before and after.

The mise tools go on their own `mise use -g` line. Sharing the line with
ruby@latest node@lts would mean a failed shellcheck download taking the
language runtimes with it.

From apt, where mise has nothing to offer: lsof and bind9-dnsutils for
"what holds port 3000" and "does this host resolve", plus rsync, zip,
file and moreutils (sponge).

bind9-dnsutils, not dnsutils, and no postgresql-contrib. Neither name
has a candidate on 26.04, and cloud-init does not behave like the CLI
here: `apt-get install dnsutils` resolves the virtual name happily, but
cloud-init pre-checks each name against APT, silently drops what it
cannot resolve, and then fails the entire package stage --

  The following packages were not found by APT so APT will not attempt
  to install them: ['postgresql-contrib', 'dnsutils']

postgresql-contrib has been in this template since the first commit, so
that stage has been failing on every machine built from it. Nothing was
lost by it: postgresql-18 ships the contrib extensions itself, and
hstore, pg_trgm, citext, uuid-ossp and pg_stat_statements are all in
pg_available_extensions without the package.

Not added, per the issue: imagemagick (libvips covers it), memcached
(Solid Cache), and more human TUIs. yq was considered and dropped -- for
reading YAML the already-installed Ruby is equivalent, and its one real
advantage, comment-preserving in-place edits, did not carry the entry.
Two more from the issue turned out to be unnecessary: netcat-openbsd and
tzdata are both already present on a stock machine.

Cost, measured: ~3 MB of apt packages and 215 MB of mise tools, against
the 636 MB Ruby and Node already occupy. Per-user provisioning ran 40
seconds end to end.

Closes #5
@defkode
defkode merged commit 9f43e99 into main Aug 30, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fill remaining tooling gaps in the default template

1 participant