Portable
Ship complete features as a single .gtpack file. No dependency resolution at deploy time — everything is bundled.
A Pack (.gtpack) is a signed, self-contained archive that bundles everything needed to deploy a capability into the Greentic platform — flows, WASM components, assets, and metadata. Packs are the primary distribution and deployment unit in Greentic.
Greentic is designed around a dynamic extension model: everything non-core to the platform is delivered as a pack. This means the platform can be extended without recompilation or redeployment of the core runtime.
Portable
Ship complete features as a single .gtpack file. No dependency resolution at deploy time — everything is bundled.
Secure
Every pack is content-hashed (BLAKE3) and signed (Ed25519). The runtime verifies integrity and authenticity before loading.
Versioned
Semantic versioning tracks compatibility. Dependency constraints are declared in the manifest and resolved at build time.
Sandboxed
WASM components inside packs execute in a sandboxed WASI Preview 2 environment with explicit capability grants.
A .gtpack file is a structured archive containing the following layout:
| Entry | Format | Purpose |
|---|---|---|
manifest.cbor | CBOR | Pack identity, capabilities, dependency graph, flow/component/asset index |
flows/*.ygtc | YAML | Orchestration graphs defining the execution logic |
components/*.wasm | WASM (wasm32-wasip2) | Portable, sandboxed code modules |
assets/ | Any | Templates, cards, i18n bundles, images, and other static resources |
sbom.json | SPDX/CycloneDX | Software Bill of Materials for supply-chain audits |
signature.sig | Ed25519 | Cryptographic signature over the BLAKE3 content hash |
Greentic uses a capability-based type system to classify packs. The capability ID in the manifest determines how the runtime treats the pack.
Provider packs bridge external services (messaging platforms, event sources, secret stores) into the Greentic runtime. Each provider pack typically includes ingress, egress, and operator WASM components plus setup/verification flows.
[pack]name = "messaging-telegram"version = "0.4.6"description = "Telegram messaging provider for Greentic"authors = ["Greentic <team@greentic.ai>"]
[capabilities]id = "greentic.cap.messaging.provider.v1"provides = ["telegram"]
[flows]setup_default = "flows/setup.ygtc"verify_webhooks = "flows/verify.ygtc"
[components]ingress = "components/messaging-ingress-telegram.wasm"egress = "components/messaging-provider-telegram.wasm"operator = "components/telegram.wasm"
[secrets]required = ["telegram_bot_token"]optional = ["public_base_url"]Application packs contain the business logic — the actual “digital worker” that processes messages, handles events, and orchestrates actions.
[pack]name = "customer-service"version = "1.0.0"description = "AI-powered customer service digital worker"authors = ["Your Team <team@example.com>"]
[capabilities]id = "greentic.cap.app.v1"provides = ["customer-service"]
[dependencies]greentic-templates = "^0.4"greentic-llm-openai = "^0.4"
[flows]on_message = "flows/on_message.ygtc"on_escalation = "flows/escalation.ygtc"
[components]classifier = "components/intent-classifier.wasm"
[assets]cards = "assets/cards/"templates = "assets/templates/"i18n = "assets/i18n/"Component packs provide reusable WASM building blocks that other packs can depend on. They contain no flows — only components and their configuration.
[pack]name = "llm-openai"version = "0.4.6"description = "OpenAI-compatible LLM component for Greentic"
[capabilities]id = "greentic.cap.component.v1"provides = ["llm"]
[components]llm = "components/llm-openai.wasm"
[config]default_model = "gpt-4"max_tokens = 4096Set up the directory structure
mkdir -p my-pack/{flows,components,assets}Write the manifest
Create a pack.toml (or pack.yaml) at the root of your pack directory:
[pack]name = "my-feature"version = "1.0.0"description = "A feature pack for handling customer inquiries"authors = ["Your Name <you@example.com>"]
[capabilities]id = "greentic.cap.app.v1"provides = ["customer-service"]
[dependencies]greentic-templates = "^0.4"
[flows]main = "flows/main.ygtc"setup = "flows/setup.ygtc"
[components]processor = "components/processor.wasm"
[assets]templates = "assets/templates/"cards = "assets/cards/"Add your flows
Write orchestration flows in .ygtc (YAML) format under flows/. See the Flows guide for the full schema.
Add WASM components
Build your components targeting wasm32-wasip2 and place the .wasm files in components/:
cargo build --target wasm32-wasip2 --releasecp target/wasm32-wasip2/release/processor.wasm my-pack/components/Build the pack
# Using the pack builder CLIgreentic-pack build ./my-pack
# Or with the GTC CLIgtc pack build ./my-pack
# Output: my-feature-1.0.0.gtpackSign the pack
# Generate a signing key pair (one-time)greentic-pack keygen --output my-key.pem
# Sign the packgreentic-pack sign my-feature-1.0.0.gtpack --key my-key.pem
# Verify the signaturegreentic-pack verify my-feature-1.0.0.gtpack --pubkey my-key.pubReference packs in your bundle configuration to deploy them:
providers: messaging-telegram: pack: "providers/messaging/messaging-telegram.gtpack" setup_flow: "setup_default" verify_flow: "verify_webhooks"
apps: customer-service: pack: "apps/customer-service.gtpack" default_flow: "on_message"Packs are distributed as OCI artifacts via container registries (e.g., GHCR):
# Pull a pack from the registrygtc pack pull ghcr.io/greentic/messaging-telegram:0.4.6
# Or reference directly in your bundle configproviders: messaging-telegram: pack: "oci://ghcr.io/greentic/messaging-telegram:0.4.6"# Validate pack structure and manifestgreentic-pack validate ./my-pack.gtpack
# Validate all flows within the packgreentic-flow doctor --pack ./my-pack.gtpack
# Full verification (signature + content integrity + flow validation)greentic-pack verify --full ./my-pack.gtpackThe manifest.cbor file is the machine-readable pack descriptor, encoded in CBOR for compact binary serialization. It contains the full index of flows, components, and assets, plus capability declarations and dependency constraints.
struct PackManifest { name: String, version: String, description: String, authors: Vec<String>, capabilities: Capabilities, flows: HashMap<String, FlowEntry>, components: HashMap<String, ComponentEntry>, assets: HashMap<String, AssetEntry>, dependencies: HashMap<String, VersionReq>, config: HashMap<String, ConfigValue>, signatures: Vec<Signature>,}Greentic packs enforce a layered security model — content integrity, authenticity, and capability sandboxing.
Every file in the pack is individually hashed with BLAKE3. The overall pack hash is a Merkle-style digest:
pack-hash = blake3( manifest_hash || flows_hash || components_hash || assets_hash)This ensures that any modification — even a single byte — is detected at load time.
Packs are signed with Ed25519 keys. The runtime verifies signatures automatically before loading any pack:
# Manual verificationgreentic-pack verify my-pack.gtpack --pubkey trusted-keys/publisher.pubConfigure which signing keys the runtime accepts:
[security]trusted_publishers = [ "greentic-official.pub", "my-org.pub",]reject_unsigned = truegreentic-pack verify --full in your CI pipelinegreentic.cap.{category}.v{N} naming convention.gtpack specification