Observability
Logs, live resource stats, port detection, and job run history — built into every worker and deployment service.
The Run side of Spunto covers what happens once your code is live: watching it, debugging it, and re-running one-off tasks against it. This works the same way for development workers and production deployment services.
Tail container stdout/stderr in real time from the dashboard, or fetch the last N lines over the API:
GET /api/orgs/:orgId/projects/:projectId/workers/:workerId/logs?tail=200
GET /api/orgs/:orgId/deployments/:deploymentId/services/:serviceId/logs?tail=200The dashboard's log panel streams over a WebSocket for live tailing; the tail query param is used for one-off fetches.
Every worker and deployment service exposes a live resource snapshot:
GET /api/orgs/:orgId/projects/:projectId/workers/:workerId/statsReturns CPU% and memory usage sampled directly from the Docker container. Returns 503 if the container isn't running — there's nothing to sample.
Any port your code listens on inside a worker is detected automatically (ss -tlnpH is polled inside the container every 10 seconds) and exposed without any forwardPorts configuration:
GET /api/orgs/:orgId/projects/:projectId/workers/:workerId/portshttps://worker-{index}-{id}-{port}.{BASE_DOMAIN}The Ports panel on the worker page turns every detected port into a clickable link.
Deployment services can define reusable jobs — one-off migrations, cron-style scripts, data exports — and trigger them on demand:
POST /api/orgs/:orgId/deployments/:deploymentId/services/:serviceId/jobs/:jobId/run
GET /api/orgs/:orgId/deployments/:deploymentId/services/:serviceId/jobs/:jobId/runsEach run stores its full log output, exit status, start/completion time, and is kept permanently in the run history — searchable and paginated from the dashboard.
Aggregated metrics, distributed tracing, and alerting are on the roadmap but not implemented today — see the homepage for the current direction. This page only documents what you can use right now.
