{"slug": "s2", "name": "S2", "category": "dev-libs", "category_name": "Libraries and frameworks", "description": "", "recommenders": 5, "commenters": 10, "warners": 1, "score": 4.474, "rising": -0.31, "first": "2025-11-03", "latest": "2026-09-15", "why": "I used S2 to make https://wherewords.id/\n\nIt was very pleasant to work with", "why_is_quote": true, "has_verdict": false, "sentiment": {"recommend": 5, "neutral": 2, "compare": 2, "warn": 1}, "spark": [1, 0, 0, 2, 0, 1, 0, 0, 0, 0, 1, 0], "listed": true, "loved": [], "caveat": "", "short_quote": "I used S2 to make https://wherewords.id/\n\nIt was very pleasant to work with", "kind": "", "icon": true, "domain": "s2.dev", "github_repo": null, "official_url": "https://s2.dev", "pricing": "", "aliases": ["S2", "S2 Geometry", "s2"], "verdict": null, "praise": [{"label": "", "summary": "", "quotes": [{"id": 795361920, "item_id": 49710120, "url": "https://news.ycombinator.com/item?id=49710120", "by": "prologic", "date": "2026-09-15", "version": null, "stance": "recommend", "quote": "One alternative worth looking at is S2", "excerpt": "One alternative worth looking at is S2: https://github.com/mojatter/s2", "context": "", "use_case": "single-node local S3", "switched_from": "", "story": "Alternatives to MinIO for single-node local S3"}, {"id": 766535616, "item_id": 47908476, "url": "https://news.ycombinator.com/item?id=47908476", "by": "kybernetikos", "date": "2026-04-26", "version": null, "stance": "recommend", "quote": "I used S2 to make https://wherewords.id/\n\nIt was very pleasant to work with", "excerpt": "I used S2 to make https://wherewords.id/ It was very pleasant to work with - I spent by far the majority of the project time on the wordlist.", "context": "", "use_case": "geospatial indexing for wherewords.id", "switched_from": "", "story": "HEALPix"}, {"id": 750981232, "item_id": 46936327, "url": "https://news.ycombinator.com/item?id=46936327", "by": "gct", "date": "2026-02-08", "version": null, "stance": "recommend", "quote": "which has the very nice property that parent cells do indeed always contain their children", "excerpt": "You can do this with [S2](https://s2geometry.io/) as well which has the very nice property that parent cells do indeed always contain their children, and sorting the cell ids puts them into in-order order.", "context": "", "use_case": "geospatial cell indexing", "switched_from": "", "story": "How we made geo joins 400\u00d7 faster with H3 indexes"}, {"id": 750743472, "item_id": 46921467, "url": "https://news.ycombinator.com/item?id=46921467", "by": "0xfaded", "date": "2026-02-06", "version": null, "stance": "recommend", "quote": "S2 has this property https://s2geometry.io", "excerpt": "S2 has this property https://s2geometry.io", "context": "", "use_case": "geospatial indexing for joins", "switched_from": "", "story": "How we made geo joins 400\u00d7 faster with H3 indexes"}, {"id": 747746064, "item_id": 46734129, "url": "https://news.ycombinator.com/item?id=46734129", "by": "shikhar", "date": "2026-01-23", "version": null, "stance": "recommend", "quote": "Also checkout https://s2.dev/blog/kv-store", "excerpt": "Very cool! Looking forward to catching up. Also checkout https://s2.dev/blog/kv-store", "context": "", "use_case": "", "switched_from": "", "story": "Show HN: S2-lite, an open source Stream Store"}]}], "caveats": [{"label": "", "summary": "", "quotes": [{"id": 732872753, "item_id": 45804547, "url": "https://news.ycombinator.com/item?id=45804547", "by": "grim7reaper", "date": "2025-11-03", "version": null, "stance": "warn", "quote": "the visual distortion of S2 was quite a no-go", "excerpt": "They have a page about pros and cons: https://h3geo.org/docs/comparisons/s2/ For my use case, the visual distortion of S2 was quite a no-go. As for DB queries, it really depends on your use case and how you store your data, but you can get some good results. But yeah, if you really need exact parent-child containment, S2 is easier to work with.", "context": "", "use_case": "", "switched_from": "", "story": "Harder, Better, Faster, Stronger Version of Uber H3 in Rust"}]}], "who": [], "tags": [], "use_cases": ["single-node local s3", "durable streams", "geospatial indexing for wherewords.id", "geospatial cell indexing", "geospatial indexing for joins", "serverless streaming alternative to jetstream"], "compared": [], "makers": [{"id": 755622864, "item_id": 47226429, "url": "https://news.ycombinator.com/item?id=47226429", "by": "infiniteregrets", "date": "2026-03-02", "version": null, "stance": "neutral", "quote": "I also wrote about it here: https://s2.dev/blog/distributed-ai-agents", "excerpt": "I also wrote about it here: https://s2.dev/blog/distributed-ai-agents", "context": "", "use_case": "", "switched_from": "", "story": "Show HN: Parallax \u2013 Coordinate adversarial AI agents over durable streams"}, {"id": 747741632, "item_id": 46733852, "url": "https://news.ycombinator.com/item?id=46733852", "by": "shikhar", "date": "2026-01-23", "version": null, "stance": "neutral", "quote": "We wanted S2 to be one API", "excerpt": "We wanted S2 to be one API. Started out with gRPC, added REST - then realized REST is what is absolutely essential and what most folks care about. gRPC did give us bi-directional streaming for append/read sessions, so we added that as an optional enhancement to the corresponding POST/GET data plane endpoints (the S2S \"S2-Session\" spec I linked to above). A nice side win is that the stream resource is known from the r", "context": "", "use_case": "", "switched_from": "", "story": "Show HN: S2-lite, an open source Stream Store"}, {"id": 739089346, "item_id": 46193084, "url": "https://news.ycombinator.com/item?id=46193084", "by": "quettabit", "date": "2025-12-08", "version": null, "stance": "neutral", "quote": "At s2.dev (a serverless datastore for real-time streaming data)", "excerpt": "At s2.dev (a serverless datastore for real-time streaming data), we started with DynamoDB for our metadata store, but our access patterns kept running into per-partition throughput limits. We switched to FoundationDB, and it\u2019s been great so far.", "context": "works at s2.dev", "use_case": "", "switched_from": "", "story": "Flow: Actor-based language for C++, used by FoundationDB"}], "threads": [{"url": "https://news.ycombinator.com/item?id=49421806", "title": "Show HN: PicoMQ \u2013 Durable Streams over HTTP, on object storage", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=47901312", "title": "HEALPix", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=46898473", "title": "How we made geo joins 400\u00d7 faster with H3 indexes", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=46708055", "title": "Show HN: S2-lite, an open source Stream Store", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=46196105", "title": "Jepsen: NATS 2.12.1", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=45680602", "title": "Harder, Better, Faster, Stronger Version of Uber H3 in Rust", "mentions": 2}], "sentiment_by_month": {"2025-11": {"recommend": 1, "warn": 1}, "2025-12": {}, "2026-01": {}, "2026-02": {"recommend": 2}, "2026-03": {}, "2026-04": {"neutral": 1, "recommend": 1}, "2026-05": {}, "2026-06": {"neutral": 1}, "2026-07": {}, "2026-08": {"compare": 2}, "2026-09": {"recommend": 1}, "2026-10": {}}, "versions": [], "version_unnamed": 0, "family_ref": null, "runs_on": null, "lines": [], "quotes": [{"id": 795361920, "item_id": 49710120, "url": "https://news.ycombinator.com/item?id=49710120", "by": "prologic", "date": "2026-09-15", "version": null, "stance": "recommend", "quote": "One alternative worth looking at is S2", "excerpt": "One alternative worth looking at is S2: https://github.com/mojatter/s2", "context": "", "use_case": "single-node local S3", "switched_from": "", "story": "Alternatives to MinIO for single-node local S3"}, {"id": 790819953, "item_id": 49426247, "url": "https://news.ycombinator.com/item?id=49426247", "by": "adesh_nalpet", "date": "2026-08-24", "version": null, "stance": "compare", "quote": "But S2 is not open source", "excerpt": "Thank you! I'd say pretty close. But S2 is not open source, and the OSS version (https://github.com/s2-streamstore/s2) is S2-Lite, which is single-node only and uses SlateDB. SlateDB is great, but it's not purpose-built for streaming workloads. With PicoMQ, the goal is to really do one thing well. It would have been far easier to just extend SlateDB, but instead, the S3Stream engine is built from the ground up with A", "context": "", "use_case": "", "switched_from": "", "story": "Show HN: PicoMQ \u2013 Durable Streams over HTTP, on object storage"}, {"id": 790812768, "item_id": 49425798, "url": "https://news.ycombinator.com/item?id=49425798", "by": "gpsmsn", "date": "2026-08-24", "version": null, "stance": "compare", "quote": "I started to compare PicoMQ to https://github.com/s2-streamstore/s2", "excerpt": "Love the landing page design! I'm excited to give it a whirl this evening. Initially, I started to compare PicoMQ to https://github.com/s2-streamstore/s2. If you're familiar with them, how would you compare PicoMQ to S2?", "context": "", "use_case": "durable streams", "switched_from": "", "story": "Show HN: PicoMQ \u2013 Durable Streams over HTTP, on object storage"}, {"id": 776561521, "item_id": 48535095, "url": "https://news.ycombinator.com/item?id=48535095", "by": "devdoshi", "date": "2026-06-14", "version": null, "stance": "neutral", "quote": "I did a poc using s2.dev and val.town", "excerpt": "I've been getting tired of implementing webhooks and sync the same old way. https://webpoke.sudoscience.dev/ seems simpler. I did a poc using s2.dev and val.town [1] and am using the general idea to explore with TLA+ to see how it would model it to falsify the claims. [1] https://youtu.be/kSyE4aoNthE", "context": "", "use_case": "", "switched_from": "", "story": "Ask HN: What are you working on? (June 2026)"}, {"id": 766535616, "item_id": 47908476, "url": "https://news.ycombinator.com/item?id=47908476", "by": "kybernetikos", "date": "2026-04-26", "version": null, "stance": "recommend", "quote": "I used S2 to make https://wherewords.id/\n\nIt was very pleasant to work with", "excerpt": "I used S2 to make https://wherewords.id/ It was very pleasant to work with - I spent by far the majority of the project time on the wordlist.", "context": "", "use_case": "geospatial indexing for wherewords.id", "switched_from": "", "story": "HEALPix"}, {"id": 766474448, "item_id": 47904653, "url": "https://news.ycombinator.com/item?id=47904653", "by": "sligbad", "date": "2026-04-25", "version": null, "stance": "neutral", "quote": "Google's S2 geometry - https://s2geometry.io/", "excerpt": "Also very cool: Google's S2 geometry - https://s2geometry.io/ Used by https://catch.astro.umd.edu/", "context": "", "use_case": "", "switched_from": "", "story": "HEALPix"}, {"id": 750981232, "item_id": 46936327, "url": "https://news.ycombinator.com/item?id=46936327", "by": "gct", "date": "2026-02-08", "version": null, "stance": "recommend", "quote": "which has the very nice property that parent cells do indeed always contain their children", "excerpt": "You can do this with [S2](https://s2geometry.io/) as well which has the very nice property that parent cells do indeed always contain their children, and sorting the cell ids puts them into in-order order.", "context": "", "use_case": "geospatial cell indexing", "switched_from": "", "story": "How we made geo joins 400\u00d7 faster with H3 indexes"}, {"id": 750743472, "item_id": 46921467, "url": "https://news.ycombinator.com/item?id=46921467", "by": "0xfaded", "date": "2026-02-06", "version": null, "stance": "recommend", "quote": "S2 has this property https://s2geometry.io", "excerpt": "S2 has this property https://s2geometry.io", "context": "", "use_case": "geospatial indexing for joins", "switched_from": "", "story": "How we made geo joins 400\u00d7 faster with H3 indexes"}, {"id": 749861376, "item_id": 46866336, "url": "https://news.ycombinator.com/item?id=46866336", "by": "shikhar", "date": "2026-02-02", "version": null, "stance": "neutral", "quote": "KV store in Rust, backed by a disaggregated, replicated journal", "excerpt": "KV store in Rust, backed by a disaggregated, replicated journal https://github.com/s2-streamstore/s2-kv-demo", "context": "", "use_case": "", "switched_from": "", "story": "Joedb, the Journal-Only Embedded Database"}, {"id": 747746064, "item_id": 46734129, "url": "https://news.ycombinator.com/item?id=46734129", "by": "shikhar", "date": "2026-01-23", "version": null, "stance": "recommend", "quote": "Also checkout https://s2.dev/blog/kv-store", "excerpt": "Very cool! Looking forward to catching up. Also checkout https://s2.dev/blog/kv-store", "context": "", "use_case": "", "switched_from": "", "story": "Show HN: S2-lite, an open source Stream Store"}, {"id": 744709696, "item_id": 46544356, "url": "https://news.ycombinator.com/item?id=46544356", "by": "shikhar", "date": "2026-01-08", "version": null, "stance": "recommend", "quote": "s2.dev could make a lot of sense as a serverless option", "excerpt": "Very cool! Would you consider making the streaming backend pluggable? s2.dev could make a lot of sense as a serverless option, and a self-hostable OSS implementation of the API is also coming soon. S2 is great for agent session-level streams (https://s2.dev/blog/agent-sessions), and unlike Redis Streams all data is always completely durable on object storage.", "context": "", "use_case": "", "switched_from": "", "story": "Show HN: Pydantic-AI-stream \u2013 Structured event streaming for pydantic-AI agents"}, {"id": 739430976, "item_id": 46214436, "url": "https://news.ycombinator.com/item?id=46214436", "by": "shikhar", "date": "2025-12-09", "version": null, "stance": "recommend", "quote": "The cloud offering is self-serve, no need to get on a call at all", "excerpt": "The cloud offering is self-serve, no need to get on a call at all. An open source, self-hosted option is in progress https://github.com/s2-streamstore/s2?tab=readme-ov-file#s2-lite", "context": "", "use_case": "", "switched_from": "", "story": "Jepsen: NATS 2.12.1"}, {"id": 739182640, "item_id": 46198915, "url": "https://news.ycombinator.com/item?id=46198915", "by": "shikhar", "date": "2025-12-08", "version": null, "stance": "recommend", "quote": "unlimited streams with the durability of object storage", "excerpt": "If you are looking for a serverless alternative to JetStream, check out https://s2.dev Pros: unlimited streams with the durability of object storage \u2013 JetStream can only do a few K topics Cons: no consumer groups yet, it's on the agenda", "context": "", "use_case": "serverless streaming alternative to JetStream", "switched_from": "", "story": "Jepsen: NATS 2.12.1"}, {"id": 732872753, "item_id": 45804547, "url": "https://news.ycombinator.com/item?id=45804547", "by": "grim7reaper", "date": "2025-11-03", "version": null, "stance": "warn", "quote": "the visual distortion of S2 was quite a no-go", "excerpt": "They have a page about pros and cons: https://h3geo.org/docs/comparisons/s2/ For my use case, the visual distortion of S2 was quite a no-go. As for DB queries, it really depends on your use case and how you store your data, but you can get some good results. But yeah, if you really need exact parent-child containment, S2 is easier to work with.", "context": "", "use_case": "", "switched_from": "", "story": "Harder, Better, Faster, Stronger Version of Uber H3 in Rust"}, {"id": 732865713, "item_id": 45804107, "url": "https://news.ycombinator.com/item?id=45804107", "by": "jiggawatts", "date": "2025-11-03", "version": null, "stance": "recommend", "quote": "much simpler S2 system: http://s2geometry.io/", "excerpt": "I never understood why anyone would prefer the H3 hex tiles over Google\u2019s much simpler S2 system: http://s2geometry.io/ Sure, hex tiles make certain circular nearest neighbour searches slightly more accurate\u2026 but still have an error. And then\u2026 everything else that\u2019s inconvenient with hex tiling, like that issue that subdivisions of a cell leak into the neighbouring cells and hence don\u2019t add up to 100% of the parent! ", "context": "", "use_case": "", "switched_from": "", "story": "Harder, Better, Faster, Stronger Version of Uber H3 in Rust"}]}