← Extractions

Building UIs for Microservices — Ethan Garofolo at wroclove.rb 2019

Ethan Garofolo's wroclove.rb 2019 talk reframes microservices around autonomous services communicating via asynchronous commands and events, and walks through UI patterns (ignore, stall-for-time, task-driven with deferred validation) for working with eventually-consistent systems. He argues teams fail because they try to map MVC-CRUD mental models onto service architectures instead of first deciding what experience to deliver to users.

Model
claude-opus-4-7
Ingestion
72b66aa6
Input tokens
294,999
fresh
183,351
cached
101,781
cache write
9,867
Output tokens
13,201
Duration
213.3s
Roundtrips
8
Tool calls
22
Cost
$0.00
Nodes/edges extracted
28 / 46
Read set (nodes/edges)
106 / 2

Nodes (28)

create Aggregator concept
kind (empty) concept
name (empty) Aggregator
slug (empty) aggregator
attrs (empty) {"category" => "pattern"}
description (empty) Component that subscribes to the linear list of events and shapes them into materialized views / read models suitable...
short_description (empty) Component that shapes event streams into read models / materialized views.
update Building uls for microservices talk
description Talk at wroclove.rb 2019. Ethan Garofolo's wroclove.rb 2019 talk on the UI implications of microservices. Framed as a 'questions talk' rather t...
short_description Talk at wroclove.rb 2019. Ethan Garofolo's wroclove.rb 2019 talk on UI implications of microservices.
update Ethan Garofolo person
attrs (empty) {"location" => "Western United States"}
description Conference speaker. Conference speaker based in the western United States. Started web development with a popular Ruby web framework but ...
short_description Conference speaker. Microservices practitioner and author writing a Pragmatic Bookshelf book on microservices.
create Monolith as Data Model concept
kind (empty) concept
name (empty) Monolith as Data Model
slug (empty) monolith-as-data-model
attrs (empty) {"category" => "architecture"}
description (empty) Garofolo's definition: a monolith is not a deployment strategy or a single repository — it is a data model in which m...
short_description (empty) Defining a monolith as a single data model cramming many unrelated domains together.
create Distributed Monolith concept
kind (empty) concept
name (empty) Distributed Monolith
slug (empty) distributed-monolith
attrs (empty) {"category" => "architecture"}
description (empty) Anti-pattern in which a monolithic data model is extracted into separate services/servers connected by HTTP, leaving ...
short_description (empty) Anti-pattern: splitting a monolithic data model across HTTP without changing access patterns.
create Service Autonomy concept
kind (empty) concept
name (empty) Service Autonomy
slug (empty) service-autonomy
attrs (empty) {"category" => "pattern"}
description (empty) Garofolo's central definition of what makes something a service. Autonomy requirements: (1) no one asks a service for...
short_description (empty) A service has no GET API, no external dependencies, and is oblivious to other system parts.
create Events and Commands concept
kind (empty) concept
name (empty) Events and Commands
slug (empty) events-and-commands
attrs (empty) {"category" => "pattern"}
description (empty) Services communicate via asynchronous messages in two flavors. Events are past-tense JSON messages with a type (e.g. ...
short_description (empty) Async message types: past-tense events (facts) and imperative commands (intent).
create Message Store concept
kind (empty) concept
name (empty) Message Store
slug (empty) message-store
attrs (empty) {"category" => "architecture"}
description (empty) A database specialized for storing and retrieving events and commands that services publish and consume in a pub/sub ...
short_description (empty) Database optimized for storing and retrieving commands and events.
create Scott Bell person
kind (empty) person
name (empty) Scott Bell
slug (empty) scott-bell
description (empty) Co-maintainer of the Eventide project's Postgres-backed message store alongside Nathan Ladd.
short_description (empty) Co-maintainer of the Eventide message store alongside Nathan Ladd.
create Task-Driven UI concept
kind (empty) concept
name (empty) Task-Driven UI
slug (empty) task-driven-ui
attrs (empty) {"category" => "pattern"}
description (empty) UI style in which the software encodes specific tasks the user performs, rather than showing one giant form containin...
short_description (empty) UI approach presenting small process-aware forms instead of a giant edit-everything form.
create Sometimes Nothing Is Enough concept
kind (empty) concept
name (empty) Sometimes Nothing Is Enough
slug (empty) sometimes-nothing-is-enough
attrs (empty) {"category" => "pattern"}
description (empty) UI pattern for eventually-consistent systems: when users don't expect real-time feedback (analytics, view counts, etc...
short_description (empty) UI pattern: don't wait for async processing when real-time feedback isn't required.
create Stalling For Time concept
kind (empty) concept
name (empty) Stalling For Time
slug (empty) stalling-for-time
attrs (empty) {"category" => "pattern"}
description (empty) UI pattern for eventually-consistent systems: give the user a credible static confirmation page while background proc...
short_description (empty) UI pattern: hide async background work behind a plausible static confirmation screen.
create Embrace The Evented Model concept
kind (empty) concept
name (empty) Embrace The Evented Model
slug (empty) embrace-the-evented-model
attrs (empty) {"category" => "pattern"}
description (empty) UI pattern for eventually-consistent systems: instead of synchronously rejecting invalid input, accept the command, r...
short_description (empty) UI pattern: record bad input as an event and show tailored read-model views per audience.
update Ubiquitous Language concept
description A language deliberately designed so the same terms are used in spoken discussion, written documentation, tests, and s... Domain-driven design concept Garofolo invokes to motivate defining common terms (monolith, service, events, commands)...
short_description Designed shared language used by domain experts and code within one bounded context. DDD term for a shared vocabulary between domain experts and developers.
create Event Store (project) project
kind (empty) project
name (empty) Event Store (project)
slug (empty) event-store-project
attrs (empty) {"status" => "active", "license" => "open-source"}
description (empty) Event store project associated with Greg Young, cited by Garofolo as an example of a message store for event-sourced ...
short_description (empty) Greg Young's event store project for event-sourced systems.
create Pragmatic Bookshelf company
kind (empty) company
name (empty) Pragmatic Bookshelf
slug (empty) pragmatic-bookshelf
attrs (empty) {"industry" => "publishing"}
description (empty) Technical publisher for which Ethan Garofolo is writing a book about microservices.
short_description (empty) Technical publisher of programming and software-engineering books.
update Node.js tool
description JavaScript runtime for backend work. Panel's take: Node.js is not the primary backend option at many companies and fa... JavaScript runtime for backend work. Panel's take: Node.js is not the primary backend option at many companies and fa...
create Aaron Patterson person
kind (empty) person
name (empty) Aaron Patterson
slug (empty) aaron-patterson
description (empty) Ruby and Rails core contributor cited by Garofolo for the line 'microservices are great for turning method calls into...
short_description (empty) Prominent Ruby/Rails core contributor known for humor and technical depth.
create Claude Lévi-Strauss person
kind (empty) person
name (empty) Claude Lévi-Strauss
slug (empty) claude-levi-strauss
description (empty) French philosopher/anthropologist quoted by Garofolo: 'the scientist is not a person who gives the right answers; the...
short_description (empty) French anthropologist and philosopher quoted on questions vs answers in science.
update Andrzej Śliwa person
description Berlin-based Ruby developer who was working at a fintech startup (securitization of loans) and departing to Zencargo ... Arkency-affiliated Ruby developer who speaks on CQRS and event sourcing with Rails Event Store. Cited by Garofolo as ...
short_description Ruby developer specializing in DDD, event sourcing, CQRS and functional programming. Arkency developer, speaker on CQRS/Event Sourcing with Rails.
create Design UX Before Technology takeaway
kind (empty) takeaway
name (empty) Design UX Before Technology
slug (empty) design-ux-before-technology
attrs (empty) {"type" => "recommendation"}
description (empty) Garofolo's core recommendation: set aside all technology choices and work with your business team and UX experts to d...
short_description (empty) Decide the user experience with business/UX before choosing the tech, especially for services.
create Don't Bring MVC-CRUD Thinking To Services takeaway
kind (empty) takeaway
name (empty) Don't Bring MVC-CRUD Thinking To Services
slug (empty) don-t-bring-mvc-crud-thinking-to-services
attrs (empty) {"type" => "warning"}
description (empty) Warning: if you bring MVC-CRUD mental models (immediate response for every request, form-over-row editing, DB-level v...
short_description (empty) Service architectures collapse when the mental model stays MVC-CRUD.
create Elevate Validations Into The Domain takeaway
kind (empty) takeaway
name (empty) Elevate Validations Into The Domain
slug (empty) elevate-validations-into-the-domain
attrs (empty) {"type" => "insight"}
description (empty) Validation is not a persistence concern — it is part of the core domain model. Pulling validations out of ActiveRecor...
short_description (empty) Treat validation as core domain logic in a service, not a persistence concern.
create A Week Or Two Of Up-front Analysis Is Still Agile takeaway
kind (empty) takeaway
name (empty) A Week Or Two Of Up-front Analysis Is Still Agile
slug (empty) a-week-or-two-of-up-front-analysis-is-still-agile
attrs (empty) {"type" => "recommendation"}
description (empty) Event-based service systems require up-front analysis — not nine-month waterfall, but a week or two of figuring out w...
short_description (empty) Event-based systems need real up-front analysis; one-to-two weeks is not waterfall.
create Recommend Reading The Eventide Project takeaway
kind (empty) takeaway
name (empty) Recommend Reading The Eventide Project
slug (empty) recommend-reading-the-eventide-project
attrs (empty) {"type" => "recommendation"}
description (empty) Garofolo recommends reading the Eventide project's documentation as fantastic material that will inform your thinking...
short_description (empty) Garofolo recommends reading Eventide's docs even if you don't use it day-to-day.
create When is a command considered processed? question
kind (empty) question
name (empty) When is a command considered processed?
slug (empty) when-is-a-command-considered-processed
attrs (empty) {"answer_summary" => "When the responsible service has produced the event in response to the command — aggregators ob...
description (empty) Audience asks when a command should be considered processed. Garofolo: when the service has produced the correspondin...
short_description (empty) Q&A on when to treat a command as processed in an event-driven system.
create Does per-field validation blow up UI complexity? question
kind (empty) question
name (empty) Does per-field validation blow up UI complexity?
slug (empty) does-per-field-validation-blow-up-ui-complexity
attrs (empty) {"answer_summary" => "You aren't forced to validate every field this way, but pairing the approach with task-driven U...
description (empty) Audience worries that validating each field via events (label, description, etc.) would require many new forms and UI...
short_description (empty) Q&A on whether accepting invalid events and validating per-field increases UI complexity.
create How to migrate legacy data into an event-sourced system? question
kind (empty) question
name (empty) How to migrate legacy data into an event-sourced system?
slug (empty) how-to-migrate-legacy-data-into-an-event-sourced-system
attrs (empty) {"answer_summary" => "Build the new domain model first, then seed new streams with 'legacy imported' events. The orig...
description (empty) Audience member (commercial real-estate company) asks how to handle migrating data from decades-old legacy systems wh...
short_description (empty) Q&A on importing legacy database data as the starting events of new streams.

Edges (46)

update Ethan GarofoloauthoredBuilding uls for microservices
context (empty) Garofolo delivered this talk at wroclove.rb 2019.
update Building uls for microservicespresented_atwroclove.rb 2019
context (empty) Talk delivered at the 2019 edition of wroclove.rb.
create Ethan Garofoloworks_onPragmatic Bookshelf
attrs (empty) {"role" => "author"}
context (empty) Writing a book about microservices for the Pragmatic Bookshelf.
relation (empty) works_on
source_node_id (empty) 7d9dc5f0-e9bf-42cb-bbb7-a0e11d1f3009
target_node_id (empty) 159b3fdf-6b4e-4ad4-a2c3-d5cd4e0f507a
create Ethan GarofolousesNode.js
context (empty) Makes his living programming in Node.js.
relation (empty) uses
source_node_id (empty) 7d9dc5f0-e9bf-42cb-bbb7-a0e11d1f3009
target_node_id (empty) 9aeec77e-7dee-4054-85fe-541434a0d272
create Ethan GarofolorecommendsRecommend Reading The Eventide Project
context (empty) Closes the talk recommending the Eventide project's docs as reading material.
relation (empty) recommends
source_node_id (empty) 7d9dc5f0-e9bf-42cb-bbb7-a0e11d1f3009
target_node_id (empty) 1ebf56e0-a73d-4401-8421-8f73fac6307c
create Building uls for microservicesaboutMonolith as Data Model
context (empty) Redefines a monolith as a data model rather than a deployment unit.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) ff7269c2-94b0-4600-9af2-5e686e72aae7
create Building uls for microservicesaboutDistributed Monolith
context (empty) Warns that extracting a monolith over HTTP without changing access patterns yields a distributed monolith.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) a3f89459-620c-477b-8cc5-8f0ea99f603e
create Building uls for microservicesaboutService Autonomy
context (empty) Centers the definition of a service on autonomy.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) cbcd7061-ffc0-4a24-993e-4076c6dc9c3a
create Building uls for microservicesaboutEvents and Commands
context (empty) Explains past-tense events and imperative commands as the two message flavors between services.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 772380ce-dd09-4d23-bda6-1acfbec76487
create Building uls for microservicesaboutMessage Store
context (empty) Introduces message stores as the pub/sub transport for events and commands.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 6e525311-fbf8-49e7-8017-7bf53f6ce02b
create Building uls for microservicesaboutAggregator
context (empty) Describes aggregators shaping event streams into read models.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 6ab520d9-ba0d-4b3c-8c63-2f12ee658205
create Building uls for microservicesaboutSometimes Nothing Is Enough
context (empty) Presents the 'don't wait' UI pattern with a YouTube-style view count example.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 3ba414af-5e88-4df4-b61e-2f8fd225b22c
create Building uls for microservicesaboutStalling For Time
context (empty) Presents the swan-metaphor UI pattern using email confirmation/registration as an example.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 9c58a4df-ce80-4c60-ba10-4829e2cc50de
create Building uls for microservicesaboutEmbrace The Evented Model
context (empty) Presents the accept-bad-input + per-audience-view UI pattern using the video name example.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 384b32bf-c76b-424f-8a2b-a8d7ea90170e
create Building uls for microservicesaboutTask-Driven UI
context (empty) Advocates task-driven UIs instead of giant edit-everything forms.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) e778f635-8b61-4ac0-944d-4a45e8d3e957
create Building uls for microservicesaboutCQRS
context (empty) References the CQRS pattern when explaining how aggregators shape different views per audience.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 8918002a-9def-4449-a187-e3052bf175b5
create Building uls for microservicesaboutEvent Sourcing
context (empty) Discusses events literally becoming the state of the system.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Building uls for microservicesaboutUbiquitous Language
context (empty) Invokes DDD's ubiquitous-language idea to justify defining shared terms up front.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 143ce1ce-e02c-4efb-abeb-ad39d8cdc0d6
create Building uls for microservicesaboutEventide
context (empty) Cites Eventide and its Postgres-backed message store as an example implementation.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
create Building uls for microservicesaboutrails_event_store
context (empty) Cites Rails Event Store (Arkency / Andrzej) as an example message store.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create Building uls for microservicesaboutEvent Store (project)
context (empty) Cites Greg Young's Event Store project as an example message store.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 4cef42c8-83ec-420d-b2ce-fb9b51f0711c
create Building uls for microservicesaboutAaron Patterson
context (empty) Quotes Aaron Patterson's 'distributed computing problems' line to skewer the distributed monolith.
relation (empty) about
source_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
target_node_id (empty) 81cd828d-cc7c-4022-982a-cd5690dfd1e0
create Distributed Monolithrelated_toMonolith as Data Model
context (empty) A distributed monolith is a monolithic data model extracted over HTTP without changing access patterns.
relation (empty) related_to
source_node_id (empty) a3f89459-620c-477b-8cc5-8f0ea99f603e
target_node_id (empty) ff7269c2-94b0-4600-9af2-5e686e72aae7
create Eventiderelated_toMessage Store
context (empty) Eventide ships a Postgres-backed message store implementation.
relation (empty) related_to
source_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
target_node_id (empty) 6e525311-fbf8-49e7-8017-7bf53f6ce02b
create rails_event_storerelated_toMessage Store
context (empty) Rails Event Store is given as an example of a message store implementation.
relation (empty) related_to
source_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
target_node_id (empty) 6e525311-fbf8-49e7-8017-7bf53f6ce02b
create Event Store (project)related_toMessage Store
context (empty) Greg Young's Event Store project is given as a canonical message store implementation.
relation (empty) related_to
source_node_id (empty) 4cef42c8-83ec-420d-b2ce-fb9b51f0711c
target_node_id (empty) 6e525311-fbf8-49e7-8017-7bf53f6ce02b
create Greg Youngworks_onEvent Store (project)
attrs (empty) {"role" => "author"}
context (empty) Garofolo attributes the Event Store project to Greg Young.
relation (empty) works_on
source_node_id (empty) 45e8eebf-faf5-48d2-a2fe-fb21ff38b80a
target_node_id (empty) 4cef42c8-83ec-420d-b2ce-fb9b51f0711c
update Nathan Laddworks_onEventide
attrs {"role" => "co-author/maintainer"} {"role" => "co-maintainer"}
context Co-author and maintainer of Eventide; mentions maintaining 30+ gems. Garofolo names Nathan as co-maintainer of Eventide's Postgres-backed message store.
create Scott Bellworks_onEventide
attrs (empty) {"role" => "co-maintainer"}
context (empty) Garofolo names Scott Bell as co-maintainer of Eventide's Postgres-backed message store alongside Nathan Ladd.
relation (empty) works_on
source_node_id (empty) 1a9bf14a-9bd6-4ad1-b80f-5484b342dd14
target_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
update Andrzej Śliwaworks_onrails_event_store
attrs {"role" => "contributor"} {"role" => "maintainer"}
context Contributing to rails_event_store via Arkency; some of the team's patterns merged upstream. Garofolo credits 'Andre and the folks at Arkency' with maintaining Rails Event Store.
create Andrzej Śliwaworks_atArkency
context (empty) Garofolo associates Andrzej with the Arkency team maintaining Rails Event Store.
relation (empty) works_at
source_node_id (empty) 85da3fcc-bd29-47c7-a138-fa1708770fc9
target_node_id (empty) f8b4b616-ffd6-4eaa-a7b9-fdc07bb2cb27
create Arkencyworks_onrails_event_store
context (empty) Arkency maintains Rails Event Store.
relation (empty) works_on
source_node_id (empty) f8b4b616-ffd6-4eaa-a7b9-fdc07bb2cb27
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create Design UX Before Technologyfrom_talkBuilding uls for microservices
context (empty) Closing recommendation of the talk.
relation (empty) from_talk
source_node_id (empty) 74ad8129-32d1-49bb-9568-e2fce099a09c
target_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
create Don't Bring MVC-CRUD Thinking To Servicesfrom_talkBuilding uls for microservices
context (empty) Core warning of the talk, illustrated by the zebra/texture-map metaphor.
relation (empty) from_talk
source_node_id (empty) af2ee74a-7a08-4555-91ea-a7140638bb11
target_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
create Elevate Validations Into The Domainfrom_talkBuilding uls for microservices
context (empty) Extracted from the embrace-the-evented-model section on validations.
relation (empty) from_talk
source_node_id (empty) 646f2753-a844-4118-a53d-d2c3e4305485
target_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
create A Week Or Two Of Up-front Analysis Is Still Agilefrom_talkBuilding uls for microservices
context (empty) Stated before the video-upload validation example.
relation (empty) from_talk
source_node_id (empty) f2b6c2f8-68cd-46e1-adc2-c4be085dd598
target_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
create Recommend Reading The Eventide Projectfrom_talkBuilding uls for microservices
context (empty) Closing recommendation of the talk.
relation (empty) from_talk
source_node_id (empty) 1ebf56e0-a73d-4401-8421-8f73fac6307c
target_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
create Design UX Before TechnologyaboutTask-Driven UI
context (empty) Designing UX first is what motivates task-driven UIs over form-over-row.
relation (empty) about
source_node_id (empty) 74ad8129-32d1-49bb-9568-e2fce099a09c
target_node_id (empty) e778f635-8b61-4ac0-944d-4a45e8d3e957
create Don't Bring MVC-CRUD Thinking To ServicesaboutDistributed Monolith
context (empty) MVC-CRUD mindset applied to services produces the distributed monolith anti-pattern.
relation (empty) about
source_node_id (empty) af2ee74a-7a08-4555-91ea-a7140638bb11
target_node_id (empty) a3f89459-620c-477b-8cc5-8f0ea99f603e
create Elevate Validations Into The DomainaboutEmbrace The Evented Model
context (empty) Elevating validations into services is what enables the embrace-the-evented-model UI pattern.
relation (empty) about
source_node_id (empty) 646f2753-a844-4118-a53d-d2c3e4305485
target_node_id (empty) 384b32bf-c76b-424f-8a2b-a8d7ea90170e
create When is a command considered processed?asked_atBuilding uls for microservices
context (empty) Asked in Q&A after the talk.
relation (empty) asked_at
source_node_id (empty) ef69bee7-a0ea-466f-bd04-555b70e8fbf1
target_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
create Does per-field validation blow up UI complexity?asked_atBuilding uls for microservices
context (empty) Asked in Q&A after the talk.
relation (empty) asked_at
source_node_id (empty) e2aec8d6-1f80-4b8f-a3ee-60b7fd3eda5a
target_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
create How to migrate legacy data into an event-sourced system?asked_atBuilding uls for microservices
context (empty) Asked in Q&A after the talk by an attendee from a commercial real-estate company.
relation (empty) asked_at
source_node_id (empty) 09eec5de-c53d-45ca-9417-9a1a68ac7168
target_node_id (empty) 4957b705-a43b-4b5d-bb69-728db69b1b86
create When is a command considered processed?aboutEvents and Commands
context (empty) Clarifies the processing semantics of commands vs resulting events.
relation (empty) about
source_node_id (empty) ef69bee7-a0ea-466f-bd04-555b70e8fbf1
target_node_id (empty) 772380ce-dd09-4d23-bda6-1acfbec76487
create Does per-field validation blow up UI complexity?aboutTask-Driven UI
context (empty) Garofolo answers by appealing to task-driven UIs as the complexity mitigation.
relation (empty) about
source_node_id (empty) e2aec8d6-1f80-4b8f-a3ee-60b7fd3eda5a
target_node_id (empty) e778f635-8b61-4ac0-944d-4a45e8d3e957
create How to migrate legacy data into an event-sourced system?aboutEvent Sourcing
context (empty) Question is about seeding new event streams with legacy data.
relation (empty) about
source_node_id (empty) 09eec5de-c53d-45ca-9417-9a1a68ac7168
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5

Read set

106 nodes

talk Building uls for microservices search_nodes+get_node_edges talk No-build Utopia: Modern User Experiences with Rails & Web Standards search_nodes takeaway Bounded Contexts Are Not Microservices search_nodes takeaway Bounded Contexts Are Natural Microservice Seams search_nodes talk Component Driven UI with ViewComponent search_nodes concept Reactive Programming search_nodes takeaway Stop Building Web Apps, Build Software search_nodes takeaway Adopt CSS-in-JS for modern component-based frontends search_nodes question Distributed or majestic monolith? search_nodes tool Grafana search_nodes concept Event Sourcing search_nodes takeaway Use CQRS And Event Sourcing Independently search_nodes talk Applying CQRS & Event Sourcing on Rails applications search_nodes takeaway Event Sourcing Enables Distribution search_nodes question Can Trailblazer be combined with event sourcing and CQRS? search_nodes talk Event Sourcing Anti Patterns and Failures search_nodes question How to persist commands in an event-sourced system? search_nodes takeaway Hiring For Event Sourcing Trade-off search_nodes concept Snapshotting search_nodes takeaway Event Sourcing Mind Shift Trade-off search_nodes event wroclove.rb 2019 search_nodes talk Building LLM powered applications in Ruby search_nodes event wroclove.rb 2018 search_nodes talk To Refine or Not to Refine search_nodes talk Rubyana Gems and the Ractorous Rubetta Stones! search_nodes talk Business logic in Ruby search_nodes talk Orchestrating video transcoding in ruby search_nodes talk Methods Gem for Ruby Method References search_nodes talk Introducing Sorbet into your Ruby codebase search_nodes talk Towards the post framework future search_nodes person Ethan Garofolo search_nodes concept Event Store search_nodes project Eventide search_nodes tool Ruby Event Store search_nodes question Can parts of Eventide, Rails Event Store and Trailblazer be combined in one project? search_nodes tool rails_event_store search_nodes concept Idempotent Projectors and Reactors search_nodes concept Command UUID Deduplication search_nodes talk Working with RailsEventStore in Cashflow Management System search_nodes talk Event Sourcing and Actor model in Ruby search_nodes company Arkency search_nodes takeaway Silver Bullet Anti-Pattern search_nodes concept Majestic Monolith search_nodes project monolith framework search_nodes takeaway Risks of DDD: Hierarchy, Perfectionism, Constraints search_nodes concept CQRS search_nodes talk Is the monolith a problem search_nodes takeaway Eventual Consistency Trade-off search_nodes concept Command Form search_nodes talk Forms Are Dead: Building Agentic Workflows in Ruby search_nodes tool RealtimeBoard search_nodes concept Trailblazer Workflow search_nodes concept Waterfall Analysis search_nodes concept Commands, Queries, and Events search_nodes question Does experienced architect's intuition override precise design vocabulary? search_nodes concept Performance Time Budget search_nodes concept EventStorming search_nodes takeaway Replay-Based Debugging search_nodes person Greg Young search_nodes person Nathan Ladd search_nodes talk Events events events search_nodes person Adam Okoń search_nodes resource Rocket Real-Time Benchmark search_nodes tool Faker search_nodes person Julik Tarkhanov search_nodes tool GraphQL search_nodes takeaway Time Travel Superpower search_nodes resource Domain-Driven Design: Patterns, Principles and Practices search_nodes resource Implementing Domain-Driven Design search_nodes resource Introducing EventStorming search_nodes concept Hexagonal Architecture search_nodes concept Partitioning search_nodes tool Node.js search_nodes tool Babel search_nodes tool Electron search_nodes tool TypeScript search_nodes tool PureScript search_nodes tool nginx search_nodes takeaway Sign serverlessforruby.org petition search_nodes tool Iodine search_nodes concept WebAssembly search_nodes tool Redis search_nodes takeaway Action Cable Crowded-Channel Trade-off search_nodes project AnyCable search_nodes concept WebSockets search_nodes concept Saga Pattern search_nodes concept Event Handler Error Strategy search_nodes tool git bisect search_nodes concept Architecture Drivers search_nodes concept Event-Driven Architecture search_nodes takeaway Break Code Into Small Units Orchestrated By A Process Engine search_nodes concept DDD Whirlpool search_nodes concept Railway Oriented Programming search_nodes talk Adventures in durable execution search_nodes concept Domain Storytelling search_nodes concept Function as a Service search_nodes concept Dependency Injection search_nodes resource Drive search_nodes tool Sync Space VR search_nodes concept Denormalizer / Read Model search_nodes talk MVCC for Ruby developers search_nodes takeaway Horizontal Scale Superpower search_nodes tool PostgreSQL search_nodes talk Building on Bluesky's AT Protocol with Ruby search_nodes question How to handle very large event volumes over time? search_nodes talk From PostgreSQL to SQLite in Rails search_nodes

2 edges