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.
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"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"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 = trueRoot 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"url = "https://your.site" # optionalPermissions
Section titled “Permissions”Resource Tiers
Section titled “Resource Tiers”[permissions]memory = "standard" # minimal, light, standard, heavy, intensive, large, huge, extreme, maximumtimeout = "standard" # quick, standard, extended, long_running, very_long, maximumMemory 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 |
large | 512 MB | Large model inference |
huge | 1 GB | Very large datasets |
extreme | 2 GB | Heavy computation |
maximum | 4 GB | Maximum allocation |
Timeout Tiers:
| Tier | Duration | Description |
|---|---|---|
quick | 5s | Fast operations |
standard | 30s | Most nodes (default) |
extended | 60s | API calls |
long_running | 5min | ML inference |
very_long | 10min | Heavy processing |
maximum | 30min | Maximum duration |
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
Node Discovery
Section titled “Node Discovery”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.
Validation
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 |
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