Sprites

Release Notes

Updates and improvements to Sprites and our SDKs.

Sprites API

Improved: Storage sync jobs are now resilient to deploys

Large storage syncs are now broken into a chain of small jobs, one per page of buckets, instead of one long-running job. This means a rolling deploy no longer forces a full re-sync from scratch — each page finishes well within the deployment grace period and any interrupted page is safely retried without producing duplicate billing records.

Improved: Remote MCP server tools are clearer and safer

The Sprites remote MCP server now exposes metadata that lets Claude distinguish read-only tools from destructive ones. Users also get more actionable error messages when required parameters are missing or a backend routing issue occurs.

Improved: Storage sync resumes from where it failed

If a storage sync job hits an error partway through paginating buckets, it now picks up from the point of failure instead of starting over from the beginning. Buckets already processed are not lost, and a follow-up job is automatically queued to continue from the last successful offset.

Fixed: Oban queue stats were silently failing to report

A type mismatch in the queue stats query was causing an error on every poll, which meant job queue metrics (sprites_oban_queue_stats_count, oldest_age_ms) were never emitted to Prometheus. The query now runs correctly and metrics appear as expected.

Fixed: Empty job queues now report zero instead of disappearing from metrics

When a job queue drained completely, its metrics series would vanish from Prometheus rather than showing zero. Queue stats now explicitly emit a zero value for every tracked state, so dashboards and alerts behave correctly even when queues are empty.

Improved: Prometheus metrics are now active in production

The Prometheus metrics endpoint is now enabled in the application’s supervision tree. Metrics were previously collected but not served; they are now available and scraped in production.

Fixed: Metrics server no longer fails to start during blue/green deploys

The Prometheus metrics listener previously crashed with an address-in-use error when a new instance started before the old one finished shutting down during a blue/green deploy. The server now uses socket options that allow both instances to bind the same port simultaneously during the cutover window.

Sprites API

New: Prometheus metrics for background job queues

The Sprites API now exposes Prometheus metrics for its internal job pipeline, including job durations, error rates, and queue depths per queue. This makes it possible to set up precise alerts and dashboards using PromQL instead of fragile log-string matching.

Improved: Cleaned up completed backfill infrastructure

The temporary backfill queue and workers used to rebuild app index records have been removed now that the backfill is complete. This keeps the job pipeline tidy and reduces overhead.

Fixed: Storage sync errors for non-active sprites

Storage sync was skipping app index records for destroyed or archived sprites, causing thousands of “AppRecord not found” errors every hour. The fix ensures all sprites — regardless of status — are covered, eliminating the recurring error noise.

Improved: Reduced log noise from orphaned storage buckets

Missing app record warnings during storage sync are now logged at warning level instead of error level, with a single batch summary instead of one error per bucket. Real storage sync failures are now much easier to spot in the logs.

Improved: Increased SQLite queue timeouts

Internal SQLite queue timeouts have been bumped to better handle bursts of activity without triggering premature timeout failures.

Improved: Faster, more reliable health probes and self-replay requests

Health probes and internal self-replay requests now use a larger dedicated connection pool (50x4 instead of 50x1), reducing connection checkout timeouts when many sprite channels are active at the same time.

Sprites API

New: Control who can access private sprite URLs

You can now set private_access on a sprite’s URL settings to allow all org members — not just admins — to access private sprite URLs. The default remains admin-only. Admins can view and change this setting from the sprite detail page.

Fixed: Storage usage was being recorded for deleted sprites

A background job was incorrectly tracking storage usage for sprites that had already been deleted, causing phantom billing data to accumulate. Deleted sprites are now correctly identified and skipped during storage accounting.

Improved: Remote MCP server tools are clearer and safer

The Sprites remote MCP server now exposes metadata that lets Claude distinguish read-only tools from destructive ones. Users also get more actionable error messages when required parameters are missing or a backend routing issue occurs.

Sprites Go SDK

New: Labels support

You can now set, update, and clear labels on sprites using the Go SDK. The new types and helpers integrate with sprite create and update flows.

PR #18

New: PrivateAccess field in URLSettings

The Go SDK’s URLSettings struct now includes a PrivateAccess field, supporting the new sprite URL access control option. This change is backward compatible with older servers.

PR #17

Sprites API

New: Restore a deleted sprite from its backup bucket

Deleted sprites can now be recovered through the admin console when their storage bucket is still intact. This gives operators a way to bring back sprites that were removed accidentally.

Fixed: Sprite snapshots, forking, and fork progress now work correctly

Three issues with the admin sprite page have been resolved: the Snapshots panel now loads correctly instead of always showing empty, forking a sprite to a new sprite now reliably creates and starts the new machine, and the Fork button now shows real progress (“Creating fork bucket…”, “Configuring sprite…”, “Booting machine…”) instead of a static “Forking…” message throughout the ~90-second process.

Fixed: Test pipeline runs reliably again after dependency update

An issue with the CI dependency cache was resolved, so automated tests run cleanly again after a recent internal library update.

Sprites API

Improved: Deleting sprites is now allowed even when flagged as high risk

You can now delete sprites that were previously blocked from deletion due to a high-risk status. This removes an unnecessary restriction that could leave unwanted sprites stuck in your account.

Fixed: Sprite deletion events now reach all listeners in your organization

When a sprite is deleted, the notification is now correctly delivered through the organization-scoped channel so all relevant subscribers receive it. Previously, some listeners could miss the deletion event entirely.

Improved: The machines API now uses “version” instead of “instance_id”

The /orgs/machines endpoint now returns a version field instead of instance_id to be consistent with the rest of the API. This makes the field naming more predictable across endpoints.

Fixed: Health probes that return “sprite not found” are now handled correctly

Health checks that receive a 404 “sprite not found” response are now treated as their own distinct state rather than being grouped with other failures. The system continues probing and recovers automatically if the sprite becomes available again.

Sprites API

New: Sprite channel health monitoring

Sprites now continuously monitors the health of sprite channels, tracking active sessions and key metrics. You can view the latest health status on the admin sprite page and trigger a manual check anytime from the UI.

Sprites Docs

New: Shell completions setup instructions

The docs now include step-by-step instructions for installing shell completions for the Sprites CLI, making it easier to get tab completion working in your terminal.

PR #167

Improved: Clearer Ubuntu upgrade instructions

The Ubuntu upgrade guide now uses the correct apt full-upgrade command, which properly handles package removals during the upgrade. A checkpoint step has also been added so you can roll back quickly if something goes wrong.

PR #166

Sprites API

Improved: Better sprite diagnostics with multi-pass analysis

The Diagnose tool now runs multiple passes over your sprite’s data instead of a single scan, pulling in debug logs, extended metrics, machine events, and version history as needed. Operators can also add symptom notes directly on the sprite admin page to guide the diagnosis.

Fixed: OpenRouter gateway requests now route correctly

API requests through the OpenRouter gateway were failing because the /v1/ path prefix was missing, causing OpenRouter to return an HTML page instead of an API response. The correct paths are now used throughout the playground, usage snippets, and connection test.

New: Bring Your Own API Key with Platform Connection Overrides

Organizations can now supply their own API keys for platform-managed AI provider connections. When an org adds their own key, the platform connection is marked as “Overridden” so it’s always clear which key is in use.

Sprites Go SDK

Fixed: Login redirects now work correctly on sprites with IPv6

Proxy connections were misformatting IPv6 addresses, which caused Claude login redirects to fail on sprites. The address formatting is now handled correctly.

PR #16

Sprites API

New: Bring Your Own API Key with Platform Connection Overrides

Organizations can now supply their own API keys for platform-managed AI provider connections. When an org adds their own key, the platform connection is marked as “Overridden” so it’s always clear which key is in use.

New: Fork a Sprite to Create a New One

Admins can now fork an existing sprite’s storage at any point in time and spin up a brand-new sprite from it. The fork can be created using a specific timestamp, making it easy to branch off a known-good state.

Fixed: Billing Correctly Ignores Storage and Credit Line Items

Stripe invoice processing no longer misidentifies storage allowance charges or credit adjustments as subscription payments. Billing events are now handled accurately without errors.

Improved: Stripe Billing Webhook Simplified

The internal billing webhook handler was streamlined to reduce complexity and make it easier to maintain. Non-matching invoice events are now silently ignored instead of potentially causing errors.

Improved: Completed App Index Backfill Cleaned Up

Background workers used for a one-time data backfill have been removed now that the backfill is complete. This reduces background job overhead and keeps the system tidy.

Improved: Admin Dashboard Updated

The admin health page, which was no longer accurate, has been removed and replaced with a more relevant server upgrade count indicator. The admin interface now shows more useful information.

Improved: Backfill Jobs Now Run in Their Own Queue

Background data backfill jobs have been moved to a dedicated queue, so they no longer compete with other background work. This gives better control over how fast backfills run without affecting other jobs.

New: Background Job System for App Record Backfills

A new two-level background job system handles backfilling app records across all organizations. Failures in one batch no longer require reprocessing an entire org, making large-scale data updates more reliable.

New: Paperclip Tutorial Added

A new tutorial covering Paperclip has been added to the platform.

Sprites API

Fixed: Several reliability issues resolved

Multiple stability improvements landed: the admin upgrades view now correctly lists upgrade servers on load, a crash caused by leftover dead code in the org tracker has been removed, and the upgrade server no longer crashes when a node goes down during lock acquisition. Metric display bugs were also fixed — sparkline units now show correctly and usage totals are no longer double-counted.

Improved: Noisy log messages reduced during sprite creation

Temporary failures during sprite creation that are safe to retry are now logged as warnings instead of errors. This reduces alert noise while still surfacing real problems at the appropriate level.

Fixed: Sprite creation error tracking corrected

Errors during sprite creation are now tracked and reported correctly in metrics. Previously, certain error types caused crashes in the metrics pipeline; they are now handled cleanly without losing any detail in logs.

Improved: Better protection against connection overload

The API is now more resilient to sudden spikes in WebSocket connections (channel storms), preventing them from degrading service for other users.

Improved: API Gateway connectors and admin tools updated

The API Gateway received UI improvements to the connectors view, better label handling, and an updated admin view for Fly Apps. Internal data paths were also cleaned up to remove unused fields.

Improved: Sprite upgrade pipeline simplified

The upgrade process no longer uses Fly machine leases, which added complexity without providing meaningful safety guarantees. Upgrades are still protected against concurrent runs via app-level locking, and the pipeline is now simpler and easier to maintain.

Improved: Internal cluster routing made more efficient

Hot spots in the cluster’s internal routing layer have been reduced by spreading load more evenly across shards, improving overall throughput and stability.

Fixed: Unavailable repo errors now handled correctly during retries

When a database is temporarily unavailable, the system now correctly preserves and surfaces that specific error after retries are exhausted. Previously it could be swallowed and misreported as a timeout.

Improved: Staging environment setup for development

A new configuration file was added to make it easier for the team to spin up personal staging instances of the Sprites API for testing.

Improved: Release notes published for 2026-03-03

Internal release notes for the March 3rd cycle were added to the repository.

Improved: Deployment tooling updated

Deployment scripts were updated to make the internal release process faster and easier.

New: Detailed per-org metrics and admin dashboard

Sprites now collects and exports detailed per-org metrics — including sprite cache performance, API response times, pool assignments, and startup behavior — and surfaces them in an admin dashboard. This gives the team much better visibility into how the platform is performing per organization.

Improved: Sprite startup and upgrade reliability

Sprites now recovers more gracefully from unexpected states: concurrent upgrades across nodes are safely coordinated, stale machines left behind after upgrades are cleaned up automatically, and a sprite with a single stopped machine will now try to start it directly rather than triggering a full recovery sequence.

Sprites API

Improved: More Reliable Database Idle Handling

Litestream now handles idle state more gracefully, improving stability for sprites that aren’t under constant load.

Fixed: Job Queue Recovers Properly After a Restart

The background job queue now correctly rebuilds itself if the underlying database process restarts, so jobs continue processing without manual intervention.

Fixed: Large Request Bodies Now Forward Correctly Through Proxies

Requests with large bodies (like file uploads) are no longer held up before being forwarded to the target sprite — they pass through immediately as expected.

Improved: Warm Sprites Are Ready Before Accepting Traffic

Sprites in the warm pool now only accept new connections once they are fully started, reducing cases where a “warm” start felt as slow as a cold one.

Improved: Internal Release Notes Tooling Updated

Updated internal documentation for the release notes process.

Sprites API

New: Memory autoscaling

Sprites now start with 2 GB of memory and can autoscale up to 16 GB based on demand, replacing the previous fixed memory allocation approach.

New: MCP OAuth consent flow with restricted tokens

The MCP OAuth flow now shows a consent screen where you can configure restrictions like name prefix and max sprites. A restricted token is automatically created on approval and cleaned up on revocation.

New: MCP dynamic tool generation

MCP tools are now dynamically generated from the API schema, keeping the tool catalog in sync automatically.

Improved: Upgrade URL in rate limit responses

Rate limit error responses now include an org-specific upgrade URL, making it easier to find the right plan page.

Improved: MCP proxy error logging

MCP proxy failure logs now inline the sprite name, tool name, status, and error reason directly in the message for easier debugging.

Fixed: Expired session tokens no longer block token creation

When your Fly.io session token expires but your browser session is still valid, you can now create API tokens without being incorrectly blocked.

Sprites Go SDK

New: Service endpoint examples

The Go SDK now includes examples for all service endpoints — list, get, create, start, and stop — making it easier to get started with service management in Go.

PR #14

Sprites API

Fixed: OAuth on Sprite app domains now works correctly

Visiting /oauth/authorize on a Sprite app domain was incorrectly redirecting to MCP auth instead of your app’s OAuth flow. This is now fixed — Sprite apps can use OAuth without interference from the MCP auth layer.

Improved: Sprite lookups now use in-memory cache

The API now uses the SpriteIndex cache when looking up sprites for access checks, reducing database load. Label-restricted tokens still enforce access correctly, and the show endpoint continues to return full sprite details.

Fixed: No more noisy warnings on exec requests

Every /exec request was generating a [Replay] payload mismatch warning in logs even though the request worked fine. The request type classification is now consistent between the API and the sprite, so these warnings no longer appear.

Improved: Sprite startup is faster and more reliable

Sprites that are already running or connected are now detected earlier in the startup flow, avoiding unnecessary API calls and recovery attempts. Requests are also less likely to arrive before a sprite’s channel is visible, reducing edge-case delays.

Sprites Python SDK

New: Python examples for service endpoints

The Python SDK now includes example scripts for all five service endpoints: listing services, getting a service, creating a service, starting a service, and stopping a service. These follow the same patterns as the existing checkpoint examples.

PR #22

Sprites API

New: API gateway with OAuth connections

Sprites can now connect to external APIs like Slack and GitHub through a built-in OAuth gateway. Users authorize once, configure access policies to control which Sprites can use each connection, and Sprites make requests through the gateway which handles authentication automatically. Tokens are encrypted at rest with AES-256-GCM.

Sprites API

New: Seat-based plan upgrades and downgrades

Organizations can now upgrade and downgrade between seat-based plans with modal confirmations. Upgrades happen immediately while downgrades are scheduled for the start of the next billing period.

New: Org dashboard with connected services and billing

The org dashboard now shows connected services, labels, billing information, and developer tools in a unified view.

Fixed: Checkout redirect URL

After adding a credit card, users are now correctly redirected back to sprites.dev instead of fly.io.

Sprites Docs

Improved: Eliminated header and font flickering between pages

Navigation between documentation pages is now smooth and flicker-free, using Astro’s client router for SPA-like page transitions.

PR #144

Sprites API

New: Redesigned CLI authentication flow

The CLI login experience has been redesigned with an updated look and feel.

Improved: Faster sprite URL requests

Sprite URL requests no longer require a database roundtrip on every call. Frequently accessed data is now cached in memory, reducing latency.

Improved: Deployment documentation expanded

Deployment documentation for the Sprites API has been expanded based on recent operational learnings.

Fixed: MCP tools now correctly accept path parameters

MCP tools like service_get were returning 404 errors because path parameters were missing from the tool schema. All affected tools now include the correct parameters.

Fixed: Service API parameter naming conflict resolved

The service path parameter was renamed to avoid a collision with the sprite name parameter, ensuring MCP service tools correctly identify both the sprite and the service.

Fixed: Sprite version now updates correctly after upgrade

Sprite records were not reflecting the new version after an upgrade completed. The version is now always persisted correctly, even after restarts mid-upgrade.

Sprites API

Improved: Clearer MCP proxy error logs

MCP proxy failures now include inline details (sprite name, tool name, status, error reason) for easier debugging.

Fixed: Token restrictions enforced for MCP

Restricted token policies (name prefix and max sprites) are now properly enforced when creating sprites through MCP, matching the REST API behavior.

Fixed: Login errors resolved

Fixed an issue that was causing 500 errors during login.

Sprites Go SDK

Improved: TTY sessions report correct exit codes

Fixed an issue where TTY sessions always reported exit code -1 instead of the actual exit code.

PR #13

Fixed: WebSocket deadlocks in TTY mode

Fixed deadlocks in TTY exec by decoupling stdin reads from WebSocket writes using a buffered channel pipeline.

PR #11

Sprites JS SDK

Improved: Control mode defaults to off

Control mode now defaults to off and gracefully falls back to direct WebSocket when the control endpoint isn’t available, preventing crashes on older sprites.

PR #6

Sprites Python SDK

Improved: Control mode defaults to off

Control mode now defaults to off and gracefully falls back to direct WebSocket when the control endpoint isn’t available, preventing crashes on older sprites.

PR #15

Sprites API

New: Browser-based sprite authentication

Sprites now support authentication through a browser-based flow, with clear messaging when you’re signed into the wrong organization.

Fixed: OAuth consent flow bug

Fixed a variable shadowing bug in the MCP OAuth consent flow that was preventing authorization codes from being created.

Sprites Go SDK

New: Control WebSocket support

Added persistent multiplexed WebSocket connections for more efficient command execution and filesystem operations, with connection pooling and automatic fallback to direct mode.

PR #9

New: Debug connection mode

Added ConnectionMode() method to help debug whether control or direct WebSocket mode is being used.

PR #8

Sprites JS SDK

New: Control connection support

Added multiplexed WebSocket connections for more efficient command execution, with connection pooling (100 max) and automatic fallback when the control endpoint is unavailable.

PR #4

Sprites Python SDK

New: Control connection support

Added multiplexed WebSocket connections for more efficient command execution, with connection pooling and automatic fallback when the control endpoint is unavailable.

PR #13

Sprites API

New: Email support for paid plans

Hero, Champion, and Legend plans now include standard email support. Epic and Mythic plans include premium email support with faster response times.

New: MCP OAuth consent screen

When connecting MCP clients, you now see a consent screen where you can configure restrictions like sprite name prefixes and maximum sprite count before granting access.

New: Dynamic MCP tool generation

MCP tools are now generated dynamically based on your sprites, giving AI assistants access to your specific sprite capabilities.

Improved: More reliable MCP tool routing

MCP tool calls now use a dedicated proxy for more reliable routing to sprite machines.

Sprites API

New: Restricted API tokens

You can now create API tokens with restrictions like maximum sprite count, required name prefixes, and label-based access control. Tokens can also have expiration dates.

Improved: Separate runtime and environment upgrades

Auto-upgrades now only update the Sprites runtime without changing your environment (Ubuntu base, languages). Use upgrade_type: "all" when you want to update everything.

Improved: Faster cold starts for web requests

Web requests to stopped sprites now automatically start the machine and wait up to 10 seconds before responding, rather than failing immediately.

Improved: Simpler WebSocket channel monitoring

WebSocket channel tracking now uses a simpler architecture with built-in PID monitoring, improving reliability when connections drop.

Improved: Rate limit errors include upgrade link

When you hit rate limits, error responses now include a direct link to upgrade your plan.

Fixed: Litestream restore safety

Fixed an edge case where Litestream could restore from a stale database backup.

Sprites Go SDK

Improved: Structured API errors

WebSocket connection failures now return structured APIError objects with error codes, limits, and upgrade URLs instead of raw JSON strings.

PR #5

Sprites Python SDK

Improved: Structured API errors

API errors now include structured fields like upgrade_url, making it easier to handle rate limits and guide users to upgrade their plans.

PR #12

Sprites JS SDK

Improved: Structured API errors

The APIError class now includes all structured fields including upgradeUrl, matching the improvements in the Go and Python SDKs.

PR #2

Sprites API

New: Multiple subscription tiers

Choose from four plan tiers based on your needs:

  • Level 1 (Recruit) - Free tier
  • Level 20 (Adventurer) - $20/mo
  • Level 200 (Legend) - $200/mo
  • Level 2000 (Mythic) - $2,000/mo

Improved: Landing page navigation

The landing page now has separate links for Docs (docs.sprites.dev) and API Reference (/api), making it easier to find what you need.

New: Hot and cold storage pricing display

The landing page billing section now shows the two-tier storage pricing: hot storage ($0.50/GB-month) for active working data and cold storage ($0.02/GB-month) for object storage.

Sprites Docs

New: API version selector

You can now switch between API versions directly from the sidebar. Your preference is saved, so when you return to the docs you’ll automatically see your preferred version.

PR #85

New: Hot and cold storage pricing documentation

Documentation now covers the two-tier storage pricing model with detailed explanations of hot storage for active data and cold storage for backups.

PR #90

Fixed: Broken links on API reference pages

Links on the API reference index pages now work correctly across all versions.

PR #100

Sprites Go SDK

New: Better error handling for rate limits

The Go SDK now returns structured error information when you hit rate limits. Use IsRateLimitError() to detect rate limiting and GetRetryAfterSeconds() to know when to retry.

PR #3 by @mrkurt

Sprites Docs

New: Interactive API documentation

Added a new API reference section with code examples in Go, Python, JavaScript, and Elixir. Your language preference is remembered across pages.

PR #59 by @kylemclaren

Sprites Go SDK

Fixed: Session attachment works with older sprites

Fixed an issue where attaching to sessions on older sprites would fail. The SDK now automatically detects and uses the correct endpoint format.

PR #2 by @mrkurt

Sprites Python SDK

Fixed: Commands no longer return incorrect exit codes

Fixed a race condition that could cause commands to report exit status 255 instead of the actual exit code.

PR #7 by @mrkurt

Fixed: Command output no longer gets lost

Fixed a timing issue where fast-running commands could miss their output. Output is now captured reliably from the moment a command starts.

PR #6 by @mrkurt

New: Python SDK now available on PyPI

You can now install the Python SDK with pip install sprites-py.

PR #4 by @mrkurt

Sprites Docs

New: Introduction video on homepage

Added an embedded video walkthrough on the overview page to help you get started with Sprites.

PR #61 by @kylemclaren

Improved: Checkpoints documentation rewritten

Simplified the checkpoints guide with clearer explanations and fewer redundant examples.

PR #60 by @kcmartin

Sprites Docs

New: Elixir SDK documentation

Added documentation for the Elixir SDK. You can now use Sprites from your Elixir and Phoenix applications.

PR #45 by @kylemclaren

Improved: Resource limits clarified

Updated the docs to clarify that sprites can use up to 8 vCPUs, 8GB RAM, and 100GB storage. You’re billed based on actual usage.

PR #43 by @kcmartin

Sprites Docs

Improved: Lifecycle and persistence guide rewritten

Simplified the lifecycle documentation with clearer explanations of what persists between sessions and what doesn’t.

PR #30 by @kcmartin

Improved: Networking documentation streamlined

Rewrote the networking docs for clarity, removing repetitive information.

PR #28 by @kcmartin

Sprites Docs

New: LLM-friendly documentation export

You can download the entire documentation as a single text file at /llms-full.txt, useful for feeding into AI assistants.

PR #11 by @kylemclaren

Improved: Updated pricing

Updated the billing calculator and documentation to reflect current pricing: $0.07/vCPU-hour, $0.011/GB-hour for RAM, and $0.10/GB-month for storage.

PR #17 by @asib

Sprites Docs

New: Documentation site launched

Launched the new Sprites documentation site at docs.sprites.dev.

PR #1 by @kylemclaren

You've reached the beginning.