This registry is the official distribution channel for Wheels packages. This document explains how to submit a new package, publish a new version of an existing one, and what the review process looks like.
Your package must:
- Live in its own public git repo on GitHub. Monorepos and subpath-based submissions are not accepted in Phase 1.
- Have a
package.jsonmanifest at the repo root withname,version,wheelsVersion, and eitherprovides.mixinsor at least one ofprovides.services/provides.middleware. - Declare
wheelsVersionas a SemVer range (e.g.,">=4.0"). Packages that don't declare this will be rejected. - Be tagged at the version you're submitting. The tag name must match
v<version>— e.g., manifest version1.2.0→ tagv1.2.0. - Ship only allowlisted file types:
.cfc,.cfm,.cfml,.md,.json,.js,.mjs,.ts,.css,.scss,.html,.txt,.sql,.yml,.yaml,.gitkeep. Anything else will block CI until a maintainer reviews and approves. - Stay under 10 MB uncompressed. Packages larger than this need explicit maintainer approval.
- Declare a license in the manifest's
licensefield (SPDX identifier).
- Fork this repo.
- Create a new directory under
packages/named exactly after your package — e.g.,packages/wheels-foo/. - Add
manifest.jsonfollowing the schema atschema/manifest.schema.json. Leaveversions[].tarballandversions[].sha256asnull— CI fills these on merge. - Add
README.md— a one-paragraph listing blurb. Shown onwheels.dev/packages/<name>. - Open a PR with title
Add wheels-foo v1.0.0. - CI runs — validates schema, name uniqueness, source-repo resolvability, tag existence, file-type allowlist, size cap.
- Maintainer reviews — confirms author, glances at the author's repo, merges if everything looks good.
- Mirror workflow fires on merge (Phase 2) — packages the tagged source into a deterministic tarball, uploads to this repo's Releases, computes sha256, commits both back into your manifest.
- Users can now install via
wheels packages install wheels-foo.
- Tag the new version in your own repo (
v1.1.0etc.). - Open a PR here that appends to
packages/wheels-foo/manifest.json'sversions[]array. Do not modify previous entries. - CI and review same as above.
- Users run
wheels packages update wheels-foo— opt-in only; no auto-pull.
Maintainers look at:
- Does the author repo look real (commits, README, tests)?
- Does the manifest match the schema?
- Does the tag at
source.reporesolve? - Does the package fit the ecosystem (Wheels app augmentation, not e.g. a general-purpose CFML library masquerading as a package)?
- We don't host source code. Your repo stays authoritative.
- We don't auto-update. Version bumps require an explicit PR.
- We don't accept author-hosted tarball URLs (Attack A defense — see the registry design spec).
- We don't support private packages yet. Post-4.1.
Open an issue on this repo or ping #wheels-packages on Discord.
Merging a PR that changes packages/** or schema/** on main automatically
rebuilds packages.wheels.dev via a
repository_dispatch event fired at wheels-dev/wheels. The trigger is
implemented in .github/workflows/notify-site.yml
and requires a repository secret named NOTIFY_WHEELS_TOKEN — a fine-grained
PAT scoped to wheels-dev/wheels with contents: write.
If a registry merge does not rebuild the site within a few minutes:
- Check the
Notify wheels.dev siteworkflow run in this repo's Actions tab. - If it succeeded, check the
Deploy static sitesworkflow inwheels-dev/wheels. - If the notify workflow failed with a 401/403, the PAT has likely expired — rotate and update the secret.