Publish to the Store
Any public git repository with a Chrysalis app in it can be installed with Import app. Adding it to the Store puts it in front of everyone.
#Put your app in a repository
- Create a public repository with
manifest.jsonat its root and the rest of the app beside it. - Leave out
node_modules/,dist/and your owndata/. Ship only the templates (files starting with_) and any starter data a new install needs. - Add the
chrysalis-apptopic to the repository so people can find it on GitHub. - Check that it installs: in Chrysalis, Import app > Git repository with your repository's address.
#Add it to the Store
The Store's list is apps.json in the app-store repository.
- Fork the app-store repository and add an entry at the end of
apps.json:{ "id": "reading-tracker", "name": "Reading Tracker", "description": "Books I am reading, with notes.", "author": "Your name", "repository": "https://github.com/you/reading-tracker", "tags": ["books", "notes"], "added": "2026-09-13" } - Run
bun scripts/validate.ts --clonein your fork. It checks every entry and installs yours from its repository. - Open a pull request.
| Field | Rules |
|---|---|
id | Unique. Lowercase letters, digits, - and _, up to 64 characters. It becomes the app's folder name when installed. |
name | Up to 80 characters. |
description | Up to 500 characters. |
author | Up to 80 characters. |
repository | The https:// address of a public git repository. |
ref | Optional. A branch or tag to install instead of the default branch. |
tags | Optional. Up to 8 lowercase tags. |
added | The day you add the entry, as YYYY-MM-DD. It decides what counts as new. |
#Releasing updates
No pull request is needed for updates. Push to your repository (or to the branch or tag the entry names) and every install is offered the new commits. Raise version in manifest.json when you release, so people see what they are updating to.
- Keep your plugins' permissions as small as you can. On community apps, an update that adds a permission stops and asks the user.
- Changing npm packages also asks the user on community apps, so batch those changes.
- If a release needs a newer Chrysalis, say so with
enginein the manifest. - Upgrade stored data in a plugin's
onAppUpdateexport rather than asking people to start over. It receives the version the data last had, which can be several releases back, so checkctx.fromagainst each change. It may run for up to five minutes with 512 MB of memory, and if it throws it runs again later from the same version, so every step must be safe to repeat.
#Official apps
Official apps are maintained by the Chrysalis team in the ProjectChrysalis organization, in repositories whose names end in -Chrysalis. An app is official because of where it is installed from; nothing in an entry or a manifest can make an app official.
#Removal
Apps that break, disappear or turn out to be harmful are taken off the list. Removing an entry does not uninstall the app from anyone's Chrysalis.