Installation and release files
Pablo releases use four versioned archives, one for each supported operating-system and architecture pair. The installer chooses the target from uname, verifies the archive before extraction, executes the candidate’s --version, and writes only the executable and an ownership receipt beneath an absolute prefix.
Prerelease delivery
The installer and release-candidate pipeline are implemented, but the four candidates still need their full native acceptance gates before they can be published. Until a version appears in release status, build from source.
Supported targets
| Target | Runtime requirement | Distribution limit |
|---|---|---|
aarch64-apple-darwin | macOS 11.0 or newer on Apple silicon | Unsigned and not notarized |
x86_64-apple-darwin | macOS 10.15 or newer on Intel | Unsigned and not notarized |
aarch64-unknown-linux-gnu | 64-bit Linux with glibc 2.35 or newer | GNU libc build; musl is not supported |
x86_64-unknown-linux-gnu | 64-bit Linux with glibc 2.35 or newer | GNU libc build; musl is not supported |
The macOS deployment targets are set explicitly during compilation. Linux candidates are built natively on Ubuntu 22.04 runners and declare glibc 2.35 as the minimum. Each target manifest records the build runner, dynamic-library report, runtime requirements, signing state, binary hash, and the checkpoint that owns full native acceptance.
Install an exact version
Download the small POSIX shell installer from the documentation site and inspect it before execution:
curl -fsSLo /tmp/pablo-install.sh https://runpablo.pages.dev/install.sh
less /tmp/pablo-install.sh
sh /tmp/pablo-install.sh \
--version v0.0.1 \
--prefix "$HOME/.local"The version is required; there is no moving latest channel. The prefix must be absolute. The installer downloads the matching archive and .sha256 file from https://runpablo.pages.dev/releases/<version>/, backed by a private Cloudflare R2 bucket through a read-only Pages Function.
Installation fails before changing the prefix when:
- the archive or checksum cannot be downloaded over HTTPS;
- the checksum is malformed or does not match;
- the archive does not contain the exact versioned
bin/pablomember; - the candidate does not execute or reports another version;
- another
pablocommand is visible outside the selected prefix; or $PREFIX/bin/pabloalready exists.
Pablo never invokes sudo, a package manager, Node, or Python. Add $HOME/.local/bin to PATH yourself when that is your chosen prefix.
Update, replacement and removal
Update to another exact version with the same inspected installer:
sh /tmp/pablo-install.sh \
--version v0.0.2 \
--prefix "$HOME/.local" \
--update--update requires an existing receipt from this installer, checks the installed binary hash and target, and refuses the same version or a locally changed executable. The new archive still passes download, checksum and candidate-version validation before replacement. If receipt installation fails, the previous binary is restored.
Use --replace for the broader explicit policy that replaces any regular, non-symlink pablo file at the selected path. It does not require an earlier receipt, so inspect the target yourself before choosing it.
An installation receipt at $PREFIX/share/pablo/install-receipt records the version, target, binary path, and binary SHA-256. Removal checks that receipt and refuses to delete a binary whose bytes changed:
sh /tmp/pablo-install.sh --prefix "$HOME/.local" --removeRemoval leaves unrelated files and directories beneath the prefix in place.
Verify a download manually
Every archive has an adjacent checksum file, and the release set includes SHA256SUMS:
version=v0.0.1
target=aarch64-apple-darwin
base="https://runpablo.pages.dev/releases/$version"
archive="pablo-$version-$target.tar.gz"
curl -fsSLO "$base/$archive"
curl -fsSLO "$base/$archive.sha256"
shasum -a 256 -c "$archive.sha256"
tar -tzf "$archive"On Linux, use sha256sum -c instead of shasum -a 256 -c when preferred.
Archive contents
The archive has one versioned root and never writes outside it:
pablo-v0.0.1-aarch64-apple-darwin/
├── bin/pablo
├── LICENSE
├── NOTICE
├── THIRD_PARTY_NOTICES.json
├── licenses/<license-content-sha256>.txt
└── manifest/
├── source.json
├── build.json
└── target.jsonLICENSE contains Pablo’s MIT license. source.json records the Git commit and tree, source fingerprint, Cargo.lock hash, version, and source epoch. build.json records the locked release command, Rust, Cargo and Node identities, runner, binary hash, and deterministic archive settings. target.json records the target triple, platform requirements, dynamic libraries, signing state, and native-acceptance status.
The packer writes lexically ordered ustar entries with fixed ownership and timestamps, then creates a gzip stream with a zero timestamp. Repackaging identical inputs produces identical archive bytes. The third-party inventory comes from the target-filtered locked Cargo dependency closure; bundled license and notice files are deduplicated by content hash while package attribution remains machine-readable.
Build from source
Source builds use Rust 1.98.1 and the checked-in lockfile:
git clone https://github.com/calebjohn24/pablo.git
cd pablo
cargo build --release --locked -p pablo --bin pablo
./target/release/pablo --versionThe release profile enables thin LTO, uses one codegen unit, and strips symbols. Source builds are distinct from official release candidates because they do not carry the candidate archive’s source, build, target, and native-acceptance identities.