← Extractions

10 Things You Never Wanted To Know About Reform 3 — Nick Sutterer at wroclove.rb 2022

Nick Sutterer revisits the Reform gem's design mistakes and walks through the Reform 3 redesign: same declarative DSL, but a runtime API based on immutable objects and class methods (present/validate/persist) instead of one mutable form instance. The rewrite is built on Trailblazer activities, benefits from its tracing and step DSL, makes strong_parameters obsolete, and supports dry-validation and ROM. Ends with Q&A on parsing-vs-validation cycles, monads, and what he'd do differently.

Model
claude-opus-4-7
Ingestion
42ee18ac
Input tokens
180,223
fresh
96,013
cached
71,457
cache write
12,753
Output tokens
11,277
Duration
169.0s
Roundtrips
5
Tool calls
17
Cost
$0.00
Nodes/edges extracted
21 / 38
Read set (nodes/edges)
110 / 2

Nodes (21)

update 10 Things You Never Wanted To Know About Reform 3 talk
description Talk at wroclove.rb 2022. Nick Sutterer's wroclove.rb 2022 talk retrospectively examining the Reform gem's design problems and presenting Refor...
short_description Talk at wroclove.rb 2022. Nick Sutterer's talk on redesigning the Reform gem as Reform 3 on top of Trailblazer.
create Reform 3 makes strong_parameters obsolete takeaway
kind (empty) takeaway
name (empty) Reform 3 makes strong_parameters obsolete
slug (empty) reform-3-makes-strong_parameters-obsolete
attrs (empty) {"type" => "insight"}
description (empty) Because a Reform form only reads the properties it declares, any extra keys in the incoming hash are ignored. This is...
short_description (empty) A Reform form already ignores undeclared params, removing the need for controller whitelisting.
update Reform tool
attrs {"category" => "library"} {"license" => "open-source", "category" => "library"}
description Ruby gem by Nick Sutterer introducing a dedicated form object mapping to a web UI form: declares properties, collecti... Ruby gem by Nick Sutterer providing a declarative API for form objects with properties, collections, nested forms and...
update Nick Sutterer person
description German Ruby framework author and conference speaker. Started programming around age 8 on a Mac, learning C++ from 'Tr... German Ruby framework author and conference speaker. Started programming around age 8 on a Mac, learning C++ from 'Tr...
create accepts_nested_attributes_for concept
kind (empty) concept
name (empty) accepts_nested_attributes_for
slug (empty) accepts_nested_attributes_for
attrs (empty) {"category" => "pattern"}
description (empty) Rails Active Record feature that lets a parent model declare accepts_nested_attributes_for :child, so a nested params...
short_description (empty) Rails Active Record feature auto-creating nested models from a nested params hash.
create Reform Populators concept
kind (empty) concept
name (empty) Reform Populators
slug (empty) reform-populators
attrs (empty) {"category" => "pattern"}
description (empty) Reform 2 feature for parsing nested form submissions. When a nested fragment comes in for a property (e.g. a size has...
short_description (empty) Reform 2 hooks that decide how to turn an incoming nested fragment into a form/model.
create Representable tool
kind (empty) tool
name (empty) Representable
slug (empty) representable
attrs (empty) {"category" => "library"}
description (empty) Complex Ruby gem by Nick Sutterer for declarative (de)serialization of object graphs between formats (JSON/XML/hashes...
short_description (empty) Ruby gem for declarative rendering and parsing of object graphs.
create ROM tool
kind (empty) tool
name (empty) ROM
slug (empty) rom
attrs (empty) {"category" => "library"}
description (empty) Ruby Object Mapper, a data-mapper-style persistence library and alternative to Active Record. Reform 3 can use ROM as...
short_description (empty) Ruby Object Mapper — data-mapper alternative to Active Record.
create Trailblazer tracing saves thousands of debugging hours takeaway
kind (empty) takeaway
name (empty) Trailblazer tracing saves thousands of debugging hours
slug (empty) trailblazer-tracing-saves-thousands-of-debugging-hours
attrs (empty) {"type" => "insight"}
description (empty) Trailblazer 2.1's tracing renders the actual flow taken through a nested activity, highlighting which step failed and...
short_description (empty) Trailblazer's step tracer shows execution path and exceptions across deeply nested flows.
update Trailblazer tool
description Ruby framework authored by Nick Sutterer that provides higher-level architectural building blocks on top of (or along... Ruby framework authored by Nick Sutterer that provides higher-level architectural building blocks on top of (or along...
update dry-validation tool
description Previously used for validations on commands. The team is slowly moving away from it because it is strongly opinionate... Ruby validation library from the dry-rb family, created by Piotr Solnica. Nick Sutterer's preferred validation backen...
create Strong Parameters concept
kind (empty) concept
name (empty) Strong Parameters
slug (empty) strong-parameters
attrs (empty) {"category" => "pattern"}
description (empty) Rails feature that requires controllers to explicitly permit which params from a request hash can be mass-assigned to...
short_description (empty) Rails controller-level whitelisting of permitted request parameters.
create Reform 3 Parsing Pipeline concept
kind (empty) concept
name (empty) Reform 3 Parsing Pipeline
slug (empty) reform-3-parsing-pipeline
attrs (empty) {"category" => "architecture"}
description (empty) Reform 3 models form parsing as a Trailblazer step pipeline: for each property, steps read the incoming value, coerce...
short_description (empty) Reform 3 step-based parsing built on Trailblazer activities that users can extend.
create Immutable Form Runtime API concept
kind (empty) concept
name (empty) Immutable Form Runtime API
slug (empty) immutable-form-runtime-api
attrs (empty) {"category" => "pattern"}
description (empty) Reform 3 runtime API principle: instead of one mutable form instance doing rendering, validation and persistence, eve...
short_description (empty) API design where form operations are class methods returning fresh immutable objects.
update Avo tool
description Application-building framework built on top of Ruby on Rails, authored by Adrian Marin, that helps developers build a... Application-building framework built on top of Ruby on Rails, authored by Adrian Marin, that helps developers build a...
create Reform 2's single mutable form instance was the core design mistake takeaway
kind (empty) takeaway
name (empty) Reform 2's single mutable form instance was the core design mistake
slug (empty) reform-2-s-single-mutable-form-instance-was-the-core-design-mistake
attrs (empty) {"type" => "lesson-learned"}
description (empty) Nick Sutterer's main retrospective insight on Reform 2: having a single public form instance used for rendering, vali...
short_description (empty) Letting one form instance render, validate and persist invited misuse.
create Parsing is already validation takeaway
kind (empty) takeaway
name (empty) Parsing is already validation
slug (empty) parsing-is-already-validation
attrs (empty) {"type" => "insight"}
description (empty) Q&A insight: separating parsing from validation is clean in theory, but coercion steps (e.g. turning a date string in...
short_description (empty) Coercion steps inside parsing are validations, suggesting parse/validate should form a cycle.
create Keep the DSL, rewrite the runtime API takeaway
kind (empty) takeaway
name (empty) Keep the DSL, rewrite the runtime API
slug (empty) keep-the-dsl-rewrite-the-runtime-api
attrs (empty) {"type" => "lesson-learned"}
description (empty) Nick Sutterer's framing of the Reform 3 redesign: the DSL (property/collection, nested forms, inheritable create/upda...
short_description (empty) In Reform 3 the declarative DSL is kept; only the runtime and internals changed.
create What's the biggest design mistake you'd fix in Reform? question
kind (empty) question
name (empty) What's the biggest design mistake you'd fix in Reform?
slug (empty) what-s-the-biggest-design-mistake-you-d-fix-in-reform
attrs (empty) {"answer_summary" => "Nothing fundamental about Reform 3 itself — maybe a non-Ruby language would have been an option...
description (empty) Audience member (Alexei) asks what Nick Sutterer would change if building Reform from scratch. Sutterer jokes that ma...
short_description (empty) Audience asks what Nick would do differently if rebuilding Reform.
create Is parsing and validation really a cycle because of coercion? question
kind (empty) question
name (empty) Is parsing and validation really a cycle because of coercion?
slug (empty) is-parsing-and-validation-really-a-cycle-because-of-coercion
attrs (empty) {"answer_summary" => "Yes. Coercion is validation, so the parsing pipeline should embed small validation rules (e.g. ...
description (empty) Audience member observes coercion was step 3 or 4 in the parsing pipeline and asks whether parsing and validation end...
short_description (empty) Audience asks whether coercion means parse/validate must loop.
create Is that monads in your stack trace? question
kind (empty) question
name (empty) Is that monads in your stack trace?
slug (empty) is-that-monads-in-your-stack-trace
attrs (empty) {"answer_summary" => "No dry-monads; Trailblazer uses its own railway-pattern success/failure dialect with tracing, b...
description (empty) Audience member jokingly points at Reform 3's stack trace and asks if monads (dry-monads) are involved. Sutterer answ...
short_description (empty) Audience jokingly asks whether Reform 3's stack trace shows dry-monads.

Edges (38)

update 10 Things You Never Wanted To Know About Reform 3presented_atwroclove.rb 2022
context (empty) Talk delivered at wroclove.rb 2022 on Friday night.
update Nick Suttererauthored10 Things You Never Wanted To Know About Reform 3
context (empty) Nick Sutterer is the sole speaker.
create Nick Suttererattendedwroclove.rb 2022
context (empty) Speaker at the conference; arrived just before his slot after multiple train cancellations.
relation (empty) attended
source_node_id (empty) ce8dc98c-7309-4a19-af98-99a6ad6cea69
target_node_id (empty) cfc5cfd3-25a6-46c2-8b5d-626986c71c24
update Nick Suttererworks_onReform
context Author of the Reform form-object gem. Author and maintainer of the Reform gem; currently redesigning it as Reform 3.
update Nick Suttererworks_onTrailblazer
context Krzywda jokes about defending Trailblazer in front of Apotonique/Nick. Author of the Trailblazer framework, on which Reform 3 is built.
create 10 Things You Never Wanted To Know About Reform 3aboutReform
context (empty) Main subject of the talk: Reform 2's mistakes and the Reform 3 redesign.
relation (empty) about
source_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
target_node_id (empty) cf107a9f-3e8f-4728-b232-8fc100a667f5
create 10 Things You Never Wanted To Know About Reform 3aboutTrailblazer
context (empty) Reform 3 is rebuilt on Trailblazer activities; tracing and step DSL are discussed in detail.
relation (empty) about
source_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
target_node_id (empty) c25b5eef-3c08-4d09-9fc6-407f04f949a0
create 10 Things You Never Wanted To Know About Reform 3aboutaccepts_nested_attributes_for
context (empty) Origin story: Reform was created to replace accepts_nested_attributes_for for complex cases.
relation (empty) about
source_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
target_node_id (empty) 97a13e27-67da-41bf-a09c-d427505f5130
create 10 Things You Never Wanted To Know About Reform 3aboutReform Populators
context (empty) Populators are presented as the most misunderstood and abused feature of Reform 2.
relation (empty) about
source_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
target_node_id (empty) e991f9de-75bb-4660-9c17-f424c1af8f92
create 10 Things You Never Wanted To Know About Reform 3aboutReform 3 Parsing Pipeline
context (empty) Reform 3 replaces populators with an extensible step-based parsing pipeline.
relation (empty) about
source_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
target_node_id (empty) fec7558d-8303-4afd-89ba-dca5913b95f3
create 10 Things You Never Wanted To Know About Reform 3aboutImmutable Form Runtime API
context (empty) Core redesign: class methods returning fresh immutable objects for present/validate/persist.
relation (empty) about
source_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
target_node_id (empty) cde6bae2-1d08-4657-bcc3-27370d15ff7e
create 10 Things You Never Wanted To Know About Reform 3aboutStrong Parameters
context (empty) Talk highlights that Reform 3 makes strong_parameters obsolete.
relation (empty) about
source_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
target_node_id (empty) 1d1817b0-dba4-4492-9ffe-c4e801057402
create Reformrelated_toaccepts_nested_attributes_for
context (empty) Reform was motivated by the limitations of accepts_nested_attributes_for when more than one form per model is needed.
relation (empty) related_to
source_node_id (empty) cf107a9f-3e8f-4728-b232-8fc100a667f5
target_node_id (empty) 97a13e27-67da-41bf-a09c-d427505f5130
create Reformrelated_toTrailblazer
context (empty) Reform is part of the Trailblazer framework; Reform 3 is internally built on Trailblazer activities.
relation (empty) related_to
source_node_id (empty) cf107a9f-3e8f-4728-b232-8fc100a667f5
target_node_id (empty) c25b5eef-3c08-4d09-9fc6-407f04f949a0
create ReformusesRepresentable
context (empty) Reform 2 used Representable internally as its parsing/serialization layer.
relation (empty) uses
source_node_id (empty) cf107a9f-3e8f-4728-b232-8fc100a667f5
target_node_id (empty) cb0f9124-4d58-4212-94a6-0a6eef2004b6
create Reformusesdry-validation
context (empty) Reform 3 supports dry-validation as a validation backend (preferred by Nick).
relation (empty) uses
source_node_id (empty) cf107a9f-3e8f-4728-b232-8fc100a667f5
target_node_id (empty) d0742e31-8ece-450c-8f38-801e65d09036
create Reformrelated_toRuby on Rails
context (empty) Reform integrates with Rails form helpers (e.g. simple_form) but is not tied to Rails.
relation (empty) related_to
source_node_id (empty) cf107a9f-3e8f-4728-b232-8fc100a667f5
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create ReformusesROM
context (empty) Reform 3 can persist through a ROM adapter to produce change sets instead of using Active Record.
relation (empty) uses
source_node_id (empty) cf107a9f-3e8f-4728-b232-8fc100a667f5
target_node_id (empty) ed5b54a4-5527-4498-aa67-bc4d90d98d87
create Reformrelated_toAvo
context (empty) Nick Sutterer proposes Reform as a possible replacement for Avo's form engine.
relation (empty) related_to
source_node_id (empty) cf107a9f-3e8f-4728-b232-8fc100a667f5
target_node_id (empty) f523171f-5f61-4e47-a115-b99aed7b7b99
update Nick Suttererrelated_toPiotr Solnica
context Names Piotr Solnica as an inspiration who nudged him toward functional programming. Discussed the parse/validate cycle and coercion-as-validation with Solnica years earlier; Solnica's dry-rb libraries ...
create Nick Suttererhas_skillRailway Oriented Programming
attrs (empty) {"level" => "expert"}
context (empty) Trailblazer's step DSL — which Reform 3 now uses — is directly inspired by Railway Oriented Programming.
relation (empty) has_skill
source_node_id (empty) ce8dc98c-7309-4a19-af98-99a6ad6cea69
target_node_id (empty) 693c5091-066f-4602-a1ce-ff9067e469bd
create Nick Suttererrecommendsdry-validation
context (empty) Recommends dry-validation as the validation backend for Reform 3 over Active Record validations.
relation (empty) recommends
source_node_id (empty) ce8dc98c-7309-4a19-af98-99a6ad6cea69
target_node_id (empty) d0742e31-8ece-450c-8f38-801e65d09036
update Nick Suttererworks_onCells
context Author of the Cells gem, his first Ruby gem, around 2008. Author of the Cells gem.
create Reform 2's single mutable form instance was the core design mistakefrom_talk10 Things You Never Wanted To Know About Reform 3
context (empty) Central retrospective lesson of the talk.
relation (empty) from_talk
source_node_id (empty) f6566098-407e-43a1-b8fc-f3fd0db15520
target_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
create Reform 3 makes strong_parameters obsoletefrom_talk10 Things You Never Wanted To Know About Reform 3
context (empty) Stated as one of the 'ten things' wrap-up points.
relation (empty) from_talk
source_node_id (empty) 6cb8c056-8609-44de-9bb8-e9e253709ba0
target_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
create Trailblazer tracing saves thousands of debugging hoursfrom_talk10 Things You Never Wanted To Know About Reform 3
context (empty) Sutterer credits Trailblazer tracing with saving him enormous time while building Reform 3.
relation (empty) from_talk
source_node_id (empty) 5aa05a56-1c30-4f20-a60e-ae357021d7a4
target_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
create Parsing is already validationfrom_talk10 Things You Never Wanted To Know About Reform 3
context (empty) Insight surfaced in Q&A on the parse/validate cycle.
relation (empty) from_talk
source_node_id (empty) bff2b97f-61d6-4ea6-acf2-b015a3d272f2
target_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
create Keep the DSL, rewrite the runtime APIfrom_talk10 Things You Never Wanted To Know About Reform 3
context (empty) Framing of the Reform 3 redesign: DSL preserved, runtime replaced.
relation (empty) from_talk
source_node_id (empty) 00c1b893-747c-4ace-ba7b-9442c763a291
target_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
create Reform 2's single mutable form instance was the core design mistakeaboutReform
context (empty) Concerns Reform 2's runtime API.
relation (empty) about
source_node_id (empty) f6566098-407e-43a1-b8fc-f3fd0db15520
target_node_id (empty) cf107a9f-3e8f-4728-b232-8fc100a667f5
create Trailblazer tracing saves thousands of debugging hoursaboutTrailblazer
context (empty) Praises Trailblazer's built-in tracer.
relation (empty) about
source_node_id (empty) 5aa05a56-1c30-4f20-a60e-ae357021d7a4
target_node_id (empty) c25b5eef-3c08-4d09-9fc6-407f04f949a0
create Reform 3 makes strong_parameters obsoleteaboutStrong Parameters
context (empty) About the obsolescence of Rails strong_parameters.
relation (empty) about
source_node_id (empty) 6cb8c056-8609-44de-9bb8-e9e253709ba0
target_node_id (empty) 1d1817b0-dba4-4492-9ffe-c4e801057402
create What's the biggest design mistake you'd fix in Reform?asked_at10 Things You Never Wanted To Know About Reform 3
context (empty) Audience Q&A question.
relation (empty) asked_at
source_node_id (empty) 3ad21ba8-6756-4dcb-a30b-465fea901069
target_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
create Is parsing and validation really a cycle because of coercion?asked_at10 Things You Never Wanted To Know About Reform 3
context (empty) Audience Q&A question.
relation (empty) asked_at
source_node_id (empty) f0a6ed4b-6c17-4929-a9e8-f8d35a5e68d0
target_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
create Is that monads in your stack trace?asked_at10 Things You Never Wanted To Know About Reform 3
context (empty) Audience Q&A question.
relation (empty) asked_at
source_node_id (empty) d379e2f6-6cfd-4a06-9e62-0575d6019646
target_node_id (empty) b789fbeb-cd17-4b63-8057-8e2a7b7ffeb9
create Is parsing and validation really a cycle because of coercion?aboutReform 3 Parsing Pipeline
context (empty) Question concerns the Reform 3 parsing/validation step design.
relation (empty) about
source_node_id (empty) f0a6ed4b-6c17-4929-a9e8-f8d35a5e68d0
target_node_id (empty) fec7558d-8303-4afd-89ba-dca5913b95f3
create Is that monads in your stack trace?aboutTrailblazer
context (empty) Question targets Trailblazer's success/failure railway internals vs dry-monads.
relation (empty) about
source_node_id (empty) d379e2f6-6cfd-4a06-9e62-0575d6019646
target_node_id (empty) c25b5eef-3c08-4d09-9fc6-407f04f949a0
create What's the biggest design mistake you'd fix in Reform?aboutReform
context (empty) Retrospective question about Reform's design.
relation (empty) about
source_node_id (empty) 3ad21ba8-6756-4dcb-a30b-465fea901069
target_node_id (empty) cf107a9f-3e8f-4728-b232-8fc100a667f5
create Adam Piotrowskiattendedwroclove.rb 2022
context (empty) Mentioned by Nick Sutterer as organizing the Special beer / sailing trip in northeast Poland that several speakers at...
relation (empty) attended
source_node_id (empty) bb91e542-d8fd-49a6-8e44-c0c48c57161c
target_node_id (empty) cfc5cfd3-25a6-46c2-8b5d-626986c71c24

Read set

110 nodes

tool Reform search_nodes talk Methods Gem for Ruby Method References search_nodes tool Active Admin search_nodes tool Devise search_nodes tool JSON API Resources search_nodes concept Command Form search_nodes tool FactoryBot search_nodes talk Handling file uploads for modern developer search_nodes project gemcheck search_nodes tool Refile search_nodes tool Trailblazer search_nodes concept Trailblazer Workflow search_nodes concept Trailblazer Activity search_nodes concept Trailblazer Operation search_nodes project monolith framework search_nodes question Can parts of Eventide, Rails Event Store and Trailblazer be combined in one project? search_nodes tool Tyrant search_nodes question Can Trailblazer be combined with event sourcing and CQRS? search_nodes tool Ruby on Rails search_nodes talk Towards the post framework future search_nodes person Nick Sutterer search_nodes takeaway Name Things To Find Their Properties search_nodes concept GitHub Self-Hosted Runner search_nodes company SpaceX search_nodes tool RealtimeBoard search_nodes takeaway Be kind and build useful things search_nodes tool interactor search_nodes talk Offline Sandwich Focus Workflow search_nodes tool jq search_nodes tool GraphQL search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2025 search_nodes talk Building LLM powered applications in Ruby search_nodes talk Data Management With Ruby search_nodes talk Fix Production Bugs 20x Faster search_nodes tool dry-validation search_nodes tool dry-types search_nodes tool ruby-contracts search_nodes tool Standard RB search_nodes tool dry-struct search_nodes tool power_assert search_nodes talk Configuration Again Lightning Talk search_nodes talk Scientific Ruby Lightning Talk search_nodes question Should touch on belongs_to be avoided in complex apps? search_nodes tool acts_as_api search_nodes tool Paperclip search_nodes tool Active Storage search_nodes tool acts_as_tenant search_nodes tool activerecord-multi-tenant search_nodes concept Mutator Layer search_nodes concept Active Record search_nodes concept Fixtures over Factories search_nodes tool Rails 5.2 search_nodes tool Avo search_nodes tool Apartment search_nodes project rails_event_store/ecommerce search_nodes concept Railway Oriented Programming search_nodes concept Aspect-Oriented Programming search_nodes question Does DDD require object-oriented programming? search_nodes talk Business logic in Ruby search_nodes concept Reactive Programming search_nodes concept DDD Whirlpool search_nodes concept Punch Card Programming search_nodes talk How wroclove.rb impacts developers and companies search_nodes resource Rails Architect Master Class search_nodes resource Object-Oriented Software Construction search_nodes person Adam Piotrowski search_nodes person Adam Okoń search_nodes project Ruby Romania search_nodes resource Short Ruby Newsletter search_nodes talk Rubyana Gems and the Ractorous Rubetta Stones! search_nodes talk Forms Are Dead: Building Agentic Workflows in Ruby search_nodes person Piotr Solnica search_nodes tool Distributed Ruby search_nodes tool dry-container search_nodes talk Introducing Sorbet into your Ruby codebase search_nodes project configuration_again search_nodes concept ObjectSpace heap dumps search_nodes tool Ruby search_nodes tool DBM / SDBM / GDBM search_nodes tool Sequel search_nodes tool PStore search_nodes concept REST Representations search_nodes concept gemspec search_nodes tool methods gem search_nodes tool RubyGems search_nodes concept Build Gems in Docker Isolation search_nodes talk 10 Things You Never Wanted To Know About Reform 3 search_nodes+get_node_edges talk Rewrite with confidence search_nodes talk Why I Like Mentoring Lightning Talk search_nodes tool Cells search_nodes talk Component Driven UI with ViewComponent search_nodes talk 18 months of using hotwire and viewcomponent in production search_nodes talk Building Rails SPAs in Frontend Ruby with Glimmer DSL for Web search_nodes talk Extracting logic from templates with Hanami Views search_nodes concept Pre-Compile Engine Assets at Build Time search_nodes tool jsbundling-rails search_nodes question Is rendering from cached pages with server-side includes possible in Rails? search_nodes person Norbert Wójtowicz search_nodes talk Functional Programming as Naming Lightning Talk search_nodes talk One machine please, make it Turing search_nodes talk Grokking FP For The Practicing Rubyist search_nodes talk Fantastic Databases and Where to Find Them search_nodes tool PureScript search_nodes talk Adventures in durable execution search_nodes

2 edges