← 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 DrapperauthoredRuby has literally always had types
context (empty) Joel Drapper delivered this talk at wroclove.rb 2025.
update Ruby has literally always had typespresented_atwroclove.rb 2025
context (empty) First speaker of wroclove.rb 2025, delivered on 2025-03-14.
create Joel Drapperattendedwroclove.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 Drapperworks_onLiteral
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 Drapperworks_onPhlex
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?aboutLiteral
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 Drapperworks_onQuickdraw
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 Drapperworks_onRooftop 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 Drapperworks_atShopify
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 Drapperworks_atClear 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 DrapperrecommendsTypeScript
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 typesaboutLiteral
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 typesaboutCase 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 typesaboutType 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 typesaboutRuntime 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 typesaboutInvalid 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 typesaboutAccordion 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 typesaboutSorbet
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 typesaboutRBS
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 typesaboutSteep
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 typesaboutdry-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 typesaboutPhlex
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 LiteralusesCase 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 LiteralusesRuby
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 PhlexusesLiteral
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 SteepusesRBS
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 Matsumotoworks_onSteep
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 Sorbetrelated_toShopify
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 Sorbetrelated_toStripe
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 effortfrom_talkRuby 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 continuefrom_talkRuby 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 themfrom_talkRuby 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 effortaboutLiteral
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 continueaboutLiteral
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 themaboutLiteral
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-typesasked_atRuby 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_atRuby 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 matchingasked_atRuby 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_atRuby 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_atRuby 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_atRuby 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-typesaboutLiteral
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-typesaboutdry-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?aboutLiteral
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?aboutRBS
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?aboutRBS
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