veld

Local development orchestrator

One command. Every service. Real HTTPS.

Open Source MIT Licensed Written in Rust macOS & Linux
The problem

Local dev is broken

Port conflicts, manual wiring, no HTTPS—sound familiar?

your-monorepo
$ npm run dev:backend Error: listen EADDRINUSE: address already in use :::3000 $ lsof -i :3000 node 4821 dev 23u IPv6 0x1a2b3c TCP *:3000 (LISTEN) $ kill -9 4821 && npm run dev:backend & $ npm run dev:frontend & $ npm run dev:admin & Wait, which port is which again? backend → localhost:3000 frontend → localhost:3001 ...or was it 3002? admin → localhost:???? Mixed Content: blocked loading http:// from https:// ERR_SSL_PROTOCOL_ERROR
The solution

One command

Declare your stack in veld.json, run veld start.

veld
$ veld start --preset fullstack --name my-feature veld Starting environment 'my-feature'... [1/4] database:docker healthy [2.1s] [2/4] backend:local Phase 1 (port check) passed Phase 2 (HTTPS check) passed healthy [1.2s] [3/4] frontend:local healthy [0.8s] [4/4] admin:local healthy [0.6s] ──────────────────────────────────────────────────────── database https://database.my-feature.myproject.localhost backend https://backend.my-feature.myproject.localhost frontend https://frontend.my-feature.myproject.localhost admin https://admin.my-feature.myproject.localhost ──────────────────────────────────────────────────────── Environment 'my-feature' started. 4 URL(s) active.
Same task, different world

Start backend + frontend with HTTPS

Same goal. Watch the difference.

without veld
with veld
0s
Core feature

Real HTTPS. Zero config.

No self-signed cert warnings. No mixed content errors. Trusted by browsers out of the box.

Before

http://localhost:3000
Mixed Content CORS errors No TLS Port conflicts

With veld

🔒 https://frontend.dev.myproject.localhost
Auto TLS Auto DNS Auto ports Browser-trusted

DNS

RFC 6761 .localhost. No hosts file edits needed.

TLS

mkcert auto-certs, trusted by your browser automatically.

Ports

Auto-allocated. You never see or manage them.

Production parity

Any domain. Real policies.

Use your own apex domain locally. Test frame-ancestors, strict CSP, cookie scoping, and OAuth redirects against URLs that match production—not localhost:3000.

localhost

http://localhost:3000
CSP bypassed Cookies leak frame-ancestors fails

Your domain

🔒 https://app.feat-42.myapp.dev
CSP enforced Cookies scoped Matches production
veld.json
// .localhost works out of the box (RFC 6761, zero DNS config) "url_template": "{service}.{run}.{project}.localhost" // or use your own apex — veld handles DNS + TLS automatically "url_template": "{service}.{run}.myapp.dev"
🔒 https://frontend.feat-42.myapp.dev
🔒 https://backend.feat-42.myapp.dev
🔒 https://admin.feat-42.myapp.dev
CSP frame-ancestors Cookie domain scoping CORS origin matching OAuth redirect URIs iframe embedding Prod-like URLs
Parallel worlds

Every worktree. Every variant. Zero collisions.

Run the main branch, two feature worktrees, and a staging variant—all at the same time on the same machine. Every environment gets its own URLs.

main branch
~/myproject
veld start --preset fullstack
database:docker
backend:local
frontend:local
https://frontend.cuddly-panda.myproject.localhost https://backend.cuddly-panda.myproject.localhost
feature/auth-v2
~/worktrees/auth-v2
veld start backend:local frontend:local
backend:local
frontend:local
https://frontend.fuzzy-tiger.myproject.localhost https://backend.fuzzy-tiger.myproject.localhost
feature/payments
~/worktrees/payments
veld start backend:docker frontend:local
backend:docker
frontend:local
https://frontend.happy-fox.myproject.localhost https://backend.happy-fox.myproject.localhost
0 environments
0 unique URLs
0 port conflicts
Configuration

Your stack. One file.

Declarative, version-controlled, with JSON Schema support for your editor.

veld.json
{ "name": "myproject", "url_template": "{service}.{run}.myproject.localhost", "nodes": { "database": { "variants": { "docker": { "type": "start_server", "command": "docker run --rm -p ${veld.port}:5432 postgres:16", "outputs": { // downstream nodes reference these "DATABASE_URL": "postgres://dev:dev@localhost:${veld.port}/app" }, "health_check": { "type": "port", "timeout_seconds": 15 } } } }, "backend": { "variants": { "local": { "type": "start_server", "command": "cargo run -- --port ${veld.port}", "env": { "DATABASE_URL": "${nodes.database.DATABASE_URL}" // wired }, "health_check": { "type": "http", "path": "/health" }, "depends_on": { "database": "docker" } } } }, "frontend": { "variants": { "local": { "type": "start_server", "command": "npm run dev -- --port ${veld.port}", "health_check": { "type": "http", "path": "/" }, "env": { "API_URL": "${nodes.backend.url}" // HTTPS URL }, "depends_on": { "backend": "local" } } } } }, "presets": { "fullstack": [ "database:docker", "backend:local", "frontend:local" ], "frontend-only": [ "frontend:local" ] } }
Dependency graph Health checks Output wiring URL templates Presets Variable interpolation Teardown hooks JSON Schema
Features

Built for real workflows

Dependency graph

Nodes start in the right order. Parallel when possible. Reverse teardown on stop.

Two-phase health checks

TCP port check + HTTPS endpoint check. Precise error messages when something fails.

Named runs

Multiple environments coexist. Re-running by name is idempotent. Auto-generated fun names.

Variable interpolation

${veld.port}, ${nodes.backend.url}, git branch, username—wired automatically.

Structured output

Every command supports --json. Built for scripting, CI, and AI agents.

Single binary

Written in Rust. No runtime, no Node, no containers required for the tool itself.

Developer experience

Commands you'll actually use

Check what's running

$ veld status Environment: my-feature State: running NODE STATUS URL ──────────────────────────────────────────────────────── backend:local ✓ healthy https://backend.my-feature.myproject.localhost frontend:local ✓ healthy https://frontend.my-feature.myproject.localhost

Stream logs

$ veld logs -f backend:local Server listening on allocated port backend:local Database connection established frontend:local Dev server compiled in 340ms frontend:local Connected to backend at https://backend....
Agent-ready

Built for AI agents

AI agents spin up environments.
One veld.json. Any machine. Any agent.
JSON in. HTTPS URLs out.
Structured, deterministic, machine-readable.
Every command supports --json.
ai-agent
agent Reading veld.json... agent $ veld start --preset fullstack -d --json agent $ veld urls --json { "backend": "https://backend.agent-run.myproject.localhost", "frontend": "https://frontend.agent-run.myproject.localhost" } agent Running test suite against live URLs... agent All tests passed. Pushing changes.

Stop managing ports.
Start building.

curl -fsSL https://veld.oss.life.li/get | bash
Copied to clipboard
View on GitHub