{"slug": "lowtype", "name": "Lowtype", "category": "dev-libs", "category_name": "Libraries and frameworks", "description": "", "recommenders": 5, "commenters": 5, "warners": 0, "score": 4.087, "rising": -1.64, "first": "2025-11-30", "latest": "2025-12-27", "why": "I love it, I liked what dry-initializer and dry-struct do, and I wanted something similar but simpler than RBS or Sorbet.", "why_is_quote": true, "has_verdict": false, "sentiment": {"recommend": 5, "neutral": 0, "compare": 1, "warn": 0}, "spark": [0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "listed": true, "loved": [], "caveat": "", "short_quote": "I love it, I liked what dry-initializer and dry-struct do, and I wanted something similar but simpler than RBS or Sorbet.", "kind": "", "icon": true, "domain": null, "github_repo": "github.com/low-rb/low_type", "official_url": "https://github.com/low-rb/low_type", "pricing": "", "aliases": ["Lowtype", "low_type", "low-type"], "verdict": null, "praise": [{"label": "", "summary": "", "quotes": [{"id": 742416480, "item_id": 46401030, "url": "https://news.ycombinator.com/item?id=46401030", "by": "Lio", "date": "2025-12-27", "stance": "recommend", "quote": "low-type with a static analysis tool would be my favourite syntax for this", "excerpt": "I think they've missed a trick there, they could have used `|` like low-type does. e.g. def greet(name: String | \"Hello\"): String I know it's all subjective but I think that reads better and it's valid ruby. To be honest low-type with a static analysis tool would be my favourite syntax for this. https://github.com/low-rb/low_type", "context": "", "use_case": "", "switched_from": "", "story": "T-Ruby is Ruby with syntax for types"}, {"id": 742408960, "item_id": 46400560, "url": "https://news.ycombinator.com/item?id=46400560", "by": "Levitating", "date": "2025-12-27", "stance": "recommend", "quote": "I think low_type is a much more elegant solution", "excerpt": "Ugh more transpilers. I think low_type is a much more elegant solution: https://github.com/low-rb/low_type", "context": "", "use_case": "", "switched_from": "", "story": "T-Ruby is Ruby with syntax for types"}, {"id": 742125184, "item_id": 46382824, "url": "https://news.ycombinator.com/item?id=46382824", "by": "rsanheim", "date": "2025-12-24", "stance": "recommend", "quote": "I think this approach is clearly the future of ruby typing.", "excerpt": "_low_type_ is early days still, but I think this approach is clearly the future of ruby typing. If this gets baked into the language for full \u201ccompile\u201d time support and minimal performance impact, it will be amazing: https://github.com/low-rb/low_type", "context": "", "use_case": "Ruby type checking", "switched_from": "", "story": "Ruby 4.0.0 Released"}, {"id": 738008944, "item_id": 46125559, "url": "https://news.ycombinator.com/item?id=46125559", "by": "jez", "date": "2025-12-02", "stance": "recommend", "quote": "I'm very impressed by the ingenuity of the approach", "excerpt": "It's an interesting approach. From my skim, the way it works: 1. Parse the files with a Ruby parser, collect all method definition nodes 2. Using location information in the parsed AST, and the source text of the that was parsed, splice the parameters into two lambda expressions, like this[1]: \"-> (#{method_node.parameters.slice}) {}\" 3. Evaluate the first lambda. This lets you reflect on `lambda.parameters`, which w", "context": "", "use_case": "", "switched_from": "", "story": "Lowtype: Elegant Types in Ruby"}, {"id": 737999232, "item_id": 46124952, "url": "https://news.ycombinator.com/item?id=46124952", "by": "ceritium", "date": "2025-12-02", "stance": "recommend", "quote": "I love it, I liked what dry-initializer and dry-struct do, and I wanted something similar but simpler than RBS or Sorbet.", "excerpt": "I love it, I liked what dry-initializer and dry-struct do, and I wanted something similar but simpler than RBS or Sorbet. I tried once myself to implement something like lowtype, but without success.", "context": "", "use_case": "Ruby typing", "switched_from": "", "story": "Lowtype: Elegant Types in Ruby"}]}], "caveats": [], "who": [], "tags": [], "use_cases": ["ruby type checking", "ruby typing", "ruby runtime type checking"], "compared": [{"slug": "sorbet", "name": "Sorbet", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "literal", "name": "Literal", "co": 2, "switched_from": 0, "switched_to": 0}], "makers": [], "threads": [{"url": "https://news.ycombinator.com/item?id=46080307", "title": "Lowtype: Elegant Types in Ruby", "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=46382011", "title": "Ruby 4.0.0 Released", "mentions": 1}], "sentiment_by_month": {"2025-11": {"compare": 1}, "2025-12": {"recommend": 5}, "2026-01": {}, "2026-02": {}, "2026-03": {}, "2026-04": {}, "2026-05": {}, "2026-06": {}, "2026-07": {}, "2026-08": {}, "2026-09": {}, "2026-10": {}}, "quotes": [{"id": 742416480, "item_id": 46401030, "url": "https://news.ycombinator.com/item?id=46401030", "by": "Lio", "date": "2025-12-27", "stance": "recommend", "quote": "low-type with a static analysis tool would be my favourite syntax for this", "excerpt": "I think they've missed a trick there, they could have used `|` like low-type does. e.g. def greet(name: String | \"Hello\"): String I know it's all subjective but I think that reads better and it's valid ruby. To be honest low-type with a static analysis tool would be my favourite syntax for this. https://github.com/low-rb/low_type", "context": "", "use_case": "", "switched_from": "", "story": "T-Ruby is Ruby with syntax for types"}, {"id": 742408960, "item_id": 46400560, "url": "https://news.ycombinator.com/item?id=46400560", "by": "Levitating", "date": "2025-12-27", "stance": "recommend", "quote": "I think low_type is a much more elegant solution", "excerpt": "Ugh more transpilers. I think low_type is a much more elegant solution: https://github.com/low-rb/low_type", "context": "", "use_case": "", "switched_from": "", "story": "T-Ruby is Ruby with syntax for types"}, {"id": 742125184, "item_id": 46382824, "url": "https://news.ycombinator.com/item?id=46382824", "by": "rsanheim", "date": "2025-12-24", "stance": "recommend", "quote": "I think this approach is clearly the future of ruby typing.", "excerpt": "_low_type_ is early days still, but I think this approach is clearly the future of ruby typing. If this gets baked into the language for full \u201ccompile\u201d time support and minimal performance impact, it will be amazing: https://github.com/low-rb/low_type", "context": "", "use_case": "Ruby type checking", "switched_from": "", "story": "Ruby 4.0.0 Released"}, {"id": 738008944, "item_id": 46125559, "url": "https://news.ycombinator.com/item?id=46125559", "by": "jez", "date": "2025-12-02", "stance": "recommend", "quote": "I'm very impressed by the ingenuity of the approach", "excerpt": "It's an interesting approach. From my skim, the way it works: 1. Parse the files with a Ruby parser, collect all method definition nodes 2. Using location information in the parsed AST, and the source text of the that was parsed, splice the parameters into two lambda expressions, like this[1]: \"-> (#{method_node.parameters.slice}) {}\" 3. Evaluate the first lambda. This lets you reflect on `lambda.parameters`, which w", "context": "", "use_case": "", "switched_from": "", "story": "Lowtype: Elegant Types in Ruby"}, {"id": 737999232, "item_id": 46124952, "url": "https://news.ycombinator.com/item?id=46124952", "by": "ceritium", "date": "2025-12-02", "stance": "recommend", "quote": "I love it, I liked what dry-initializer and dry-struct do, and I wanted something similar but simpler than RBS or Sorbet.", "excerpt": "I love it, I liked what dry-initializer and dry-struct do, and I wanted something similar but simpler than RBS or Sorbet. I tried once myself to implement something like lowtype, but without success.", "context": "", "use_case": "Ruby typing", "switched_from": "", "story": "Lowtype: Elegant Types in Ruby"}, {"id": 737551329, "item_id": 46096958, "url": "https://news.ycombinator.com/item?id=46096958", "by": "Lio", "date": "2025-11-30", "stance": "compare", "quote": "These runtime typing efforts look nicer than Sorbet", "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 runtime type checking", "switched_from": "", "story": "Lowtype: Elegant Types in Ruby"}]}