Project templates for the Wendy CLI. Used by wendy init --template to scaffold new projects.
# Interactive — pick template, language, and configure variables
wendy init
# Non-interactive
wendy init --app-id my-api --template simple-api --language rust --var PORT=9090
# Override any template variable
wendy init --app-id my-api --template simple-api --language python --var PORT=8080A minimal HTTP API with JSON endpoints (GET /, GET /health, POST /items), ready to deploy to WendyOS.
| Language | Framework | Default Port | Directory |
|---|---|---|---|
| Python | FastAPI 0.135.3 (uv + Python 3.14) | 3001 | python/simple-api/ |
| Swift | Hummingbird 2.21.1 | 6001 | swift/simple-api/ |
| Rust | Axum 0.8.8 | 4001 | rust/simple-api/ |
| Node | TypeScript + Express | 5001 | node/simple-api/ |
| C++ | Drogon 1.9.12 | 7001 | cpp/simple-api/ |
Each template includes:
wendy.json— network entitlement, TCP readiness probe, postStart hookDockerfile— containerized deployment- Application source code
Fullstack app with API backend + React/shadcn dashboard-01 frontend. Multi-stage Dockerfile builds the React frontend then serves it alongside a CRUD API for cars.
Live webcam streaming via GStreamer MJPEG over WebSocket. Entitlements: network (host), video, gpu.
Live audio waveform visualization with GStreamer mic capture. Streams raw PCM S16LE 16kHz mono over WebSocket. Includes sample .wav files for playback. Entitlements: network (host), audio.
Shared building blocks (not selectable as templates):
shadcn-vite-frontend/— Vite + React + shadcn/ui dashboardcamera-feed-html/— Webcam viewer HTML pageaudio-feed-html/— Audio waveform visualizer HTML page
Templates are plain project directories with a template.json manifest and Go text/template syntax in the source files.
{language}/{template-name}/
├── template.json # Variable declarations (required)
├── wendy.json # App config (rendered)
├── Dockerfile # Container build (rendered)
└── ... # Source files (rendered)
Templates are organized by language at the top level (python/, swift/, rust/, node/, cpp/). Each template directory must contain a template.json.
The manifest declares the template's variables — their types, defaults, prompts, and validation rules. The CLI reads this at runtime to present interactive prompts (Bubble Tea) or accept --var KEY=VALUE flags.
{
"name": "simple-api",
"description": "Minimal HTTP API with FastAPI",
"variables": [
{
"name": "APP_ID",
"description": "Application identifier",
"type": "string",
"required": true,
"prompt": "App ID"
},
{
"name": "PORT",
"description": "Primary HTTP port",
"type": "integer",
"default": 3001,
"prompt": "HTTP port",
"validate": { "min": 1, "max": 65535 }
}
]
}| Field | Type | Required | Description |
|---|---|---|---|
name |
string | yes | Variable name, referenced in templates as {{.NAME}} |
description |
string | no | Help text shown in prompts |
type |
string | yes | "string", "integer", or "boolean" |
default |
any | no | Default value (type must match type) |
required |
boolean | no | If true and no default, the CLI will prompt or error |
prompt |
string | no | Label shown in interactive mode |
validate |
object | no | Validation rules (see below) |
For integer variables:
{ "min": 1, "max": 65535 }For string variables:
{ "pattern": "^[a-z][a-z0-9-]*$" }Files use Go text/template syntax. Variables are accessed with a dot prefix:
{{.APP_ID}} — string substitution
{{.PORT}} — integer substitution (rendered as string)
Go template conditionals and logic are supported:
{{if .ENABLE_CORS}}
app.use(cors());
{{end}}
- Downloads the
wendylabsinc/templatesrepo as a tarball from GitHub - Extracts
{language}/{template-name}/into a temp area - Reads
template.jsonto discover variables - For each variable: checks
--var NAME=VALUEflags, falls back to Bubble Tea prompts (text input for strings/integers, confirm for booleans) - Renders every file (except
template.json) throughtext/templatewith the collected values - Writes output to
./{app-id}/, renames template-named directories to the app ID - Deletes
template.jsonfrom the output - Optionally runs
git init
APP_ID is always available — it comes from the --app-id flag or the interactive prompt. You do not need to declare it in template.json (but you can to customize the prompt text).
- Keep
template.jsonnext towendy.jsonandDockerfileat the template root - Test your templates by running
wendy init --template {name} --language {lang}locally - Avoid complex logic in templates — conditionals are supported but keep them minimal
- Use sensible defaults so non-interactive mode works out of the box
Sample .wav audio files in the audio template are from pdx-cs-sound/wavs. Thanks to the Portland State University CS Sound group for making these available.