Koder suite deb mapping
Koder Suite — .deb → Hub Apt Reconciliation Registry
*ource of truth*for the mapping between (a) the Debian .deb packages that the Koder Linux ISO installs via hook 0060, (b) the Flow release tags that produce those .deb assets, (c) the Hub catalog slugs that store the published artifact metadata, and (d) the Debian Package: field emitted in the apt repo's Packages index.
Lives at meta/docs/stack/registries/ per policies/content-location.kmd (registries → tabular sources of truth). Authored by hub#139 (20260520) to resolve the slug/package-name divergence surfaced when populating hub.koder.dev/apt with real .debs.
How the four names relate
Per specs/naming/forms.kmd R1R6 + `policies/namingaliases.kmd + the
RFC-007 Package: convention codified in depothandlersapt.go`:
- *anonical slug*— kebab-case identifier registered in
meta/docs/stack/registries/component-names.md. Used as the Hub URL segment (hub.koder.dev/apps/<slug>) and as the path prefix when publishing. - *.deb
Package name** — the literalPackage:` field inside the.debcontrol file. Comes fromkoder.toml/kpkg.toml/ fpm invocations at build time. Apt clients install by this name (apt install <pkg>). - *low tag path*—
<area>/<sector>/v<X.Y.Z>perpolicies/releases.kmd. The.debis attached as a release asset. - *ndroid applicationId*— reverse-DNS, lives in
AppRow.PackageNameper
specs/binaries-and-cli/naming.kmd §11. Not relevant to apt; listed here only to surface the conflict thatdepot/handlers/apt.go'sdebPackageNamehad to navigate (overriding it via PackageName would emit invalid Debian names likedev.koder.koder_store).
koder-suite mapping (desktop variant)
| Hub slug | .deb Package |
Flow path | Latest tag (2026 |
required? | First Hub publish |
|---|---|---|---|---|---|
koder-x |
koder-x |
infra/linux/x |
infra/linux/x/v0.3.2 |
yes | 2026 |
kolide-shell |
kolide-shell |
infra/linux/kolide |
infra/linux/kolide/v0.3.4 |
yes | 2026 |
kolide-services |
kolide-services |
infra/linux/kolide |
infra/linux/kolide/v0.3.4 |
yes | 2026 |
koder-settings |
koder-settings |
core/settings |
core/settings/v1.0.0 |
yes | 2026 |
koder-term |
koder-term |
products/dev/kterm |
products/dev/kterm/v1.32.1-deb (published as 1.32.1) |
opt | 2026 |
koder-drive-desktop |
koder-drive-desktop |
products/horizontal/drive |
products/horizontal/drive/v1.4.1 |
yes | 2026 |
koder-grid |
koder-grid |
products/dev/grid |
products/dev/grid/v3.0.4 |
opt | 2026 |
koder-calc |
koder-calc |
products/horizontal/calc |
products/horizontal/calc/v1.0.0 |
opt | 2026 |
koder-snap |
koder-snap |
products/horizontal/snap |
products/horizontal/snap/v1.0.0 |
opt | 2026 |
koder-pixel |
koder-pixel |
products/horizontal/pixel |
products/horizontal/pixel/v1.7.0 |
opt | 2026 |
koder-kruze |
koder-kruze |
products/horizontal/kruze |
products/horizontal/kruze/v1.0.23-deb (published as 1.0.23) |
opt | 2026 |
koder-hub |
koder-hub |
products/dev/hub |
products/dev/hub/v2.31.2 |
opt | 2026 |
koder |
(no .deb yet) | products/dev/koder-tools |
— | opt | pending first koder-tools release |
Termux / TUR absorption (hub#162, 20260524)
Until 20260524, Koder maintained a second apt repo at tur.koder.dev (TUR-style) for Termux/Android packages. Per policies/reuse-first.kmd and policies/self-hosted-first.kmd's "single canonical apt source" principle, that repo's koder-* content was bulk-published into hub.koder.dev/apt under hub#162 Option A.
3 packages absorbed:
| Hub slug | .deb Package |
Version (latest) | Arch | First Hub publish |
|---|---|---|---|---|
koder-act-runner |
koder-act-runner |
1.0.2-koder2 |
aarch64 | 2026 |
koder-archive-keyring |
koder-archive-keyring |
0.1.0~rc.1 |
all | 2026 |
koder-creds-helper |
koder-creds-helper |
0.3.0 |
all | 2026 |
Suite landing (per apt.go::versionFitsSuite):
1.0.2-koder2lands in *re + dev*(hyphen tail = pre-release).0.1.0~rc.1lands in *ev only*(~tail doesn't matchsemver-pre).
0.3.0lands in *table + pre + dev*(clean semver-core).
End-user Termux source lines to consume the absorbed packages:
deb [trusted=yes] https://hub.koder.dev/apt stable main
deb [trusted=yes] https://hub.koder.dev/apt pre mainKeeping Hub apt in sync with TUR (hub#163, 20260524)
Per-version sync from tur.koder.dev into Hub apt is automated via Koder/termux-packages-koder repo at .github/workflows/koder-hub-mirror.yml + scripts/koder-hub-mirror.py. The mirror is idempotent (Hub returns replaced=true on re-publish) and pulls every koder-* tuple it finds across the (suite × arch) matrix.
*cheduled trigger* 03:17 + 15:17 UTC daily.
*anual trigger*(operator runbook):
# From any laptop with Flow access:
git clone --depth 1 https://flow.koder.dev/Koder/termux-packages-koder.git
cd termux-packages-koder
KODER_HUB_PUBLISH_KEY=$(ssh s.khost1 'incus exec hub -- grep publish_key /etc/koder-hub/config.toml | cut -d\" -f2') \
python3 scripts/koder-hub-mirror.pyOutputs one line per tuple: OK <slug> v=<ver> arch=<arch> replaced=<true|false>.
*tatus* workflow + script deployed 20260524. Auto-trigger via Gitea Actions blocked on Flow runner ecosystem (the registered laptop act_runner hasn't successfully executed any of the 79 historical runs in this repo — separate concern tracked as a flow follow-up). The script works standalone today; manual run covers the gap.
koder-suite mapping (server variant)
All entries currently optional in the server koder-suite-packages.txt; they'll flip to required once each component's .deb release pipeline stabilises. None are published to Hub apt yet — server bulk-import is the follow-up to hub#139.
| Hub slug (planned) | .deb Package |
Flow path | Latest tag |
|---|---|---|---|
koder-id-daemon |
koder-id-daemon |
services/foundation/id |
not yet released as .deb |
koder-reporter |
koder-reporter |
services/foundation/reporter |
not yet released as .deb |
koder-certs |
koder-certs |
services/foundation/certs |
not yet released as .deb |
koder-billing |
koder-billing |
services/foundation/billing |
not yet released as .deb |
koder-jet |
koder-jet |
infra/net/jet |
not yet released as .deb |
koder-kdb-next |
koder-kdb-next |
infra/data/kdb |
not yet released as .deb |
Drift notes
Two recurring drift sources to watch:
- *
deb` versiontag suffix.*Several components (kterm, kruze) tagtheir .deb releases as
vX.Y.Z-debto distinguish from the parent Flutter build (which has no Debian-side artifact). Hub'sversionFitsSuiteclassifiesvX.Y.Z-debas a semver pre-release (excluded fromstable), so the bulk-publish script strips the-debsuffix before POSTing to/api/v1/publish/{slug}. Pre/dev suite consumers wanting the raw-debversion can read fromdevorpre. - *roduction-catalog slug drift.*The Hub catalog DB drifted from
the seed list at some point —
ktermended up as slugkoder-termin prod, and the seed's slugrename loop can't rerename when the targetktermwould collide with the seed-created entry. Reconcile manually if/when the canonical name matters; for apt purposeskoder-termis a perfectly valid Debian Package name and installs the same.deb.
How to publish a new component's .deb to Hub
Until hub#103 wires a Gitea Action that runs on every release tag, the one-shot script lives in this ticket's closure notes. Pattern:
PUBLISH_KEY=$(ssh s.khost1 "incus exec hub -- bash -c \"grep publish_key /etc/koder-hub/config.toml | awk -F'\\\"' '{print \\\$2}'\"")
curl -sf -X POST "https://hub.koder.dev/api/v1/publish/<slug>" \
-H "Authorization: Bearer $PUBLISH_KEY" \
-F file=@<deb_path> \
-F version=<semver-core> \ # strip any `-deb` / `-prerelease` suffix
-F format=deb \
-F platform=linux \
-F arch=x86_64 # or aarch64 / universalUploads > ~100 MiB are best sent via the internal endpoint (http://127.0.0.1:9420/api/v1/publish/<slug> from inside the hub container) to avoid edge timeouts on the public URL. See hub#139 closure for the kruze 442 MiB precedent.
Update cadence
Refreshed by hub#139 (20260520) when first populating apt. Future updates: any new KoderLinuxinstallable component should add a row at publishpipelinewiring time; renames should add a "previous slug → new slug" entry under a ## Drift notes section above. CI ownership of this file lives with the hub team (depot/seed.go owners).