Update the software on a running Amiga, or install more, without rebuilding the whole
disk image. amipkg ships on every OS image AmigaImager builds: a command-line tool in C:,
a Workbench GUI in the dock, a receipt database of what’s installed, and a signed package index served
from the AmigaPKG repository.
| Piece | Where | What it is |
|---|---|---|
amipkg | SYS:C/amipkg | CLI — run it from any Shell. |
amipkg‑gui | SYS:Tools/amipkg-gui + dock | GadTools GUI (with its parcel icon). |
| Receipt DB | AMIGAIMAGER:db/ | installed.txt + per-package file inventories. |
| Seeded index | AMIGAIMAGER:packages.json | Host-verified catalog amipkg checks against. |
Bundling is controlled by Settings → Package Manager → “Install amipkg package manager” (on by default). Turn it off to omit amipkg from an image.
Type amipkg in any AmigaShell for the command list:
| Command | Does |
|---|---|
amipkg list | List installed packages and their versions (from the receipt DB). |
amipkg check | Compare installed versions against the seeded index — shows what has updates. |
amipkg info <id> | Show a package’s details from the index (name, category, version, deps). |
amipkg fetch <id> | Download the package archive and verify its SHA-256. Needs a TCP/IP stack. |
amipkg install <id> | Fetch + verify + unpack + run the recipe + record a receipt. |
amipkg verify <file> <sha256> | Check any file against a digest. |
amipkg remove <id> [FORCE] | Safe removal: only files whose digest still matches and that no other package owns. FORCE overrides. |
1> amipkg check
newmeter version unknown (reinstall to adopt versioning)
ibrowse 3.0 -> 3.0a
Everything is up to date.
1> amipkg remove riva
Removed riva: 0 file(s) deleted, 0 shared kept.
fetch/install need a TCP/IP stack up
(Roadshow on real hardware, or the host stack under UAE/Amiberry). If none is running, amipkg says so and exits
cleanly — bring the network up (GoOnline / your stack), then retry. list, check,
info and remove work fully offline.Launch amipkg-gui from the dock (the parcel icon) or SYS:Tools/. A window lists the
installed packages; the buttons act on the selected one:
Built with GadTools (core OS since 2.0), so it runs on every image — Kickstart 3.0–3.9, no MUI needed. It reads the same receipt DB the CLI does; Remove calls the CLI so both stay in step.
┌ amipkg — Package Manager ──────┐
│ Installed packages │
│ ┌────────────────┐ [Check Upd] │
│ │ ibrowse 3.0a │ [Info ]│
│ │ iconlib 46.4 │ [Remove ]│
│ │ mui38 3.8 │ [Refresh ]│
│ │ newmeter - │ [Quit ]│
│ │ … │ │
│ └────────────────┘ │
└────────────────────────────────┘
The catalog amipkg checks against is a single signed file, published by the AmigaPKG repository (a public GitHub repo that serves it via GitHub Pages) behind a stable custom domain:
packages.json | thomas-luebker.github.io/amiga-pkg/packages.json — the index (id, version, category, archive URL + SHA-256, deps, requirements). |
packages.json.sig | …/packages.json.sig — a detached Ed25519 signature over the exact index bytes. |
The serving host is untrusted — clients verify the signature against a baked-in public key, so the bytes can come from GitHub Pages, a mirror, or anywhere. That's why serving from the repo is safe.
The Mac/iPad app downloads the index, verifies the signature against the project’s baked-in public key, and
seeds that verified copy onto the image as AMIGAIMAGER:packages.json. On the Amiga, amipkg
then verifies each downloaded archive by SHA-256 against that trusted seeded index — one signature
transitively authenticates every archive. amipkg never refreshes the catalog over the network itself (that
would need on-device signature checking, a later phase), so a tampered or swapped index can’t reach it.
Project public key: tqZXIleRDYeU69ZsLNdvN790MUYdEKqvHctivyIhLEY=. The matching private
key stays offline and is never in the repo.
Packages are added to the AmigaPKG repo — one JSON file per package in its packages/
directory, no app-code edits, no signing key needed. It's the Homebrew model: you submit (a pull
request), a maintainer reviews and signs it in.
The submission tools need only Python 3 — no Mac, no Swift, no AmigaImager. Anyone on any OS can add a package.
.lha on a stable place — ideally
Aminet (mirrored, and reachable over plain HTTP, which amipkg needs).amigapkg.py (computes the SHA-256 + size):
python3 amigapkg.py add \
--archive /path/to/foo.lha \
--id foo --name "Foo" --category "Utilities" --version "1.2" \
--url https://aminet.net/.../foo.lha \
--out packages/foo.jsonpython3 amigapkg.py validate packages/foo.json --check-archivesCI validates the PR (schema, id, capabilities, and that the archive's SHA-256 matches). A maintainer reviews the metadata + license, then merges.
Signing stays offline (the private key is never in the repo or CI). After merging, regenerate the signed index and push — GitHub Pages serves it:
swift run pkgindex generate \
--extra <amiga-pkg>/packages/ \
--archives <local-archives-dir> \
--sign @private-key.txt \
--public-key tqZXIleRDYeU69ZsLNdvN790MUYdEKqvHctivyIhLEY= \
--out <amiga-pkg>/docs/packages.json
# then: git add docs/ packages/ && git commit && git push
archive is fetch-able today
(download + SHA-256 verify). On-Amiga install additionally needs a recipe (the unpack/copy
steps); until the on-Amiga recipe runner ships, installs run through the Mac “Manage Software” lane. Fetch-only
entries are fine to publish.| Area | State |
|---|---|
CLI (list/check/info/remove) | validated on AmigaOS 3.2 (FS-UAE) |
| GUI, dock button, icon | builds & installs; on-Amiga behaviour pending UAE validation |
Network fetch/install | written to the bsdsocket API; live download path not yet exercised on a networked image |
| Online repo | live — github.io/amiga-pkg, signed & served via GitHub Pages |
| Add-to-repo flow | pkgindex add / validate / generate --extra + PR-based submission & CI, working |