Stacksmith

BetaLocal dev stack control for macOS

Stop babysitting terminals.

Run your whole local stack (apps, workers, jobs, and tunnels) from one YAML file. Stacksmith keeps dependency-aware startup, readiness, logs, and diagnosis tied to the component that matters.

Try it free for 7 days, no licence key required.

Or read the docs first

Free 7-day trial. Buy any time to keep using it, your work is never locked away.

Requires macOS 26 · Apple silicon · Notarized

The problem

Your stack shouldn't live in twelve terminal tabs.

Running a local stack means starting processes by hand in the right order, memorising ports, guessing what's actually ready, and scrolling scattered logs the moment something breaks.

Scattered terminals

A tab per process, launched by hand in the right order, every single time.

Guesswork readiness

Is the API up? Did the worker connect? You refresh, retry, and hope.

Failure archaeology

When something dies you dig through logs to work out which thing failed, and why.

Stacksmith replaces all of it with one declarative file and one native window.

Control surface

Everything runnable has a role.

Stacksmith turns a project folder into an organized runtime surface, so each process has clear state, controls, logs, and dependency context.

Apps

Foreground services with ports, URLs, and health checks.

0/2 running

Workers

Queue runners and background processes that wait for dependencies.

0/1 running

Jobs

One-shot commands that complete, fail, and can be rerun.

0/1 completed

Tunnels

Public URLs forwarded to declared local apps.

0/1 running

Logs

Live stdout, stderr, and system lines tied to each component.

254 visible

Diagnosis

Role-aware failure evidence and next actions.

action ready

Workflow

From configuration to recovery.

The same declared stack powers startup order, readiness checks, runtime monitoring, and incident evidence.

  1. 01

    .stacksmith.yml

    Declare roles, ports, links, jobs, tunnels, env, and dependencies.

  2. 02

    Ordered startup

    Start All respects dependency order, manual jobs, health checks, and ports.

  3. 03

    Observed runtime

    Stacksmith tracks lifecycle state, logs, readiness, and recent failures.

  4. 04

    Grounded recovery

    Diagnosis points to the affected component, evidence, and next action.

Live logs

Every line tied to the component that produced it.

Stdout, stderr, and system events stream in real time with severity parsing and ANSI cleanup, scoped to each app, worker, job, and tunnel, so you read the failure, not the noise.

  • Severity-aware highlighting across stdout and stderr
  • Per-component scoping, not one merged firehose
  • Recent logs persisted across restarts
Logs · all components
sysStart All: resolving dependency order
infoapi · listening on :8080
okapi · health check passed
infoworker · connected to api
warnstripe_webhook · retrying tunnel…
okstripe_webhook · public url live
errmigrate · exit 1: relation "users" already exists

Diagnosis

Failure state stays attached to the evidence.

Port conflicts, health failures, blocked workers, failed jobs, and tunnel issues resolve into a deterministic brief with the affected component and next action.

01

Detected

Port 8080 already in use

02

Affected

API Server blocks Worker and Tunnel

03

Evidence

bind tcp :8080: address already in use
04

Action

Release the port, then restart API Server

On-device intelligence

Incident briefs explained on your Mac.

When a component fails, Stacksmith can turn the same confirmed evidence into a plain-language incident brief using Apple's on-device Foundation Models. No cloud round-trip, no API keys, no telemetry. The language model runs locally and every generated explanation is validated before it shows.

  • Runs entirely on-device, so evidence never leaves your Mac.
  • Grounded in confirmed runtime state, not guesswork.
  • Falls back to the deterministic brief when unavailable.
On-device brieflocal

API Server failed to bind port 8080. The port is already in use by another process.

This blocks Background Worker and the stripe_webhook tunnel, which both depend on a healthy API.

Release the port, then restart API Server to unblock the stack.

Configuration

One file describes the stack.

A single .stacksmith.yml gives each process an explicit role. References resolve before validation, and structured env keeps secrets out of command strings.

Apps
Foreground processes with ports, URLs, and health checks.
Workers
Long-running background processes and queue runners.
Jobs
One-shot commands that complete, fail, and can run again.
Tunnels
Public URLs forwarded to a declared local app.
Links
Named project URLs without another process.
Env
Launch-only environment values from Keychain, dotenv, or the parent process.
.stacksmith.yml
1version: 12name: my_awesome_app3 4apps:5  api:6    name: API Server7    command: cargo run --bin api8    cwd: .9    env:10      DATABASE_URL: ${secret.DATABASE_URL}11      STRIPE_KEY: ${dotenv.STRIPE_KEY}12    port: 808013    url: http://localhost:${apps.api.port}14    health: ${apps.api.url}/health15 16workers:17  worker:18    name: Background Worker19    command: cargo run --bin worker20    cwd: .21    depends_on:22      api: healthy23 24jobs:25  migrate:26    name: Migrate Databases27    command: cargo run --bin migrate28    cwd: .29    env:30      DATABASE_URL: ${secret.DATABASE_URL}31    depends_on:32      api: port_listening33 34tunnels:35  stripe_webhook:36    command: ngrok http --url=${tunnels.stripe_webhook.public_url} ${apps.api.port}37    cwd: .38    public_url: https://guiding-lucky-tick.ngrok-free.app39    forwards_to: api40    depends_on:41      api: healthy42 43links:44  api: ${apps.api.url}

Secrets & environment

Inject secrets without putting them in commands.

Reference Keychain secrets or dotenv values from structured env. Stacksmith resolves them at launch, injects them into the child process, and keeps resolved values out of logs and runtime snapshots.

  • Project-scoped secrets come from the macOS Keychain.
  • Dotenv files stay local and later files override earlier ones.
  • Missing values block startup with a non-sensitive error.
  • Add or replace Keychain values from Manage Secrets in the app.
Read environment docs
01Resolve at launch${secret.DATABASE_URL}
02Inject child envDATABASE_URL=••••••
03Keep snapshots cleanNo resolved values persisted
.stacksmith.yml
env
1apps:2  api:3    command: cargo run --bin api4    env:5      DATABASE_URL: ${secret.DATABASE_URL}6      STRIPE_KEY: ${dotenv.STRIPE_KEY}

MCP and licensing

Built for local control, not cloud custody.

The bundled MCP helper exposes Stacksmith state over a local socket while the app remains the owner of runtime processes. Licensing and project secrets use the macOS Keychain, with cached entitlement for offline use.

Read MCP setup

Read-only inspection

Project state, components, logs, diagnosis, and validation.

Explicit control

Start, stop, restart, and run job tools require component-control permission.

License resilience

Activated installations keep using cached entitlement when licensing is temporarily unavailable.

Run the stack. See the state. Fix the failure.

Download the 7-day free trial and replace scattered terminals with one local control surface. No licence key needed to start.

Or read the docs first

BetaBuy now for $9.99 and lock it in. The price rises to $19.99 when Stacksmith leaves beta.

Free 7-day trial. Buy any time to keep using it, your work is never locked away.

Requires macOS 26 · Apple silicon · Notarized