Package Manifest
Every WASM package requires a manifest.toml file that declares its metadata, permissions, and nodes. This document provides a complete reference.
Minimal Example
Section titled “Minimal Example”manifest_version = 1id = "com.example.hello"name = "Hello World"version = "1.0.0"description = "A simple hello world node"
[[nodes]]id = "hello"name = "Say Hello"description = "Outputs a greeting"category = "Custom/Examples"Full Example
Section titled “Full Example”manifest_version = 1id = "com.example.google-drive"name = "Google Drive Integration"version = "2.1.0"description = "Read and write files to Google Drive"license = "MIT"repository = "https://github.com/example/flow-like-gdrive"homepage = "https://example.com/flow-like-gdrive"keywords = ["google", "drive", "cloud", "storage"]min_flow_like_version = "0.5.0"
[[authors]]name = "Jane Developer"email = "jane@example.com"url = "https://jane.dev"
[permissions]memory = "standard"timeout = "extended"variables = truecache = truestreaming = truemodels = falsea2ui = false
[permissions.network]http_enabled = trueallowed_hosts = ["*.googleapis.com", "accounts.google.com"]websocket_enabled = false
[permissions.filesystem]node_storage = trueuser_storage = falseupload_dir = truecache_dir = true
[[permissions.oauth_scopes]]provider = "google"scopes = [ "https://www.googleapis.com/auth/drive.readonly", "https://www.googleapis.com/auth/drive.file"]reason = "Read and write files to Google Drive"required = true
[[nodes]]id = "list_files"name = "List Drive Files"description = "List files in a Google Drive folder"category = "Cloud/Google Drive"icon = "data:image/svg+xml;base64,..."oauth_providers = ["google"]
[nodes.metadata]docs_url = "https://example.com/docs/list-files"
[[nodes]]id = "download_file"name = "Download File"description = "Download a file from Google Drive"category = "Cloud/Google Drive"oauth_providers = ["google"]
[[nodes]]id = "upload_file"name = "Upload File"description = "Upload a file to Google Drive"category = "Cloud/Google Drive"oauth_providers = ["google"]Root Fields
Section titled “Root Fields”| Field | Type | Required | Description |
|---|---|---|---|
manifest_version | integer | ✅ | Always 1 for current version |
id | string | ✅ | Unique package ID (reverse domain style) |
name | string | ✅ | Human-readable package name |
version | string | ✅ | Semantic version (e.g., “1.2.3”) |
description | string | ✅ | Brief description of the package |
license | string | SPDX license identifier | |
repository | string | Source code repository URL | |
homepage | string | Package homepage URL | |
keywords | string[] | Search keywords | |
min_flow_like_version | string | Minimum required Flow-Like version | |
wasm_path | string | Path to WASM file (for local dev) | |
wasm_hash | string | SHA-256 hash for integrity |
Authors
Section titled “Authors”[[authors]]name = "Your Name"email = "you@example.com" # optionalurl = "https://your.site" # optionalPermissions
Section titled “Permissions”Resource Tiers
Section titled “Resource Tiers”[permissions]memory = "standard" # minimal, light, standard, heavy, intensivetimeout = "standard" # quick, standard, extended, long_runningMemory Tiers:
| Tier | Memory | Description |
|---|---|---|
minimal | 16 MB | Simple operations |
light | 32 MB | Basic processing |
standard | 64 MB | Most nodes (default) |
heavy | 128 MB | Data processing |
intensive | 256 MB | ML, large datasets |
Timeout Tiers:
| Tier | Duration | Description |
|---|---|---|
quick | 5s | Fast operations |
standard | 30s | Most nodes (default) |
extended | 60s | API calls |
long_running | 5min | ML inference |
Capability Flags
Section titled “Capability Flags”[permissions]variables = true # Access execution variablescache = true # Access execution cachestreaming = true # Stream output to UIa2ui = true # Adaptive UI renderingmodels = true # Access LLM/model providersNetwork Permissions
Section titled “Network Permissions”[permissions.network]http_enabled = trueallowed_hosts = ["api.example.com", "*.googleapis.com"]websocket_enabled = falseallowed_hostssupports wildcards (*)- Empty
allowed_hostswithhttp_enabled = trueallows all hosts
Filesystem Permissions
Section titled “Filesystem Permissions”[permissions.filesystem]node_storage = true # Per-node persistent storageuser_storage = false # Per-user storageupload_dir = true # Access uploaded filescache_dir = true # Temporary cache storageOAuth Scopes
Section titled “OAuth Scopes”[[permissions.oauth_scopes]]provider = "google"scopes = ["https://www.googleapis.com/auth/drive.readonly"]reason = "Read files from your Google Drive"required = true| Field | Type | Required | Description |
|---|---|---|---|
provider | string | ✅ | OAuth provider ID |
scopes | string[] | ✅ | Required OAuth scopes |
reason | string | ✅ | User-facing explanation |
required | boolean | If false, node works without OAuth |
Supported Providers:
google- Google OAuth 2.0github- GitHub OAuthmicrosoft- Microsoft/Azure ADslack- Slack OAuthdiscord- Discord OAuth- Custom providers via Flow-Like configuration
Each node in the package is declared with a [[nodes]] section:
[[nodes]]id = "my_node"name = "My Node"description = "Does something useful"category = "Custom/MyCategory"icon = "data:image/svg+xml;base64,..." # optionaloauth_providers = ["google"] # optional
[nodes.metadata]docs_url = "https://example.com/docs"custom_key = "custom_value"| Field | Type | Required | Description |
|---|---|---|---|
id | string | ✅ | Unique identifier within package |
name | string | ✅ | Display name |
description | string | ✅ | Brief description |
category | string | ✅ | Category path (e.g., “Cloud/Storage”) |
icon | string | Base64 data URI or URL | |
oauth_providers | string[] | Which OAuth providers this node uses | |
metadata | table | Additional key-value metadata |
OAuth Provider References
Section titled “OAuth Provider References”Nodes can only reference OAuth providers declared at the package level:
# Package-level declaration[[permissions.oauth_scopes]]provider = "google"scopes = ["..."]reason = "..."
[[permissions.oauth_scopes]]provider = "github"scopes = ["..."]reason = "..."
# Node references[[nodes]]id = "google_only"oauth_providers = ["google"] # ✅ Valid
[[nodes]]id = "both"oauth_providers = ["google", "github"] # ✅ Valid
[[nodes]]id = "invalid"oauth_providers = ["slack"] # ❌ Error: not declared at package levelValidation
Section titled “Validation”The manifest is validated when:
- Loading — Package won’t load if invalid
- Publishing — Registry rejects invalid manifests
Common validation errors:
| Error | Cause |
|---|---|
Package ID is required | Missing id field |
Package must contain at least one node | Empty nodes array |
Node references unknown OAuth provider | oauth_providers not in package oauth_scopes |
Invalid memory tier | Unknown value for memory |
Best Practices
Section titled “Best Practices”Package IDs
Section titled “Package IDs”Use reverse domain notation:
# Goodid = "com.yourcompany.package-name"id = "io.github.username.package-name"
# Avoidid = "my-package"id = "package_v2"Minimal Permissions
Section titled “Minimal Permissions”Only request what you need:
# Good - specific hosts[permissions.network]http_enabled = trueallowed_hosts = ["api.openai.com"]
# Avoid - all hosts when not needed[permissions.network]http_enabled = trueallowed_hosts = []Clear OAuth Reasons
Section titled “Clear OAuth Reasons”Help users understand why you need access:
# Goodreason = "Read your calendar events to schedule workflows"
# Avoidreason = "Google access"Semantic Versioning
Section titled “Semantic Versioning”Follow semver for predictable updates:
1.0.0→1.0.1— Bug fixes1.0.0→1.1.0— New features, backward compatible1.0.0→2.0.0— Breaking changes