- Rust 99.3%
- Shell 0.3%
- Smarty 0.2%
- Just 0.1%
## 🤖 New release * `s2-common`: 0.38.0 -> 0.39.0 (⚠ API breaking changes) * `s2-api`: 0.30.1 -> 0.30.2 (✓ API compatible changes) * `s2-resource-spec`: 0.1.0 * `s2-storage`: 0.1.0 * `s2-lite`: 0.36.5 -> 0.36.6 (✓ API compatible changes) * `s2-sdk`: 0.31.4 -> 0.31.5 (✓ API compatible changes) * `s2-cli`: 0.36.5 -> 0.36.6 ### ⚠ `s2-common` breaking changes ```text --- failure enum_missing: pub enum removed or renamed --- Description: A publicly-visible enum cannot be imported by its prior path. A `pub use` may have been removed, or the enum itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/enum_missing.ron Failed in: enum s2_common::resource_spec::TimestampingModeSpec, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:197 enum s2_common::types::access::ArchivedResourceSet, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:193 enum s2_common::record::RecordDecodeError, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/mod.rs:55 enum s2_common::types::metrics::StreamMetricSet, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:83 enum s2_common::types::resources::ProvisionResult, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/resources.rs:96 enum s2_common::types::access::Operation, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:163 enum s2_common::types::access::ResourceSet, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:195 enum s2_common::resource_spec::StorageClassSpec, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:79 enum s2_common::types::metrics::MetricUnit, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:4 enum s2_common::types::metrics::AccountMetricSet, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:55 enum s2_common::types::stream::ReadSessionOutput, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:474 enum s2_common::types::stream::ReadFrom, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:387 enum s2_common::types::metrics::TimeseriesInterval, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:10 enum s2_common::types::metrics::Metric, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:48 enum s2_common::types::resources::ProvisionMode, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/resources.rs:74 enum s2_common::types::config::TimestampingMode, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:78 enum s2_common::types::metrics::BasinMetricSet, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:67 enum s2_common::record::StoredRecord, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/mod.rs:204 enum s2_common::record::RecordDecryptionError, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/encryption.rs:110 enum s2_common::types::access::ResourceSetResolver, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:193 enum s2_common::types::config::RetentionPolicy, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:55 enum s2_common::record::RecordType, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/mod.rs:86 enum s2_common::types::stream::ReadPosition, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:381 enum s2_common::types::config::StorageClass, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:46 enum s2_common::resource_spec::EncryptionAlgorithmSpec, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:108 --- failure feature_missing: package feature removed or renamed --- Description: A feature has been removed from this package's Cargo.toml. This will break downstream crates which enable that feature. ref: https://doc.rust-lang.org/cargo/reference/semver.html#cargo-feature-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/feature_missing.ron Failed in: feature resource_spec in the package's Cargo.toml --- failure function_missing: pub fn removed or renamed --- Description: A publicly-visible function cannot be imported by its prior path. A `pub use` may have been removed, or the function itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/function_missing.ron Failed in: function s2_common::record::decrypt_stored_record, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/encryption.rs:274 function s2_common::record::try_metered_size, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/mod.rs:110 function s2_common::resource_spec::validate, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:314 function s2_common::record::encrypt_record, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/encryption.rs:202 function s2_common::record::decode_if_command_record, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/mod.rs:292 function s2_common::resource_spec::json_schema, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:310 --- failure module_missing: pub module removed or renamed --- Description: A publicly-visible module cannot be imported by its prior path. A `pub use` may have been removed, or the module may have been renamed, removed, or made non-public. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/module_missing.ron Failed in: mod s2_common::types::config, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:1 mod s2_common::types::basin, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/basin.rs:1 mod s2_common::types::resources, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/resources.rs:1 mod s2_common::types::metrics, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:1 mod s2_common::types::location, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/location.rs:1 mod s2_common::types::access, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:1 mod s2_common::bash, previously in file /tmp/.tmpdi5YbZ/s2-common/src/bash.rs:1 mod s2_common::types, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/mod.rs:1 mod s2_common::resource_spec, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:1 mod s2_common::types::stream, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:1 --- failure pub_module_level_const_missing: pub module-level const is missing --- Description: A public const is missing or renamed ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/pub_module_level_const_missing.ron Failed in: MAX_REQUEST_TOKEN_LENGTH in file /tmp/.tmpdi5YbZ/s2-common/src/types/resources.rs:144 --- failure pub_static_missing: pub static is missing --- Description: A public static is missing, renamed, or made private. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/pub_static_missing.ron Failed in: BASIN_HEADER in file /tmp/.tmpdi5YbZ/s2-common/src/types/basin.rs:13 REQUEST_TOKEN_HEADER in file /tmp/.tmpdi5YbZ/s2-common/src/types/resources.rs:138 PROVISION_RESULT_HEADER in file /tmp/.tmpdi5YbZ/s2-common/src/types/resources.rs:141 --- failure struct_missing: pub struct removed or renamed --- Description: A publicly-visible struct cannot be imported by its prior path. A `pub use` may have been removed, or the struct itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/struct_missing.ron Failed in: struct s2_common::resource_spec::RetentionPolicySpec, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:140 struct s2_common::types::access::AccessTokenInfo, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:229 struct s2_common::types::location::LocationName, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/location.rs:35 struct s2_common::bash::Bash, previously in file /tmp/.tmpdi5YbZ/s2-common/src/bash.rs:7 struct s2_common::types::access::ReadWritePermissions, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:207 struct s2_common::types::config::OptionalTimestampingConfig, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:130 struct s2_common::types::resources::ListItemsRequest, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/resources.rs:63 struct s2_common::types::basin::BasinInfo, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/basin.rs:205 struct s2_common::types::stream::ReadStart, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:400 struct s2_common::types::metrics::ScalarMetric, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:20 struct s2_common::types::stream::AppendRecord, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:176 struct s2_common::types::location::LocationNameResolver, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/location.rs:33 struct s2_common::types::resources::Page, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/resources.rs:6 struct s2_common::types::stream::AppendRecordParts, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:197 struct s2_common::types::stream::StreamNameStrResolver, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:24 struct s2_common::types::metrics::AccountMetricsRequest, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:60 struct s2_common::types::stream::ReadBatch, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:420 struct s2_common::record::RecordBatcher, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/batcher.rs:30 struct s2_common::types::stream::AppendRecordBatch, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:227 struct s2_common::types::ValidationError, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/mod.rs:12 struct s2_common::types::access::ArchivedAccessTokenIdStr, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:17 struct s2_common::resource_spec::BasinConfigSpec, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:45 struct s2_common::types::config::StreamConfig, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:103 struct s2_common::resource_spec::HumanDuration, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:238 struct s2_common::types::basin::BasinNameStrResolver, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/basin.rs:18 struct s2_common::types::config::StreamReconfiguration, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:122 struct s2_common::record::RecordBatch, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/batcher.rs:9 struct s2_common::types::stream::AppendAck, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:374 struct s2_common::record::MagicByte, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/mod.rs:93 struct s2_common::resource_spec::DeleteOnEmptySpec, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:229 struct s2_common::resource_spec::BasinSpec, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:27 struct s2_common::types::metrics::BasinMetricsRequest, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:76 struct s2_common::types::config::DeleteOnEmptyReconfiguration, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:117 struct s2_common::types::resources::ListLimit, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/resources.rs:28 struct s2_common::types::access::AccessTokenScope, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:220 struct s2_common::types::stream::AppendInput, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:323 struct s2_common::types::location::ArchivedLocationName, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/location.rs:33 struct s2_common::record::EncryptedRecord, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/encryption.rs:127 struct s2_common::types::stream::ArchivedStreamNameStr, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:24 struct s2_common::resource_spec::StreamConfigSpec, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:61 struct s2_common::types::location::LocationInfo, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/location.rs:146 struct s2_common::types::access::IssueAccessTokenRequest, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:237 struct s2_common::types::resources::RequestToken, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/resources.rs:151 struct s2_common::types::access::AccessTokenIdStr, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:19 struct s2_common::types::config::TimestampingReconfiguration, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:111 struct s2_common::types::stream::StreamNameStr, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:26 struct s2_common::types::config::DeleteOnEmptyConfig, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:92 struct s2_common::types::config::BasinConfig, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:340 struct s2_common::types::config::TimestampingConfig, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:86 struct s2_common::types::config::OptionalStreamConfig, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:227 struct s2_common::types::basin::ArchivedBasinNameStr, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/basin.rs:18 struct s2_common::types::metrics::AccumulationMetric, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:27 struct s2_common::types::metrics::LabelMetric, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:42 struct s2_common::resource_spec::TimestampingSpec, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:185 struct s2_common::resource_spec::ResourcesSpec, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:20 struct s2_common::types::metrics::MetricsResponse, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:95 struct s2_common::types::basin::BasinNameStr, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/basin.rs:20 struct s2_common::types::config::BasinReconfiguration, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:397 struct s2_common::record::StoredRecordIterator, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/iterator.rs:7 struct s2_common::types::metrics::GaugeMetric, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:35 struct s2_common::types::resources::RequestTokenTooLongError, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/resources.rs:148 struct s2_common::types::stream::StreamInfo, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:168 struct s2_common::types::config::StorageClassIter, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:37 struct s2_common::types::config::OptionalDeleteOnEmptyConfig, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/config.rs:184 struct s2_common::types::access::PermittedOperationGroups, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:213 struct s2_common::types::access::AccessTokenIdStrResolver, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/access.rs:17 struct s2_common::types::stream::ReadEnd, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/stream.rs:406 struct s2_common::types::metrics::StreamMetricsRequest, previously in file /tmp/.tmpdi5YbZ/s2-common/src/types/metrics.rs:87 struct s2_common::resource_spec::StreamSpec, previously in file /tmp/.tmpdi5YbZ/s2-common/src/resource_spec.rs:37 --- failure trait_missing: pub trait removed or renamed --- Description: A publicly-visible trait cannot be imported by its prior path. A `pub use` may have been removed, or the trait itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/trait_missing.ron Failed in: trait s2_common::record::Encodable, previously in file /tmp/.tmpdi5YbZ/s2-common/src/record/mod.rs:310 ``` <details><summary><i><b>Changelog</b></i></summary><p> ## `s2-common` <blockquote> ## [0.39.0] - 2026-06-12 ### Refactor - Split storage internals from common ([#533](https://github.com/s2-streamstore/s2/issues/533)) ### Testing - Add unit tests for low-coverage modules ([#515](https://github.com/s2-streamstore/s2/issues/515)) <!-- generated by git-cliff --> </blockquote> ## `s2-api` <blockquote> ## [0.30.2] - 2026-06-12 ### Refactor - Split storage internals from common ([#533](https://github.com/s2-streamstore/s2/issues/533)) <!-- generated by git-cliff --> </blockquote> ## `s2-resource-spec` <blockquote> ## [0.1.0] - 2026-06-12 ### Refactor - Split storage internals from common ([#533](https://github.com/s2-streamstore/s2/issues/533)) <!-- generated by git-cliff --> </blockquote> ## `s2-storage` <blockquote> ## [0.1.0] - 2026-06-12 ### Refactor - Split storage internals from common ([#533](https://github.com/s2-streamstore/s2/issues/533)) <!-- generated by git-cliff --> </blockquote> ## `s2-lite` <blockquote> ## [0.36.6] - 2026-06-12 ### Refactor - Split storage internals from common ([#533](https://github.com/s2-streamstore/s2/issues/533)) <!-- generated by git-cliff --> </blockquote> ## `s2-sdk` <blockquote> ## [0.31.5] - 2026-06-12 ### Bug Fixes - Only show token-source guidance for token-related SDK init failures ([#538](https://github.com/s2-streamstore/s2/issues/538)) ### Refactor - Split storage internals from common ([#533](https://github.com/s2-streamstore/s2/issues/533)) ### Testing - Add unit tests for low-coverage modules ([#515](https://github.com/s2-streamstore/s2/issues/515)) <!-- generated by git-cliff --> </blockquote> ## `s2-cli` <blockquote> ## [0.36.6] - 2026-06-12 ### Bug Fixes - Only show token-source guidance for token-related SDK init failures ([#538](https://github.com/s2-streamstore/s2/issues/538)) ### Refactor - Split storage internals from common ([#533](https://github.com/s2-streamstore/s2/issues/533)) ### Testing - Add unit tests for low-coverage modules ([#515](https://github.com/s2-streamstore/s2/issues/515)) <!-- generated by git-cliff --> </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/release-plz/release-plz/). Co-authored-by: release-pleaze[bot] <262023388+release-pleaze[bot]@users.noreply.github.com> |
History
|
|
|---|---|---|
| .claude/skills/release | ||
| .github/workflows | ||
| api | ||
| assets | ||
| charts/s2-lite-helm | ||
| cli | ||
| common | ||
| docs/adr | ||
| hooks | ||
| lite | ||
| resource-spec | ||
| sdk | ||
| storage | ||
| .gitignore | ||
| .gitmodules | ||
| .rustfmt.toml | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CLAUDE.md | ||
| cliff.toml | ||
| Cross.toml | ||
| deny.toml | ||
| Dockerfile | ||
| install.sh | ||
| justfile | ||
| LICENSE | ||
| README.md | ||
| release-plz.toml | ||
s2.dev is a serverless datastore for real-time, streaming data.
This repository contains:
- s2-cli - The official S2 command-line interface
- s2-lite - An open source, self-hostable server implementation of the S2 API
- s2-sdk - The official Rust SDK for S2
Installation
Homebrew (macOS/Linux)
brew install s2-streamstore/s2/s2
Cargo
cargo install --locked s2-cli
Release Binaries (macOS/Linux)
curl -fsSL https://raw.githubusercontent.com/s2-streamstore/s2/main/install.sh | bash
Or specify a version with VERSION=x.y.z before the command. See all releases.
Docker
docker pull ghcr.io/s2-streamstore/s2
s2-lite
s2-lite is embedded as the s2 lite subcommand of the CLI. It's a self-hostable server implementation of the S2 API.
It uses SlateDB as its storage engine, which relies entirely on object storage for durability.
It is easy to run s2 lite against object stores like AWS S3 and Tigris. It is a single-node binary with no other external dependencies.
You can also simply not specify a --bucket, which makes it operate entirely in-memory (or use --local-root to persist to local disk instead).
Tip
When you point lite at a
--bucket, data is always durable on object storage before being acknowledged or returned to readers — just like s2.dev.The optional in-memory mode (no
--bucketor--local-rootspecified) just makes it an effective S2 emulator for integration tests.
Quickstart
Here's how you can run in-memory without any external dependency:
# Using Docker
docker run -p 8080:80 ghcr.io/s2-streamstore/s2 lite
# Or directly with the CLI
s2 lite --port 8080
AWS S3 bucket example
docker run -p 8080:80 \
-e AWS_PROFILE=${AWS_PROFILE} \
-v ~/.aws:/home/nonroot/.aws:ro \
ghcr.io/s2-streamstore/s2 lite \
--bucket ${S3_BUCKET} \
--path s2lite
Static credentials example (Tigris, R2 etc)
docker run -p 8080:80 \
-e AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
-e AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
-e AWS_ENDPOINT_URL_S3=${AWS_ENDPOINT_URL_S3} \
ghcr.io/s2-streamstore/s2 lite \
--bucket ${S3_BUCKET} \
--path s2lite
Note
Point the S2 CLI or SDKs at your lite instance like this:
export S2_ACCOUNT_ENDPOINT="http://localhost:8080" export S2_BASIN_ENDPOINT="http://localhost:8080" export S2_ACCESS_TOKEN="ignored"
Let's make sure the server is ready:
while ! curl -sf ${S2_ACCOUNT_ENDPOINT}/health -o /dev/null; do echo Waiting...; sleep 2; done && echo Up!
Install the CLI (see Installation above) or upgrade if s2 --version is older than 0.26
Let's create a basin with auto-creation of streams enabled:
s2 create-basin liteness --create-stream-on-append --create-stream-on-read
Test your performance:
s2 bench liteness --target-mibps 10 --duration 5s --catchup-delay 0s
Now let's try streaming sessions. In one or more new terminals (make sure you re-export the env vars noted above),
s2 read s2://liteness/starwars 2> /dev/null
Now back from your original terminal, let's write to the stream:
nc starwars.s2.dev 23 | s2 append s2://liteness/starwars
Kubernetes Deployment
Deploy s2-lite to Kubernetes using Helm. See the Helm chart documentation for installation instructions and configuration options.
Monitoring
/health will return 200 on success for readiness and liveness checks
/metrics returns Prometheus text format
Internals
SlateDB settings
Use SL8_ prefixed environment variables, e.g.:
# Defaults to 50ms for remote bucket / 5ms in-memory
SL8_FLUSH_INTERVAL=10ms
Design
- HTTP serving is implemented using axum
- Each stream corresponds to a Tokio task called
streamerthat owns the currenttailposition, serializes appends, and broadcasts acknowledged records to followers - Appends are pipelined to improve performance against high-latency object storage
lite::backend::kv::Keydocuments the data modeling in SlateDB
Compatibility
- CLI ✅ v0.26+
- TypeScript SDK ✅ v0.22+
- Go SDK ✅ v0.11+
- Rust SDK ✅ v0.22+
- Python SDK ✅ v0.1+
API Coverage
Complete specs are available:
Important
Unlike the cloud service where the basin is implicit as a subdomain,
/streams/*requests must specify the basin using theS2-Basinheader. The SDKs take care of this automatically.
| Endpoint | Support |
|---|---|
/basins |
Supported |
/streams |
Supported |
/streams/{stream}/records |
Supported |
/access-tokens |
Not supported https://github.com/s2-streamstore/s2/issues/28 |
/metrics |
Not supported |

