2025-12-11 20:37:05 +01:00
# Package Manager 🤖📦
2025-12-11 21:01:27 +01:00

2025-03-12 20:40:19 +01:00
[](https://github.com/sponsors/kevinveenbirkenbach)
2025-12-11 20:37:05 +01:00
[](https://www.patreon.com/c/kevinveenbirkenbach)
[](https://buymeacoffee.com/kevinveenbirkenbach)
[](https://s.veen.world/paypaldonate)
2025-03-04 17:28:40 +01:00
[](LICENSE)
[](https://github.com/kevinveenbirkenbach/package-manager)
2025-12-12 21:16:27 +01:00
[](https://github.com/kevinveenbirkenbach/package-manager/actions/workflows/mark-stable.yml)
2025-03-04 17:28:40 +01:00
2025-12-12 21:16:27 +01:00
[**Kevin's Package Manager (PKGMGR)** ](https://s.veen.world/pkgmgr ) is a * multi-distro * package manager and workflow orchestrator.
2025-12-11 20:37:05 +01:00
It helps you **develop, package, release and manage projects across multiple Linux-based
operating systems** (Arch, Debian, Ubuntu, Fedora, CentOS, …).
PKGMGR is implemented in **Python ** and uses **Nix (flakes) ** as a foundation for
distribution-independent builds and tooling. On top of that it provides a rich
CLI that proxies common developer tools (Git, Docker, Make, …) and glues them
together into repeatable development workflows.
---
## Why PKGMGR? 🧠
Traditional distro package managers like `apt` , `pacman` or `dnf` focus on a
single operating system. PKGMGR instead focuses on **your repositories and
2025-12-13 08:34:39 +01:00
development lifecycle**. It provides one configuration for all repositories,
one unified CLI to interact with them, and a Nix-based foundation that keeps
tooling reproducible across distributions.
2025-12-11 20:37:05 +01:00
2025-12-13 08:34:39 +01:00
Native package managers are still used where they make sense. PKGMGR coordinates
the surrounding development, build and release workflows in a consistent way.
2025-12-11 20:37:05 +01:00
2025-12-13 08:34:39 +01:00
In addition, PKGMGR provides Docker images that can serve as a **reproducible
system baseline**. These images bundle the complete PKGMGR toolchain and are
designed to be reused as a stable execution environment across machines,
pipelines and teams. This approach is specifically used within
[**Infinito.Nexus** ](https://s.infinito.nexus/code ) to make complex systems
distribution-independent while remaining fully reproducible.
2025-12-11 20:37:05 +01:00
---
2025-03-04 17:28:40 +01:00
## Features 🚀
2025-12-13 08:34:39 +01:00
PKGMGR enables multi-distro development and packaging by managing multiple
repositories from a single configuration file. It drives complete release
pipelines across Linux distributions using Nix flakes, Python build metadata,
native OS packages such as Arch, Debian and RPM formats, and additional ecosystem
integrations like Ansible.
2025-12-11 20:37:05 +01:00
2025-12-13 08:34:39 +01:00
All functionality is exposed through a unified `pkgmgr` command-line interface
that works identically on every supported distribution. It combines repository
management, Git operations, Docker and Compose orchestration, as well as
versioning, release and changelog workflows. Many commands support a preview
mode, allowing you to inspect the underlying actions before they are executed.
2025-12-11 20:37:05 +01:00
2025-12-13 08:34:39 +01:00
---
2025-12-11 20:37:05 +01:00
### Full development workflows
PKGMGR is not just a helper around Git commands. Combined with its release and
versioning features it can drive **end-to-end workflows ** :
1. Clone and mirror repositories.
2. Run tests and builds through `make` or Nix.
3. Bump versions, update changelogs and tags.
4. Build distro-specific packages.
5. Keep all mirrors and working copies in sync.
---
2025-03-04 17:28:40 +01:00
2025-12-10 22:51:40 +01:00
## Architecture & Setup Map 🗺️
2025-12-11 20:37:05 +01:00
The following diagram gives a full overview of:
* PKGMGR’ s package structure,
* the layered installers (OS, foundation, Python, Makefile),
* and the setup controller that decides which layer to use on a given system.
2025-12-10 22:51:40 +01:00

2025-04-01 15:37:07 +02:00
2025-12-13 08:34:39 +01:00
**Diagram status:** 12 December 2025
2025-12-12 21:16:27 +01:00
2025-12-13 08:34:39 +01:00
**Always-up-to-date version:** [https://s.veen.world/pkgmgrmp ](https://s.veen.world/pkgmgrmp )
2025-12-12 21:16:27 +01:00
---
2025-03-04 17:28:40 +01:00
## Installation ⚙️
2025-12-12 21:16:27 +01:00
PKGMGR can be installed using `make` .
The setup mode defines **which runtime layers are prepared ** .
2025-12-12 21:37:50 +01:00
---
2025-12-13 08:34:39 +01:00
### Download
```bash
git clone https://github.com/kevinveenbirkenbach/package-manager.git
cd package-manager
```
2025-12-12 21:37:50 +01:00
### Dependency installation (optional)
System dependencies required **before running any *make* commands ** are installed via:
```
scripts/installation/dependencies.sh
```
The script detects and normalizes the OS and installs the required **system-level dependencies ** accordingly.
2025-12-13 08:34:39 +01:00
### Install
2025-12-12 21:37:50 +01:00
2025-12-13 08:34:39 +01:00
```bash
git clone https://github.com/kevinveenbirkenbach/package-manager.git
cd package-manager
make install
```
2025-12-12 21:16:27 +01:00
### Setup modes
| Command | Prepares | Use case |
| ------------------- | ----------------------- | --------------------- |
| **make setup ** | Python venv **and ** Nix | Full development & CI |
| **make setup-venv ** | Python venv only | Local user setup |
2025-12-13 08:34:39 +01:00
##### Full setup (venv + Nix)
2025-12-12 21:16:27 +01:00
```bash
make setup
2025-03-04 17:28:40 +01:00
```
2025-12-12 21:16:27 +01:00
Use this for CI, servers, containers and full development workflows.
2025-12-11 20:37:05 +01:00
2025-12-13 08:34:39 +01:00
##### Venv-only setup
2025-04-01 20:19:21 +02:00
```bash
2025-12-12 21:16:27 +01:00
make setup-venv
source ~/.venvs/pkgmgr/bin/activate
2025-04-01 20:19:21 +02:00
```
2025-12-12 21:16:27 +01:00
Use this if you want PKGMGR isolated without Nix integration.
---
2025-12-11 20:37:05 +01:00
2025-12-13 08:34:39 +01:00
Alles klar 🙂
Hier ist der **RUN-Abschnitt ohne Gedankenstriche ** , klar nach **Nix, Docker und venv ** getrennt:
---
## Run PKGMGR 🧰
PKGMGR can be executed in different environments.
All modes expose the same CLI and commands.
---
2025-12-11 20:37:05 +01:00
2025-12-13 08:34:39 +01:00
### Run via Nix (no installation)
2025-03-04 17:28:40 +01:00
```bash
2025-12-12 21:16:27 +01:00
nix run github:kevinveenbirkenbach/package-manager#pkgmgr -- --help
2025-03-04 17:28:40 +01:00
```
2025-12-13 08:34:39 +01:00
---
2025-12-12 21:16:27 +01:00
2025-12-13 08:34:39 +01:00
### Run via Docker 🐳
2025-12-12 21:16:27 +01:00
2025-12-13 08:34:39 +01:00
PKGMGR can be executed **inside Docker containers ** for CI, testing and isolated
workflows.
chore: drop what the base-images refactor left behind
scripts/docker/slim.sh survived the removal of the stage that copied and ran
it, and nothing else referenced it.
The README still offered a `Virgin` image type with `pkgmgr-arch-virgin` as its
example, which is no longer published. Its second row was wrong independently
of that refactor: the image does not contain Nix, it runs `make install`, which
is scripts/installation/init.sh, and neither that nor entry.sh installs it. The
section now states the tags compute_publish_tags() actually pushes, including
the unsuffixed alias the default distribution gets, and points at base-images
for the clean environment the virgin image used to serve. A missing blank line
before a horizontal rule had also been rendering the paragraph above it as a
heading.
Three comment blocks explained what the repository used to do rather than what
it does, in the Dockerfile, in scripts/build/publish.sh and in the Makefile.
That belongs in the history, which is where it already is.
Verified: markdownlint-cli2 on the README goes from 21 findings to 10, all
remaining ones pre-existing and outside this section; `bash -n` on publish.sh
and `make -n build` pass.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 16:22:32 +02:00
---
2025-12-13 08:34:39 +01:00
chore: drop what the base-images refactor left behind
scripts/docker/slim.sh survived the removal of the stage that copied and ran
it, and nothing else referenced it.
The README still offered a `Virgin` image type with `pkgmgr-arch-virgin` as its
example, which is no longer published. Its second row was wrong independently
of that refactor: the image does not contain Nix, it runs `make install`, which
is scripts/installation/init.sh, and neither that nor entry.sh installs it. The
section now states the tags compute_publish_tags() actually pushes, including
the unsuffixed alias the default distribution gets, and points at base-images
for the clean environment the virgin image used to serve. A missing blank line
before a horizontal rule had also been rendering the paragraph above it as a
heading.
Three comment blocks explained what the repository used to do rather than what
it does, in the Dockerfile, in scripts/build/publish.sh and in the Makefile.
That belongs in the history, which is where it already is.
Verified: markdownlint-cli2 on the README goes from 21 findings to 10, all
remaining ones pre-existing and outside this section; `bash -n` on publish.sh
and `make -n build` pass.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 16:22:32 +02:00
#### Container images
2025-12-13 08:34:39 +01:00
chore: drop what the base-images refactor left behind
scripts/docker/slim.sh survived the removal of the stage that copied and ran
it, and nothing else referenced it.
The README still offered a `Virgin` image type with `pkgmgr-arch-virgin` as its
example, which is no longer published. Its second row was wrong independently
of that refactor: the image does not contain Nix, it runs `make install`, which
is scripts/installation/init.sh, and neither that nor entry.sh installs it. The
section now states the tags compute_publish_tags() actually pushes, including
the unsuffixed alias the default distribution gets, and points at base-images
for the clean environment the virgin image used to serve. A missing blank line
before a horizontal rule had also been rendering the paragraph above it as a
heading.
Three comment blocks explained what the repository used to do rather than what
it does, in the Dockerfile, in scripts/build/publish.sh and in the Makefile.
That belongs in the history, which is where it already is.
Verified: markdownlint-cli2 on the README goes from 21 findings to 10, all
remaining ones pre-existing and outside this section; `bash -n` on publish.sh
and `make -n build` pass.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 16:22:32 +02:00
One image per distribution, each installing PKGMGR as a distro-native package
on top of the matching base image from
[base-images ](https://github.com/kevinveenbirkenbach/base-images ). Every image
is a manifest list covering `linux/amd64` and `linux/arm64` .
2025-12-13 08:34:39 +01:00
chore: drop what the base-images refactor left behind
scripts/docker/slim.sh survived the removal of the stage that copied and ran
it, and nothing else referenced it.
The README still offered a `Virgin` image type with `pkgmgr-arch-virgin` as its
example, which is no longer published. Its second row was wrong independently
of that refactor: the image does not contain Nix, it runs `make install`, which
is scripts/installation/init.sh, and neither that nor entry.sh installs it. The
section now states the tags compute_publish_tags() actually pushes, including
the unsuffixed alias the default distribution gets, and points at base-images
for the clean environment the virgin image used to serve. A missing blank line
before a horizontal rule had also been rendering the paragraph above it as a
heading.
Three comment blocks explained what the repository used to do rather than what
it does, in the Dockerfile, in scripts/build/publish.sh and in the Makefile.
That belongs in the history, which is where it already is.
Verified: markdownlint-cli2 on the README goes from 21 findings to 10, all
remaining ones pre-existing and outside this section; `bash -n` on publish.sh
and `make -n build` pass.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 16:22:32 +02:00
All images live under `ghcr.io/kevinveenbirkenbach/` :
2025-12-13 08:34:39 +01:00
chore: drop what the base-images refactor left behind
scripts/docker/slim.sh survived the removal of the stage that copied and ran
it, and nothing else referenced it.
The README still offered a `Virgin` image type with `pkgmgr-arch-virgin` as its
example, which is no longer published. Its second row was wrong independently
of that refactor: the image does not contain Nix, it runs `make install`, which
is scripts/installation/init.sh, and neither that nor entry.sh installs it. The
section now states the tags compute_publish_tags() actually pushes, including
the unsuffixed alias the default distribution gets, and points at base-images
for the clean environment the virgin image used to serve. A missing blank line
before a horizontal rule had also been rendering the paragraph above it as a
heading.
Three comment blocks explained what the repository used to do rather than what
it does, in the Dockerfile, in scripts/build/publish.sh and in the Makefile.
That belongs in the history, which is where it already is.
Verified: markdownlint-cli2 on the README goes from 21 findings to 10, all
remaining ones pre-existing and outside this section; `bash -n` on publish.sh
and `make -n build` pass.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 16:22:32 +02:00
| Tag | Contains |
| --------------------------- | ---------------------------------- |
| `pkgmgr-<distro>:latest` | newest build for that distribution |
| `pkgmgr-<distro>:<version>` | one release |
| `pkgmgr-<distro>:stable` | newest release marked stable |
2025-12-13 08:34:39 +01:00
chore: drop what the base-images refactor left behind
scripts/docker/slim.sh survived the removal of the stage that copied and ran
it, and nothing else referenced it.
The README still offered a `Virgin` image type with `pkgmgr-arch-virgin` as its
example, which is no longer published. Its second row was wrong independently
of that refactor: the image does not contain Nix, it runs `make install`, which
is scripts/installation/init.sh, and neither that nor entry.sh installs it. The
section now states the tags compute_publish_tags() actually pushes, including
the unsuffixed alias the default distribution gets, and points at base-images
for the clean environment the virgin image used to serve. A missing blank line
before a horizontal rule had also been rendering the paragraph above it as a
heading.
Three comment blocks explained what the repository used to do rather than what
it does, in the Dockerfile, in scripts/build/publish.sh and in the Makefile.
That belongs in the history, which is where it already is.
Verified: markdownlint-cli2 on the README goes from 21 findings to 10, all
remaining ones pre-existing and outside this section; `bash -n` on publish.sh
and `make -n build` pass.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 16:22:32 +02:00
`<distro>` is one of `arch` , `debian` , `ubuntu` , `fedora` , `centos` . The Arch
image is published without the suffix as well, so `pkgmgr:stable` and
`pkgmgr-arch:stable` are the same image.
2025-12-13 08:34:39 +01:00
chore: drop what the base-images refactor left behind
scripts/docker/slim.sh survived the removal of the stage that copied and ran
it, and nothing else referenced it.
The README still offered a `Virgin` image type with `pkgmgr-arch-virgin` as its
example, which is no longer published. Its second row was wrong independently
of that refactor: the image does not contain Nix, it runs `make install`, which
is scripts/installation/init.sh, and neither that nor entry.sh installs it. The
section now states the tags compute_publish_tags() actually pushes, including
the unsuffixed alias the default distribution gets, and points at base-images
for the clean environment the virgin image used to serve. A missing blank line
before a horizontal rule had also been rendering the paragraph above it as a
heading.
Three comment blocks explained what the repository used to do rather than what
it does, in the Dockerfile, in scripts/build/publish.sh and in the Makefile.
That belongs in the history, which is where it already is.
Verified: markdownlint-cli2 on the README goes from 21 findings to 10, all
remaining ones pre-existing and outside this section; `bash -n` on publish.sh
and `make -n build` pass.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 16:22:32 +02:00
For a clean environment that carries the system dependencies but no PKGMGR,
pull `base-<distro>` from
[base-images ](https://github.com/kevinveenbirkenbach/base-images ) directly.
2025-12-11 20:37:05 +01:00
---
2025-12-13 08:34:39 +01:00
#### Run examples
2025-12-11 20:37:05 +01:00
2025-12-13 08:34:39 +01:00
```bash
docker run --rm -it \
-v "$PWD":/src \
-w /src \
ghcr.io/kevinveenbirkenbach/pkgmgr:stable \
pkgmgr --help
```
---
### Run via virtual environment (venv)
After activating the venv:
2025-12-11 20:37:05 +01:00
```bash
pkgmgr --help
```
2025-12-13 08:34:39 +01:00
---
This allows you to choose between zero install execution using Nix, fully prebuilt
Docker environments or local isolated venv setups with identical command behavior.
2025-12-11 20:37:05 +01:00
---
2025-04-01 15:37:07 +02:00
2025-03-04 17:28:40 +01:00
## License 📄
This project is licensed under the MIT License.
2025-12-11 20:37:05 +01:00
See the [LICENSE ](LICENSE ) file for details.
---
2025-03-04 17:28:40 +01:00
## Author 👤
2025-12-11 20:37:05 +01:00
Kevin Veen-Birkenbach
2025-03-04 17:28:40 +01:00
[https://www.veen.world ](https://www.veen.world )