Pack catalog

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.json
node scripts/pack-folder.mjs path/to/my-pack packs/files

2. 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": []
}
  • id is reverse-DNS in lowercase with at least two labels (org.example.my-pack, or io.github.<user>.<name>), and stays the same across versions.
  • version and minAppVersion are semantic versions without build metadata (1.0.0, 1.1.0-beta.1). Raise the version for every change.
  • contents lists 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 a documents entry with its path, title and license (SPDX), plus its source when it has one. Only include documents you may redistribute.
  • files is written by the script or the app: every file except pack.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.json lists, 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> or on… attributes, and load nothing remote: images and fonts come from the template’s own folder or data: 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.aspack

4. 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.json and a LICENSE file. 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.0 for 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.