Publish apps to S3 — iw app publish
InsightWorker apps are bundles — a folder with app.yaml, widget.json, workflow.yaml, plan.md, and (optionally) prompts/ and dictionaries/. iw app publish ships that bundle to a shared S3 bucket so other team members — or an InsightStudio marketplace — can discover and run it.
This is Tier S, the lightweight share path. No database, no service required. Just a bucket your team has read access to.
One-time bucket setup
Pick (or create) a private S3 bucket your team can read. Set one env var pointing at it — the CLI uses this for every publish, pull, and list.
export IW_APP_STORE=s3://your-bucket/optional/prefix
export AWS_REGION=us-east-1 # or wherever your bucket lives
Credentials come from the standard AWS provider chain — SSO, EC2 instance role, IAM keys, or whatever you've configured. See AWS SSO for the recommended setup.
Publish a bundle
From the bundle's root directory (where app.yaml lives):
iw app publish
# or, for a specific bundle in another folder:
iw app publish ./apps/credit-triage
The publish flow:
- Validates the bundle against the §15 spec (required files, slug shape, version is semver, widget JSON is parseable).
- Reads
app.yamlforslugandversion. - Uploads every file under the bundle to
s3://<bucket>/<prefix>apps/<slug>/v<version>/. - Writes a
LATESTalias file ats3://<bucket>/<prefix>apps/<slug>/LATESTwith the version number, so consumers can fetch the newest version without listing.
S3 layout reference
s3://<bucket>/<prefix>apps/
├── credit-triage/
│ ├── LATEST # plain text: "1.2.0"
│ ├── v1.0.0/
│ │ ├── app.yaml
│ │ ├── widget.json
│ │ ├── workflow.yaml
│ │ ├── plan.md
│ │ ├── manifest.yaml
│ │ ├── prompts/
│ │ └── dictionaries/
│ ├── v1.1.0/
│ └── v1.2.0/
└── broker-submission-intake/
└── ...
Every version is immutable. Republishing the same version errors out unless you pass --force (don't).
Pull a teammate's app
To run an app someone else published:
iw app pull credit-triage # latest version
iw app pull credit-triage --version 1.1.0 # a specific version
iw app pull credit-triage --destination ./ # custom output dir
Files land in ./apps/<slug>/ by default. You can then run them with the standard widget runner:
cd apps/credit-triage
insightworker --ui
List versions
iw app versions credit-triage
# 1.2.0 (LATEST)
# 1.1.0
# 1.0.0
What gets uploaded vs what gets skipped
| Included | Skipped |
|---|---|
app.yaml, widget.json, workflow.yaml, plan.md, manifest.yaml | runs/ (local run history) |
Everything under prompts/ and dictionaries/ | .env, .git, node_modules |
Anything you add to the bundle root (e.g. README.md, examples/) | Files matched by .gitignore in the bundle root |
From CLI to Studio marketplace
If your team runs an InsightStudio instance, apps published this way appear in the Studio marketplace automatically — Studio reads the same S3 bucket on a 60-second cache TTL. No separate publish step. Your CLI authoring loop and Studio's browser-based runners stay in sync.
Related: Join a Studio worker farm · InsightStudio overview
