amipkg

The on-Amiga package manager for AmigaImager-built systems — a “brew for Amiga”.

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.

What’s on a built image

PieceWhereWhat it is
amipkgSYS:C/amipkgCLI — run it from any Shell.
amipkg‑guiSYS:Tools/amipkg-gui + dockGadTools GUI (with its parcel icon).
Receipt DBAMIGAIMAGER:db/installed.txt + per-package file inventories.
Seeded indexAMIGAIMAGER:packages.jsonHost-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.

Using the command line

Type amipkg in any AmigaShell for the command list:

CommandDoes
amipkg listList installed packages and their versions (from the receipt DB).
amipkg checkCompare 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.
Networking is manual. 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.

Using the GUI

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:

  • Check Updates — what the index has newer.
  • Info — details for the selected package.
  • Remove — with a confirmation requester.
  • Refresh — reload the list.

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 online repository

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.jsonthomas-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.

How trust works

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.

Adding a package to 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.

  1. Make sure it's redistributable and host the .lha on a stable place — ideally Aminet (mirrored, and reachable over plain HTTP, which amipkg needs).
  2. Scaffold the entry with the repo's 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.json
  3. Self-check, then open a pull request:
    python3 amigapkg.py validate packages/foo.json --check-archives

CI validates the PR (schema, id, capabilities, and that the archive's SHA-256 matches). A maintainer reviews the metadata + license, then merges.

Maintainer — sign & publish

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
Fetch vs install. An entry with an 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.

Status

AreaState
CLI (list/check/info/remove)validated on AmigaOS 3.2 (FS-UAE)
GUI, dock button, iconbuilds & installs; on-Amiga behaviour pending UAE validation
Network fetch/installwritten to the bsdsocket API; live download path not yet exercised on a networked image
Online repolive — github.io/amiga-pkg, signed & served via GitHub Pages
Add-to-repo flowpkgindex add / validate / generate --extra + PR-based submission & CI, working