← Extractions

Ruby has literally always had types — Joel Drapper at wroclove.rb 2025

Joel Drapper argues that Ruby already has a first-class type system via the `===` (case-equality) interface, and introduces his Literal gem as a runtime-typing toolkit built on that idea. He walks through Literal's types, struct/data, properties, enums, values, decorators, performance optimizations, roadmap (collection objects, cross-property validation, result monad, LLM schemas), and contrasts with static approaches like Sorbet, RBS/Steep, and dry-types.

Model
claude-opus-4-7
Ingestion
f7d4157f
Input tokens
330,221
fresh
212,555
cached
98,055
cache write
19,611
Output tokens
13,912
Duration
227.0s
Roundtrips
6
Tool calls
23
Cost
$0.00
Nodes/edges extracted
24 / 46
Read set (nodes/edges)
141 / 2

Nodes (24)

update Joel Drapper person
attrs (empty) → {"blog" => "joel.drapper.me", "social" => "Bluesky, GitHub", "podcast" => "Rooftop Ruby"}
description Conference speaker. → Ruby developer passionate about meta-programming and 'dark' corners of the language. Creator of the Phlex view-compon...
short_description Conference speaker. → Ruby developer; creator of Phlex and Literal; meta-programming enthusiast.
update Ruby has literally always had types talk
attrs {"type" => "talk"} → {"date" => "2025-03-14", "type" => "talk", "duration" => "45 minutes"}
description Talk at wroclove.rb 2025. → Joel Drapper's wroclove.rb 2025 talk (first speaker of the day). Opens with a Shopify war story where interpolating a...
short_description Talk at wroclove.rb 2025. → Joel Drapper's wroclove.rb 2025 talk arguing Ruby's === interface is its type system, showcased via the Literal gem.
create Literal tool
kind (empty) → tool
name (empty) → Literal
slug (empty) → literal
attrs (empty) → {"author" => "Joel Drapper", "license" => "open-source", "category" => "library", "language" => "Ruby"}
description (empty) → Open-source Ruby gem by Joel Drapper. Treats any object responding to `===` as a type and provides a library of compo...
short_description (empty) → Ruby gem by Joel Drapper providing composable runtime types built on the === interface.
update Phlex tool
attrs {"category" => "library"} → {"author" => "Joel Drapper", "category" => "library"}
description Ruby gem for building HTML views as Ruby objects/methods instead of template files. Mentioned in Yaroslav Shmarov's w... → Ruby gem for building HTML views as Ruby objects/methods instead of template files. Created by Joel Drapper. Componen...
create Quickdraw tool
kind (empty) → tool
name (empty) → Quickdraw
slug (empty) → quickdraw
attrs (empty) → {"author" => "Joel Drapper", "category" => "library", "language" => "Ruby"}
description (empty) → Ruby test framework authored by Joel Drapper. Mentioned in the speaker introduction at wroclove.rb 2025 alongside Phl...
short_description (empty) → Ruby test framework created by Joel Drapper.
create Rooftop Ruby resource
kind (empty) → resource
name (empty) → Rooftop Ruby
slug (empty) → rooftop-ruby
attrs (empty) → {"type" => "podcast"}
description (empty) → Ruby podcast co-hosted by Joel Drapper. Mentioned in his speaker introduction at wroclove.rb 2025.
short_description (empty) → Ruby podcast co-hosted by Joel Drapper.
create Steep tool
kind (empty) → tool
name (empty) → Steep
slug (empty) → steep
attrs (empty) → {"author" => "Soutaro Matsumoto", "category" => "tool", "language" => "Ruby"}
description (empty) → Static type checker for Ruby that consumes RBS type signatures. Authored by Soutaro Matsumoto. Cited by Joel Drapper ...
short_description (empty) → Ruby static type checker for RBS signatures by Soutaro Matsumoto.
create Soutaro Matsumoto person
kind (empty) → person
name (empty) → Soutaro Matsumoto
slug (empty) → soutaro-matsumoto
description (empty) → Ruby developer, author of the Steep static type checker for Ruby. Credited by Joel Drapper at wroclove.rb 2025 for th...
short_description (empty) → Ruby core contributor; author of the Steep type checker.
create Zendesk company
kind (empty) → company
name (empty) → Zendesk
slug (empty) → zendesk
attrs (empty) → {"industry" => "customer support"}
description (empty) → Customer-support ticketing SaaS. Referenced in Joel Drapper's wroclove.rb 2025 talk as the external system where a ni...
short_description (empty) → Customer-support ticketing SaaS.
create Clear Scope company
kind (empty) → company
name (empty) → Clear Scope
slug (empty) → clear-scope
description (empty) → Company where Joel Drapper deployed the Literal gem in production. Reported outcome: even with runtime type checking ...
short_description (empty) → Company where Joel Drapper deployed the Literal gem in production.
create Case Equality Interface concept
kind (empty) → concept
name (empty) → Case Equality Interface
slug (empty) → case-equality-interface
attrs (empty) → {"category" => "pattern"}
description (empty) → Ruby's `===` (triple-equals / case equality) method — the interface Joel Drapper identifies as Ruby's native type sys...
short_description (empty) → Ruby's === operator used for type membership, case/when, and pattern matching.
create Runtime Types vs Static Types concept
kind (empty) → concept
name (empty) → Runtime Types vs Static Types
slug (empty) → runtime-types-vs-static-types
attrs (empty) → {"category" => "practice"}
description (empty) → Debate framed in Joel Drapper's talk: static type checking (Sorbet, RBS+Steep) requires complete annotation or infere...
short_description (empty) → Trade-off between runtime type checking and static type checking in Ruby.
create Type As Description Of A Set concept
kind (empty) → concept
name (empty) → Type As Description Of A Set
slug (empty) → type-as-description-of-a-set
attrs (empty) → {"category" => "methodology"}
description (empty) → Joel Drapper's working definition at wroclove.rb 2025: a type is not a set of objects (types can be infinite) but a *...
short_description (empty) → Joel Drapper's abstract definition of a type as a description of a set of objects.
create Accordion of Complexity concept
kind (empty) → concept
name (empty) → Accordion of Complexity
slug (empty) → accordion-of-complexity
attrs (empty) → {"category" => "methodology"}
description (empty) → Idea (attributed by Joel Drapper to Stephen Margheim's upcoming talk at wroclove.rb 2025) that good interfaces let yo...
short_description (empty) → Design progression that scales with use case — add complexity only when needed.
create Invalid States Impossible concept
kind (empty) → concept
name (empty) → Invalid States Impossible
slug (empty) → invalid-states-impossible
attrs (empty) → {"category" => "practice"}
description (empty) → Practice of using a type system — in Ruby via Literal, at runtime — to make invalid object states unrepresentable. Ra...
short_description (empty) → Design practice of making illegitimate object states unrepresentable through types.
create Runtime types give you most of the safety for little effort takeaway
kind (empty) → takeaway
name (empty) → Runtime types give you most of the safety for little effort
slug (empty) → runtime-types-give-you-most-of-the-safety-for-little-effort
attrs (empty) → {"type" => "insight"}
description (empty) → Joel Drapper's thesis: full static type safety in Ruby is unattainable (metaprogramming, massive un-annotated codebas...
short_description (empty) → Ruby's === plus a gem like Literal delivers ~80% of type safety without full static annotation.
create Raise in production rather than silently continue takeaway
kind (empty) → takeaway
name (empty) → Raise in production rather than silently continue
slug (empty) → raise-in-production-rather-than-silently-continue
attrs (empty) → {"type" => "recommendation"}
description (empty) → Counter-intuitive lesson from Joel Drapper: leave runtime type checking on in production. A raised exception with a c...
short_description (empty) → Better to crash on a type error than to corrupt data silently.
create Name your types to reuse and document them takeaway
kind (empty) → takeaway
name (empty) → Name your types to reuse and document them
slug (empty) → name-your-types-to-reuse-and-document-them
attrs (empty) → {"type" => "recommendation"}
description (empty) → Joel Drapper recommends extracting compound types into named constants (e.g. `Latitude = _Float(-90..90)`, `UserID` a...
short_description (empty) → Extract and name composite types (Latitude, UserID, GroupMembers) so they become first-class domain concepts.
create Difference between Literal and dry-types question
kind (empty) → question
name (empty) → Difference between Literal and dry-types
slug (empty) → difference-between-literal-and-dry-types
attrs (empty) → {"answer_summary" => "Literal rides Ruby's === so any object is already a type; dry-types bundles coercion and defaul...
description (empty) → Audience question comparing Literal to dry-types. Joel Drapper's answer: Literal uses Ruby's existing `===` interface...
short_description (empty) → How does Literal differ from dry-types?
create Does Literal::Data raise in production on a bad prop? question
kind (empty) → question
name (empty) → Does Literal::Data raise in production on a bad prop?
slug (empty) → does-literal-data-raise-in-production-on-a-bad-prop
attrs (empty) → {"answer_summary" => "Yes, Literal raises in production. Performance overhead is unnoticeable; Clear Scope saw fewer ...
description (empty) → Audience question: does Literal::Data raise when given the wrong type, and does that behavior apply in production? Dr...
short_description (empty) → Does Literal throw an exception when passed a wrong prop type in production?
create Specifying types at the method boundary with pattern matching question
kind (empty) → question
name (empty) → Specifying types at the method boundary with pattern matching
slug (empty) → specifying-types-at-the-method-boundary-with-pattern-matching
attrs (empty) → {"answer_summary" => "Use Ruby pattern matching at the top of the method. Drapper hasn't found a satisfying method-le...
description (empty) → Audience asks how to declare types for a public method's arguments. Drapper's answer: use Ruby's pattern matching in ...
short_description (empty) → Can Literal check parameter types on ordinary methods?
create Is Literal a good basis for a validation library? question
kind (empty) → question
name (empty) → Is Literal a good basis for a validation library?
slug (empty) → is-literal-a-good-basis-for-a-validation-library
attrs (empty) → {"answer_summary" => "Good basis in principle, but Literal currently only raises — a soft `validate` API returning er...
description (empty) → Audience asks whether Literal fits writing a validation library that returns an error list rather than raising. Drapp...
short_description (empty) → Could Literal back a validation library that returns errors instead of raising?
create Could types be defined outside the class like RBS? question
kind (empty) → question
name (empty) → Could types be defined outside the class like RBS?
slug (empty) → could-types-be-defined-outside-the-class-like-rbs
attrs (empty) → {"answer_summary" => "No — Literal already reduces line count and Drapper prefers inline types for local documentatio...
description (empty) → Audience observation that Ruby developers dislike verbose code, which is what drives them away from types, and that R...
short_description (empty) → Have you explored RBS-style external type files for Literal?
create Can production observation auto-generate types? question
kind (empty) → question
name (empty) → Can production observation auto-generate types?
slug (empty) → can-production-observation-auto-generate-types
attrs (empty) → {"answer_summary" => "Skeptical. Observation can't infer unions, stops working once exceptions raise, and rare-but-va...
description (empty) → Final audience question (from someone asking during post-party logistics): could observability tooling (e.g. Coverban...
short_description (empty) → Could tools like Coverband observe production and generate types automatically?

Edges (46)

update Joel Drapper → authored → Ruby has literally always had types
context (empty) → Joel Drapper delivered this talk at wroclove.rb 2025.
update Ruby has literally always had types → presented_at → wroclove.rb 2025
context (empty) → First speaker of wroclove.rb 2025, delivered on 2025-03-14.
create Joel Drapper → attended → wroclove.rb 2025
context (empty) → Traveled to Wrocław to give the opening talk and stay for the after-party.
relation (empty) → attended
source_node_id (empty) → af49a23b-6658-4fc4-a29e-a0edd1d8c83a
target_node_id (empty) → 4a9688cf-482e-48ac-a0b5-de88900bdb2b
create Joel Drapper → works_on → Literal
attrs (empty) → {"role" => "creator"}
context (empty) → Creator and maintainer of the Literal gem, the centerpiece of the talk.
relation (empty) → works_on
source_node_id (empty) → af49a23b-6658-4fc4-a29e-a0edd1d8c83a
target_node_id (empty) → c8b9e593-e990-460b-aa69-c3f4259bcd8c
create Joel Drapper → works_on → Phlex
attrs (empty) → {"role" => "creator"}
context (empty) → Creator of Phlex; used a Phlex Button component to demo Literal::Properties.
relation (empty) → works_on
source_node_id (empty) → af49a23b-6658-4fc4-a29e-a0edd1d8c83a
target_node_id (empty) → 6bb19a01-47fc-4521-83c9-874cd58c606a
create Does Literal::Data raise in production on a bad prop? → about → Literal
context (empty) → Asks about Literal::Data production behavior.
relation (empty) → about
source_node_id (empty) → 323fee95-f624-4750-b2de-4ffb93b27d6c
target_node_id (empty) → c8b9e593-e990-460b-aa69-c3f4259bcd8c
create Joel Drapper → works_on → Quickdraw
attrs (empty) → {"role" => "creator"}
context (empty) → Introduced as creator of Quickdraw in the speaker introduction.
relation (empty) → works_on
source_node_id (empty) → af49a23b-6658-4fc4-a29e-a0edd1d8c83a
target_node_id (empty) → 9a9d18ed-4f5e-46d7-a340-89fc8425bcf9
create Joel Drapper → works_on → Rooftop Ruby
attrs (empty) → {"role" => "co-host"}
context (empty) → Co-hosts the Rooftop Ruby podcast.
relation (empty) → works_on
source_node_id (empty) → af49a23b-6658-4fc4-a29e-a0edd1d8c83a
target_node_id (empty) → e8f977c4-3321-4296-a330-5e5eb542a92b
create Joel Drapper → works_at → Shopify
context (empty) → Shopify war story — the Zendesk ticket deletion incident happened at Shopify while Drapper was there.
relation (empty) → works_at
source_node_id (empty) → af49a23b-6658-4fc4-a29e-a0edd1d8c83a
target_node_id (empty) → 934a1185-4a30-4c56-b417-b26f0ad00133
create Joel Drapper → works_at → Clear Scope
context (empty) → Deployed Literal in production at Clear Scope, reducing production error rates.
relation (empty) → works_at
source_node_id (empty) → af49a23b-6658-4fc4-a29e-a0edd1d8c83a
target_node_id (empty) → 2b64c5bc-1d8c-4246-bfb6-37d7e593ac6a
create Joel Drapper → recommends → TypeScript
context (empty) → Self-describes as 'one of those degenerates who loves TypeScript'.
relation (empty) → recommends
source_node_id (empty) → af49a23b-6658-4fc4-a29e-a0edd1d8c83a
target_node_id (empty) → 43a67685-cd1a-4515-82f2-37f8f1670634
create Ruby has literally always had types → about → Literal
context (empty) → The talk introduces and demonstrates Literal's types, struct/data, properties, enums, values, and decorators.
relation (empty) → about
source_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
target_node_id (empty) → c8b9e593-e990-460b-aa69-c3f4259bcd8c
create Ruby has literally always had types → about → Case Equality Interface
context (empty) → Core claim: Ruby's === is Ruby's type interface.
relation (empty) → about
source_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
target_node_id (empty) → 41274254-ed26-4007-b1ea-ac46af3784dc
create Ruby has literally always had types → about → Type As Description Of A Set
context (empty) → Drapper's working definition of what a type is.
relation (empty) → about
source_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
target_node_id (empty) → 2e6596d3-7c4d-482c-a8d0-1bdb277eb110
create Ruby has literally always had types → about → Runtime Types vs Static Types
context (empty) → Central argument of the talk.
relation (empty) → about
source_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
target_node_id (empty) → 6c61e0dc-1d76-45f5-91c0-69da1bc741f4
create Ruby has literally always had types → about → Invalid States Impossible
context (empty) → Types at object boundaries make invalid states unrepresentable.
relation (empty) → about
source_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
target_node_id (empty) → 42c09886-00a7-4403-8acd-8f80a7e33dae
create Ruby has literally always had types → about → Accordion of Complexity
context (empty) → Drapper uses Stephen Margheim's accordion-of-complexity framing to describe Literal's incremental safety layers.
relation (empty) → about
source_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
target_node_id (empty) → fb07dfa3-8cc3-4771-9946-54c856e9f78d
create Ruby has literally always had types → about → Sorbet
context (empty) → Discussed as the furthest-along static type checker for Ruby; contrasted with Literal's runtime approach.
relation (empty) → about
source_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create Ruby has literally always had types → about → RBS
context (empty) → Covered as the official Ruby type-signature language (no checker of its own).
relation (empty) → about
source_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
target_node_id (empty) → bbf22e30-34ab-40fd-964c-783bf88a65a4
create Ruby has literally always had types → about → Steep
context (empty) → Cited as the best available type checker for RBS.
relation (empty) → about
source_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
target_node_id (empty) → 4f880764-1346-44b6-ad82-c52b08201367
create Ruby has literally always had types → about → dry-types
context (empty) → Contrasted with Literal in Q&A: dry-types bundle coercion/defaults in the type.
relation (empty) → about
source_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
target_node_id (empty) → 6669b526-7545-407c-993f-4580e69ae743
create Ruby has literally always had types → about → Phlex
context (empty) → Phlex Button component demonstrated as a user of Literal::Properties.
relation (empty) → about
source_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
target_node_id (empty) → 6bb19a01-47fc-4521-83c9-874cd58c606a
create Literal → uses → Case Equality Interface
context (empty) → Literal treats any object responding to === as a type.
relation (empty) → uses
source_node_id (empty) → c8b9e593-e990-460b-aa69-c3f4259bcd8c
target_node_id (empty) → 41274254-ed26-4007-b1ea-ac46af3784dc
create Literal → uses → Ruby
context (empty) → Built as a Ruby gem leveraging Ruby's existing case-equality, pattern matching, and code-generation capabilities.
relation (empty) → uses
source_node_id (empty) → c8b9e593-e990-460b-aa69-c3f4259bcd8c
target_node_id (empty) → c7f25b33-06c9-460e-aca7-fe993123ebee
create Phlex → uses → Literal
context (empty) → Phlex components can extend Literal::Properties to get typed props like union-typed size/variant.
relation (empty) → uses
source_node_id (empty) → 6bb19a01-47fc-4521-83c9-874cd58c606a
target_node_id (empty) → c8b9e593-e990-460b-aa69-c3f4259bcd8c
create Steep → uses → RBS
context (empty) → Steep is a static type checker that consumes RBS type signatures.
relation (empty) → uses
source_node_id (empty) → 4f880764-1346-44b6-ad82-c52b08201367
target_node_id (empty) → bbf22e30-34ab-40fd-964c-783bf88a65a4
create Soutaro Matsumoto → works_on → Steep
attrs (empty) → {"role" => "author"}
context (empty) → Author of the Steep type checker, as credited in the talk.
relation (empty) → works_on
source_node_id (empty) → 521fe235-6c37-42b3-a1cf-32eac899dcfd
target_node_id (empty) → 4f880764-1346-44b6-ad82-c52b08201367
create Sorbet → related_to → Shopify
context (empty) → Drapper cites Shopify as one of the big companies that succeeded with Sorbet.
relation (empty) → related_to
source_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
target_node_id (empty) → 934a1185-4a30-4c56-b417-b26f0ad00133
create Sorbet → related_to → Stripe
context (empty) → Originally authored by Stripe; Drapper references Stripe as one of the companies using Sorbet well.
relation (empty) → related_to
source_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
target_node_id (empty) → e3389b72-3041-48ce-95c9-e1d0e2e23c8b
create Runtime types give you most of the safety for little effort → from_talk → Ruby has literally always had types
context (empty) → Core takeaway summarizing the talk's thesis.
relation (empty) → from_talk
source_node_id (empty) → 903d5909-f606-49ce-8beb-fdb699b826fe
target_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
create Raise in production rather than silently continue → from_talk → Ruby has literally always had types
context (empty) → Lesson drawn from the Shopify/Zendesk incident and Clear Scope's deployment.
relation (empty) → from_talk
source_node_id (empty) → 5691b8a5-90e8-4b7d-9fa9-8dcca54784a7
target_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
create Name your types to reuse and document them → from_talk → Ruby has literally always had types
context (empty) → Drapper urges extracting Latitude, UserID, GroupMembers as named types.
relation (empty) → from_talk
source_node_id (empty) → e85443ef-d3c8-4fdc-8d22-db63126de2ac
target_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
create Runtime types give you most of the safety for little effort → about → Literal
context (empty) → Takeaway centers on what Literal provides.
relation (empty) → about
source_node_id (empty) → 903d5909-f606-49ce-8beb-fdb699b826fe
target_node_id (empty) → c8b9e593-e990-460b-aa69-c3f4259bcd8c
create Raise in production rather than silently continue → about → Literal
context (empty) → Raising is Literal's default and was kept on in production at Clear Scope.
relation (empty) → about
source_node_id (empty) → 5691b8a5-90e8-4b7d-9fa9-8dcca54784a7
target_node_id (empty) → c8b9e593-e990-460b-aa69-c3f4259bcd8c
create Name your types to reuse and document them → about → Literal
context (empty) → Recommendation applies specifically to Literal's composable type constructors.
relation (empty) → about
source_node_id (empty) → e85443ef-d3c8-4fdc-8d22-db63126de2ac
target_node_id (empty) → c8b9e593-e990-460b-aa69-c3f4259bcd8c
create Difference between Literal and dry-types → asked_at → Ruby has literally always had types
context (empty) → First audience Q&A question.
relation (empty) → asked_at
source_node_id (empty) → bce521db-bd68-402e-9ee9-111897f78cf3
target_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
create Does Literal::Data raise in production on a bad prop? → asked_at → Ruby has literally always had types
context (empty) → Second audience Q&A question.
relation (empty) → asked_at
source_node_id (empty) → 323fee95-f624-4750-b2de-4ffb93b27d6c
target_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
create Specifying types at the method boundary with pattern matching → asked_at → Ruby has literally always had types
context (empty) → Third audience Q&A question about method-level typing.
relation (empty) → asked_at
source_node_id (empty) → f71f06d8-abc9-47ca-beaf-f0195f6758cd
target_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
create Is Literal a good basis for a validation library? → asked_at → Ruby has literally always had types
context (empty) → Follow-up Q&A question.
relation (empty) → asked_at
source_node_id (empty) → 063b424a-24c1-4094-ab41-662e7feabb7d
target_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
create Could types be defined outside the class like RBS? → asked_at → Ruby has literally always had types
context (empty) → Q&A question on verbosity and external type files.
relation (empty) → asked_at
source_node_id (empty) → 27625cc6-53a1-4d04-be6c-d6c434b271fb
target_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
create Can production observation auto-generate types? → asked_at → Ruby has literally always had types
context (empty) → Final Q&A question on Coverband-style production observation generating types.
relation (empty) → asked_at
source_node_id (empty) → d4a8874d-18ed-42ea-a793-a34a13844f81
target_node_id (empty) → 29c32628-fdfd-427b-96b6-836394922307
create Difference between Literal and dry-types → about → Literal
context (empty) → Compares Literal's design.
relation (empty) → about
source_node_id (empty) → bce521db-bd68-402e-9ee9-111897f78cf3
target_node_id (empty) → c8b9e593-e990-460b-aa69-c3f4259bcd8c
create Difference between Literal and dry-types → about → dry-types
context (empty) → Directly asks about dry-types.
relation (empty) → about
source_node_id (empty) → bce521db-bd68-402e-9ee9-111897f78cf3
target_node_id (empty) → 6669b526-7545-407c-993f-4580e69ae743
create Is Literal a good basis for a validation library? → about → Literal
context (empty) → Asks whether Literal can power a validation library.
relation (empty) → about
source_node_id (empty) → 063b424a-24c1-4094-ab41-662e7feabb7d
target_node_id (empty) → c8b9e593-e990-460b-aa69-c3f4259bcd8c
create Could types be defined outside the class like RBS? → about → RBS
context (empty) → References RBS's external type-file capability.
relation (empty) → about
source_node_id (empty) → 27625cc6-53a1-4d04-be6c-d6c434b271fb
target_node_id (empty) → bbf22e30-34ab-40fd-964c-783bf88a65a4
create Can production observation auto-generate types? → about → RBS
context (empty) → Proposes generating RBS-style types from production observation.
relation (empty) → about
source_node_id (empty) → d4a8874d-18ed-42ea-a793-a34a13844f81
target_node_id (empty) → bbf22e30-34ab-40fd-964c-783bf88a65a4

Read set

141 nodes

person Joel Drapper search_nodes+get_node_edges tool ChatGPT search_nodes concept AI Agent search_nodes takeaway Name Things To Find Their Properties search_nodes tool langchainrb search_nodes concept xkcd Dependency / Nebraska Problem search_nodes concept Retrieval Augmented Generation search_nodes concept GraphQL max_depth search_nodes tool RealtimeBoard search_nodes concept Prompt Alchemy search_nodes talk Ruby has literally always had types search_nodes+get_node_edges tool dry-types search_nodes tool litestream-ruby search_nodes talk Ruby Standard Library Hidden Gems Lightning Talk search_nodes talk Methods Gem for Ruby Method References search_nodes tool RBS search_nodes tool Sorbet search_nodes takeaway Look outside Ruby for better patterns search_nodes tool Ruby search_nodes talk Rubyana Gems and the Ractorous Rubetta Stones! search_nodes question Are Sorbet runtime checks built on TracePoint? search_nodes takeaway Sorbet fits big refactorable codebases, not greenfield search_nodes question Dry-types input validation vs full Sorbet typing search_nodes concept T.unsafe search_nodes takeaway Generate RBI files instead of writing inline signatures search_nodes talk Introducing Sorbet into your Ruby codebase search_nodes tool ruby-contracts search_nodes tool Standard RB search_nodes tool RBI search_nodes tool rbspy search_nodes tool ViewComponent search_nodes takeaway ViewComponent Checklist search_nodes concept ViewComponent Slots search_nodes tool Phlex search_nodes tool Lookbook search_nodes talk Component Driven UI with ViewComponent search_nodes tool Phoenix LiveView search_nodes concept Builder Pattern for ViewComponents search_nodes takeaway Use generic and object-specific ViewComponents together search_nodes tool Cells search_nodes event Rails World search_nodes project Ruby Romania search_nodes resource Short Ruby Newsletter search_nodes talk Events events events search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes talk Building LLM powered applications in Ruby search_nodes talk Scientific Ruby Lightning Talk search_nodes resource My Ruby Story search_nodes project Ruby News search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2026 search_nodes talk It is not so bad, after all search_nodes talk Gregorian Calendar search_nodes talk Performance Panel wroclove.rb 2024 search_nodes resource Ruby Rogues search_nodes talk How to Be Top 10% in Ruby Lightning Talk search_nodes talk To Refine or Not to Refine search_nodes tool TestBench search_nodes tool test-prof search_nodes tool ruby-openai search_nodes tool FactoryBot search_nodes tool Capybara search_nodes tool parallel_tests search_nodes tool WebMock search_nodes tool TTY toolkit search_nodes tool Faker search_nodes tool RuboCop search_nodes tool dry-struct search_nodes person Stephen Margheim search_nodes tool Sonic Pi search_nodes concept Rubber Duck Debugging search_nodes concept Distance From The Main Sequence search_nodes concept Cynefin Framework search_nodes talk Sonic Pi Music Performance search_nodes concept State Machine search_nodes company Shopify search_nodes tool Klaviyo search_nodes project Nerds and Threads search_nodes project rails_event_store/ecommerce search_nodes tool Spree search_nodes talk Scaling an Open Source E-Commerce Framework search_nodes tool Apollo GraphQL search_nodes tool Tapioca search_nodes tool Solidus search_nodes tool Apollo GraphQL Platform search_nodes concept Proc Triple-Equals Call search_nodes takeaway Use === to put Procs in case/when search_nodes concept Scope Resolution Operator search_nodes tool power_assert search_nodes concept Duck Typing search_nodes company SpaceX search_nodes tool Sync Space VR search_nodes tool Speedscope search_nodes takeaway Trailblazer tracing saves thousands of debugging hours search_nodes tool PagerDuty search_nodes resource awesome-ddd search_nodes takeaway Ruby as a Data Management Language search_nodes tool server-engine search_nodes question Generate code once vs instruct LLM per request search_nodes tool TypeScript search_nodes question Would you recommend TypeScript or Flow? search_nodes takeaway Adopt TypeScript or Flow for maintainability search_nodes tool Kotlin search_nodes tool PureScript search_nodes concept Optional Gradual Typing search_nodes tool Flow search_nodes tool ESLint search_nodes tool Elm search_nodes tool .NET search_nodes project Check search_nodes takeaway Port Python Libraries With ChatGPT search_nodes tool Puma search_nodes tool Passenger search_nodes tool Rack search_nodes tool Iodine search_nodes tool Unicorn search_nodes tool Plezi search_nodes tool Ruby Packer search_nodes tool Ruby on Rails search_nodes tool Traveling Ruby search_nodes takeaway Ask the Most Human Question Possible search_nodes tool JIRA search_nodes project Trezy search_nodes tool Speaker Deck search_nodes tool Honeycomb search_nodes question Is that monads in your stack trace? search_nodes concept Idempotent Projectors and Reactors search_nodes tool dry-cli search_nodes question Isn't the dry-container recipe global state? search_nodes tool dry-validation search_nodes concept Pipeline Operator search_nodes concept Immutable Form Runtime API search_nodes takeaway Purity Is The Wrong Lens; Dependency On Time Is The Right One search_nodes tool Distributed Ruby search_nodes takeaway Read the Ruby standard library search_nodes talk Code Golfing in Ruby Lightning Talk search_nodes takeaway Use Ruby Packer for Single-Binary CLIs search_nodes

2 edges