Publishing your app
From a working dev app to a listing in the Chataway store — publisher account, domain verification, signing in, uploading, and what happens during review.
#Checklist
Before your first upload:
- Your MCP server is deployed at an
httpsURL, andremote.mcpUrlpoints at it. remote.domainslists every other host your panel and results use — and nothing more.branding.iconis a real 512×512 icon (not the scaffold's placeholder), and you've added screenshots.README.mddescribes the app for users — it becomes your store description.- Every grant, account and scope is explained in
permissions. - Tools with side effects have
confirm. npm run validate(ornpx chataway validate --store) passes.
#Publish from Chataway (one click)
If you built the app in an app project in Chataway (Apps → New app → Cloud app), you don't need the CLI or a developer token. The desktop app uses the account it is already signed in with:
- In the App strip, open Share → Publish to store….
- Publisher: pick one of yours, or create one right there (slug, name, optional website). Chataway writes
publisherintoplugin.json— and turns alocal.*id intocom.<publisher>.<app>— and commits it. - Checks: the same store checks as
chataway validate --store, with fix hints. Ask agent to fix sends them to the builder chat. - Changes: what people will be asked to allow, compared with your live version.
- Publish: Chataway runs
npm run build, packs exactly whatchataway packwould, and uploads it. If the version is already in the store it offers Bump to x.y.z+1 (editsplugin.json, commits).
The strip then shows In review, Live v1.2 or Changes requested, and you get a notification when a reviewer decides. Only cloud apps can go to the store; an app that runs on your Mac is shared through GitHub instead.
Prefer the terminal or CI? The rest of this page is the CLI path.
#1. Create a publisher
Apps are published by a publisher — your company or you. Sign in at chataway.co/dashboard, open Developer → Publishers, and create one:
| Field | |
|---|---|
| Slug | Lowercase letters, digits and -, 3–40 characters. Goes into every manifest as publisher. Some slugs (like chataway, official, store) are reserved. |
| Name | Shown in the store: by Acme Inc. |
| Website | Your homepage. |
| Domain | The domain you'll verify, e.g. acme.com. |
Invite teammates as members; anyone who's a member can publish that publisher's apps. A publisher always has at least one owner.
#2. Verify your domain
A verified publisher gets a badge in the store, and its updates that don't widen permissions are approved automatically. Unverified publishers' versions always go to a person.
In the dashboard, your publisher shows a token. Add it as a DNS TXT record on the domain itself (the apex, not a subdomain):
Type: TXT
Name: acme.com (often written "@")
Value: chataway-verify=3b1f9c0e7d2a…Then press Verify. DNS can take a while to propagate; if it's not found yet, try again later. You can remove the record after verification. Changing the publisher's domain resets verification.
#3. Sign in the CLI
npx chataway loginThe CLI shows a short code and opens chataway.co/developers/activate. Check the code matches, approve, and the CLI saves a developer token (~/.config/chataway/credentials.json, readable only by you). For CI, create a token in the dashboard and set CHATAWAY_TOKEN. See the CLI reference.
#4. Publish
npm run publish # builds the panel, then: npx chataway publishThe CLI packs the bundle, runs the store checks locally, and uploads it. Nothing is uploaded if a check fails.
com.acme.my-app@1.0.0 in_review
Review: https://chataway.co/dashboard/developer/apps/com.acme.my-appThe first upload of an id claims it for your publisher — nobody else can publish under that id afterwards.
#Review states
| Status | Meaning |
|---|---|
submitted | Uploaded. |
checking | Automated checks running (the same validator as the CLI). |
in_review | Waiting for a person. See below for when this happens. |
approved | A reviewer approved it; it's being signed and published. |
rejected | Not approved. The reviewer's notes say why; fix it and upload a new version. |
published | Signed and live in the store. Users get the update. |
yanked | Withdrawn; disabled on every Mac within the hour. See Versioning. |
Follow a version with npx chataway status, in the developer dashboard, or by push notification on your phone (Chataway notifies the publisher's members when a review finishes).
#When a person reviews
A version goes to human review when any of these is true:
| Reason | |
|---|---|
first-version | The first version of an app. |
permissions-widened | It adds grants, domains, accounts or scopes, adds a file param, or changes mcpUrl compared with the last approved version. |
publisher-unverified | The publisher hasn't verified its domain. |
flagged:<code> | A check raised a flag, e.g. flagged:bundle.obfuscated. |
Otherwise — a verified publisher shipping an update that asks for nothing new — the version is approved automatically and published within seconds. See the review guidelines for what reviewers look for.
#After publishing
- Your listing shows your name, tagline (the first sentence of
description), icon, screenshots, README, permissions, domains, accounts and tools, publisher and verified badge, rating and install count. - Listed / unlisted. In the dashboard you can unlist an app: it disappears from search and categories, but existing installs keep working and it stays reachable by id.
- Reviews and reports from users show up in the dashboard. Reports go to the review team as well.
- Updates: bump
version, publish again. See Updating & versioning.
#Common rejections at upload
| Error | Fix |
|---|---|
unknown_publisher | Create the publisher in the dashboard; publisher in plugin.json must be its slug. |
not_a_member | Ask the publisher's owner to add you. |
id_taken | Another publisher owns that id. Pick one under your own domain. |
version_not_greater | Bump version above every version you've uploaded before, including rejected ones. |
validation_failed | Run npx chataway validate --store and fix the errors. |