Ubunatic Coding

Stories · Linux Systems, Hosting & Infrastructure · 🏠 venile.de

This project is in an early phase; its repository is not public yet. Copied from venile.de/docs/studies/2026-10-04-static-tools-in-restricted-hosting-story.md.

Turning a Restricted Web Host into a Useful Workspace

Date: 2026-10-04
Project: venile.de
Scope: Static site deployment and a portable command-line toolkit for restricted shared hosting.

When a shell is barely a shell

Shared hosting can be a frustrating place to do even ordinary maintenance. A browser terminal or SSH session may open, but the environment behind it can be deliberately small: system directories are read-only, there is no package manager, and familiar commands such as find or which may be missing. Installing a favorite file manager is not an option when the host has no compiler and cannot load binaries built for a different system.

This repository began as a small static website with a simple deployment path. Its more unusual job became building the tools that the hosting environment did not provide. The site itself remains plain HTML and CSS, with no framework or build step. The supporting toolkit uses Bash and Make, and builds Linux executables inside Alpine containers using musl. It deploys them over SSH into a user-writable directory. The deployment scripts check the target architecture before copying binaries.

The project’s guide describes a suite that grew to include Midnight Commander, common command-line utilities, a small health auditor, and a terminal image viewer. The point was not simply to collect programs. Each one needed to work without relying on system libraries or standard runtime data that the host did not have.

A bug that survived the static build

One particularly instructive failure came after Midnight Commander had been compiled as a static binary. The executable no longer depended on shared libraries, yet launching it still failed with an error about opening the xterm-256color terminal. Static linking had solved the binary’s library problem, but not its separate need to look up terminal capabilities in a terminfo database. That data normally lives in system directories absent from the restricted environment.

The solution was to treat runtime data as part of the deployment. The build packaged terminal definitions, deployment unpacked them under a writable application directory, and the shell environment pointed ncurses to that location through TERMINFO. The account also needed a predictable search path for the installed commands. Those settings were added idempotently, so a repeat deployment would not keep appending duplicate lines.

The same practical investigation exposed other assumptions. A health-auditing script initially called cut, which was not installed; it was revised to use awk, another utility included in the toolkit. A script using #!/usr/bin/env bash could not start because that path was absent, so the remote script used the host’s Bash path directly. The project’s case study also records a probe of a terminal UI that expected /dev/tty; when that device was unavailable, the experiment was rolled back and a different, compatible image-viewing tool was integrated.

These are small failures, but they are precisely the kind that a local build cannot reveal. A binary can pass a static-link check and still fail because of a missing data file, an unavailable shell helper, or an assumption about terminal devices.

A repeatable path from build to diagnosis

The repository turns those lessons into a workflow. Container recipes provide a consistent Alpine musl build environment. Verification scripts inspect static linkage and executable architecture. Deployment scripts compare the binary and target architecture before installing. A remote auditor reports whether the installed tools run and provides basic version and file information. Canary scripts test uncertain integrations before they become part of the wider toolchain.

The commit history shows this toolkit arriving in a concentrated sequence: an initial static build pipeline, additional utilities, the auditor, an unsuccessful experiment that was reverted, and then a compatible image viewer. The existing case study records the concrete obstacles and fixes. This workflow is agent-friendly because it gives coding work clear boundaries: a canary can answer one narrow compatibility question, a build script can be checked independently, and verification can turn an environmental assumption into an explicit check. The repository does not preserve a formal sprint or ticket trail, so it would be misleading to attribute the work to a particular multi-agent run. What it does preserve is the engineering evidence: code, commits, reproducible checks, and a candid post-mortem.

What this demonstrates

Agentic development is useful here less as a story of writing code at extraordinary speed than as a way to work through a broad chain of small constraints. Building and deploying a collection of static tools touches packaging, shell behavior, terminal databases, architecture, remote configuration, and user-facing diagnosis. The important discipline is to test each boundary, record what failed, and keep the resulting fixes reproducible.

The site still presents itself as a work in progress and promises small JavaScript experiments. The toolkit is a separate, more mature experiment: a practical answer to the question, “What can I bring with me when the host gives me almost nothing?”

Facts

Item Verified detail
Stack HTML/CSS, Bash, Make, Alpine Linux, musl, Docker or Podman, SSH
Repository size 31 tracked files at the time of review
Toolkit 12 tools described in the existing case study
Recent activity 4 commits in the six weeks before 2026-10-04; upkeep and documentation
Feature sequence Static toolchain, audit CLI, canary experiment and rollback, image viewer (Aug 2026)