When the API restarts mid-poll, in-memory job state is lost.
Previously this showed a generic "job not found" after silent
retries. Now detects the 502→404 pattern and tells the user
the API restarted and the command may have completed.
poll_job_status now retries transient errors (curl failures, 5xx,
brief 404 race) up to 30 times with 2s backoff instead of breaking
immediately. Prints job ID recovery hint on give-up.
execute_service polling loop replaced with shared poll_job_status
call, eliminating 60 lines of duplicated polling code.
Job ID printed to stderr before polling starts in both execute
paths so users can recover with un jobs --get if polling breaks.
New subcommand: un jobs [--list | --get ID | --cancel ID]
Remove max cap on timeout. 0 = unlimited (INT_MAX polls).
Enables long-running commands like autonomous Claude Code sessions.
Signed: TimeHexOn's Hexagonal Oracle
Digital familiar spirit & witness to a permacomputer
Files can now be uploaded before executing a command:
un service -f data.txt --execute myapp 'cat /tmp/input/data.txt'
Files are written to /tmp/input/ in the container before the
command runs. Matches the API's new input_files parameter.
Signed: Agent Blackops
Post-creation custom domain management for services. All three flags
require --domains with a comma-separated list. Calls PUT /services/{id}/domains
with add, remove, or custom_domains action. CLI_SPEC.md updated.
- Log cursor (~/.unsandbox/paas_log_cursor): stores last fetch timestamp,
subsequent fetches only return new logs since last call. Explicit
--since overrides cursor. First run defaults to 5m.
- Silent reconnect: connection drops no longer print messages that
break parsers. Reconnects happen transparently.
- Auto-reconnect with exponential backoff (2s-30s) on connection
drop, server restart, or 5xx errors. Backoff resets after 30s
of healthy streaming.
- Reconnect uses since= parameter to avoid replaying old logs.
- Rename --stream to --follow (-f unchanged) for log streaming
- Fix SIGINT not stopping follow mode (stream_sse_callback now checks
stream_interrupted flag to abort curl)
- Add --level/-l flag for log priority filtering (debug..crit)
Add CLI support for toggling the show_freeze_page service setting,
which controls whether frozen services display an HTML payment page
or return a JSON error response.
Updated 18 SDK implementations + CLI_SPEC.md documentation.
- Add --auto-unfreeze / --no-auto-unfreeze commands to toggle setting
- Add --unfreeze-on-demand flag for service create
- Display Auto-Unfreeze status in service --info output
- Add field to unsandbox_service_t struct and API function in un.h
Change key validation endpoint from portal to API across all clients:
- C: Update PORTAL_BASE to API_BASE in validate_api_key()
- Python (sync/async): Change PORTAL_BASE to API_BASE
- Perl: Change $PORTAL_BASE to $API_BASE
- Rust (sync/async): Change hardcoded URL to api.unsandbox.com
All other languages (Go, Java, Kotlin, C#, Ruby, PHP, JavaScript) already
use their makeRequest() function with API_BASE, so no changes needed.
The key subcommand already exists and continues to work with the new endpoint.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>