date: 2026-05-27 title: 'Spice v2.0-rc.5 (May 27, 2026)' type: blog authors: [jeadie] tags: [release, cayenne, postgres, mongodb, snowflake, udf, kafka, arrow, ducklake, data-connector]
Spice v2.0-rc.5 is now available! 🔥
v2.0.0-rc.5 is the fifth release candidate for advanced testing of v2.0, building on v2.0.0-rc.4 (opens in a new tab).
This release completes the mTLS implementation across server endpoints and outbound connectors, adds MongoDB Change Streams and durable Kafka offset persistence as new CDC sources, expands DML write-back to PostgreSQL, Snowflake, and Arrow, promotes DuckLake to Beta, introduces user-defined functions, on-demand dataset loading, unified query cancellation, dynamic HTTP request headers and subquery-driven request parameters, provider-aware LLM prompt caching, and a long list of Cayenne performance improvements.
Highlights in this release candidate include:
ST_*) for geometry workloadsCtrl-C and HTTP request cancellation propagate across all execution pathsrefresh_mode: snapshot — point-in-time snapshot acceleration with SQLite/Turso WAL flushingresponse.output_text.delta, plus Authorization: Bearer header supportSignificant performance work across Spice Cayenne (opens in a new tab)-backed catalogs and accelerators.
cayenne_inlined_data), bypassing the staged Vortex write path for low-latency ingest. Inline upserts atomically rewrite existing inline rows instead of emitting side delete markers, and inline data remains query-visible via an in-memory union scan with a generation-keyed decode cache. Inline rows are checkpointed to Vortex when row, segment, or byte thresholds are reached. Defaults are refresh-mode aware: inline writes are enabled by default for high-frequency caching, changes, and fast append workloads and disabled for full, snapshot, and slower append.runtime.params.cayenne_filter_propagation), range fallback for large join filters, hot-path clone elimination, and IN-list rewrites for large filter lists.NULL-sentinel handling for nullable partition expressions (e.g. bucket(N, col)), Vortex panic fix on highly compressible data, and live reads through expired protected snapshots.Spice.ai Enterprise (opens in a new tab) feature. See Enterprise Security (opens in a new tab).
Spice now supports full mutual TLS (opens in a new tab) for both HTTP and Arrow Flight endpoints.
TLS cert hot-reload (#10727 (opens in a new tab)): The Spice runtime watches for SIGHUP and reloads TLS certificates without restarting, enabling cert rotation with zero downtime.
Public mTLS for HTTP and Flight (#10753 (opens in a new tab)): Two client_auth_mode values control how the server handles client certificates:
request — optional mTLS: the server requests a client cert but accepts connections without one (useful for migration windows).required — strict mTLS: the server requires a valid client cert signed by the configured CA.mTLS client certs for FlightSQL and Spice.ai connectors (#10764 (opens in a new tab)): Outbound connections from the FlightSQL and Spice.ai data connectors can now present client certificates for mutual authentication with upstream services.
Example configuration:
MongoDB (opens in a new tab) datasets configured with refresh_mode: changes now stream changes from MongoDB Change Streams into any local accelerator (#10813 (opens in a new tab)), providing real-time CDC without Debezium or Kafka.
Example configuration:
See Change Data Capture (CDC) (opens in a new tab) for an overview of CDC in Spice.
The PostgreSQL (opens in a new tab) data connector now supports write-back via INSERT, UPDATE, and DELETE operations (#10446 (opens in a new tab)). Combined with the existing read-side federation, PostgreSQL-backed datasets can serve as full read/write tables. The PostgreSQL Catalog connector additionally exposes foreign-key metadata for NSQL and query planning (#10849 (opens in a new tab)).
The Snowflake (opens in a new tab) data connector now supports write-back via INSERT, UPDATE, and DELETE operations (#10747 (opens in a new tab)), complementing its existing read capabilities.
Arrow (opens in a new tab)-accelerated tables now support native upsert operations using primary key matching (#10749 (opens in a new tab)), providing efficient update-or-insert semantics for in-memory datasets.
The DuckLake (opens in a new tab) Catalog and Data Connector (opens in a new tab) are promoted to Beta quality (#10743 (opens in a new tab)).
DuckLake catalog tables with read_write access now support INSERT operations (#10744 (opens in a new tab)), enabling full read/write workflows against DuckLake-backed catalogs. The DuckLake connector also gains a series of correctness fixes for downcast, module registration, schema discovery, and S3 credentials (#10650 (opens in a new tab)).
Spice now supports user-defined functions (UDFs) as a first-class spicepod component (#10571 (opens in a new tab)), letting you define reusable SQL functions in the spicepod or invoke remote functions over HTTP. The runtime also gains table user functions with HTTP server gating (#10675 (opens in a new tab)).
A security fix closes a remote-UDF SSRF vector (#10757 (opens in a new tab)).
Spice now ships an optional set of geospatial SQL (opens in a new tab) UDFs (ST_*) for geometry workloads (#10833 (opens in a new tab)). The functions are gated behind a build feature and can be invoked from any SQL surface.
Datasets (opens in a new tab) can now be marked for on-demand loading (#10629 (opens in a new tab)). Deferred datasets are registered with a declared schema at startup (#10669 (opens in a new tab)) and only fully resolve when first referenced, reducing startup time and memory footprint for spicepods with many seldom-used datasets.
Spicepods also gain columns[].type and columns[].nullable (#10661 (opens in a new tab)) with a lenient type parser for declaring schemas inline.
All query execution paths — HTTP, Flight, FlightSQL, MCP, and internal — now honour a unified cancellation signal (#10390 (opens in a new tab)). When a client disconnects, presses Ctrl-C in the REPL, or cancels an in-flight HTTP request, the corresponding query is cancelled end-to-end, freeing resources promptly.
The HTTP data connector (opens in a new tab) gains dynamic request headers parameterised from query predicates (#10604 (opens in a new tab)), subquery-driven request parameters for fan-out queries (#10636 (opens in a new tab)), HTTP response metadata as queryable columns via JSON schema decomposition (#10679 (opens in a new tab)), no-limit pagination (#10673 (opens in a new tab)), and shared rate-control across HTTP-based connectors using the same backend host (#10648 (opens in a new tab)).
The HTTP rate-control state (per-endpoint throttle counters) is now persisted in object storage (#10697 (opens in a new tab)), ensuring rate limits survive restarts and are consistent across replicas. Rate-control metrics now use an origin label rather than the connector name for cleaner aggregation (#10689 (opens in a new tab)).
The metrics HTTP endpoint (/metrics) is also independently rate-limited (#10162 (opens in a new tab)) to prevent scraping from impacting query serving.
refresh_mode: snapshotSpice.ai Enterprise (opens in a new tab) feature. See Acceleration Snapshots (opens in a new tab).
A new refresh_mode: snapshot provides point-in-time snapshot acceleration (#10651 (opens in a new tab)), with SQLite and Turso WAL flushing and a Cayenne metastore slice integration so accelerated readers see a consistent snapshot while writes continue.
Acceleration (opens in a new tab) configs gain a new storage_profile field (#10913 (opens in a new tab)) with values auto (default), local_ssd, ebs, and tmpfs. Under auto, the runtime detects whether the acceleration store is backed by local SSD, EBS-class network disk, or tmpfs, and applies storage-aware defaults across DuckDB, partitioned DuckDB, SQLite, Turso, and Cayenne file-mode accelerators. Explicit per-accelerator parameters always override the profile defaults.
LLM (opens in a new tab) calls automatically use provider-aware prompt caching (#10645 (opens in a new tab)) when the configured model provider supports it (e.g., Anthropic, OpenAI). System prompts and tool descriptions are marked for caching so repeated invocations within the cache window reuse the provider-side cached prefix, reducing latency and cost.
A new searchable registry mode for LLM tools (#10647 (opens in a new tab)) lets agents discover tools by semantic search rather than enumerating all tools in the system prompt, which scales to large tool inventories.
The Responses API is now supported across all configured model providers (opens in a new tab) (#10724 (opens in a new tab)). Streaming delta events via response.output_text.delta are also supported (#10828 (opens in a new tab)). The runtime now also accepts Authorization: Bearer headers in addition to x-api-key, bumps async-openai, and stops populating FunctionToolCall.id so OpenAI-compatible servers can assign the ID themselves (#10911 (opens in a new tab)).
Spice.ai Enterprise (opens in a new tab) feature. See High Availability (opens in a new tab).
/v1/ready on schedulers waits for a configurable quorum of executors before returning healthy, enabling proper rolling deployments.runtime.params.shuffle_location: s3://... now complete instead of failing with AccessDenied on shuffle fetches.runtime.scheduler.partition_management.* fields are flattened directly onto runtime.scheduler and renamed under the canonical "partition assignment" terminology. See Breaking Changes (opens in a new tab).Improvements across Caching (opens in a new tab) and Search (opens in a new tab):
HNSW_INDEX_SCAN, and HNSW indexes are preserved across data refresh.See Authentication (opens in a new tab) and TLS (opens in a new tab) for configuring Spice security.
allowed_hosts for MCP (#10638 (opens in a new tab)): MCP servers can be restricted to an explicit allowlist of upstream hosts.See the SQL Reference (opens in a new tab) for the full SQL surface area.
\x in the REPL for a vertical key-value layout on wide result sets.CommandStatementSubstraitPlan, enabling clients that submit plans as Substrait-encoded protobuf.mcp_auth_token and mcp_headers, both with full Spice secret expansion.Notable correctness fixes across the Data Connectors (opens in a new tab): DynamoDB Streams retry on transient errors (#10794 (opens in a new tab)) and typed-NULL handling in DML (#10511 (opens in a new tab)); ScyllaDB physical filter pushdown disabled to fix incorrect results (#10772 (opens in a new tab)); MSSQL TOP N pushdown for non-nullable sort columns (#10621 (opens in a new tab)); DuckLake include filter applied (#10738 (opens in a new tab)); DuckDB DELETE/UPDATE on full and caching refresh modes (#10632 (opens in a new tab)); checked arithmetic for Turso integer-millis and timestamp-to-nanosecond conversions (#10786 (opens in a new tab), #10666 (opens in a new tab)); and Flight GetFlightInfo/DoGet schema parity (). See the for the full list.
| Dependency / Component | Version |
|---|---|
| DuckDB | v1.5.2 |
| Iceberg | v0.9.1 |
| Turso | v0.6.0 |
| Vortex | v0.69.0 |
Flattened runtime.scheduler configuration (#10450 (opens in a new tab)): The nested runtime.scheduler.partition_management block has been flattened and renamed to use the canonical "partition assignment" terminology. Migrate as follows:
No new cookbook recipes.
The Spice Cookbook (opens in a new tab) includes 86 recipes to help you get started with Spice quickly and easily.
To upgrade to v2.0.0-rc.5, use one of the following methods:
CLI:
Homebrew:
Docker:
Pull the spiceai/spiceai:2.0.0-rc.5 image:
For available tags, see DockerHub (opens in a new tab).
Helm:
AWS Marketplace:
Spice is available in the AWS Marketplace (opens in a new tab).
Full Changelog: https://github.com/spiceai/spiceai/compare/v2.0.0-rc.4...v2.0.0-rc.5 (opens in a new tab)
full and caching refresh mode datasets by @phillipleblanc (opens in a new tab) in #10632 (opens in a new tab)include filter being ignored by @phillipleblanc (opens in a new tab) in #10738 (opens in a new tab)kind validation by @krinart (opens in a new tab) in #10777 (opens in a new tab)spice cloud metrics table output by @claudespice (opens in a new tab) in #10784 (opens in a new tab)tool_search/tool_invoke spans by @lukekim (opens in a new tab) in #10791 (opens in a new tab)response.output_text.delta to responses API by @krinart (opens in a new tab) in #10828 (opens in a new tab)spice feedback command to open community Slack by @lukekim (opens in a new tab) in #10856 (opens in a new tab)CayennePropagateFilterAcrossEquiJoinKeys by @sgrebnov (opens in a new tab) in #10863 (opens in a new tab)responses_adapter fix by @krinart (opens in a new tab) in #10911 (opens in a new tab)NULL sentinel for nullable partition expressions by @Jeadie (opens in a new tab) in #10880 (opens in a new tab)