why
Most internal developer platforms are either Kubernetes-shaped or yet another Jira. Runway is the smallest possible IDP: a curated catalog of opinionated templates, a button, and a live log streaming over WebSockets while Terraform does the actual work.
how it works
A React 18 + Vite frontend talks to a Node.js / Express backend over REST plus a WebSocket. The backend has three explicit subsystems:
- Policy Engine validates the provision request before anything else runs. Reject early or fall through.
- Terraform Runner spawns
terraform applyas a child process and pipes its stdout straight to the WebSocket so the requesting user sees the plan unfold in real time. - TTL Scheduler uses
setTimeoutto fireterraform destroywhen the environment expires. TTL is mandatory, 1 to 72 hours, no opt-out. Cloud sprawl never happens.
Environment records and the audit log live in sql.js (SQLite, in-memory). The audit log is append-only: every request, who made it, what got created, what got destroyed.
templates
Out of the box: nodejs-docker, static-nginx, ec2-aws, s3-static-site, lambda, SQS, DynamoDB, EventBridge.
Two providers: Docker for local dev (just needs Desktop), AWS for production (needs credentials).
what I’m proudest of
The fail-fast policy gate. The Terraform runner never sees a request the policy engine hasn’t already cleared, which means partially-applied environments are rare and almost always the cloud’s fault rather than the platform’s. When they do happen, the audit log catches them and they show up as failed next to the user’s real error.
Reschedule-on-boot is the other small detail: if Runway is down when a TTL expires, it picks up the missed destroys when it comes back online instead of leaking resources.