Skip to content

Roadmap

This page tracks planned features and improvements for BatleHub, grouped by theme. Within each group the order reflects rough implementation priority.

To propose a feature or discuss an item, open an issue on the project repository.


New registry types

BatleHub currently supports npm, Cargo, GitHub, OpenVSX, VS Code Marketplace, Go modules, Maven / Gradle, RubyGems, Terraform, Composer, PyPI, and Conda. The following adapters are planned or in progress:

RegistryStatusNotes
npm✅ ShippedPackage proxy + local/hybrid publishing
Cargo✅ ShippedSparse index + crate downloads
GitHub✅ ShippedRelease artifact proxy
OpenVSX✅ ShippedExtension proxy
VS Code Marketplace✅ ShippedExtension proxy
Go modules✅ ShippedGOPROXY protocol
Maven / Gradle✅ ShippedMaven Central–compatible metadata XML + JAR / POM; mvn deploy support
RubyGems✅ ShippedGem downloads and version listing; publish/yank/unyank
Terraform registry✅ ShippedProvider and module proxy; private module + provider publishing
Composer✅ ShippedPackagist v2 protocol; packages.json + p2 metadata + dist downloads; private ZIP publishing in local/hybrid mode
PyPI✅ ShippedSimple API proxy with URL rewriting (pip, uv, Poetry); wheel and sdist downloads; twine-compatible private publishing in local/hybrid mode
Conda✅ Shippedrepodata.json proxy (all platforms); .conda and .tar.bz2 downloads; private channel publishing; hybrid repodata merge
NuGet✅ ShippedNuGet v3 service index + flat container proxy; .nupkg and .nuspec downloads; private publishing via dotnet nuget push in local/hybrid mode
Deb / RPMPlannedDebian APT and Red Hat YUM repository proxying
GitLabPlannedReleases and packages — similar to GitHub, different auth / pagination
ForgejoPlannedGitea fork with minor API differences

Docker / OCI not planned

Harbor covers this use case better than BatleHub could. If you have a concrete need, open an issue.


Cache policy

FeatureStatusNotes
Cache-Control headers✅ ShippedHonour no-cache, max-age, and no-store from upstream responses
Eviction policies✅ ShippedTTL-based expiry, "not accessed for N days", keep only the latest N versions, storage size cap with LRU eviction
Cache index coherence✅ ShippedDetect and recover from mismatches between storage contents and registry metadata (corruption, manual deletions)
Content-addressable deduplication✅ ShippedIdentical artifact bytes stored once, ref-counted across logical keys; transparent and backwards-compatible
Proactive cache warming✅ ShippedPre-fetch known versions at startup and on demand via POST /api/v1/admin/registries/{registry}/warm

Metrics & observability

FeatureStatusNotes
Prometheus endpoint✅ Shipped/metrics — request counts, cache hit/miss rates, latency percentiles, error rates per registry
Health check✅ Shipped/healthz — verifies connectivity to the database and all configured storage backends
Admin dashboard✅ ShippedHits/misses and bandwidth saved, per-registry and aggregate, on the admin home screen

Artifact integrity & security

BatleHub aims to be a trust boundary, not just a cache.

FeatureStatusNotes
Checksum verificationPlannedVerify artifact hashes when the upstream provides them (Cargo sparse index SHA-256, npm integrity, etc.)
Block on failed integrityPlannedBlock serving an artifact if its checksum fails, or optionally if no integrity metadata is available
Sigstore / npm provenancePlannedVerify npm provenance attestations and Sigstore signatures
Cargo crate verificationPlannedcargo verify-project-style verification for Cargo crates
Signed release enforcementPlannedDetect and optionally require signed releases (GitHub, OpenVSX, VS Code Marketplace)
Trusted publisher allowlistPlannedAllowlist of trusted GitHub users / orgs, npm scopes, Cargo owners
Version allowlist / blocklistPlannedAllowlist of approved versions; blocklist of specific versions with known issues
OSV vulnerability scanningPlannedBlock or warn on CVEs via the OSV API
YARA rule evaluationPlannedCustom malware or policy pattern matching on artifact bytes
Antivirus scanningPlannedBinary artifact scanning (VSIX, Go module zips) via a configurable external REST API
Upstream health warningsPlannedWarn when cached data may be stale due to upstream errors

Authentication providers

ProviderStatusNotes
Static tokens✅ ShippedPlain-text and Argon2id-hashed; batlehub hash-token CLI
OIDC✅ ShippedJWT validation, browser SSO (Authorization Code), role + group claim mapping
Kubernetes service accounts✅ ShippedTokenReview API; in-cluster defaults; role + group mapping
GitHub / Forgejo Actions OIDC✅ ShippedValidate short-lived workflow JWTs; rule-based group mapping from any claim; dynamic group name templates; glob + regex conditions

Saml / Github PAT / Gitlab PAT

Saml and specific GitHub/GitLab PAT providers are not planned, but may be possible to implement via the generic OIDC provider with some custom configuration. Open an issue if you have a concrete use case or want to contribute an adapter.

Actions OIDC highlights

The actions-oidc provider lets CI jobs authenticate without long-lived secrets. Workflow JWTs carry rich context claims (repository, ref, environment, actor, …) that can be matched by glob or regex rules to grant specific groups and roles:

toml
[[auth]]
type = "actions-oidc"
name = "github-actions"
issuer_url = "https://token.actions.githubusercontent.com"

  [[auth.rules]]
  group_template = "{name}/{repository}/{ref_name}"
  role = "user"
  match = "all"
  [[auth.rules.conditions]]
  claim = "repository_owner"
  pattern = "myorg"

A token from myorg/my-repo on main resolves to group github-actions/myorg-my-repo/main, which you can grant registry permissions to with a wildcard: "github-actions/*" = ["releases:write"].

See Configuration § Actions OIDC auth for the full reference.


Rate limiting & DoS protection

FeatureStatusNotes
Per-user and per-group rate limits✅ ShippedFixed-window counters; configurable thresholds and time windows; InMemory / PostgreSQL / Redis backends
Configurable enforcement✅ ShippedHard block (429) or soft warn; standard Retry-After and X-RateLimit-* headers
IP-based blocking✅ ShippedAuto-block IPs exceeding a violation threshold; manual block/unblock via admin API; X-Block-Expires header. See Access Control guide.
External IP reputationPlannedIntegrate with external threat-intel feeds to automatically block known malicious IPs

Quota management

FeatureStatusNotes
Per-user, per-group, per-registry quotas✅ ShippedMax storage bytes and max package count; configurable per scope
Enforcement policies✅ ShippedBlock or warn on quota exceeded; X-Quota-* headers on every publish response
Quota warnings✅ ShippedAPI responses and admin UI indicate when a limit is being approached
Admin quota reset✅ ShippedReset quotas for specific users, groups, or registries via admin API

Hot reloading & dynamic config

FeatureStatusNotes
File-watching with admin confirmation✅ ShippedFile watcher loads a pending reload; admin confirms via UI or POST /api/v1/admin/config/pending/apply
Config validation before applying✅ ShippedSchema check + HEAD connectivity probes to each upstream (5 s timeout)
Partial reloads without restart✅ ShippedRegistries, policies, RBAC, versioning, signing, and beta-channel maps are all hot-swappable
Immediate reload API✅ ShippedPOST /api/v1/admin/config/reload — load, validate, and apply atomically for CI/CD
Disable hot reload✅ ShippedBATLEHUB_DISABLE_HOT_RELOAD=1 returns 503 from all reload endpoints (use with read-only Kubernetes ConfigMaps)
Config change audit trail✅ ShippedEvery reload written to config_changes table; GET /api/v1/admin/config/changes
Global admin banner✅ ShippedBroadcast info / warning / error messages to all visitors; HA-safe via Redis or PostgreSQL; auto-set during reload
Dynamic blocking rules from external sourcePlannedFetch and apply block rules from a signed external repository (e.g. signed Git repo)
Dynamic allowlists from external sourcePlannedFetch trusted publisher / approved version lists and merge into RBAC / block rules automatically

Webhooks & notifications

FeatureStatusNotes
Event subscriptionsPlannedSubscribe to new publish, deprecation, or removal events for specific packages, versions, or registries
Notification channelsPlannedEmail, Slack, Microsoft Teams, outbound webhooks
User preferences UIPlannedUser-configurable notification preferences in the web UI
Inbound webhook APIPlannedAllow external systems (CI pipelines, security scanners) to push events into BatleHub

Private registry features

Applies to registries running in local or hybrid mode. See the User Guide for current publish flows.

Per-registry additions

RegistryStatusNotes
Maven✅ Shippedmvn deploy support; POM-triggered three-phase publish; JAR/checksum pre-upload; dynamic maven-metadata.xml; local and hybrid modes
Terraform✅ ShippedPrivate module publishing (tar.gz + X-Terraform-Get redirect); private provider publishing (manifest + per-platform binary); local and hybrid modes
Composer✅ ShippedPrivate PHP package publishing via ZIP upload; composer.json extracted automatically; local and hybrid modes
PyPI✅ ShippedPrivate Python distribution publishing via twine-compatible multipart upload (POST /legacy/); wheel and sdist formats; local and hybrid modes
Conda✅ ShippedPrivate conda package publishing (.tar.bz2 and .conda); metadata extracted from info/index.json; repodata.json generated and merged automatically; local and hybrid modes
npmPlannedVersioning policies: enforce semantic versioning, restrict accepted version patterns
CargoPlannedVersioning policies; full yank protocol compatibility with crates.io
VS Code extensionsPlannedDeprecation and unlisting; VSIX upload form in the UI

For all private registry types

FeatureStatusNotes
Artifact signing✅ ShippedPublish-time X-Artifact-Signature / X-Signature-Type headers; stored alongside artifacts and returned on download; configurable required enforcement and allowed-type allowlist
Ownership management✅ ShippedPer-package owner list with admin/maintainer roles; admin API for listing, adding, and removing owners
Versioning policies✅ ShippedEnforce semver and/or restrict accepted version patterns per registry; violations return HTTP 422 at publish time
Beta/pre-release channel✅ ShippedGate pre-release versions (semver -pre suffix) to specific users or groups; non-members see only stable versions. See Access Control guide.
Bulk operations✅ ShippedBulk yank, unyank, and delete via admin API
Content-addressable deduplication✅ ShippedIdentical artifact bytes stored once, ref-counted across logical keys; transparent and backwards-compatible
Bulk publish / deprecationPlannedBatch publish or deprecate multiple versions in a single API call
Integrity verification on re-servePlannedRe-verify checksums when serving artifacts, not only at publish time

CLI tool — batlehub-cli

A standalone CLI for common private registry tasks, suitable for CI pipelines:

sh
batlehub-cli publish --registry internal-npm ./dist
batlehub-cli deprecate --registry internal-cargo my-crate@1.2.0
batlehub-cli yank --registry internal-cargo my-crate@1.2.0
batlehub-cli list --registry internal-go example.com/mymod
FeatureStatus
publish, yank, unyank, list, deprecate commandsPlanned

SBOM support

Software Bill of Materials support, driven by compliance requirements (EU Cyber Resilience Act, US Executive Order 14028):

FeatureStatusNotes
Upstream passthrough✅ ShippedProxy pre-built SBOMs from upstreams that provide them (GitHub dependency graph API, npm bom.json); enable with fetch_upstream = true in [registries.sbom]
Per-artifact generation✅ ShippedSPDX 2.3 and CycloneDX 1.4 generated at proxy time; source priority: upstream-fetched → archive-extracted → minimal from metadata
Org-level export✅ ShippedGET /api/v1/sbom/export?from=…&to=…&format=spdx|cyclonedx — merged document covering all artifacts in a time window; admin UI at /admin/sbom
Upload-time generation✅ ShippedFor private registries: dependency manifests extracted from the archive at publish time (go.mod, Cargo.toml, package.json, pom.xml, requirements.txt)
Publish policy✅ Shippedrequired = true in [registries.sbom] denies publish when no manifest can be extracted
Explorer integration✅ ShippedPer-version SPDX and CycloneDX download buttons in the Package Explorer detail view
Continuous re-evaluationPlannedPeriodically re-check cached SBOMs against the OSV database and update block / warn metadata automatically

UI improvements

FeatureStatusNotes
Package Explorer✅ Shipped/explore — collapsed catalog, registry sidebar, search/sort, upstream search, per-package version detail with firewall + gate status
Package detail deep linksPlannedFull metadata, version history, and download links beyond the Explorer summary
Global searchPlannedSearch across all registries including packages not yet cached
User listing & block managementPlannedManage OIDC and Kubernetes-sourced identities in the admin panel
Config editorPlannedInline config editing with validation, diff preview, and apply button (integrates with hot reload)
Read-only ConfigMap warningPlannedShow a banner when the config is mounted from a Kubernetes ConfigMap with instructions for external updates

Testing

FeatureStatusNotes
Unit test coverage✅ ShippedEntities, services, auth providers, storage router, registry adapters, web middleware, and handler guards covered; ≥ 80% line coverage enforced via task coverage-check (llvm-cov)
Integration tests (real upstreams)PlannedGated, opt-in tests against real upstream registries
Fuzzing expansionPlannedBroader fuzzing targets beyond the current four (fuzz_rbac_evaluate, fuzz_package_id_cache_key, fuzz_deny_latest, fuzz_release_age)

Released under the MIT License.