Skip to content

Package Manifest

Every WASM package requires a manifest.toml file that declares its metadata, permissions, and nodes. This document provides a complete reference.

manifest_version = 1
id = "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"
manifest_version = 1
id = "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"
url = "https://jane.dev"
[permissions]
memory = "standard"
timeout = "extended"
variables = true
cache = true
streaming = true
models = false
a2ui = false
[permissions.network]
http_enabled = true
allowed_hosts = ["*.googleapis.com", "accounts.google.com"]
websocket_enabled = false
[permissions.filesystem]
node_storage = true
user_storage = false
upload_dir = true
cache_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"]
FieldTypeRequiredDescription
manifest_versionintegerAlways 1 for current version
idstringUnique package ID (reverse domain style)
namestringHuman-readable package name
versionstringSemantic version (e.g., “1.2.3”)
descriptionstringBrief description of the package
licensestringSPDX license identifier
repositorystringSource code repository URL
homepagestringPackage homepage URL
keywordsstring[]Search keywords
min_flow_like_versionstringMinimum required Flow-Like version
wasm_pathstringPath to WASM file (for local dev)
wasm_hashstringSHA-256 hash for integrity
[[authors]]
name = "Your Name"
email = "[email protected]" # optional
url = "https://your.site" # optional
[permissions]
memory = "standard" # minimal, light, standard, heavy, intensive
timeout = "standard" # quick, standard, extended, long_running

Memory Tiers:

TierMemoryDescription
minimal16 MBSimple operations
light32 MBBasic processing
standard64 MBMost nodes (default)
heavy128 MBData processing
intensive256 MBML, large datasets

Timeout Tiers:

TierDurationDescription
quick5sFast operations
standard30sMost nodes (default)
extended60sAPI calls
long_running5minML inference
[permissions]
variables = true # Access execution variables
cache = true # Access execution cache
streaming = true # Stream output to UI
a2ui = true # Adaptive UI rendering
models = true # Access LLM/model providers
[permissions.network]
http_enabled = true
allowed_hosts = ["api.example.com", "*.googleapis.com"]
websocket_enabled = false
  • allowed_hosts supports wildcards (*)
  • Empty allowed_hosts with http_enabled = true allows all hosts
[permissions.filesystem]
node_storage = true # Per-node persistent storage
user_storage = false # Per-user storage
upload_dir = true # Access uploaded files
cache_dir = true # Temporary cache storage
[[permissions.oauth_scopes]]
provider = "google"
scopes = ["https://www.googleapis.com/auth/drive.readonly"]
reason = "Read files from your Google Drive"
required = true
FieldTypeRequiredDescription
providerstringOAuth provider ID
scopesstring[]Required OAuth scopes
reasonstringUser-facing explanation
requiredbooleanIf false, node works without OAuth

Supported Providers:

  • google - Google OAuth 2.0
  • github - GitHub OAuth
  • microsoft - Microsoft/Azure AD
  • slack - Slack OAuth
  • discord - 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,..." # optional
oauth_providers = ["google"] # optional
[nodes.metadata]
docs_url = "https://example.com/docs"
custom_key = "custom_value"
FieldTypeRequiredDescription
idstringUnique identifier within package
namestringDisplay name
descriptionstringBrief description
categorystringCategory path (e.g., “Cloud/Storage”)
iconstringBase64 data URI or URL
oauth_providersstring[]Which OAuth providers this node uses
metadatatableAdditional key-value metadata

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 level

The manifest is validated when:

  1. Loading — Package won’t load if invalid
  2. Publishing — Registry rejects invalid manifests

Common validation errors:

ErrorCause
Package ID is requiredMissing id field
Package must contain at least one nodeEmpty nodes array
Node references unknown OAuth provideroauth_providers not in package oauth_scopes
Invalid memory tierUnknown value for memory

Use reverse domain notation:

# Good
id = "com.yourcompany.package-name"
id = "io.github.username.package-name"
# Avoid
id = "my-package"
id = "package_v2"

Only request what you need:

# Good - specific hosts
[permissions.network]
http_enabled = true
allowed_hosts = ["api.openai.com"]
# Avoid - all hosts when not needed
[permissions.network]
http_enabled = true
allowed_hosts = []

Help users understand why you need access:

# Good
reason = "Read your calendar events to schedule workflows"
# Avoid
reason = "Google access"

Follow semver for predictable updates:

  • 1.0.01.0.1 — Bug fixes
  • 1.0.01.1.0 — New features, backward compatible
  • 1.0.02.0.0 — Breaking changes