Share a pack
If you have built templates, prompts or a domain profile that other exercise teams could use, package them as a pack and send it to the catalog.
1. Make the pack
From the app (0.3.0 or later): open Packs and choose Export as pack. Pick your own templates, prompt overrides, workflows, a project’s domain profile, project documents (you state each document’s license) or a project as an example, then fill in the name, summary, author and license. The app writes <id>-<version>.aspack with every checksum and validates it before saving.
By hand: lay out a folder like this, then build it with the site repository’s script.
my-pack/
pack.json manifest (no "files" list: the script adds it)
README.md LICENSE optional, recommended (also NOTICE, CHANGELOG.md)
templates/<type>/ template.html + meta.json required;
style.css, schema.json, preview.json, images, fonts
prompts/<name>.md replaces a prompt the app ships (YAML frontmatter)
domains/<id>.json a new domain profile (not a built-in id)
workflows/<id>.json ComfyUI workflow, API format
workflows/<id>.bindings.json its bindings
documents/<slug>/<file> reference documents (PDF, DOCX, PPTX, XLSX, Markdown, text, images)
examples/<slug>/example.json example manifest ("fictional": true)
examples/<slug>/project/… the example's .asproj folder content, with project/project.jsonnode scripts/pack-folder.mjs path/to/my-pack packs/files2. The manifest
{
"formatVersion": 1,
"id": "org.example.water-utility-pio",
"name": "Water Utility PIO Pack",
"version": "1.0.0",
"summary": "Public-information injects for water and wastewater exercises.",
"description": "Longer Markdown description.",
"author": { "name": "Your name", "url": "https://example.org" },
"license": "CC-BY-4.0",
"homepage": "https://example.org/packs/pio",
"minAppVersion": "0.3.0",
"domains": ["water_utility"],
"tags": ["pio", "social"],
"contents": { "templates": ["boil_water_notice"] },
"documents": []
}idis reverse-DNS in lowercase with at least two labels (org.example.my-pack, orio.github.<user>.<name>), and stays the same across versions.versionandminAppVersionare semantic versions without build metadata (1.0.0,1.1.0-beta.1). Raise the version for every change.contentslists item ids by kind; leave out kinds you don’t use. Unknown kinds are refused, and a pack needs at least one item. Every file must belong to a listed item.- Every file under
documents/needs adocumentsentry with itspath,titleandlicense(SPDX), plus itssourcewhen it has one. Only include documents you may redistribute. filesis written by the script or the app: every file exceptpack.json, with its SHA-256 and size.
The full specification is docs/packs-format.md in the app repository.
3. Rules every pack must pass
- The archive holds exactly the files
pack.jsonlists, each with the right SHA-256 and size. - Only the folders and file types the format allows, per kind. No scripts, programs, SVG, databases or macro documents anywhere. The only HTML file is a template’s
template.html. - Templates have no
<script>, iframes, forms,<link>oron…attributes, and load nothing remote: images and fonts come from the template’s own folder ordata:URLs. CSS has no@import. Handlebars triple-stash and partials are not allowed. - Prompt files use YAML frontmatter and replace a prompt the app ships. Domain profiles use a new id.
- Paths use only letters, digits,
_,-and.; no two may differ only by case; no symbolic links or encrypted entries. - At most 200 MB per pack, 100 MB per file, 500 MB uncompressed, 2,000 files, and 100:1 compression per file.
- In templates, previews, prompts and examples, make the organization being exercised, its people and any private businesses fictional. Real places and government agencies are fine. Mark exercise material as an exercise. Example manifests must say
"fictional": true.
Check a pack before you submit it:
node scripts/validate-pack.mjs packs/files/org.example.water-utility-pio-1.0.0.aspack4. Submit it
Submissions by pull request open when the website repository is public. Until then, email licensing@actionstations.ai with your pack’s name, what it is for, and its license, and we will arrange the hand-off.
Licenses
- Your pack, your license. Each pack’s author chooses the pack’s license and states it in
pack.jsonand aLICENSEfile. The catalog shows it on the pack’s page. - Templates derived from the app stay under the app’s license: use
LicenseRef-PolyForm-Internal-Use-1.0.0for a pack built from Action Stations’ own templates. - Contributions to the app’s code (pull requests to the app repository) are made under the Contributor License Agreement. Packs submitted to this catalog are not app contributions and do not need the CLA.
Packs are trusted by checksum only: they are not signed. The catalog records the SHA-256 of each .aspack, and the pack records the SHA-256 of each file inside it.
