Skip to content

Package Manifest

Every WASM package requires a manifest.toml file that declares its metadata and permissions. Nodes are automatically extracted from the WASM binary during compilation — they do not need to be declared in the manifest.

manifest_version = 1
id = "com.example.hello"
name = "Hello World"
version = "1.0.0"
description = "A simple hello world node"
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
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, large, huge, extreme, maximum
timeout = "standard" # quick, standard, extended, long_running, very_long, maximum

Memory Tiers:

TierMemoryDescription
minimal16 MBSimple operations
light32 MBBasic processing
standard64 MBMost nodes (default)
heavy128 MBData processing
intensive256 MBML, large datasets
large512 MBLarge model inference
huge1 GBVery large datasets
extreme2 GBHeavy computation
maximum4 GBMaximum allocation

Timeout Tiers:

TierDurationDescription
quick5sFast operations
standard30sMost nodes (default)
extended60sAPI calls
long_running5minML inference
very_long10minHeavy processing
maximum30minMaximum duration
[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

Nodes are not declared in the manifest. Instead, they are automatically extracted from the WASM binary:

  • Remote (registry): The backend compiles the WASM and calls get_nodes() to discover all nodes.
  • Local (desktop): The runtime calls get_nodes() on the loaded WASM module.

This ensures the node catalog always matches the actual WASM code and prevents manifests from misrepresenting capabilities.

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
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