Publishing a Khal app is a git push, not an npm publish. The CI workflows in a generated app repo validate lint, typecheck, tests, image/chart metadata when present, and release notes. The install source remains the reviewed git repo/ref plusDocumentation Index
Fetch the complete documentation index at: https://docs.khal.ai/llms.txt
Use this file to discover all available pages before exploring further.
khal-app.json.
The flow
Open a PR
The
ci.yml workflow runs: typecheck, lint, test, helm lint, and a check that khal-app.json exists. All four must pass before merge.Merge to `main`
The
release.yml workflow runs on push: main. It:- Reads the version from
package/package.json. - Tags
v${VERSION}and pushes the tag. - Creates a GitHub Release with auto-generated notes from commits since the previous tag.
Publish release metadata
App repos are not published as npm packages. If the app has a backend, CI may publish a service image and chart according to that repo’s workflow. The frontend/app identity remains the git repo/ref and
khal-app.json.Install
A customer admin installs the published version through their platform’s install flow. See Customer install.
You never SSH into a cluster. You never run
kubectl apply. You never push a Docker image by hand. Your job ends at “merge the PR”. The rest is CI.Inherited workflows
Generated app repos commonly ship these workflows in.github/workflows/:
| Workflow | Trigger | Does |
|---|---|---|
ci.yml | PR to dev or main | Typecheck, lint, test, Helm lint, manifest validation. |
ci-guards.yml | PR | Secret scanning (gitleaks), CLAUDE.md presence check, CODEOWNERS check. |
release.yml | Push to main | Tag + GitHub Release + version-driven publish. |
FDE dry-run before handoff
Before handoff, prove the exact git source/ref with the public CLI:Versioning
Pack versions live inpackage/package.json and are the single source of truth. Bump the version field in the same PR that merits a release, and release.yml will tag + release automatically on merge.
What a merge does not do
- Does not deploy to a customer’s instance. Customers pull new pack versions through their own platform flow.
- Does not guarantee your new pack version is the default. Customers may pin to earlier versions.
- Does not invalidate existing users’ sessions in the shell.
What’s next
Customer install
How a customer admin consumes your published pack.
Local dev and testing
Test before you push.