← Extractions

Component Driven UI with ViewComponent — Radoslav Stankov at wroclove.rb 2024

Radoslav Stankov walks through how he uses the ViewComponent gem to structure a Rails-only front end for his Angry Building ERP side project. He shares a practical checklist for when to reach for ViewComponents vs partials/helpers, and dissects real code for stats, filter form, page header, and table components — including slots, builder patterns, i18n helpers, and smoke-testing components via Lookbook previews.

Model
claude-opus-4-7
Ingestion
f0af4dd8
Input tokens
299,821
fresh
206,224
cached
80,226
cache write
13,371
Output tokens
11,080
Duration
169.0s
Roundtrips
7
Tool calls
23
Cost
$0.00
Nodes/edges extracted
20 / 49
Read set (nodes/edges)
147 / 2

Nodes (20)

update Radoslav Stankov person
attrs (empty) {"country" => "Bulgaria", "newsletter" => "tips.rstankov.com"}
description Conference speaker. Bulgarian software engineer. Former CTO of Product Hunt, where he worked with a Rails backend + GraphQL + Apollo + Ne...
short_description Conference speaker. Bulgarian Rails developer, former CTO of Product Hunt, author of the tips.rstankov.com newsletter.
update Component Driven UI with ViewComponent talk
attrs {"type" => "talk"} {"date" => "2024-03-22", "type" => "talk"}
description Talk at wroclove.rb 2024. Talk at wroclove.rb 2024 by Radoslav Stankov. Walks through how he structures the front end of his Angry Building ERP...
short_description Talk at wroclove.rb 2024. Radoslav Stankov's wroclove.rb 2024 talk on structuring Rails front-ends with ViewComponent.
create Angry Building project
kind (empty) project
name (empty) Angry Building
slug (empty) angry-building
attrs (empty) {"domain" => "facility management / ERP", "status" => "active"}
description (empty) ERP-style facility-management system Radoslav Stankov started as a weekend side project while CTO at Product Hunt. St...
short_description (empty) Rails ERP system for facility management, built as Radoslav Stankov's side project.
create Product Hunt company
kind (empty) company
name (empty) Product Hunt
slug (empty) product-hunt
attrs (empty) {"industry" => "product discovery / media"}
description (empty) Product-discovery platform. Radoslav Stankov was its CTO; during that time the stack was a Rails backend with a Graph...
short_description (empty) Product-discovery platform where Radoslav Stankov was CTO.
create tips.rstankov.com resource
kind (empty) resource
name (empty) tips.rstankov.com
slug (empty) tips-rstankov-com
attrs (empty) {"url" => "tips.rstankov.com", "type" => "blog-post"}
description (empty) Newsletter by Radoslav Stankov at tips.rstankov.com where he shares developer tips.
short_description (empty) Radoslav Stankov's developer tips newsletter.
create Speaker Deck tool
kind (empty) tool
name (empty) Speaker Deck
slug (empty) speaker-deck
attrs (empty) {"category" => "service"}
description (empty) Online slide-hosting service. Radoslav Stankov uploads his wroclove.rb 2024 slides there in advance because he tends ...
short_description (empty) Online service for hosting and sharing presentation slides.
create Lookbook tool
kind (empty) tool
name (empty) Lookbook
slug (empty) lookbook
attrs (empty) {"category" => "library", "ecosystem" => "Rails"}
description (empty) Ruby on Rails gem that layers on top of ViewComponent's preview feature to give a browsable UI for all components and...
short_description (empty) Rails gem providing a browsable UI for ViewComponent previews.
create Capybara tool
kind (empty) tool
name (empty) Capybara
slug (empty) capybara
attrs (empty) {"category" => "library", "language" => "Ruby"}
description (empty) Ruby acceptance-test library. Used by Radoslav Stankov for end-to-end tests of his Angry Building ERP, and for smoke-...
short_description (empty) Ruby acceptance-test framework simulating user interactions in a browser.
update ViewComponent tool
description Ruby on Rails gem for building reusable, testable view components as objects with a .rb file (parameters, variants, v... Ruby on Rails gem released by GitHub for building reusable, testable view components. Each component is a Ruby class ...
create UI Component vs Domain Component Split concept
kind (empty) concept
name (empty) UI Component vs Domain Component Split
slug (empty) ui-component-vs-domain-component-split
attrs (empty) {"category" => "pattern"}
description (empty) Mental model Radoslav Stankov borrows from his React experience and applies to ViewComponent. Layer your components i...
short_description (empty) Layer components into generic UI ones and object-aware domain ones that compose them.
create ViewComponent Slots concept
kind (empty) concept
name (empty) ViewComponent Slots
slug (empty) viewcomponent-slots
attrs (empty) {"category" => "pattern"}
description (empty) ViewComponent feature analogous to Web-component slots or React children: a component declares named 'holes' (renders...
short_description (empty) ViewComponent feature exposing named content holes filled by callers (render_one / render_many).
create Builder Pattern for ViewComponents concept
kind (empty) concept
name (empty) Builder Pattern for ViewComponents
slug (empty) builder-pattern-for-viewcomponents
attrs (empty) {"category" => "pattern"}
description (empty) Pattern Radoslav Stankov uses for his filter_form component, implemented before he discovered ViewComponent slots. Th...
short_description (empty) Expose a component's configuration as DSL methods on a yielded builder object.
create Fetch With Fallback concept
kind (empty) concept
name (empty) Fetch With Fallback
slug (empty) fetch-with-fallback
attrs (empty) {"category" => "practice"}
description (empty) Defensive helper Radoslav Stankov uses in Angry Building's application component layer. Given a value and a lookup ta...
short_description (empty) Raise in dev/test but silently fall back with reported error in production for unknown values.
create Isolate Messy HTML Rather Than Fix Prematurely takeaway
kind (empty) takeaway
name (empty) Isolate Messy HTML Rather Than Fix Prematurely
slug (empty) isolate-messy-html-rather-than-fix-prematurely
attrs (empty) {"type" => "lesson-learned"}
description (empty) Radoslav Stankov's philosophy: don't extract ViewComponents from messy HTML just to make it clean. Keep the mess isol...
short_description (empty) Keep messy code contained on one page until you have a better idea; don't over-extract.
create Don't Start a Design System from Button Components takeaway
kind (empty) takeaway
name (empty) Don't Start a Design System from Button Components
slug (empty) don-t-start-a-design-system-from-button-components
attrs (empty) {"type" => "recommendation"}
description (empty) Friendly advice from Radoslav Stankov: when building a new UI/design system, leave the button component for last. But...
short_description (empty) Buttons are the most varied, most opinionated component — extract them last.
create ViewComponent Checklist takeaway
kind (empty) takeaway
name (empty) ViewComponent Checklist
slug (empty) viewcomponent-checklist
attrs (empty) {"type" => "recommendation"}
description (empty) Use a ViewComponent when: code is shared between two controllers; a view helper is generating more than ~2–3 lines of...
short_description (empty) Radoslav Stankov's criteria for when to use a ViewComponent vs a partial or helper.
create Smoke Test ViewComponents via Lookbook Previews takeaway
kind (empty) takeaway
name (empty) Smoke Test ViewComponents via Lookbook Previews
slug (empty) smoke-test-viewcomponents-via-lookbook-previews
attrs (empty) {"type" => "recommendation"}
description (empty) Radoslav Stankov's testing strategy for ViewComponents: don't unit-test them individually. Instead, write one Capybar...
short_description (empty) Use Capybara to visit every Lookbook preview; rely on end-to-end tests for business logic.
create Choose Frontend Stack Based on Product Constraints takeaway
kind (empty) takeaway
name (empty) Choose Frontend Stack Based on Product Constraints
slug (empty) choose-frontend-stack-based-on-product-constraints
attrs (empty) {"type" => "insight"}
description (empty) Radoslav Stankov's answer to the React comparison question: ViewComponent and React are different value propositions....
short_description (empty) View components for Rails monoliths, React/React Native when the product needs it — each is a trade-off.
create Experience with React comparison question question
kind (empty) question
name (empty) Experience with React comparison question
slug (empty) experience-with-react-comparison-question
attrs (empty) {"answer_summary" => "Different value propositions — ViewComponent fits Rails-centric B2B ERPs; React/Next.js fit B2C...
description (empty) Audience asks Radoslav Stankov about his React experience and how ViewComponent compares. Answer: he has plenty of Re...
short_description (empty) Audience question comparing ViewComponent with React and asking for Stankov's feelings.
create Do you unit test ViewComponents? question
kind (empty) question
name (empty) Do you unit test ViewComponents?
slug (empty) do-you-unit-test-viewcomponents
attrs (empty) {"answer_summary" => "No unit tests; Capybara smoke tests over Lookbook previews plus end-to-end business tests."}
description (empty) Audience asks whether Radoslav Stankov writes unit tests for ViewComponents, given that testability is often cited as...
short_description (empty) Audience question on whether Stankov heavily unit-tests ViewComponents.

Edges (49)

update Radoslav StankovauthoredComponent Driven UI with ViewComponent
context (empty) Speaker and author of this wroclove.rb 2024 talk.
update Component Driven UI with ViewComponentpresented_atwroclove.rb 2024
context (empty) Talk delivered at wroclove.rb 2024 on 2024-03-22.
create Radoslav Stankovattendedwroclove.rb 2024
context (empty) Attended as a speaker.
relation (empty) attended
source_node_id (empty) 69cb744b-77f2-438a-9a32-5a6acaa40385
target_node_id (empty) 748e0524-a102-41d4-97dc-575881583d91
create Radoslav Stankovworks_atProduct Hunt
attrs (empty) {"role" => "former CTO"}
context (empty) Former CTO of Product Hunt.
relation (empty) works_at
source_node_id (empty) 69cb744b-77f2-438a-9a32-5a6acaa40385
target_node_id (empty) ce572b82-bb6e-4e89-9e21-c574d6c933f1
create Product HuntusesNext.js
context (empty) Next.js was the front end at Product Hunt.
relation (empty) uses
source_node_id (empty) ce572b82-bb6e-4e89-9e21-c574d6c933f1
target_node_id (empty) 3c364ae0-0e7e-4fbc-b2b6-3f4bd983fc17
create Product HuntusesReact
context (empty) Next.js-based React front end.
relation (empty) uses
source_node_id (empty) ce572b82-bb6e-4e89-9e21-c574d6c933f1
target_node_id (empty) 5026a4fc-0c6e-49d7-bb7d-29be23b72b24
create Radoslav StankovusesSpeaker Deck
context (empty) Uploads slides to Speaker Deck in advance of talks.
relation (empty) uses
source_node_id (empty) 69cb744b-77f2-438a-9a32-5a6acaa40385
target_node_id (empty) 75a6d0ab-be63-41d1-ac5a-144fe9002a08
create Radoslav Stankovhas_skillViewComponent
attrs (empty) {"level" => "expert"}
context (empty) Deep, opinionated practical experience with ViewComponent in production.
relation (empty) has_skill
source_node_id (empty) 69cb744b-77f2-438a-9a32-5a6acaa40385
target_node_id (empty) aaa7fac1-54d6-4dde-8805-bbc7219cd58a
create Radoslav Stankovworks_onAngry Building
attrs (empty) {"role" => "creator"}
context (empty) Created Angry Building as a weekend side project while at Product Hunt.
relation (empty) works_on
source_node_id (empty) 69cb744b-77f2-438a-9a32-5a6acaa40385
target_node_id (empty) bf511ffe-9f4e-47ce-af33-37f8431f7163
create Radoslav Stankovauthoredtips.rstankov.com
context (empty) Runs this newsletter.
relation (empty) authored
source_node_id (empty) 69cb744b-77f2-438a-9a32-5a6acaa40385
target_node_id (empty) adae32c7-eb75-430f-ab73-1b298d051bca
create Component Driven UI with ViewComponentaboutViewComponent
context (empty) Central topic of the talk.
relation (empty) about
source_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
target_node_id (empty) aaa7fac1-54d6-4dde-8805-bbc7219cd58a
create Component Driven UI with ViewComponentaboutAngry Building
context (empty) All real code examples come from the Angry Building ERP.
relation (empty) about
source_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
target_node_id (empty) bf511ffe-9f4e-47ce-af33-37f8431f7163
create Component Driven UI with ViewComponentaboutLookbook
context (empty) Talk shows how Lookbook surfaces ViewComponent previews and enables smoke testing.
relation (empty) about
source_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
target_node_id (empty) 5d84789d-16ad-423f-8735-567ed5459fde
create Component Driven UI with ViewComponentaboutUI Component vs Domain Component Split
context (empty) Stankov explains layering components into UI and domain tiers.
relation (empty) about
source_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
target_node_id (empty) 5047b8d4-0001-4f82-9d4d-d130672a46b7
create Component Driven UI with ViewComponentaboutViewComponent Slots
context (empty) Slots are demoed in stats, page_header, and discussed as an alternative to the builder pattern.
relation (empty) about
source_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
target_node_id (empty) 8bc10077-07ca-4096-b040-6d648cb8d66a
create Component Driven UI with ViewComponentaboutBuilder Pattern for ViewComponents
context (empty) Filter form component is built as a yielded builder with DSL methods.
relation (empty) about
source_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
target_node_id (empty) 52eb12c5-0def-46c9-a273-e76592b642d3
create Component Driven UI with ViewComponentaboutFetch With Fallback
context (empty) Application component uses this pattern for safe enum/color lookups.
relation (empty) about
source_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
target_node_id (empty) d50eab76-d826-4581-ad29-30d218e5bbf1
create Angry BuildingusesRuby on Rails
context (empty) Angry Building is a Rails application.
relation (empty) uses
source_node_id (empty) bf511ffe-9f4e-47ce-af33-37f8431f7163
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Angry BuildingusesViewComponent
context (empty) Front-end is structured entirely around ViewComponent.
relation (empty) uses
source_node_id (empty) bf511ffe-9f4e-47ce-af33-37f8431f7163
target_node_id (empty) aaa7fac1-54d6-4dde-8805-bbc7219cd58a
create Angry BuildingusesTailwind CSS
context (empty) Styled with Tailwind instead of hand-rolled CSS.
relation (empty) uses
source_node_id (empty) bf511ffe-9f4e-47ce-af33-37f8431f7163
target_node_id (empty) ec73c2f6-5a41-41a5-8bc3-17addcf6fa0f
create Angry BuildingusesLookbook
context (empty) Hosts ViewComponent previews for visual exploration and smoke testing.
relation (empty) uses
source_node_id (empty) bf511ffe-9f4e-47ce-af33-37f8431f7163
target_node_id (empty) 5d84789d-16ad-423f-8735-567ed5459fde
create Angry BuildingusesCapybara
context (empty) End-to-end and smoke tests (over Lookbook previews) are written with Capybara.
relation (empty) uses
source_node_id (empty) bf511ffe-9f4e-47ce-af33-37f8431f7163
target_node_id (empty) 3322cb95-ef6a-43c0-8814-16c1c1ab7379
create Angry BuildingusesStimulus
context (empty) Mentioned as the JS framework components can connect to when JavaScript is needed.
relation (empty) uses
source_node_id (empty) bf511ffe-9f4e-47ce-af33-37f8431f7163
target_node_id (empty) 87cb1332-bd03-4cc9-a0b1-c8c83aae8051
create Angry BuildingusesReact Native
context (empty) Companion mobile app for Angry Building is built in React Native.
relation (empty) uses
source_node_id (empty) bf511ffe-9f4e-47ce-af33-37f8431f7163
target_node_id (empty) 3244aefe-82e6-4dd5-a1f6-ac7e98897b86
create Product HuntusesRuby on Rails
context (empty) Rails backend per Stankov's description of the stack.
relation (empty) uses
source_node_id (empty) ce572b82-bb6e-4e89-9e21-c574d6c933f1
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Product HuntusesGraphQL
context (empty) GraphQL layer connected the Rails backend to the front end.
relation (empty) uses
source_node_id (empty) ce572b82-bb6e-4e89-9e21-c574d6c933f1
target_node_id (empty) c6a1041c-3116-4194-b7f0-eba7cd4a7e64
create Product HuntusesApollo GraphQL
context (empty) Apollo sat between GraphQL and the Next.js front end.
relation (empty) uses
source_node_id (empty) ce572b82-bb6e-4e89-9e21-c574d6c933f1
target_node_id (empty) cebd5aab-3634-4afe-b0a8-ba8fb96ddffc
create Radoslav Stankovhas_skillRuby on Rails
attrs (empty) {"level" => "expert"}
context (empty) Self-describes as 'really good with' Rails.
relation (empty) has_skill
source_node_id (empty) 69cb744b-77f2-438a-9a32-5a6acaa40385
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Radoslav Stankovhas_skillReact
attrs (empty) {"level" => "expert"}
context (empty) 'Plenty of experience with React' including at Product Hunt.
relation (empty) has_skill
source_node_id (empty) 69cb744b-77f2-438a-9a32-5a6acaa40385
target_node_id (empty) 5026a4fc-0c6e-49d7-bb7d-29be23b72b24
create Lookbookrelated_toViewComponent
context (empty) Lookbook builds on ViewComponent's preview feature.
relation (empty) related_to
source_node_id (empty) 5d84789d-16ad-423f-8735-567ed5459fde
target_node_id (empty) aaa7fac1-54d6-4dde-8805-bbc7219cd58a
create ViewComponent Slotsrelated_toViewComponent
context (empty) Slots are a feature of ViewComponent.
relation (empty) related_to
source_node_id (empty) 8bc10077-07ca-4096-b040-6d648cb8d66a
target_node_id (empty) aaa7fac1-54d6-4dde-8805-bbc7219cd58a
create Builder Pattern for ViewComponentsrelated_toViewComponent
context (empty) Pattern applied inside ViewComponent classes, predating slots adoption.
relation (empty) related_to
source_node_id (empty) 52eb12c5-0def-46c9-a273-e76592b642d3
target_node_id (empty) aaa7fac1-54d6-4dde-8805-bbc7219cd58a
create UI Component vs Domain Component Splitrelated_toReact
context (empty) Concept Stankov borrows from his React practice and applies to ViewComponents.
relation (empty) related_to
source_node_id (empty) 5047b8d4-0001-4f82-9d4d-d130672a46b7
target_node_id (empty) 5026a4fc-0c6e-49d7-bb7d-29be23b72b24
create ViewComponent Checklistfrom_talkComponent Driven UI with ViewComponent
context (empty) Checklist explicitly presented during the talk.
relation (empty) from_talk
source_node_id (empty) 5dd689c4-ae31-46a3-bbcf-7d6057d7942c
target_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
create ViewComponent ChecklistaboutViewComponent
context (empty) Criteria for deciding when a piece of UI becomes a ViewComponent.
relation (empty) about
source_node_id (empty) 5dd689c4-ae31-46a3-bbcf-7d6057d7942c
target_node_id (empty) aaa7fac1-54d6-4dde-8805-bbc7219cd58a
create Isolate Messy HTML Rather Than Fix Prematurelyfrom_talkComponent Driven UI with ViewComponent
context (empty) Stated in the talk as Stankov's personal philosophy.
relation (empty) from_talk
source_node_id (empty) 77ecb987-79bc-4e98-945a-828cf09ef850
target_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
create Don't Start a Design System from Button Componentsfrom_talkComponent Driven UI with ViewComponent
context (empty) Friendly advice during the table/button discussion.
relation (empty) from_talk
source_node_id (empty) c84b76ca-61d7-4f58-a5a9-884e6343fce7
target_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
create Smoke Test ViewComponents via Lookbook Previewsfrom_talkComponent Driven UI with ViewComponent
context (empty) Testing approach explained in Q&A.
relation (empty) from_talk
source_node_id (empty) 0b480b41-08b9-4efd-96af-15464cacf50a
target_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
create Smoke Test ViewComponents via Lookbook PreviewsaboutLookbook
context (empty) Strategy leverages Lookbook preview pages.
relation (empty) about
source_node_id (empty) 0b480b41-08b9-4efd-96af-15464cacf50a
target_node_id (empty) 5d84789d-16ad-423f-8735-567ed5459fde
create Smoke Test ViewComponents via Lookbook PreviewsaboutCapybara
context (empty) Uses Capybara to drive preview-page visits.
relation (empty) about
source_node_id (empty) 0b480b41-08b9-4efd-96af-15464cacf50a
target_node_id (empty) 3322cb95-ef6a-43c0-8814-16c1c1ab7379
create Choose Frontend Stack Based on Product Constraintsfrom_talkComponent Driven UI with ViewComponent
context (empty) Key point from the React-comparison Q&A.
relation (empty) from_talk
source_node_id (empty) 6751e16e-ab5b-4de7-b3f3-2742d7d7fffb
target_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
create Experience with React comparison questionasked_atComponent Driven UI with ViewComponent
context (empty) First audience question during Q&A.
relation (empty) asked_at
source_node_id (empty) 7b8fb7de-7d4b-4fd5-96eb-6e5c5345dd78
target_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
create Experience with React comparison questionaboutReact
context (empty) Asks about React vs ViewComponent.
relation (empty) about
source_node_id (empty) 7b8fb7de-7d4b-4fd5-96eb-6e5c5345dd78
target_node_id (empty) 5026a4fc-0c6e-49d7-bb7d-29be23b72b24
create Experience with React comparison questionaboutViewComponent
context (empty) Compares the two approaches.
relation (empty) about
source_node_id (empty) 7b8fb7de-7d4b-4fd5-96eb-6e5c5345dd78
target_node_id (empty) aaa7fac1-54d6-4dde-8805-bbc7219cd58a
create Do you unit test ViewComponents?asked_atComponent Driven UI with ViewComponent
context (empty) Second audience question during Q&A.
relation (empty) asked_at
source_node_id (empty) 828a2860-61f7-4c79-9ccb-79c6653a8e2f
target_node_id (empty) c288601f-6e75-45fe-a084-515c30daa779
create Do you unit test ViewComponents?aboutViewComponent
context (empty) Asks about testability of ViewComponents.
relation (empty) about
source_node_id (empty) 828a2860-61f7-4c79-9ccb-79c6653a8e2f
target_node_id (empty) aaa7fac1-54d6-4dde-8805-bbc7219cd58a
create Do you unit test ViewComponents?aboutLookbook
context (empty) Answer centers on smoke testing Lookbook previews.
relation (empty) about
source_node_id (empty) 828a2860-61f7-4c79-9ccb-79c6653a8e2f
target_node_id (empty) 5d84789d-16ad-423f-8735-567ed5459fde
create Radoslav StankovrecommendsViewComponent
context (empty) Entire talk advocates structuring Rails front-ends around ViewComponent.
relation (empty) recommends
source_node_id (empty) 69cb744b-77f2-438a-9a32-5a6acaa40385
target_node_id (empty) aaa7fac1-54d6-4dde-8805-bbc7219cd58a
create Radoslav StankovrecommendsLookbook
context (empty) Recommends Lookbook for browsing previews and smoke testing.
relation (empty) recommends
source_node_id (empty) 69cb744b-77f2-438a-9a32-5a6acaa40385
target_node_id (empty) 5d84789d-16ad-423f-8735-567ed5459fde

Read set

147 nodes

person Radoslav Stankov search_nodes+get_node_edges project Check search_nodes project Ruby Romania search_nodes tool Preact search_nodes question What licenses do Turbo Native libraries use? search_nodes concept Tree Shaking search_nodes tool Stimulus search_nodes concept Cynefin Framework search_nodes question Have you heard of Stimulus? search_nodes project monolith framework search_nodes tool StimulusReflex search_nodes concept Reform 3 Parsing Pipeline search_nodes tool PagerDuty search_nodes project Trezy search_nodes company Apply4 search_nodes takeaway Prompts as Business Logic search_nodes tool Apartment search_nodes concept Noisy Neighbor Problem search_nodes tool Sync Space VR search_nodes concept Retrieval Augmented Generation search_nodes tool ChatGPT search_nodes takeaway Name Things To Find Their Properties search_nodes tool langchainrb search_nodes concept AI Agent search_nodes tool RealtimeBoard search_nodes concept Vector Database search_nodes tool ViewComponent search_nodes talk Component Driven UI with ViewComponent search_nodes+get_node_edges company GitHub search_nodes tool GitHub Releases search_nodes question How do you test ViewComponents and Hotwire flows? search_nodes tool Cells search_nodes tool Deface search_nodes takeaway Use generic and object-specific ViewComponents together search_nodes tool GitHub Actions search_nodes tool Jekyll search_nodes tool Ruby on Rails search_nodes tool Ruby search_nodes event Rails World search_nodes resource Woman on Rails search_nodes tool Rails 5.2 search_nodes takeaway Ruby as a Data Management Language search_nodes tool ruby-openai search_nodes tool Active Admin search_nodes project logux-rails search_nodes resource Painless Rails search_nodes tool cssbundling-rails search_nodes talk No-build Utopia: Modern User Experiences with Rails & Web Standards search_nodes resource The Rails and Hotwire Codex search_nodes tool Webpacker search_nodes project Rails World Website search_nodes talk Better WebPerformance with Rails search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes talk Performance Panel wroclove.rb 2024 search_nodes talk Webmock unmocked search_nodes talk Mutation testing workshop wroclove.rb 2019 search_nodes project Nerds and Threads search_nodes resource awesome-ddd search_nodes project Ruby News search_nodes talk Events events events search_nodes takeaway Buy Faster Hardware search_nodes project BBC Sport App search_nodes tool Tailwind CSS search_nodes concept CSS-in-JS search_nodes takeaway Adopt CSS-in-JS for modern component-based frontends search_nodes tool Next.js search_nodes tool Turbo Laravel search_nodes tool Ember.js search_nodes tool Hotwire search_nodes tool htmx search_nodes takeaway Turbo Frames, Turbo Streams and Stimulus can be used independently search_nodes tool Turbo Streams search_nodes tool React search_nodes tool React Native search_nodes tool Redux search_nodes tool MobX search_nodes tool Elm search_nodes concept Mutation Testing search_nodes takeaway Rails Tests Are Mostly Integration Tests search_nodes concept Time.current Testing Trap search_nodes concept Rails Testing Pyramid (Ivan's version) search_nodes tool parallel_tests search_nodes tool FactoryBot search_nodes concept Fixtures over Factories search_nodes question Do fixtures beat factories? search_nodes tool TestBench search_nodes tool Apollo GraphQL search_nodes tool Apollo GraphQL Platform search_nodes tool GraphQL search_nodes tool graphql-ruby search_nodes concept GraphQL query batching search_nodes tool graphql-batch search_nodes concept Nested GraphQL query bottleneck search_nodes concept GraphQL look_ahead search_nodes concept GraphQL query timeout search_nodes tool graphql-preload search_nodes tool Turbo Native search_nodes talk Native apps are dead, long live native apps search_nodes question How does hybrid compare to React Native after a decade? search_nodes question Is there a generator or scaffold for Turbo Native apps? search_nodes takeaway Use hybrid when your app's core is a server-rendered web app search_nodes concept Web-to-Native Bridge search_nodes concept Partial Rendering Overhead search_nodes talk Extracting logic from templates with Hanami Views search_nodes tool Glimmer search_nodes tool Phlex search_nodes question Is rendering from cached pages with server-side includes possible in Rails? search_nodes tool jsbundling-rails search_nodes tool merb search_nodes concept Optimistic UI search_nodes concept Stalling For Time search_nodes concept Sometimes Nothing Is Enough search_nodes concept Embrace The Evented Model search_nodes concept Command Form search_nodes question Does per-field validation blow up UI complexity? search_nodes concept Task-Driven UI search_nodes concept Saga Pattern search_nodes concept Immutable Form Runtime API search_nodes concept Form Object search_nodes tool Reform search_nodes takeaway Form objects must not save search_nodes question What does the application do? search_nodes tool Bootsnap search_nodes talk Better ActiveRecord IRB Output Gem Lightning Talk search_nodes tool Active Storage search_nodes tool acts_as_api search_nodes takeaway Use Logux for optimistic UI with Rails search_nodes tool Ruby Browser Detection Gem search_nodes takeaway Share Browser-Support Config Across Front-End And Back-End search_nodes tool test-prof search_nodes tool knapsack_pro search_nodes concept Ruby Module Customization Mechanics search_nodes tool interactor search_nodes takeaway Don't Use Interactors search_nodes takeaway Look outside Ruby for better patterns search_nodes concept Service Object search_nodes tool Representable search_nodes concept Refinements search_nodes concept Monkey Patching search_nodes tool Mimic search_nodes talk Offline Sandwich Focus Workflow search_nodes

2 edges