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=200

The 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/stats

Returns 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/ports
https://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/runs

Each 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.

Tip

Jobs run in their own temporary container, on the same deployment network as the service, so they can reach other services (e.g. a database) by name.

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.