wendy.json
wendy.json is the configuration file for a Wendy app. It lives at the root of your project and describes the app's identity, target platform, required capabilities, and runtime beh
wendy.json
wendy.json is the configuration file for a Wendy app. It lives at the root of your project and describes the app's identity, target platform, required capabilities, and runtime behaviour.
Example
{
"$schema": "https://wendy.sh/schemas/wendy.json",
"appId": "my-app",
"version": "1.0.0",
"language": "swift",
"entitlements": [
{ "type": "network" },
{ "type": "gpu" }
]
}Fields
appId (required)
Unique identifier for the app.
{ "appId": "my-app" }version
Version string for the app, e.g. "1.0.0".
platform
Target platform. One of:
| Value | Description |
|---|---|
wendyos | Linux edge device running WendyOS |
wendy-lite | ESP32 WASM target |
Omit to target the default platform.
language
Project language, e.g. "swift" or "python". Used by the CLI to select the appropriate build toolchain.
debug
Set to true to enable debug mode (default false). Injects debug tooling into the container via the WENDY_DEBUG build arg.
entitlements
Array of capabilities the app requires. See Entitlements below.
readiness
Configures how the CLI determines when the app is ready after starting.
{
"readiness": {
"tcpSocket": { "port": 8080 },
"timeoutSeconds": 30
}
}| Field | Type | Default | Description |
|---|---|---|---|
tcpSocket.port | integer (1–65535) | — | TCP port to probe |
timeoutSeconds | integer | 30 | How long to wait before giving up |
hooks
Lifecycle commands to run at specific points during the app lifecycle.
{
"hooks": {
"postStart": {
"cli": "open http://localhost:8080",
"agent": "/app/post-start.sh"
}
}
}| Field | Description |
|---|---|
hooks.postStart.cli | Command run on the developer's machine after the app starts |
hooks.postStart.agent | Command run on the device after the app starts |
python
Python-specific settings.
| Field | Description |
|---|---|
python.sourceRoot | Path to the Python source root directory |
python.container.sourceRoot | Path to the Python source root inside the container image |
$schema
Optional URI pointing to the JSON Schema for editor autocompletion and validation. Set to "https://wendy.sh/schemas/wendy.json".
Entitlements
Entitlements grant the app access to hardware and system capabilities. Any capability not listed is unavailable to the app. They are code signed, preventing privilege escalation.
Use wendy project entitlements add / remove to manage them, or edit wendy.json directly.
network
IP networking access.
{ "type": "network" }
{ "type": "network", "mode": "host" }mode | Description |
|---|---|
| (omitted) | Default isolated network |
"host" | Shares the host network stack |
"none" | Networking fully disabled |
gpu
GPU access for AI inference or general-purpose compute.
{ "type": "gpu" }camera
Camera / V4L2 device access.
{ "type": "camera" }
{ "type": "camera", "allowlist": ["/dev/video0"] }| Field | Description |
|---|---|
allowlist | Restrict access to specific device paths. Omit to allow all cameras. |
audio
Microphone and speaker access.
{ "type": "audio" }bluetooth
Bluetooth access.
{ "type": "bluetooth" }persist
Persistent storage that survives container restarts.
{
"type": "persist",
"name": "my-app",
"path": "/data"
}| Field | Description |
|---|---|
name | Shared namespace (app ID). Apps with the same name can share storage. |
path | Mount path inside the container, e.g. "/data". |
usb
USB device access.
{ "type": "usb" }i2c
I2C bus access.
{ "type": "i2c", "device": "/dev/i2c-1" }| Field | Description |
|---|---|
device | I2C device path (required). |
gpio
GPIO pin access.
{ "type": "gpio" }
{ "type": "gpio", "pins": [17, 27] }| Field | Description |
|---|---|
pins | Pin numbers to expose. Omit to grant access to all GPIO chips. |
spi
SPI device access.
{ "type": "spi" }input
HID input device access (barcode scanners, keyboards, etc.).
{ "type": "input" }mcp
Registers the container as a Model Context Protocol (MCP) server. When this entitlement is present the wendy agent:
- Stores the port in the container's
sh.wendy/mcp.portlabel. - Exposes the container's tools through
wendy mcp serveso that AI assistants (Claude Desktop, etc.) can call them automatically. - Makes the port available via the
StreamMCPgRPC API for secure proxying.
{ "type": "mcp", "port": 3000 }| Field | Type | Description |
|---|---|---|
port | integer | TCP port on which the container's MCP server listens (required). |
The container must serve the MCP Streamable HTTP transport on 0.0.0.0:<port>. See the MCPExample for a complete Python reference implementation.
Note: The
mcpentitlement is typically combined with{ "type": "network", "mode": "host" }so that the agent can reach the container's MCP port over loopback.
Compose-based projects
If your project uses a docker-compose.yml instead of a single container, you don't need a wendy.json. wendy run detects the compose file automatically and each service gets a generated app config derived from its ports, network_mode, and volumes declarations.
See Multi-Service Apps with Docker Compose for details.
Deprecated:
{ "type": "video" }— usecamerainstead.