← Extractions

Introducing Sorbet into your Ruby codebase — Erwin Kroon at wroclove.rb 2024

Erwin Kroon, a GitHub engineer on the Issues platform team, shares his experience adopting Sorbet — Stripe's gradual type checker — in GitHub's 10-year-old Ruby codebase. He walks through syntax, require_ancestor, T.bind, RBI files, Tapioca, and performance trade-offs, concluding Sorbet is useful for large refactorable codebases but awkward for greenfield projects.

Model
claude-opus-4-7
Ingestion
794c43ba
Input tokens
680,893
fresh
509,023
cached
164,501
cache write
7,369
Output tokens
17,365
Duration
294.1s
Roundtrips
15
Tool calls
26
Cost
$0.00
Nodes/edges extracted
23 / 50
Read set (nodes/edges)
130 / 2

Nodes (23)

create John Hawthorne person
kind (empty) → person
name (empty) → John Hawthorne
slug (empty) → john-hawthorne
description (empty) → Engineer at GitHub whom Erwin Kroon cites as the expert on Sorbet, runtime type-checking implementation details, and ...
short_description (empty) → GitHub engineer deeply involved in Ruby typing and performance work.
update Introducing Sorbet into your Ruby codebase talk
description Talk at wroclove.rb 2024. → Erwin Kroon's wroclove.rb 2024 single-speaker talk on introducing Sorbet, Stripe's gradual type checker for Ruby, to ...
short_description Talk at wroclove.rb 2024. → Erwin Kroon's wroclove.rb 2024 talk on adopting Sorbet at GitHub.
create GitHub company
kind (empty) → company
name (empty) → GitHub
slug (empty) → github
attrs (empty) → {"industry" => "developer tools / SaaS"}
description (empty) → Developer-collaboration company behind the github.com platform (source hosting, pull requests, issues, Actions). Runs...
short_description (empty) → Developer collaboration platform hosting Git repositories, issues, pull requests and Actions.
update Erwin Kroon person
attrs (empty) → {"prior_role" => "Full-stack developer (React)", "current_team" => "GitHub Issues platform"}
description Conference speaker. → Dog walker with a 'nice side job writing Ruby at GitHub'. Joined GitHub as a full-stack developer writing React, then...
short_description Conference speaker. → GitHub engineer on the Issues platform team; polyglot Ruby/React developer.
update Stripe tool
attrs {"category" => "service"} → {"category" => "service", "industry" => "payments / SaaS"}
description Online payments platform. Used in the Prevent Account Sharing talk as the source of truth for revenue — the team watc... → Online payments platform. Original author of Sorbet, the gradual static type checker for Ruby. Stripe is distinct fro...
short_description Online payments platform widely used by SaaS applications. → Online payments company; original author of the Sorbet Ruby type checker.
update Shopify company
description E-commerce SaaS platform cited as one of the most recognizable multi-tenant Rails architectures, using a row-level pa... → E-commerce SaaS platform cited as one of the most recognizable multi-tenant Rails architectures, using a row-level pa...
short_description E-commerce platform; well-known large-scale Rails multi-tenant architecture. → E-commerce platform; well-known large-scale Rails multi-tenant architecture and author of Tapioca.
update Sorbet tool
attrs {"origin" => "Stripe", "category" => "tool", "language" => "Ruby"} → {"origin" => "Stripe", "category" => "tool", "language" => "Ruby", "implementation_language" => "C++"}
description Gradual static type checker for Ruby, originally created by Stripe. Provides type signatures, runtime checks, and IDE... → Gradual static type checker for Ruby, originally created by Stripe. Provides type signatures, runtime checks, and IDE...
create Tapioca tool
kind (empty) → tool
name (empty) → Tapioca
slug (empty) → tapioca
attrs (empty) → {"category" => "tool", "language" => "Ruby"}
description (empty) → CLI tool by Shopify that replaces Sorbet's old built-in RBI generation/download. Downloads pre-generated RBI stubs fo...
short_description (empty) → Shopify CLI for downloading and generating Sorbet RBI type stubs.
create RBI tool
kind (empty) → tool
name (empty) → RBI
slug (empty) → rbi
attrs (empty) → {"category" => "tool", "language" => "Ruby"}
description (empty) → Sorbet's sidecar type-signature file format. RBI files look like normal Ruby but contain only method/constant declara...
short_description (empty) → Ruby interface file format for Sorbet type signatures separate from implementation.
create requires_ancestor concept
kind (empty) → concept
name (empty) → requires_ancestor
slug (empty) → requires_ancestor
attrs (empty) → {"category" => "practice"}
description (empty) → Experimental Sorbet feature enabled by `T::Helpers` and `requires_ancestor { Klass }`. Lets a module declare that it ...
short_description (empty) → Experimental Sorbet feature declaring that a module must be included by a given ancestor class.
create T.bind concept
kind (empty) → concept
name (empty) → T.bind
slug (empty) → t-bind
attrs (empty) → {"category" => "practice"}
description (empty) → Sorbet helper (`T.bind(self, SomeType)`) used inside included modules to tell Sorbet the runtime type of `self` when ...
short_description (empty) → Sorbet runtime helper that rebinds `self` to a given type inside a block/method.
create T.unsafe concept
kind (empty) → concept
name (empty) → T.unsafe
slug (empty) → t-unsafe
attrs (empty) → {"category" => "practice"}
description (empty) → Sorbet escape hatch that tells both the static checker and the runtime to ignore typing for the wrapped expression. U...
short_description (empty) → Sorbet escape hatch disabling type checks for a single expression.
create TracePoint API concept
kind (empty) → concept
name (empty) → TracePoint API
slug (empty) → tracepoint-api
attrs (empty) → {"category" => "architecture"}
description (empty) → Ruby core API that lets code subscribe to runtime events (method calls, returns, line execution, raises, etc.). Used ...
short_description (empty) → Ruby core API for subscribing to runtime execution events.
create YJIT tool
kind (empty) → tool
name (empty) → YJIT
slug (empty) → yjit
attrs (empty) → {"category" => "tool", "language" => "Ruby"}
description (empty) → Just-in-time compiler for MRI Ruby developed by Shopify. Erwin Kroon notes that Sorbet's runtime type assertions (`T....
short_description (empty) → Shopify-developed just-in-time compiler for MRI Ruby.
create Use typed: strict as the lower bound takeaway
kind (empty) → takeaway
name (empty) → Use typed: strict as the lower bound
slug (empty) → use-typed-strict-as-the-lower-bound
attrs (empty) → {"type" => "lesson-learned"}
description (empty) → Hindsight recommendation from Erwin Kroon's GitHub Sorbet adoption: setting `# typed: true` as the lower bound meant ...
short_description (empty) → Prefer strict typing over typed: true to force real signatures instead of runtime assertions.
create Generate RBI files instead of writing inline signatures takeaway
kind (empty) → takeaway
name (empty) → Generate RBI files instead of writing inline signatures
slug (empty) → generate-rbi-files-instead-of-writing-inline-signatures
attrs (empty) → {"type" => "recommendation"}
description (empty) → Erwin Kroon's recommended end-state for Sorbet adoption: don't pollute Ruby files with `sig` blocks, generics declara...
short_description (empty) → Keep Sorbet sigs out of your .rb files by generating them via Tapioca into RBI files.
create Enable requires_ancestor when adopting Sorbet takeaway
kind (empty) → takeaway
name (empty) → Enable requires_ancestor when adopting Sorbet
slug (empty) → enable-requires_ancestor-when-adopting-sorbet
attrs (empty) → {"type" => "recommendation"}
description (empty) → Despite being experimental, `requires_ancestor` is a must-enable when introducing Sorbet to a Ruby codebase that uses...
short_description (empty) → Turn on Sorbet's experimental requires_ancestor feature immediately.
create Sorbet signatures are free; assertions are not takeaway
kind (empty) → takeaway
name (empty) → Sorbet signatures are free; assertions are not
slug (empty) → sorbet-signatures-are-free-assertions-are-not
attrs (empty) → {"type" => "insight"}
description (empty) → Key performance insight from Erwin Kroon's measurements at GitHub. Depending on Sorbet's startup configuration, metho...
short_description (empty) → Sigs erase at startup with zero overhead; T.let/T.cast/T.must/T.unsafe stay in code and slow it down.
create Sorbet fits big refactorable codebases, not greenfield takeaway
kind (empty) → takeaway
name (empty) → Sorbet fits big refactorable codebases, not greenfield
slug (empty) → sorbet-fits-big-refactorable-codebases-not-greenfield
attrs (empty) → {"type" => "insight"}
description (empty) → Erwin Kroon's verdict: Sorbet is good for big codebases that want to refactor with more confidence, but he can't imag...
short_description (empty) → Use Sorbet for confidence while refactoring legacy Ruby; skip it on new projects.
create Dry-types input validation vs full Sorbet typing question
kind (empty) → question
name (empty) → Dry-types input validation vs full Sorbet typing
slug (empty) → dry-types-input-validation-vs-full-sorbet-typing
attrs (empty) → {"answer_summary" => "Sorbet validates type usage internally (like a static language) as a complement to — not replac...
description (empty) → Audience member at wroclove.rb 2024 explains their team uses dry-types to validate input types only at the boundaries...
short_description (empty) → Why add Sorbet on top of dry-types/unit tests if input is already validated at the boundary?
create Are Sorbet runtime checks built on TracePoint? question
kind (empty) → question
name (empty) → Are Sorbet runtime checks built on TracePoint?
slug (empty) → are-sorbet-runtime-checks-built-on-tracepoint
attrs (empty) → {"answer_summary" => "Speaker doesn't know; defers to John Hawthorne at GitHub who is deep into Sorbet internals."}
description (empty) → Audience member asks whether Sorbet's runtime checks are implemented on top of Ruby's TracePoint API (as RBS is) and ...
short_description (empty) → How Sorbet implements runtime type checks and whether TracePoint explains its overhead.
create Would you prefer types beside the code, not in it? question
kind (empty) → question
name (empty) → Would you prefer types beside the code, not in it?
slug (empty) → would-you-prefer-types-beside-the-code-not-in-it
attrs (empty) → {"answer_summary" => "Yes — speaker prefers types generated into RBI sidecar files, not inline in implementations."}
description (empty) → Audience member does a 'sentiment analysis' on the talk, asking whether Erwin would prefer Sorbet to be more automate...
short_description (empty) → Sentiment check that speaker wants more automation and types outside of implementations.
update wroclove.rb 2024 event
description Single-track, non-profit Ruby conference. → Single-track, non-profit Ruby conference held in Wrocław, Poland on 2024-03-22.

Edges (50)

update Erwin Kroon → authored → Introducing Sorbet into your Ruby codebase
context (empty) → Speaker of the talk at wroclove.rb 2024.
update Introducing Sorbet into your Ruby codebase → presented_at → wroclove.rb 2024
context (empty) → Single-speaker talk delivered at the conference.
create Erwin Kroon → works_at → GitHub
attrs (empty) → {"role" => "Issues platform engineer"}
context (empty) → Engineer on GitHub's Issues platform team; previously full-stack React developer.
relation (empty) → works_at
source_node_id (empty) → 3b36ddeb-8fdf-4164-8a2e-3213b13578c8
target_node_id (empty) → 7b9aabd6-7e21-48b6-b87d-8c99d99c3b34
create Erwin Kroon → uses → Ruby
context (empty) → Two years of Ruby at GitHub at time of talk.
relation (empty) → uses
source_node_id (empty) → 3b36ddeb-8fdf-4164-8a2e-3213b13578c8
target_node_id (empty) → c7f25b33-06c9-460e-aca7-fe993123ebee
create Erwin Kroon → uses → Sorbet
context (empty) → Introducing Sorbet to GitHub's 10-year-old Ruby codebase.
relation (empty) → uses
source_node_id (empty) → 3b36ddeb-8fdf-4164-8a2e-3213b13578c8
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create Erwin Kroon → has_skill → Python
context (empty) → Listed among prior languages used.
relation (empty) → has_skill
source_node_id (empty) → 3b36ddeb-8fdf-4164-8a2e-3213b13578c8
target_node_id (empty) → 1675ceaa-ee27-43a3-9376-d9d3106c89ab
create Erwin Kroon → has_skill → TypeScript
context (empty) → Listed among prior languages used.
relation (empty) → has_skill
source_node_id (empty) → 3b36ddeb-8fdf-4164-8a2e-3213b13578c8
target_node_id (empty) → 43a67685-cd1a-4515-82f2-37f8f1670634
create John Hawthorne → works_at → GitHub
context (empty) → Mentioned as a GitHub colleague deeply involved in Sorbet adoption and performance work.
relation (empty) → works_at
source_node_id (empty) → a152aac4-6552-4577-94ff-bd4cabed366b
target_node_id (empty) → 7b9aabd6-7e21-48b6-b87d-8c99d99c3b34
create John Hawthorne → works_on → Sorbet
context (empty) → Cited as the internal expert on Sorbet runtime and performance at GitHub.
relation (empty) → works_on
source_node_id (empty) → a152aac4-6552-4577-94ff-bd4cabed366b
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create Introducing Sorbet into your Ruby codebase → about → Sorbet
context (empty) → Whole talk is about introducing Sorbet into a Ruby codebase.
relation (empty) → about
source_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create Introducing Sorbet into your Ruby codebase → about → Tapioca
context (empty) → Talk introduces Tapioca as the recommended RBI generator.
relation (empty) → about
source_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
target_node_id (empty) → e3bf836d-09c2-4ff7-9e48-9cf0cba7fc01
create Introducing Sorbet into your Ruby codebase → about → RBI
context (empty) → Covers RBI sidecar files as an alternative to inline signatures.
relation (empty) → about
source_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
target_node_id (empty) → 7544a56e-744b-4ff0-b285-ccfc3e236544
create Introducing Sorbet into your Ruby codebase → about → requires_ancestor
context (empty) → Explains and recommends enabling Sorbet's experimental requires_ancestor feature.
relation (empty) → about
source_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
target_node_id (empty) → 57977d2a-597a-4a5b-98c8-e6a8ba28875f
create Introducing Sorbet into your Ruby codebase → about → T.bind
context (empty) → Shows T.bind(self, ...) as a workaround for dependency-style modules.
relation (empty) → about
source_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
target_node_id (empty) → 64035ee8-22f9-4dd4-8b96-5f07c905d42d
create Introducing Sorbet into your Ruby codebase → about → T.unsafe
context (empty) → Warns that T.unsafe is pure runtime overhead; GitHub has 6,000 uses.
relation (empty) → about
source_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
target_node_id (empty) → 9f2d5f9e-4881-4bdb-9054-023eb163d474
create Introducing Sorbet into your Ruby codebase → about → GitHub
context (empty) → Case study is GitHub's 10-year-old Ruby codebase.
relation (empty) → about
source_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
target_node_id (empty) → 7b9aabd6-7e21-48b6-b87d-8c99d99c3b34
create Introducing Sorbet into your Ruby codebase → about → RBS
context (empty) → Briefly contrasted with Sorbet; RBS uses TracePoint for runtime checks.
relation (empty) → about
source_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
target_node_id (empty) → bbf22e30-34ab-40fd-964c-783bf88a65a4
create Introducing Sorbet into your Ruby codebase → about → YJIT
context (empty) → Notes that Sorbet's type assertions cannot be optimized by YJIT.
relation (empty) → about
source_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
target_node_id (empty) → e4c4781f-fa87-47b0-b174-3193e35b308d
create Introducing Sorbet into your Ruby codebase → about → TracePoint API
context (empty) → Discussed in Q&A as the suspected basis for Sorbet's runtime overhead.
relation (empty) → about
source_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
target_node_id (empty) → ccc22fd4-7127-4d63-930c-052e2533d576
create Sorbet → related_to → Ruby
context (empty) → Sorbet is a type checker for Ruby.
relation (empty) → related_to
source_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
target_node_id (empty) → c7f25b33-06c9-460e-aca7-fe993123ebee
create Tapioca → related_to → Sorbet
context (empty) → Tapioca generates RBI files consumed by Sorbet.
relation (empty) → related_to
source_node_id (empty) → e3bf836d-09c2-4ff7-9e48-9cf0cba7fc01
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create Tapioca → related_to → RBI
context (empty) → Tapioca's primary output format is RBI.
relation (empty) → related_to
source_node_id (empty) → e3bf836d-09c2-4ff7-9e48-9cf0cba7fc01
target_node_id (empty) → 7544a56e-744b-4ff0-b285-ccfc3e236544
create Stripe → related_to → Sorbet
context (empty) → Stripe is the original author of Sorbet.
relation (empty) → related_to
source_node_id (empty) → e3389b72-3041-48ce-95c9-e1d0e2e23c8b
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create Shopify → related_to → Tapioca
context (empty) → Shopify authored and maintains Tapioca.
relation (empty) → related_to
source_node_id (empty) → 934a1185-4a30-4c56-b417-b26f0ad00133
target_node_id (empty) → e3bf836d-09c2-4ff7-9e48-9cf0cba7fc01
create Shopify → related_to → YJIT
context (empty) → YJIT was developed at Shopify.
relation (empty) → related_to
source_node_id (empty) → 934a1185-4a30-4c56-b417-b26f0ad00133
target_node_id (empty) → e4c4781f-fa87-47b0-b174-3193e35b308d
create requires_ancestor → related_to → Sorbet
context (empty) → Experimental Sorbet feature.
relation (empty) → related_to
source_node_id (empty) → 57977d2a-597a-4a5b-98c8-e6a8ba28875f
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create T.bind → related_to → Sorbet
context (empty) → Sorbet runtime helper for rebinding self.
relation (empty) → related_to
source_node_id (empty) → 64035ee8-22f9-4dd4-8b96-5f07c905d42d
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create T.unsafe → related_to → Sorbet
context (empty) → Sorbet escape hatch.
relation (empty) → related_to
source_node_id (empty) → 9f2d5f9e-4881-4bdb-9054-023eb163d474
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create RBI → related_to → Sorbet
context (empty) → RBI files are Sorbet's sidecar signature format.
relation (empty) → related_to
source_node_id (empty) → 7544a56e-744b-4ff0-b285-ccfc3e236544
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create Use typed: strict as the lower bound → from_talk → Introducing Sorbet into your Ruby codebase
context (empty) → Speaker's hindsight lesson after adopting Sorbet at typed: true level.
relation (empty) → from_talk
source_node_id (empty) → d53f9dd4-bd75-4a29-8040-0ae761c633f5
target_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
create Generate RBI files instead of writing inline signatures → from_talk → Introducing Sorbet into your Ruby codebase
context (empty) → Speaker's recommended Sorbet end-state.
relation (empty) → from_talk
source_node_id (empty) → 461f8591-0c73-43e5-876c-a6baa9869dbd
target_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
create Enable requires_ancestor when adopting Sorbet → from_talk → Introducing Sorbet into your Ruby codebase
context (empty) → Strong recommendation from the speaker.
relation (empty) → from_talk
source_node_id (empty) → e7ec21fb-4f8a-4e3c-a952-827f5e5ccdbf
target_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
create Sorbet signatures are free; assertions are not → from_talk → Introducing Sorbet into your Ruby codebase
context (empty) → Performance insight from speaker's benchmarks.
relation (empty) → from_talk
source_node_id (empty) → 804e65ca-0478-4b6b-aedd-3144cbd62dc3
target_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
create Sorbet fits big refactorable codebases, not greenfield → from_talk → Introducing Sorbet into your Ruby codebase
context (empty) → Speaker's closing verdict.
relation (empty) → from_talk
source_node_id (empty) → d887af5d-4adc-4d67-904b-37b8b4c6b644
target_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
create Use typed: strict as the lower bound → about → Sorbet
context (empty) → Recommendation specific to configuring Sorbet.
relation (empty) → about
source_node_id (empty) → d53f9dd4-bd75-4a29-8040-0ae761c633f5
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create Generate RBI files instead of writing inline signatures → about → Tapioca
context (empty) → Recommendation to lean on Tapioca for RBI generation.
relation (empty) → about
source_node_id (empty) → 461f8591-0c73-43e5-876c-a6baa9869dbd
target_node_id (empty) → e3bf836d-09c2-4ff7-9e48-9cf0cba7fc01
create Enable requires_ancestor when adopting Sorbet → about → requires_ancestor
context (empty) → Directly about the requires_ancestor feature.
relation (empty) → about
source_node_id (empty) → e7ec21fb-4f8a-4e3c-a952-827f5e5ccdbf
target_node_id (empty) → 57977d2a-597a-4a5b-98c8-e6a8ba28875f
create Sorbet signatures are free; assertions are not → about → Sorbet
context (empty) → Performance insight about Sorbet runtime behavior.
relation (empty) → about
source_node_id (empty) → 804e65ca-0478-4b6b-aedd-3144cbd62dc3
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create Sorbet fits big refactorable codebases, not greenfield → about → Sorbet
context (empty) → Verdict on when Sorbet is worth using.
relation (empty) → about
source_node_id (empty) → d887af5d-4adc-4d67-904b-37b8b4c6b644
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create Dry-types input validation vs full Sorbet typing → asked_at → Introducing Sorbet into your Ruby codebase
context (empty) → Audience question during Q&A.
relation (empty) → asked_at
source_node_id (empty) → 02e5780e-84da-4dca-9de5-1eae692d4f0d
target_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
create Are Sorbet runtime checks built on TracePoint? → asked_at → Introducing Sorbet into your Ruby codebase
context (empty) → Audience question during Q&A.
relation (empty) → asked_at
source_node_id (empty) → 35a0f1d1-7816-4679-81ef-fde1e2656ad5
target_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
create Would you prefer types beside the code, not in it? → asked_at → Introducing Sorbet into your Ruby codebase
context (empty) → Audience sentiment-analysis question during Q&A.
relation (empty) → asked_at
source_node_id (empty) → e42a6b73-a2c6-4ff9-9776-cf8baa43004e
target_node_id (empty) → e8deb122-e9f6-4c07-a477-322a132b588c
create Dry-types input validation vs full Sorbet typing → about → dry-types
context (empty) → Questioner's team uses dry-types for boundary validation.
relation (empty) → about
source_node_id (empty) → 02e5780e-84da-4dca-9de5-1eae692d4f0d
target_node_id (empty) → 6669b526-7545-407c-993f-4580e69ae743
create Dry-types input validation vs full Sorbet typing → about → Sorbet
context (empty) → Comparing boundary-only validation with full Sorbet typing.
relation (empty) → about
source_node_id (empty) → 02e5780e-84da-4dca-9de5-1eae692d4f0d
target_node_id (empty) → 382ece0b-b485-4d9d-b344-59755e8e0f39
create Are Sorbet runtime checks built on TracePoint? → about → TracePoint API
context (empty) → Question specifically about TracePoint as Sorbet's implementation basis.
relation (empty) → about
source_node_id (empty) → 35a0f1d1-7816-4679-81ef-fde1e2656ad5
target_node_id (empty) → ccc22fd4-7127-4d63-930c-052e2533d576
create Are Sorbet runtime checks built on TracePoint? → about → RBS
context (empty) → Questioner notes RBS implements runtime checks on TracePoint.
relation (empty) → about
source_node_id (empty) → 35a0f1d1-7816-4679-81ef-fde1e2656ad5
target_node_id (empty) → bbf22e30-34ab-40fd-964c-783bf88a65a4
create Are Sorbet runtime checks built on TracePoint? → about → John Hawthorne
context (empty) → Speaker deferred the question to John Hawthorne.
relation (empty) → about
source_node_id (empty) → 35a0f1d1-7816-4679-81ef-fde1e2656ad5
target_node_id (empty) → a152aac4-6552-4577-94ff-bd4cabed366b
create Would you prefer types beside the code, not in it? → about → RBI
context (empty) → Implicitly about RBI sidecar files as a cleaner placement for types.
relation (empty) → about
source_node_id (empty) → e42a6b73-a2c6-4ff9-9776-cf8baa43004e
target_node_id (empty) → 7544a56e-744b-4ff0-b285-ccfc3e236544
create Erwin Kroon → recommends → requires_ancestor
context (empty) → Strongly recommends enabling this experimental Sorbet feature.
relation (empty) → recommends
source_node_id (empty) → 3b36ddeb-8fdf-4164-8a2e-3213b13578c8
target_node_id (empty) → 57977d2a-597a-4a5b-98c8-e6a8ba28875f
create Erwin Kroon → recommends → Tapioca
context (empty) → Recommends generating RBIs via Tapioca instead of writing inline signatures.
relation (empty) → recommends
source_node_id (empty) → 3b36ddeb-8fdf-4164-8a2e-3213b13578c8
target_node_id (empty) → e3bf836d-09c2-4ff7-9e48-9cf0cba7fc01

Read set

130 nodes

tool Sorbet search_nodes talk Introducing Sorbet into your Ruby codebase search_nodes+get_node_edges tool dry-types search_nodes tool ruby-contracts search_nodes tool Standard RB search_nodes tool RuboCop search_nodes takeaway Look outside Ruby for better patterns search_nodes tool dry-struct search_nodes tool RBS search_nodes project gemcheck search_nodes company Shopify search_nodes project Nerds and Threads search_nodes tool langchainrb search_nodes concept AI Agent search_nodes project rails_event_store/ecommerce search_nodes takeaway Sign serverlessforruby.org petition search_nodes talk Scaling an Open Source E-Commerce Framework search_nodes concept Retrieval Augmented Generation search_nodes tool GraphQL search_nodes tool Klaviyo search_nodes tool GitHub Actions search_nodes company SpaceX search_nodes resource awesome-ddd search_nodes concept GitHub Self-Hosted Runner search_nodes tool GitHub Releases search_nodes tool reviewdog search_nodes tool Codecov search_nodes tool CircleCI search_nodes takeaway Port Python Libraries With ChatGPT search_nodes tool actions/upload-artifact search_nodes resource Short Ruby Newsletter search_nodes project Ruby Romania search_nodes talk Code Golfing in Ruby Lightning Talk search_nodes tool ruby-openai search_nodes tool ruby/setup-ruby search_nodes project Ruby News search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2026 search_nodes talk Building LLM powered applications in Ruby search_nodes talk How wroclove.rb impacts developers and companies search_nodes talk Towards the post framework future search_nodes tool ChatGPT search_nodes takeaway Name Things To Find Their Properties search_nodes concept xkcd Dependency / Nebraska Problem search_nodes tool macOS say command search_nodes tool left-pad search_nodes talk Events events events search_nodes concept Optional Gradual Typing search_nodes question Would you recommend TypeScript or Flow? search_nodes tool Flow search_nodes tool TypeScript search_nodes takeaway Adopt TypeScript or Flow for maintainability search_nodes tool PureScript search_nodes tool Babel search_nodes tool Elm search_nodes company Salesforce search_nodes tool Release Drafter search_nodes company Red Hat search_nodes takeaway Ruby as a Data Management Language search_nodes concept Reactive Programming search_nodes tool Ruby search_nodes concept Punch Card Programming search_nodes concept Exploratory Programming search_nodes tool IronRuby search_nodes concept Railway Oriented Programming search_nodes tool Wolfram Language search_nodes person Erwin Kroon get_node_edges tool Stripe search_nodes project Trezy search_nodes tool interactor search_nodes question Generate code once vs instruct LLM per request search_nodes concept ObjectSpace heap dumps search_nodes tool heapy search_nodes tool TruffleRuby search_nodes takeaway Trailblazer tracing saves thousands of debugging hours search_nodes concept Monkey Patching search_nodes talk Rubyana Gems and the Ractorous Rubetta Stones! search_nodes concept Refinements search_nodes concept Global Interpreter Lock search_nodes person Akira Matsuda search_nodes tool Distributed Ruby search_nodes concept Ruby undef_method performance search_nodes takeaway Upgrade Ruby version for free speed search_nodes tool find-slow script search_nodes talk Scientific Ruby Lightning Talk search_nodes talk To Refine or Not to Refine search_nodes talk Better WebPerformance with Rails search_nodes talk Toolbelt of a Seasoned Bug Hunter search_nodes tool PR Labeler search_nodes tool actions/checkout search_nodes concept Interface Wrapper for Ruby search_nodes concept Minimal Interface search_nodes tool DBM / SDBM / GDBM search_nodes takeaway Use Ruby Packer for Single-Binary CLIs search_nodes tool Prime (Ruby stdlib) search_nodes tool Rack search_nodes tool Matrix (Ruby stdlib) search_nodes talk Ruby on a $4 Computer search_nodes tool Ruby Packer search_nodes talk JRuby: Professional-Grade Ruby search_nodes tool JRuby search_nodes concept gemspec search_nodes concept Build Gems in Docker Isolation search_nodes tool TTY toolkit search_nodes talk Methods Gem for Ruby Method References search_nodes tool dry-validation search_nodes takeaway Put data-input validations on the command form, not the command search_nodes talk Configuration Again Lightning Talk search_nodes tool Reform search_nodes person Adam Okoń search_nodes person Julik Tarkhanov search_nodes person DHH search_nodes person Nick Schwaderer search_nodes resource My Ruby Story search_nodes tool Python search_nodes tool Perl search_nodes tool SXG Validator search_nodes concept Magic bytes MIME detection search_nodes tool Automatic Signed Exchanges search_nodes takeaway Signed On-the-fly URLs search_nodes tool ESLint search_nodes concept Live Reload search_nodes tool esbuild search_nodes tool fish shell search_nodes tool server-engine search_nodes

2 edges