arospkg By Tomasz Staniak

Find and install software on AROS.

arospkg brings a checked software catalogue to AROS x86_64. Browse by category in PkgManager or use the apkg command in the Shell. Both interfaces use the same engine to check downloads, install applications and protect files you’ve changed.

Version 0.3 is a frozen release candidate, tested on AROS One. It is not released yet.

The PkgManager window on AROS: category and state filters, a list of 25 packages with Micropolis selected and marked installed, and a details panel showing its category, size and the libraries it needs, each checked on this machine. Install, Upgrade, Roll back, Remove and Cancel buttons sit below.
PkgManager 0.2 on AROS, after apkg update fetched the public catalogue. Micropolis is installed; the panel lists what it needs from this machine, checked when you select it.

What you can install.

The catalogue holds 27 programs today: games, editors, file tools and Shell utilities. Every one of them was installed, started and removed on AROS before it was listed. Started means it opened its window or printed its output; it isn’t a promise that every feature of every program works.

GrafX2

A 256-colour pixel-art paint program in the tradition of Deluxe Paint.

Folio

A PDF reader with page thumbnails, search and highlighting.

Micropolis

The classic city-building simulation, ported to AROS.

OpenLoco

An open-source re-implementation of Chris Sawyer’s Locomotion. It needs the data files from your own copy of the game.

SDLPoP

An open-source port of Prince of Persia.

Soliton

Klondike and Freecell.

Lopan

A Mahjong solitaire.

ZapHod

A simple binary file editor.

Also: antiword, bin2iso, blips, ccd2iso, dirtree, gmore, grep, hocoslamfy, iconmake, isomaker, isotool, ominostage, rescode, shooterspace, skandalfoclock, unlzx, untangle, xrick and zunecalc.

GrafX2 2.9 on AROS: the editor window with its splash screen, the tool bar, the palette and the layers bar. Folio on AROS showing a PDF of this page: a column of page thumbnails on the left and the first page on the right. Micropolis on AROS: the choose-a-city screen with a generated map and eight scenario cities. OpenLoco on AROS: the Locomotion title screen with a railway viaduct, windmills and the main menu buttons.
GrafX2, Folio and Micropolis on AROS, each installed by apkg from the public catalogue; Folio is showing this page, printed to PDF. OpenLoco is shown from the same release archive the catalogue points at, with the player’s own Locomotion data files, which the package doesn’t include.

Two ways to use it.

PkgManager, in a window

Filter by category and by whether a package is installed, search names and summaries, and read a package’s details, including what it needs from this machine. Install, Upgrade, Roll back and Remove show what they will do and ask before they do it. Progress is shown while a package downloads and installs, and Cancel is offered only where stopping costs nothing.

apkg, in the Shell

The same operations as commands, for scripts and for anyone who prefers the Shell. Both programs share one engine and one list of installed packages, so either can pick up where the other left off. While one of them is changing something, the other refuses to start a change of its own.

apkg update
Fetches the current catalogue. It doesn’t change any installed program.
apkg search [word]
What the catalogue offers, matched against names, summaries and categories.
apkg install id
Downloads, checks and installs a package into SYS:Packages.
apkg list
What is installed.
apkg remove id
Removes a package and keeps any file you changed.
apkg upgrade id
Moves to a newer packaging of the same program version, and shows the plan first.
apkg rollback id
Goes back one step, to the packaging the last upgrade replaced.
apkg verify id
Compares the installed files with the record and says which changed. It repairs nothing.
--dry-run
With install, remove, upgrade or rollback: shows what would happen and changes nothing.
apkg doctor
Explains anything left unfinished after an interruption. --retry finishes or undoes it.

apkg --help lists everything, including options that exist for testing.

Replay: apkg install zaphod

AROS Shell, recorded apkg output. Nothing runs here.

1.AROS:> apkg install zaphod
fetching https://archives.arosworld.org/share/development/edit/zaphod-v1.3-.x86_64-aros-v11.zip
redirect -> https://arosarchives.os4depot.net/download.php?file=development/edit/zaphod-v1.3-.x86_64-aros-v11.zip
verified and cached SYS:Packages/cache/zaphod.zip
installed zaphod
1.AROS:>

What apkg is doing

  1. Read the catalogue entry

    id
    zaphod
    version
    1.3
    arch
    x86_64
    size
    218782
    sha256
    603e292457c3439f32709380bdd1d9c72b06536d013eebc01541a0bf0fa75448
  2. Connect to archives.arosworld.org

    HTTPS only. The certificate has to match this host.

  3. Follow the redirect

    To arosarchives.os4depot.net, whose certificate is checked again against its own name.

  4. Download into zaphod.zip.part

    218782 bytes (an illustration: in the Shell, apkg shows no progress while it downloads)

  5. Check the size, then the SHA-256

    Both must match the catalogue. Only then does zaphod.zip.part become the cached file.

  6. Check every path in the archive

    Before a byte is written. One path that points outside the package rejects the whole archive.

  7. Stage, then move into place

    The plan is written first, then the whole drawer moves to SYS:Packages/zaphod in one step.

  8. Record, then commit

    Every installed file and its hash go into the record. The commit comes last.

A first install typed at the AROS Shell, sped up. The left side is everything apkg install printed; the right side shows the steps behind those lines. If the archive is already in the cache, it is checked again rather than downloaded, and apkg prints only installed zaphod.

Your files stay yours.

Removing a package

Every installed file is recorded with its hash. On removal, files you haven’t touched are deleted. A file you changed is kept and listed, so you can see what stayed behind and why. A drawer icon you rearranged is kept too.

Upgrading and rolling back

An upgrade shows its plan first. A file you changed is kept; if keeping it would contradict the new version of the package, the upgrade is refused before anything is touched, and the file is named. The previous packaging is kept in the cache, so you can go one step back.

When something is interrupted

Every change is journalled. After a crash or a reset, the next run finishes the operation or undoes it, working from the plan and from what is actually on disk. apkg doctor explains anything it couldn’t settle, and nothing is ever force-deleted.

Checked before anything is downloaded

A package built for a different AROS ABI is refused up front, because it would install and then not start. So is a package that needs a library this machine doesn’t have. If apkg can’t tell whether a requirement is met, it installs, says so, and keeps the doubt on record.

apkg: this system does not provide what the package needs
     req-test-missing
     arospkg-test-absent.library (not on this machine)
A requirement the machine doesn’t meet, from a test package. Nothing is downloaded.

What it doesn’t do yet.

A catalogue, not a mirror.

arospkg doesn’t host any programs. It publishes a small public catalogue that points at each program where its author published it: AROS Archives for most of them, and a project’s own release page for some, such as GrafX2, Folio, Micropolis and OpenLoco. For each package the catalogue records the size and SHA-256 the download has to match, what it needs from the machine, and where it goes.

The catalogue is at github.com/tomaszstaniak/arospkg-index. A package goes in only after its archive has been downloaded, checked, and installed, started and removed on AROS.

apkg update
fetching https://raw.githubusercontent.com/tomaszstaniak/arospkg-index/main/index.json
index updated: SYS:Packages/db/index.json

apkg search zaphod
zaphod               1.3        x86_64    A simple binary file editor

apkg install zaphod
fetching https://archives.arosworld.org/share/development/edit/zaphod-v1.3-.x86_64-aros-v11.zip
  redirect -> https://arosarchives.os4depot.net/download.php?file=development/edit/zaphod-v1.3-.x86_64-aros-v11.zip
verified and cached SYS:Packages/cache/zaphod.zip
installed zaphod

apkg list
zaphod

apkg remove zaphod
removed zaphod
A complete session on the default root: five commands and every line they printed.

Package manifest.

RFC · Draft 0 · Not implemented as a standard

Describe what to install, rather than supply a script of installation steps.

This specification describes an archive’s contents and installation requirements. The companion application-folder specification describes how to recognise and launch the installed application. Both are proposals; examples below are invented.

1. Archive layout

exampleapp.zip                 # ZIP or LHA; no new container
    .arospkg/manifest.toml
    ExampleApp/
        ExampleApp
        ExampleApp.info
        Resources/
    ExampleApp.info             # drawer icon

The manifest is UTF-8 TOML at .arospkg/manifest.toml, relative to the archive root. Existing unpackers do not need to understand it.

2. Minimal manifest

schema = 0
id = "exampleapp"
name = "ExampleApp"
version = "2.9"
revision = 3

[[targets]]
os = "aros"
arch = "x86_64"
abi = "v11"

[install]
subdir = "ExampleApp"
icon = "ExampleApp.info"

[[requires_system]]
type = "library"
id = "crt.library"
min_version = 5
schema
Required integer. 0 identifies this draft; unsupported schemas must not be installed by guessing.
id / name
Required non-empty strings. id is stable and independent of the version; name is the display label.
version
Required string: the upstream version, or the author’s version for an original project. Opaque; this draft defines equality, not ordering.
revision
Optional positive integer: the port or package release for that version, including code and packaging changes. Compare only within the same version; do not display a suffix when absent. How omission participates in ordering remains open.
targets
At least one target, each with non-empty os, arch and abi strings. CPU alone is not compatibility. Unknown compatibility must not be treated as a match.
install.subdir
Required string. Archive-relative directory to install under the user-selected root; an empty string selects the archive root, excluding package metadata. (arospkg 0.3 does not yet exclude it.)
install.icon
Optional archive-relative file. Installed beside the application drawer as its .info, not inside it.
requires_system
Optional list of system requirements. This example names a library and its minimum version. Omission means no requirements declared, not proof that none exist. Probe results distinguish satisfied, missing and undetermined.

3. Installation rules

  • Validate the target, requirements, archive paths and destinations before changing the installation.
  • Reject absolute archive paths and traversal: no leading slash, colon, backslash or .. path component. Paths use / separators. (arospkg 0.3 already refuses a leading slash, a colon and ..; it does not yet refuse every backslash.)
  • Build a complete plan before writing managed files. Record ownership and preserve local changes; a directory is not permission to delete everything beneath it.
  • This declarative profile contains no executable installation hooks. Shared destinations such as LIBS: require explicit rules and conflict handling, not inference from directory names.

4. Optional metadata and open extensions

summary, category and license describe the package. An optional, recommended [source] can identify a repository and pinned revision, or a separate source archive and SHA-256. Installation does not fetch sources or enforce licence compliance.

Package-to-package dependencies, shared-file destinations and file roles (program, config, userdata) need further specification. In particular, creating an empty data directory is different from installing seed data or owning future user files. Those rules are not settled by this example.

The repository index supplies download locations, sizes and archive hashes; the embedded manifest does not contain the hash of the archive enclosing it. Installed-file records belong to the manager, not the author’s manifest.

5. Relationship to Installer

Installer executes an application’s installation procedure. Here, the author describes the desired result and the manager plans the procedure. For supported operations, a separate script becomes unnecessary. Legacy scripts may remain a separate compatibility route, without automatically inheriting the declarative engine’s recovery guarantees.

References: AmigaOS installation tooling, Homebrew definitions, and RPM metadata. Open decisions include version ordering, dependency constraints, target identifiers and extension handling. Today arospkg uses reviewed catalogue metadata; it does not consume this embedded standard.

A shared application format.

RFC · Draft 0 · Proposed, not implemented

Make applications easier to install and launch, without requiring users to understand Amiga-specific setup conventions.

Installing Amiga software can mean unpacking a folder, copying files into system directories, or running an Installer script. For someone new to AROS, it is not always clear which steps an application needs. Making those steps predictable removes one obstacle to using AROS as a daily driver.

Other systems separate these jobs. macOS bundles and RISC OS application directories let a file manager present a directory as a launchable application while keeping its contents accessible. Linux package systems use package metadata for dependencies, while desktop entries describe launching.

For AROS: a manifest identifies the application, its requirements and its entry point. A compatible file manager could launch a self-contained application directly from its folder’s icon and offer “Show contents” separately. The companion package specification covers installation, including applications that need shared system files. Metadata does not fix incompatible binaries or supply missing dependencies by itself.

The application remains an ordinary folder—called a “drawer” on Amiga systems. Existing file managers can still browse it and users can launch the executable inside, without arospkg.

Why this fits Amiga conventions

Amiga .info files already carry more than pictures: depending on the icon type, they include ToolTypes, stack size or a document’s Default Tool. The manifest adds the missing folder-level description: which executable represents the application, its version, compatibility and requirements.

The drawer’s icon remains its visual representation; the program’s own icon retains its launch settings. A compatible file manager should reuse those settings, not copy them into a second configuration file. An older file manager still opens the drawer normally. Missing icons and conflicts between icon settings and the manifest require explicit rules, listed below.

1. Folder layout

ExampleApp/
    application.toml           # proposed fixed discovery name
    ExampleApp                 # executable
    ExampleApp.info            # normal program icon
    Resources/                 # existing resource layout
ExampleApp.info                # normal drawer icon

The reader looks for application.toml directly inside the folder. The folder name is unrestricted; executable and resource locations are chosen by the author. Existing file managers can open the drawer and users can launch the program normally. Folder-format compatibility does not make a binary compatible with another OS, CPU or ABI.

2. Manifest

# Proposed syntax; application.toml is not yet a settled filename.
schema = 0
id = "exampleapp"
name = "ExampleApp"
version = "2.9"
revision = 3

[[targets]]
os = "aros"
arch = "x86_64"
abi = "v11"

[launch]
executable = "ExampleApp"
mode = "workbench"
working_directory = "."

Identity, version, revision, targets and optional requires_system reuse the package specification’s types and meanings. They do not establish that a package manager installed this folder.

executable
Required non-empty string. Path to a regular executable file, relative to the application folder.
mode
Required string: workbench or shell. A reader must support the selected launch convention or report that it cannot launch it; it must not silently substitute the other mode.
working_directory
Optional string; defaults to ".", the application folder. Sets the initial working directory, not PROGDIR:.

Draft 0 proposes one entry point shared by the listed targets. For Workbench launches, the design is to reuse the executable’s existing .info settings; this draft adds no TOML copies of ToolTypes or stack size. Missing-icon behaviour and precedence where settings interact with manifest fields still need an explicit contract. Arguments, multiple entry points and file associations are not defined.

3. Reader behaviour

  1. Read and validate metadata without executing code. Discovery must not block the file manager’s UI.
  2. For a supported manifest, offer Launch and Show contents. A file manager may make Launch the double-click action; Show contents always opens the ordinary directory.
  3. Before Launch, recheck the selected executable, target and declared requirements. Refuse a known mismatch or missing requirement. Report an undetermined result rather than presenting it as satisfied.
  4. Launch through the declared convention. Do not evaluate manifest strings as shell commands, install dependencies or alter system configuration.
  5. When metadata is absent, invalid or unsupported, keep ordinary directory browsing available. An attempted enhanced launch should explain the failure.

4. Validation and fallback

  • Use UTF-8 TOML. Reject duplicate keys, wrong field types, missing required fields and unsupported schema versions.
  • Resolve launch paths relative to the folder. Reject absolute paths, colons, backslashes and .. components; resolved links must not escape the folder. The executable must exist and the working directory must be a directory.
  • Reading a manifest, displaying an icon or browsing a folder never runs code. Metadata is an author’s declaration, not a trust certificate or a sandbox.
  • Keep normal .info icons and direct execution available. No arospkg database lookup or background service is required to launch an otherwise working application.

5. Package-manager boundary

The manifest travels with the application; application settings are not moved into a central database. A manager separately records installed files and transactions for upgrades, removal and recovery. Losing those records may prevent safe management, but must not by itself prevent the application from running.

The folder format does not change library lookup, provide private-library isolation or fix hard-coded resource paths. Moving a folder also does not update a manager’s installation records. Relocation and writes outside the folder need separate installation rules.

6. Decisions still open

  • Manifest location: adopt application.toml, retain the package manifest, or derive an installed view? Define one authority, not two independently maintained descriptions. It must survive archive subdir selection.
  • Launch details: Workbench startup using existing icon settings, missing-icon defaults, Shell I/O, icon-setting precedence and treatment of requirements that cannot be determined.
  • Reader limits: manifest size limits, target vocabulary, unknown fields, cache invalidation and path revalidation at launch.
  • File operations: whether a bundle-aware move or rename pairs the drawer with its sibling .info; adoption and relocation of managed installations.

7. Possible extensions: what the application can do

These are candidates for later revisions, not fields supported by Draft 0. The next useful step is to describe capabilities, not just an executable.

Document types
Declare supported formats and roles such as viewer or editor. “Open with…” can offer suitable applications; the user keeps control of defaults. This complements a document icon’s Default Tool rather than overwriting it.
Actions
Offer named actions such as “New document”, “Preferences” or “Open terminal here”. Specify accepted inputs and their launch mechanism; do not evaluate a command string assembled from filenames.
Presentation
Reuse descriptions, categories, icons and optional screenshots in the storefront and file manager. Missing artwork must not prevent launch; browsing must not execute code or require a network request.
Optional features
Distinguish a requirement for starting the application from one needed only by a particular feature. Explain what will be unavailable instead of treating every missing component as fatal.
Target variants
Map each supported CPU/ABI target to its own executable when several builds share a folder. Refuse an unknown or ambiguous match. This would extend Draft 0’s single-entry-point model.
Settings and data
Identify configuration, caches and user documents so tools can offer separate backup or reset operations. A path declaration is not permission to delete its contents or claim ownership of a shared directory.

Example: AROS Term. A future action could accept one user-selected directory and offer “Open terminal here” in that directory’s context menu. The file manager would pass the directory through a defined argument or Workbench-message contract, not interpolate it into Shell text. The executable would remain inside the application folder; accepting an external directory as input would be a separate, explicit extension to the launch contract.

A first experiment should check directories with spaces and command-like characters, missing directories, unsupported targets and normal launching without the extension. This is a proposed use case, not a claim that AROS Term already implements an action protocol.

A manually unpacked application could expose these capabilities without registering with arospkg. A later “Manage this installation” action would need separate verification of supplied files and local changes; the manifest alone cannot establish ownership.

7.1. “Open with…” for an image editor

The following snippets use invented extension syntax and invented applications. They illustrate the contract to design, not fields a current reader understands. They would extend a manifest that already has identity and target fields.

# ExamplePaint: proposed extension, NOT Draft 0 syntax.
[[documents]]
mime_types = ["image/png"]
extensions = ["png"]
role = "editor"
action = "open-image"

[[actions]]
id = "open-image"
label = "Edit image"
executable = "ExamplePaint"
mode = "workbench"
input = "files"
multiple = true
delivery = "workbench-arguments"
Select a PNG → Open with… → ExamplePaint. The editor receives the selected files as Workbench startup arguments. The declaration offers a choice; it does not replace the user’s default application.

The executable path is relative to the application folder; selected documents may be elsewhere. This assumes an editor that actually accepts Workbench file arguments. Type detection, conflicting associations and argument delivery need defined behaviour before adoption; a filename extension alone does not prove a file’s content.

7.2. “Open terminal here”

# ExampleTerm: proposed extension, NOT Draft 0 syntax.
[[actions]]
id = "terminal-here"
label = "Open terminal here"
executable = "ExampleTerm"
mode = "shell"
input = "directory"
multiple = false
working_directory_from = "input"
Select Work:Projects/My Game → Open terminal here. The file manager starts ExampleTerm with that directory as its initial working directory; it does not construct a “CD …” command.

working_directory_from = "input" explicitly permits a user-selected directory outside the application folder; it does not relax the executable-path restriction. Names with spaces or Shell characters remain path data. The terminal must honour its inherited directory. This is the intended experiment for AROS Term, not a claim about its current behaviour.

7.3. The same description in a store and on disk

# ExamplePaint: proposed extension, NOT Draft 0 syntax.
[presentation]
summary = "Create and edit pixel art"
category = "graphics/editor"
icon = "ExamplePaint.info"
screenshots = ["Preview/editor.png"]
homepage = "https://example.invalid/examplepaint"
A storefront could show “ExamplePaint — Create and edit pixel art” with a preview. A file manager could use the same description in application details, retaining the normal drawer icon.

Asset paths are application-relative. A catalogue would need to publish a derived description and separately available preview assets to show them before download; a path inside an archive is not enough. Local browsing uses available metadata and assets, with fallbacks when images are missing. The schema must settle one location for these fields rather than duplicate the package manifest’s description and category.

References: macOS document-type and bundle metadata, macOS bundles and RISC OS application directories. These extensions propose desktop cooperation, not a central registry required to run applications.

What comes next.

More programs in the catalogue, before more features in the manager. The next ones are AROS ports that already have releases of their own, each installed, started and removed on AROS before it is listed.

After that, and designed but not built: installing files into LIBS: and Fonts:, declared file by file by the package’s author, with what was there kept and a library never downgraded; and a signed catalogue.

Along the way, two fixes went into AROS mainline: a library that was never being built, and a 64-bit sign-extension bug that broke every TLS connection through the generic socket path.

Snapshot: . arospkg is an independent project by Tomasz Staniak. It is not affiliated with AROS, AROS Archives or any AROS distribution.