{"slug": "sorbet", "name": "Sorbet", "category": "other", "category_name": "Other software", "description": "", "recommenders": 6, "commenters": 17, "warners": 1, "score": 6.633, "rising": -1.96, "first": "2025-11-17", "latest": "2026-05-04", "why": "Having the productivity of Ruby + the static typing and LSP integrations is a wonderful combination.", "why_is_quote": true, "has_verdict": false, "sentiment": {"recommend": 6, "neutral": 9, "compare": 2, "warn": 1}, "spark": [0, 4, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0], "listed": true, "loved": [], "caveat": "", "short_quote": "Having the productivity of Ruby + the static typing and LSP integrations is a wonderful combination.", "kind": "", "icon": true, "domain": "sorbet.org", "github_repo": null, "official_url": "https://sorbet.org", "pricing": "", "aliases": ["Sorbet"], "verdict": null, "praise": [{"label": "", "summary": "", "quotes": [{"id": 763950752, "item_id": 47746922, "url": "https://news.ycombinator.com/item?id=47746922", "by": "nithinbekal", "date": "2026-04-12", "version": null, "stance": "recommend", "quote": "I really enjoy using Sorbet with Ruby", "excerpt": "A Ruby-inspired typed programming language called Sapphire: https://github.com/sapphire-project/sapphire I was reading the fantastic Crafting Interpreters book, and been wondering what it would be like to design a language from scratch. I really enjoy using Sorbet with Ruby, so wanted to design a small language with Ruby's object model, and a gradual type system. Despite not knowing much programming language theory, ", "context": "", "use_case": "", "switched_from": "", "story": "Ask HN: What Are You Working On? (April 2026)"}, {"id": 757773120, "item_id": 47360820, "url": "https://news.ycombinator.com/item?id=47360820", "by": "liamgriffiths", "date": "2026-03-12", "version": null, "stance": "recommend", "quote": "Having the productivity of Ruby + the static typing and LSP integrations is a wonderful combination.", "excerpt": "To all the folks in here that bemoan the lack of static types, I'd like to mention there are some great solutions in this space, eg. https://sorbet.org/ Having the productivity of Ruby + the static typing and LSP integrations is a wonderful combination. Sure, it might be less aesthetic than some might like, but at least in my experience, it works very well in practice and supports most of the needs I have from a type", "context": "", "use_case": "static typing for Ruby", "switched_from": "", "story": "Returning to Rails in 2026"}, {"id": 742412817, "item_id": 46400801, "url": "https://news.ycombinator.com/item?id=46400801", "by": "Lio", "date": "2025-12-27", "version": null, "stance": "recommend", "quote": "DSPy.Rb uses static Sorbet types", "excerpt": "DSPy.Rb uses static Sorbet types if that's what you're looking for. https://github.com/vicentereig/dspy.rb", "context": "", "use_case": "", "switched_from": "", "story": "T-Ruby is Ruby with syntax for types"}, {"id": 742194161, "item_id": 46387135, "url": "https://news.ycombinator.com/item?id=46387135", "by": "danmaz74", "date": "2025-12-25", "version": null, "stance": "recommend", "quote": "my hope is that using Sorbet this will happen much less", "excerpt": "When writing non-vibe-coded software I use CC a lot to write tests, but I have a skill to tell it not to create redundant tests, which otherwise it tends to do, and I have to check them anyway to ensure that they cover what needs to be covered, and sometimes to trim them down. When vibe coding, what I noticed is that CC tends to make mistakes which it does catch with tests and fix on its own, but my hope is that usin", "context": "", "use_case": "", "switched_from": "", "story": "Ruby 4.0.0 Released"}, {"id": 742131744, "item_id": 46383234, "url": "https://news.ycombinator.com/item?id=46383234", "by": "vicentereig", "date": "2025-12-25", "version": null, "stance": "recommend", "quote": "T::Struct and T::Enums at API boundaries has been the sweet spot", "excerpt": "Same here. T::Struct and T::Enums at API boundaries has been the sweet spot\u2014typed request/response models, runtime validation at ingress/egress. I\u2019ve been using this pattern for API clients[0] and CLIs[1]: define the shape once with Sorbet, get automatic JSON Schema generation when you need it. [0] https://github.com/vicentereig/exa-ruby [1] https://github.com/vicentereig/lf-cli", "context": "", "use_case": "Typed Ruby API models", "switched_from": "", "story": "Ruby 4.0.0 Released"}]}], "caveats": [], "who": [], "tags": [], "use_cases": ["ruby type checking", "static typing for ruby", "typing for ruby", "type checking for ruby", "typed ruby api models", "runtime types in ruby"], "compared": [{"slug": "rbs", "name": "RBS", "co": 5, "switched_from": 0, "switched_to": 0}, {"slug": "lowtype", "name": "Lowtype", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "claude-code", "name": "Claude Code", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "ruby-on-rails", "name": "Ruby on Rails", "co": 2, "switched_from": 0, "switched_to": 0}], "makers": [{"id": 779040512, "item_id": 48690032, "url": "https://news.ycombinator.com/item?id=48690032", "by": "notpachet", "date": "2026-06-26", "version": null, "stance": "recommend", "quote": "We contributed early to Sorbet and began implementing it in the main monolith prior to it being publicly announced.", "excerpt": "Languages are always evolving, because the needs they serve are always evolving. Stasis is death. > I have been using ruby since 2005 or so. Static types were never relevant or needed in the slightest here. We are like Liebniz monads, with disjoint views of the same universe due to our different experiences. I worked for several years at Shopify and there were droves of developers begging for types. Shopify itself re", "context": "worked several years at Shopify", "use_case": "static typing for Ruby", "switched_from": "", "story": "RubyLLM: A single, beautiful Ruby framework for all major AI providers"}], "threads": [{"url": "https://news.ycombinator.com/item?id=46382011", "title": "Ruby 4.0.0 Released", "mentions": 8}, {"url": "https://news.ycombinator.com/item?id=47347064", "title": "Returning to Rails in 2026", "mentions": 3}, {"url": "https://news.ycombinator.com/item?id=46395871", "title": "T-Ruby is Ruby with syntax for types", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=46080307", "title": "Lowtype: Elegant Types in Ruby", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=45957629", "title": "Compiling Ruby to machine language", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=48660711", "title": "RubyLLM: A single, beautiful Ruby framework for all major AI providers", "mentions": 1}], "sentiment_by_month": {"2025-11": {"neutral": 3, "compare": 1}, "2025-12": {"warn": 1, "recommend": 4, "neutral": 3, "compare": 1}, "2026-01": {}, "2026-02": {}, "2026-03": {"neutral": 2, "recommend": 1}, "2026-04": {"recommend": 1}, "2026-05": {"neutral": 1}, "2026-06": {}, "2026-07": {}, "2026-08": {}, "2026-09": {}, "2026-10": {}}, "versions": [], "version_unnamed": 0, "family_ref": null, "runs_on": null, "lines": [], "quotes": [{"id": 768245520, "item_id": 48015345, "url": "https://news.ycombinator.com/item?id=48015345", "by": "c3ab8ff137", "date": "2026-05-04", "version": null, "stance": "neutral", "quote": "Stripe has its own Ruby typechecker", "excerpt": "No, Stripe has its own Ruby typechecker - https://sorbet.org/", "context": "", "use_case": "", "switched_from": "", "story": "Formatting a 25M-line codebase overnight"}, {"id": 763950752, "item_id": 47746922, "url": "https://news.ycombinator.com/item?id=47746922", "by": "nithinbekal", "date": "2026-04-12", "version": null, "stance": "recommend", "quote": "I really enjoy using Sorbet with Ruby", "excerpt": "A Ruby-inspired typed programming language called Sapphire: https://github.com/sapphire-project/sapphire I was reading the fantastic Crafting Interpreters book, and been wondering what it would be like to design a language from scratch. I really enjoy using Sorbet with Ruby, so wanted to design a small language with Ruby's object model, and a gradual type system. Despite not knowing much programming language theory, ", "context": "", "use_case": "", "switched_from": "", "story": "Ask HN: What Are You Working On? (April 2026)"}, {"id": 757773120, "item_id": 47360820, "url": "https://news.ycombinator.com/item?id=47360820", "by": "liamgriffiths", "date": "2026-03-12", "version": null, "stance": "recommend", "quote": "Having the productivity of Ruby + the static typing and LSP integrations is a wonderful combination.", "excerpt": "To all the folks in here that bemoan the lack of static types, I'd like to mention there are some great solutions in this space, eg. https://sorbet.org/ Having the productivity of Ruby + the static typing and LSP integrations is a wonderful combination. Sure, it might be less aesthetic than some might like, but at least in my experience, it works very well in practice and supports most of the needs I have from a type", "context": "", "use_case": "static typing for Ruby", "switched_from": "", "story": "Returning to Rails in 2026"}, {"id": 757596146, "item_id": 47349759, "url": "https://news.ycombinator.com/item?id=47349759", "by": "sensanaty", "date": "2026-03-12", "version": null, "stance": "neutral", "quote": "I wonder how good Sorbet is these days", "excerpt": "I love Rails, but after working for a few places with huge Rails codebases and then several other places with .NET and other frameworks with actual typing, I just can't go back to Rails for anything that isn't a personal project. Working with a large codebase with an untyped codebase is just a nightmare, even with powerful IDEs like RubyMine that are able to cover some of the paint points. I wonder how good Sorbet is", "context": "", "use_case": "typing for Ruby", "switched_from": "", "story": "Returning to Rails in 2026"}, {"id": 757560848, "item_id": 47347553, "url": "https://news.ycombinator.com/item?id=47347553", "by": "gommm", "date": "2026-03-12", "version": null, "stance": "neutral", "quote": "would be interesting to try that", "excerpt": "Personally I love rust for agents because of types. In the ruby world there's sorbet and rbs so would be interesting to try that.", "context": "", "use_case": "", "switched_from": "", "story": "Returning to Rails in 2026"}, {"id": 742412817, "item_id": 46400801, "url": "https://news.ycombinator.com/item?id=46400801", "by": "Lio", "date": "2025-12-27", "version": null, "stance": "recommend", "quote": "DSPy.Rb uses static Sorbet types", "excerpt": "DSPy.Rb uses static Sorbet types if that's what you're looking for. https://github.com/vicentereig/dspy.rb", "context": "", "use_case": "", "switched_from": "", "story": "T-Ruby is Ruby with syntax for types"}, {"id": 742398896, "item_id": 46399931, "url": "https://news.ycombinator.com/item?id=46399931", "by": "zingar", "date": "2025-12-26", "version": null, "stance": "neutral", "quote": "I see sorbet supports this as an experimental feature", "excerpt": "I don\u2019t like types in separate files but I also don\u2019t want them cluttering my signatures. Types in comments would be my ideal, am I the only one who prefers this? Edit: I see sorbet supports this as an experimental feature https://sorbet.org/docs/rbs-support", "context": "", "use_case": "Ruby type checking", "switched_from": "", "story": "T-Ruby is Ruby with syntax for types"}, {"id": 742307536, "item_id": 46394221, "url": "https://news.ycombinator.com/item?id=46394221", "by": "__float", "date": "2025-12-26", "version": null, "stance": "compare", "quote": "Sorbet is a bit different from TypeScript because it has runtime type checking, not just static.", "excerpt": "You might find https://blog.jez.io/history-of-sorbet-syntax/ interesting, written by one of the primary contributors to Sorbet. Sorbet is a bit different from TypeScript because it has runtime type checking, not just static.", "context": "", "use_case": "", "switched_from": "", "story": "Ruby 4.0.0 Released"}, {"id": 742220032, "item_id": 46388752, "url": "https://news.ycombinator.com/item?id=46388752", "by": "nonconstant", "date": "2025-12-25", "version": null, "stance": "neutral", "quote": "lots of other big Ruby shops are on Sorbet", "excerpt": "Also: lots of other big Ruby shops are on Sorbet, like Figma, One Medical, Gusto etc. We discussed this at the SF Ruby meetup after this talk https://www.rubyevents.org/talks/past-present-and-future-of-sorbet-type-syntax", "context": "", "use_case": "Type checking for Ruby", "switched_from": "", "story": "Ruby 4.0.0 Released"}, {"id": 742219856, "item_id": 46388741, "url": "https://news.ycombinator.com/item?id=46388741", "by": "nonconstant", "date": "2025-12-25", "version": null, "stance": "neutral", "quote": "Stripe is using typed Ruby: they are authors of https://github.com/sorbet/sorbet", "excerpt": "Stripe is using typed Ruby: they are authors of https://github.com/sorbet/sorbet", "context": "", "use_case": "", "switched_from": "", "story": "Ruby 4.0.0 Released"}, {"id": 742194161, "item_id": 46387135, "url": "https://news.ycombinator.com/item?id=46387135", "by": "danmaz74", "date": "2025-12-25", "version": null, "stance": "recommend", "quote": "my hope is that using Sorbet this will happen much less", "excerpt": "When writing non-vibe-coded software I use CC a lot to write tests, but I have a skill to tell it not to create redundant tests, which otherwise it tends to do, and I have to check them anyway to ensure that they cover what needs to be covered, and sometimes to trim them down. When vibe coding, what I noticed is that CC tends to make mistakes which it does catch with tests and fix on its own, but my hope is that usin", "context": "", "use_case": "", "switched_from": "", "story": "Ruby 4.0.0 Released"}, {"id": 742131744, "item_id": 46383234, "url": "https://news.ycombinator.com/item?id=46383234", "by": "vicentereig", "date": "2025-12-25", "version": null, "stance": "recommend", "quote": "T::Struct and T::Enums at API boundaries has been the sweet spot", "excerpt": "Same here. T::Struct and T::Enums at API boundaries has been the sweet spot\u2014typed request/response models, runtime validation at ingress/egress. I\u2019ve been using this pattern for API clients[0] and CLIs[1]: define the shape once with Sorbet, get automatic JSON Schema generation when you need it. [0] https://github.com/vicentereig/exa-ruby [1] https://github.com/vicentereig/lf-cli", "context": "", "use_case": "Typed Ruby API models", "switched_from": "", "story": "Ruby 4.0.0 Released"}, {"id": 742131200, "item_id": 46383200, "url": "https://news.ycombinator.com/item?id=46383200", "by": "vicentereig", "date": "2025-12-25", "version": null, "stance": "recommend", "quote": "I\u2019ve been leaning hard into Sorbet runtime types for DSPy.rb[0] and finding real value.", "excerpt": "I\u2019ve been leaning hard into Sorbet runtime types for DSPy.rb[0] and finding real value. T::Struct at API boundaries, typed props for config, runtime validation where data enters the system. For generating (with LLMs) API clients and CLIs it\u2019s especially useful\u2014define the shape once, get validation at ingress/egress for free. Maybe momentum is happening in new projects rather than retrofits? [0] https://oss.vicente.se", "context": "", "use_case": "Runtime types in Ruby", "switched_from": "", "story": "Ruby 4.0.0 Released"}, {"id": 742124464, "item_id": 46382779, "url": "https://news.ycombinator.com/item?id=46382779", "by": "mrinterweb", "date": "2025-12-24", "version": null, "stance": "neutral", "quote": "these aren't widely used as far as I am aware", "excerpt": "There is [RBS](https://sorbet.org/) (part of ruby 3) and [sorbet](https://sorbet.org/). To be honest, these aren't widely used as far as I am aware. I don't know if it is runtime overhead, ergonomics, lack of type checking interest in the ruby community or something else. Type enforcement isn't a big part of ruby, and doesn't seem to be gaining much momentum.", "context": "", "use_case": "", "switched_from": "", "story": "Ruby 4.0.0 Released"}, {"id": 742123744, "item_id": 46382734, "url": "https://news.ycombinator.com/item?id=46382734", "by": "riffraff", "date": "2025-12-24", "version": null, "stance": "recommend", "quote": "There's a pretty battle tested tool to define inline types as ruby syntax", "excerpt": "There's an official format for defining types in separate files (RBS) and some tooling to type check them (matz doesn't like types next to the source code). There's a pretty battle tested tool to define inline types as ruby syntax and type check both statically and at runtime[0]. It's still not a particularly nice situation imvho compared to typescript or python, but there's been some movement, and there's a newslett", "context": "", "use_case": "Ruby static typing", "switched_from": "", "story": "Ruby 4.0.0 Released"}, {"id": 738026147, "item_id": 46126634, "url": "https://news.ycombinator.com/item?id=46126634", "by": "hakunin", "date": "2025-12-02", "version": null, "stance": "warn", "quote": "", "excerpt": "I built portrayal[1] (a much simpler replacement for those dry libs), and was also experimenting[2] with runtime-enforced types based on this lib. My general thoughts is that declaring types in Ruby is unnecessarily complicated, because you're basically just running values through pieces of boolean logic, and nothing else. Might as well make that explicit, which is what my experiment did. I didn't however publish the", "context": "", "use_case": "", "switched_from": "", "story": "Lowtype: Elegant Types in Ruby"}, {"id": 737551330, "item_id": 46096958, "url": "https://news.ycombinator.com/item?id=46096958", "by": "Lio", "date": "2025-11-30", "version": null, "stance": "compare", "quote": "Sorbet doesn't have that problem right now.", "excerpt": "I love these new approaches to type checking such as this and Literal[1]. I think they really show how far we could go with runtime ruby syntax. For both though I have questions: A. How do I use this day to day to improve my tooling and developer experience? B. If at some point in the future I decide to get rid of this how easy is it to eject? I've seen too many adandoned dependencies over the years to trust anything", "context": "Ruby developer", "use_case": "Ruby static type checking", "switched_from": "", "story": "Lowtype: Elegant Types in Ruby"}, {"id": 735632368, "item_id": 45977023, "url": "https://news.ycombinator.com/item?id=45977023", "by": "pjmlp", "date": "2025-11-19", "version": null, "stance": "neutral", "quote": "", "excerpt": "From where I stand, Ruby has much more interesting work going on JIT land than Python. Much of the Python stuff, is actually about rewriting Python tools into Rust due to its interpreter slowness and no one caring about PyPy, now apparently there is even a PEP to rewrite CPython! https://discuss.python.org/t/pre-pep-rust-for-cpython/104906", "context": "", "use_case": "Ruby type checking", "switched_from": "", "story": "Ruby 4.0.0 Preview2"}, {"id": 735399664, "item_id": 45962479, "url": "https://news.ycombinator.com/item?id=45962479", "by": "vidarh", "date": "2025-11-17", "version": null, "stance": "neutral", "quote": "Sorbet would be in a good position because part of the challenge", "excerpt": "It seems to be gone from the repo, and doesn't seem to be worked on any more? A shame. AOT compiling Ruby is hard. I'm trying [1] [2]. Sorbet would be in a good position because part of the challenge of making it fast is that Ruby has a lot of semantics that are rarely used but that makes making compiled Ruby fast really hard. E.g. the bignum promotion adds overhead to every single operation unless you can prove inva", "context": "", "use_case": "", "switched_from": "", "story": "Compiling Ruby to machine language"}, {"id": 735357648, "item_id": 45959853, "url": "https://news.ycombinator.com/item?id=45959853", "by": "jweir", "date": "2025-11-17", "version": null, "stance": "neutral", "quote": "And Stripe coders who have used the Sorbet compiler?", "excerpt": "Speaking of compiling Ruby. And Stripe coders who have used the Sorbet compiler? https://sorbet.org/blog/2021/07/30/open-sourcing-sorbet-compiler", "context": "", "use_case": "Ruby type checker and compiler", "switched_from": "", "story": "Compiling Ruby to machine language"}]}