← Extractions

Building Reactive Systems with Ruby and Event Sourcing (Ismael Celis, wroclove.rb 2026)

Ismael Celis's wroclove.rb 2026 talk (renamed from 'Event Sourcing and the Actor Model in Ruby') demonstrating two experimental Ruby libraries he is building — Cidurial (a Falcon/Datastar-based reactive web toolkit) and Sourced (an event-sourcing library with deciders, projectors and reactors). He frames domain modeling around commands/events/state instead of entity graphs, eliminates the controller-vs-background-job split, and shows how event sourcing gives durable execution, message correlation, time travel, autonomous services and real-time multiplayer UIs for free.

Model
claude-opus-4-7
Ingestion
7e6b15d0
Input tokens
672,070
fresh
144,389
cached
441,313
cache write
86,368
Output tokens
16,237
Duration
268.6s
Roundtrips
10
Tool calls
31
Cost
$0.00
Nodes/edges extracted
19 / 61
Read set (nodes/edges)
240 / 2

Nodes (19)

update Ismael Celis person
attrs (empty) {"location" => "London"}
description Ruby developer exploring event sourcing and actor model patterns. Ruby developer living and working in London. For many years has been learning, blogging about and experimenting with ...
short_description Ruby developer, event sourcing practitioner. London-based Ruby developer exploring event sourcing, actors and reactive systems.
update Event Sourcing and Actor model in Ruby talk
attrs {"type" => "talk"} {"date" => "2026-04-17", "type" => "talk", "renamed_title" => "Building Reactive Systems with Ruby and Event Sourcing...
description Talk on event sourcing and actors. Ismael Celis's wroclove.rb 2026 single-speaker talk, originally submitted as 'Event Sourcing and the Actor Model in R...
short_description Talk on event sourcing and actors. Ismael Celis's wroclove.rb 2026 talk on reactive web apps and event sourcing in Ruby.
create Cidurial project
kind (empty) project
name (empty) Cidurial
slug (empty) cidurial
attrs (empty) {"status" => "active", "license" => "open-source", "language" => "Ruby"}
description (empty) Experimental Ruby library by Ismael Celis for building reactive web apps around commands rather than controllers or b...
short_description (empty) Ismael Celis's experimental Ruby reactive-web toolkit built on Falcon and Datastar.
create Sourced project
kind (empty) project
name (empty) Sourced
slug (empty) sourced
attrs (empty) {"status" => "active", "license" => "open-source", "language" => "Ruby"}
description (empty) Experimental Ruby library by Ismael Celis for exploring event-sourcing patterns independently of the web. Core primit...
short_description (empty) Ismael Celis's experimental Ruby event-sourcing library with deciders, projectors and reactors.
create Datastar tool
kind (empty) tool
name (empty) Datastar
slug (empty) datastar
attrs (empty) {"category" => "library"}
description (empty) Lightweight JavaScript library (similar in spirit to HTMX but with a smaller API doing more) that keeps a long-lived ...
short_description (empty) Tiny JS library that morphs server-pushed HTML over SSE into the DOM.
create Event Lane App project
kind (empty) project
name (empty) Event Lane App
slug (empty) event-lane-app
attrs (empty) {"status" => "active", "license" => "open-source"}
description (empty) Small free toy app written by Ismael Celis that builds workflow diagrams (commands → events → reactions) of the kind ...
short_description (empty) Ismael Celis's toy app for drawing event-modelling/workflow diagrams.
create Dynamic Consistency Boundaries concept
kind (empty) concept
name (empty) Dynamic Consistency Boundaries
slug (empty) dynamic-consistency-boundaries
attrs (empty) {"category" => "pattern"}
description (empty) Event-sourcing approach (DCB) Ismael Celis adopts in the newer version of Sourced. In traditional event sourcing, eve...
short_description (empty) Query events by attributes to form virtual streams per decision, instead of one fixed stream.
create Model Depth Issue concept
kind (empty) concept
name (empty) Model Depth Issue
slug (empty) model-depth-issue
attrs (empty) {"category" => "pattern"}
description (empty) Ismael Celis's name for a recurring failure mode in domain modelling. Starting from an ER diagram (campaigns, donatio...
short_description (empty) Anti-pattern where entity-relationship modelling grows into an everything-relates-to-everything graph.
create Execution Context Issue concept
kind (empty) concept
name (empty) Execution Context Issue
slug (empty) execution-context-issue
attrs (empty) {"category" => "architecture"}
description (empty) Ismael Celis's name for the mental split web developers typically make between synchronous web-controller commands (q...
short_description (empty) Artificial controller-vs-background-job split that makes one domain workflow look like two.
create Message Correlation concept
kind (empty) concept
name (empty) Message Correlation
slug (empty) message-correlation
attrs (empty) {"category" => "pattern"}
description (empty) Feature of the Sourced runtime: as each handler produces events from a command, the runtime tags the pair so every do...
short_description (empty) Linking commands and their resulting events to reconstruct full workflow traces.
create Prism tool
kind (empty) tool
name (empty) Prism
slug (empty) prism
attrs (empty) {"category" => "library", "language" => "Ruby"}
description (empty) Ruby parser Ismael Celis uses in Sourced to statically analyse the command/event/reaction DSL (declarative and high-l...
short_description (empty) Ruby's modern parser producing ASTs usable for static analysis.
create Event sourcing gives durable execution for free takeaway
kind (empty) takeaway
name (empty) Event sourcing gives durable execution for free
slug (empty) event-sourcing-gives-durable-execution-for-free
attrs (empty) {"type" => "insight"}
description (empty) Ismael Celis's point: durable execution normally requires snapshotting each step of a workflow so that on failure you...
short_description (empty) Each event is a snapshot of the last successful step — so retries pick up where they left off.
create Reframe domain errors as events takeaway
kind (empty) takeaway
name (empty) Reframe domain errors as events
slug (empty) reframe-domain-errors-as-events
attrs (empty) {"type" => "insight"}
description (empty) Ismael Celis's current thinking: once you model around commands and events, the scope of true errors shrinks dramatic...
short_description (empty) Most 'errors' in a business domain are just another kind of event you should record and react to.
create Collapse controllers and background jobs into one command layer takeaway
kind (empty) takeaway
name (empty) Collapse controllers and background jobs into one command layer
slug (empty) collapse-controllers-and-background-jobs-into-one-command-layer
attrs (empty) {"type" => "recommendation"}
description (empty) Ismael Celis's architectural recommendation: stop maintaining two mental/implementation layers (web controllers vs ba...
short_description (empty) Treat synchronous and asynchronous work as a single command-handler abstraction.
create Real-time multiplayer for free via CQRS pub/sub takeaway
kind (empty) takeaway
name (empty) Real-time multiplayer for free via CQRS pub/sub
slug (empty) real-time-multiplayer-for-free-via-cqrs-pub-sub
attrs (empty) {"type" => "insight"}
description (empty) Because Cidurial separates writes (commands appended to a store) from reads (SSE-connected pages subscribing to comma...
short_description (empty) Decoupling reads from writes over a shared pub/sub gives multiplayer and streaming UIs automatically.
create Is a decider a state machine over many inputs? question
kind (empty) question
name (empty) Is a decider a state machine over many inputs?
slug (empty) is-a-decider-a-state-machine-over-many-inputs
attrs (empty) {"answer_summary" => "Yes. Traditionally events live in one stream, forcing eventual consistency across aggregates; S...
description (empty) Audience member asks whether the decider is effectively a local state machine over many inputs — tracking not just a ...
short_description (empty) Audience asks whether deciders combine state of several aggregates (campaign + donation).
create Where should events be stored? question
kind (empty) question
name (empty) Where should events be stored?
slug (empty) where-should-events-be-stored
attrs (empty) {"answer_summary" => "Ismael has used Postgres then SQLite for simplicity; an audience member confirms Postgres works...
description (empty) Audience asks whether events should simply go in a database, or in memory/logs, etc. Ismael replies that despite year...
short_description (empty) Audience asks for storage advice — database, files, memory?
create How do you prevent race conditions? question
kind (empty) question
name (empty) How do you prevent race conditions?
slug (empty) how-do-you-prevent-race-conditions
attrs (empty) {"answer_summary" => "Sourced takes a Solid-Queue-style claim/lock per partition so only one worker processes events ...
description (empty) Audience member asks whether events and read models are stored in the same transaction or how race conditions are han...
short_description (empty) Audience asks how Sourced avoids concurrent workers stepping on the same command/events.
create How does error handling work? question
kind (empty) question
name (empty) How does error handling work?
slug (empty) how-does-error-handling-work
attrs (empty) {"answer_summary" => "Reframe most 'errors' as domain events with their own reactions; reserve true exceptions for te...
description (empty) Audience asks how errors integrate with Ruby's exception model and how they're communicated to the UI. Ismael says th...
short_description (empty) Audience asks how errors integrate with Ruby exceptions and the UI.

Edges (61)

update Ismael CelisauthoredEvent Sourcing and Actor model in Ruby
context (empty) Sole speaker of the wroclove.rb 2026 talk (renamed 'Building Reactive Systems with Ruby and Event Sourcing').
update Event Sourcing and Actor model in Rubypresented_atwroclove.rb 2026
context (empty) Delivered on day 1 of the 2026 edition.
create Ismael Celisattendedwroclove.rb 2026
context (empty) Present in Wrocław to deliver the talk and attend the evening party.
relation (empty) attended
source_node_id (empty) 29ae572a-63c2-411e-bff8-ba1958173b52
target_node_id (empty) c1bfbda9-9fbb-4d7f-8e12-1a7a81621ba9
create Ismael Celisworks_onCidurial
attrs (empty) {"role" => "author"}
context (empty) Author of the experimental reactive-web library.
relation (empty) works_on
source_node_id (empty) 29ae572a-63c2-411e-bff8-ba1958173b52
target_node_id (empty) 559e1ebf-d88f-4b33-b3cf-b6a34557708f
create Ismael Celisworks_onSourced
attrs (empty) {"role" => "author"}
context (empty) Author of the experimental event-sourcing library.
relation (empty) works_on
source_node_id (empty) 29ae572a-63c2-411e-bff8-ba1958173b52
target_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
create Ismael Celisworks_onEvent Lane App
attrs (empty) {"role" => "author"}
context (empty) Wrote this companion toy app for drawing workflow diagrams.
relation (empty) works_on
source_node_id (empty) 29ae572a-63c2-411e-bff8-ba1958173b52
target_node_id (empty) d9994791-76b9-4183-8123-1ef8293acfa2
create Ismael Celisworks_onDatastar
attrs (empty) {"role" => "Ruby SDK author"}
context (empty) Wrote the Ruby SDK for Datastar used in Cidurial.
relation (empty) works_on
source_node_id (empty) 29ae572a-63c2-411e-bff8-ba1958173b52
target_node_id (empty) a84b90ee-db7f-418e-88dc-c72240432e62
create CidurialusesFalcon
context (empty) Cidurial is a Rack app running on the fiber-based Falcon server.
relation (empty) uses
source_node_id (empty) 559e1ebf-d88f-4b33-b3cf-b6a34557708f
target_node_id (empty) 54b63203-39a1-48cd-9fde-a17fbc68d768
create CidurialusesDatastar
context (empty) Datastar provides the SSE client that morphs server-pushed HTML patches into the DOM.
relation (empty) uses
source_node_id (empty) 559e1ebf-d88f-4b33-b3cf-b6a34557708f
target_node_id (empty) a84b90ee-db7f-418e-88dc-c72240432e62
create CidurialusesPhlex
context (empty) Pages are Ruby classes using Phlex for templating and sub-components.
relation (empty) uses
source_node_id (empty) 559e1ebf-d88f-4b33-b3cf-b6a34557708f
target_node_id (empty) 6bb19a01-47fc-4521-83c9-874cd58c606a
create CidurialusesRack
context (empty) A Cidurial app is a Rack app mountable on any Rack server.
relation (empty) uses
source_node_id (empty) 559e1ebf-d88f-4b33-b3cf-b6a34557708f
target_node_id (empty) ce1ce440-06a4-4527-a39f-556a7b635334
create CidurialusesBrotli
context (empty) The Datastar SDK uses Brotli over the SSE connection, achieving >80% compression ratios on HTML.
relation (empty) uses
source_node_id (empty) 559e1ebf-d88f-4b33-b3cf-b6a34557708f
target_node_id (empty) a02f5458-efb6-4935-9754-ad96a3c66aa4
create CidurialusesSourced
context (empty) Cidurial can swap its built-in command store/dispatcher for Sourced's, integrating the web toolkit with the event-sou...
relation (empty) uses
source_node_id (empty) 559e1ebf-d88f-4b33-b3cf-b6a34557708f
target_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
create SourcedusesPrism
context (empty) Uses the Prism parser to statically analyse the command/event DSL and produce workflow diagrams.
relation (empty) uses
source_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
target_node_id (empty) 6a2294f4-242b-4bed-959f-e96f52bf991e
create SourcedusesSQLite
context (empty) Ismael's current default event store after switching from Postgres to simplify dependencies.
relation (empty) uses
source_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
target_node_id (empty) a65d4872-7d76-4774-a7d5-e29e615de75a
create SourcedusesRuby LLM
context (empty) The chat-app demo in the talk uses Ruby LLM to talk to an LLM, illustrating multiplayer/real-time for free.
relation (empty) uses
source_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
target_node_id (empty) c18812ec-95b1-460a-a4a9-ced4cdba2a83
create Event Sourcing and Actor model in RubyaboutEvent Sourcing
context (empty) Core subject of the talk — framing state as derived from events.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Event Sourcing and Actor model in RubyaboutActor Model
context (empty) Originally about the actor model; retitled but still briefly discussed, with a pointer to Ismael's other talks.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) 2249ebc3-b65e-4aa6-ae55-ca0e22bfe67b
create Event Sourcing and Actor model in RubyaboutCQRS
context (empty) Cidurial is explicitly described as a version of CQRS — separate write (commands) and read (SSE) channels.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) 8918002a-9def-4449-a187-e3052bf175b5
create Event Sourcing and Actor model in RubyaboutDurable Execution
context (empty) Talk argues event sourcing provides durable execution for free.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) 706347e0-c3de-46c5-84be-5147d7bd555f
create Event Sourcing and Actor model in RubyaboutDynamic Consistency Boundaries
context (empty) Introduced in the Q&A to explain how decisions span multiple aggregates.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) a508b54a-bd13-4221-b414-87b734fff3a5
create Event Sourcing and Actor model in RubyaboutModel Depth Issue
context (empty) One of the two conceptual issues the talk opens with.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) 53f2f241-b9f3-4735-b1ac-1372879f5c3b
create Event Sourcing and Actor model in RubyaboutExecution Context Issue
context (empty) The other conceptual issue the talk opens with.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) bc513a3d-d7b6-415c-8951-e3c42b95d61f
create Event Sourcing and Actor model in RubyaboutMessage Correlation
context (empty) Sourced correlates commands and events to enable workflow tracing and time travel.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) a5fafd52-ed04-476b-8cf3-0b0d9c3aca54
create Event Sourcing and Actor model in RubyaboutCidurial
context (empty) Live-coded/demoed throughout the talk.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) 559e1ebf-d88f-4b33-b3cf-b6a34557708f
create Event Sourcing and Actor model in RubyaboutSourced
context (empty) Second half of the talk walks through Sourced's primitives and runtime.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
create Event Sourcing and Actor model in RubyaboutDecider Pattern
context (empty) Sourced's Decider class implements decide/evolve over state and events.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) 257ebe97-c2d6-4102-8515-744da7253cce
create Event Sourcing and Actor model in RubyaboutProjector
context (empty) Sourced ships a Projector superclass for materialising read models.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) 4c44ae81-e04c-495a-b02f-37c8987e39dc
create Event Sourcing and Actor model in RubyaboutReactor
context (empty) Reactions in Sourced observe events and dispatch next commands (e.g. PaymentStarted → Stripe → ConfirmPayment).
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) a5f0bb90-5784-44f8-bdd5-6295dc6d5301
create Event Sourcing and Actor model in RubyaboutService Autonomy
context (empty) Closes with the observation that each decider/projector runs at its own pace — true autonomous services communicating...
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) cbcd7061-ffc0-4a24-993e-4076c6dc9c3a
create Event Sourcing and Actor model in RubyaboutEvent Lane App
context (empty) Used to generate the workflow diagrams shown in the slides.
relation (empty) about
source_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
target_node_id (empty) d9994791-76b9-4183-8123-1ef8293acfa2
create Event sourcing gives durable execution for freefrom_talkEvent Sourcing and Actor model in Ruby
context (empty) Ismael's durable-execution argument in the talk.
relation (empty) from_talk
source_node_id (empty) c04b72ff-4ad4-453f-826a-31ae32551b3d
target_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
create Reframe domain errors as eventsfrom_talkEvent Sourcing and Actor model in Ruby
context (empty) Ismael's answer to the error-handling Q&A.
relation (empty) from_talk
source_node_id (empty) 79469ec9-39f0-4d99-a3f0-35d5a8803ba2
target_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
create Collapse controllers and background jobs into one command layerfrom_talkEvent Sourcing and Actor model in Ruby
context (empty) Core architectural message of the talk.
relation (empty) from_talk
source_node_id (empty) ad0ecd81-dc93-490f-8c36-75c407ca5680
target_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
create Real-time multiplayer for free via CQRS pub/subfrom_talkEvent Sourcing and Actor model in Ruby
context (empty) Demonstrated via chat, seat-booking and streaming demos.
relation (empty) from_talk
source_node_id (empty) 4cb7b2a8-e7c1-4506-9018-5b08a0228e8f
target_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
create Event sourcing gives durable execution for freeaboutDurable Execution
context (empty) Ties durable execution to the event-sourcing pattern.
relation (empty) about
source_node_id (empty) c04b72ff-4ad4-453f-826a-31ae32551b3d
target_node_id (empty) 706347e0-c3de-46c5-84be-5147d7bd555f
create Event sourcing gives durable execution for freeaboutEvent Sourcing
context (empty) Claims durable execution is an inherent property of event-sourced systems.
relation (empty) about
source_node_id (empty) c04b72ff-4ad4-453f-826a-31ae32551b3d
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Reframe domain errors as eventsaboutEvent Sourcing
context (empty) Extends event sourcing's philosophy to error handling.
relation (empty) about
source_node_id (empty) 79469ec9-39f0-4d99-a3f0-35d5a8803ba2
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Collapse controllers and background jobs into one command layeraboutCidurial
context (empty) Cidurial is the implementation of this idea.
relation (empty) about
source_node_id (empty) ad0ecd81-dc93-490f-8c36-75c407ca5680
target_node_id (empty) 559e1ebf-d88f-4b33-b3cf-b6a34557708f
create Real-time multiplayer for free via CQRS pub/subaboutCQRS
context (empty) Attributes the property to the CQRS pub/sub split.
relation (empty) about
source_node_id (empty) 4cb7b2a8-e7c1-4506-9018-5b08a0228e8f
target_node_id (empty) 8918002a-9def-4449-a187-e3052bf175b5
create Is a decider a state machine over many inputs?asked_atEvent Sourcing and Actor model in Ruby
context (empty) First Q&A question.
relation (empty) asked_at
source_node_id (empty) 879a09b4-37a7-4eba-80b0-0c04ac65ff9b
target_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
create Where should events be stored?asked_atEvent Sourcing and Actor model in Ruby
context (empty) Second Q&A question.
relation (empty) asked_at
source_node_id (empty) 0e3eaf28-3e73-438a-a838-fd0b6eb1b8a2
target_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
create How do you prevent race conditions?asked_atEvent Sourcing and Actor model in Ruby
context (empty) Q&A about concurrency.
relation (empty) asked_at
source_node_id (empty) d8cd015a-fdac-43e4-9c9b-1cd1e95e36d0
target_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
create How does error handling work?asked_atEvent Sourcing and Actor model in Ruby
context (empty) Final Q&A question.
relation (empty) asked_at
source_node_id (empty) 1597b3d7-7b0d-4785-9280-2d364d7c605d
target_node_id (empty) 69b07a52-9476-4691-83dc-a566801a877c
create Is a decider a state machine over many inputs?aboutDynamic Consistency Boundaries
context (empty) Ismael invokes DCB to answer the multi-input decider question.
relation (empty) about
source_node_id (empty) 879a09b4-37a7-4eba-80b0-0c04ac65ff9b
target_node_id (empty) a508b54a-bd13-4221-b414-87b734fff3a5
create Is a decider a state machine over many inputs?aboutDecider Pattern
context (empty) Directly asks about deciders.
relation (empty) about
source_node_id (empty) 879a09b4-37a7-4eba-80b0-0c04ac65ff9b
target_node_id (empty) 257ebe97-c2d6-4102-8515-744da7253cce
create Where should events be stored?aboutEvent Store
context (empty) Asks about storage options for the event store.
relation (empty) about
source_node_id (empty) 0e3eaf28-3e73-438a-a838-fd0b6eb1b8a2
target_node_id (empty) 41e612ae-2c1f-4a3c-8690-d47ac47e0174
create How do you prevent race conditions?aboutSourced
context (empty) Specifically about Sourced's concurrency handling (claim mechanism).
relation (empty) about
source_node_id (empty) d8cd015a-fdac-43e4-9c9b-1cd1e95e36d0
target_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
create How does error handling work?aboutSourced
context (empty) About Sourced's error/retry/dashboard behaviour.
relation (empty) about
source_node_id (empty) 1597b3d7-7b0d-4785-9280-2d364d7c605d
target_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
create Cidurialrelated_toCQRS
context (empty) Explicitly presented as a CQRS implementation.
relation (empty) related_to
source_node_id (empty) 559e1ebf-d88f-4b33-b3cf-b6a34557708f
target_node_id (empty) 8918002a-9def-4449-a187-e3052bf175b5
create Sourcedrelated_toEvent Sourcing
context (empty) A library for exploring event-sourcing patterns in Ruby.
relation (empty) related_to
source_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Sourcedrelated_toDecider Pattern
context (empty) Sourced's Decider class implements decide/evolve/react.
relation (empty) related_to
source_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
target_node_id (empty) 257ebe97-c2d6-4102-8515-744da7253cce
create Sourcedrelated_toProjector
context (empty) Ships a Projector superclass.
relation (empty) related_to
source_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
target_node_id (empty) 4c44ae81-e04c-495a-b02f-37c8987e39dc
create Sourcedrelated_toReactor
context (empty) Reactions are first-class in Sourced.
relation (empty) related_to
source_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
target_node_id (empty) a5f0bb90-5784-44f8-bdd5-6295dc6d5301
create Sourcedrelated_toDynamic Consistency Boundaries
context (empty) New version of Sourced implements DCB-style event querying.
relation (empty) related_to
source_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
target_node_id (empty) a508b54a-bd13-4221-b414-87b734fff3a5
create Sourcedrelated_toDurable Execution
context (empty) Provides durable execution by design via persisted events.
relation (empty) related_to
source_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
target_node_id (empty) 706347e0-c3de-46c5-84be-5147d7bd555f
create Sourcedrelated_toMessage Correlation
context (empty) Runtime feature correlating commands and resulting events.
relation (empty) related_to
source_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
target_node_id (empty) a5fafd52-ed04-476b-8cf3-0b0d9c3aca54
create Sourcedrelated_toService Autonomy
context (empty) Each decider/projector runs at its own pace as an autonomous service.
relation (empty) related_to
source_node_id (empty) 1303be73-ef7e-4416-bddd-1c02d7289492
target_node_id (empty) cbcd7061-ffc0-4a24-993e-4076c6dc9c3a
create Datastarrelated_tohtmx
context (empty) Ismael compares Datastar to HTMX — does more with a smaller API.
relation (empty) related_to
source_node_id (empty) a84b90ee-db7f-418e-88dc-c72240432e62
target_node_id (empty) 704680e3-3592-445c-b2b7-c6e2435d08a6
create Ismael Celishas_skillEvent Sourcing
attrs (empty) {"level" => "expert"}
context (empty) Years of exploration, blogging and library work on event-sourcing patterns.
relation (empty) has_skill
source_node_id (empty) 29ae572a-63c2-411e-bff8-ba1958173b52
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Ismael Celishas_skillActor Model
attrs (empty) {"level" => "intermediate"}
context (empty) Has given prior talks on the actor model in Ruby.
relation (empty) has_skill
source_node_id (empty) 29ae572a-63c2-411e-bff8-ba1958173b52
target_node_id (empty) 2249ebc3-b65e-4aa6-ae55-ca0e22bfe67b

Read set

240 nodes

talk Event Sourcing and Actor model in Ruby search_nodes+get_node_edges concept Event Sourcing search_nodes tool Ruby Event Store search_nodes talk Introduction To Event Sourcing How To Use It With Ruby search_nodes takeaway Don't be afraid of event sourcing search_nodes takeaway Event Sourcing Is Not A Silver Bullet search_nodes takeaway Adopt event sourcing gradually search_nodes talk Applying CQRS & Event Sourcing on Rails applications search_nodes takeaway Event Sourcing Is A Side Effect Of Pub/Sub search_nodes concept Event Store search_nodes takeaway Event Sourcing Is About State Not Distribution search_nodes takeaway Hiring For Event Sourcing Trade-off search_nodes concept Snapshotting search_nodes takeaway Event Sourcing Enables Distribution search_nodes takeaway Event Sourcing Mind Shift Trade-off search_nodes concept Actor Model search_nodes concept Ractor search_nodes question What is the Ractor implementation modeled on? search_nodes concept Read Model search_nodes tool Celluloid search_nodes takeaway Ractors Still Experimental In Ruby 4.0 search_nodes question Can Ractors be fire-and-forget for background GUI work? search_nodes question Port your Ractor talk to JRuby search_nodes concept Fiber Scheduler search_nodes concept Commands, Queries, and Events search_nodes concept Command Bus search_nodes concept Command Query Separation search_nodes concept CQRS search_nodes takeaway Use CQRS And Event Sourcing Independently search_nodes takeaway Handlers Must Control Their Dependencies search_nodes concept Command Form search_nodes concept Command Stream search_nodes question How to persist commands in an event-sourced system? search_nodes concept Command Handler search_nodes tool Falcon search_nodes tool async search_nodes tool server-engine search_nodes concept Fiber search_nodes person Samuel Williams search_nodes concept Auto-yielding Fibers search_nodes resource serverlessforruby.org Petition search_nodes tool Unicorn search_nodes tool Passenger search_nodes project fire sky search_nodes talk Events events events search_nodes tool Jetstream search_nodes tool Grace search_nodes tool Apollo GraphQL Platform search_nodes tool sky feed search_nodes concept App View search_nodes project AnyCable search_nodes project Linux Custom Feed search_nodes concept Logux Proxy search_nodes question How do you test rendered Phlex components? search_nodes tool Phlex search_nodes takeaway Phlex is only faster than ERB at scale search_nodes project Ruby UI search_nodes talk Building Beautiful UIs with Ruby A Rails-Native Approach search_nodes question How does Phlex integrate with Turbo? search_nodes tool ViewComponent search_nodes takeaway Borrow From Non-Rails View Approaches search_nodes concept Selective Rendering search_nodes tool Cells search_nodes tool htmx search_nodes question What about HTMX? search_nodes tool Turbo Streams search_nodes tool Turbo Frames search_nodes concept Declarative Partial Updates search_nodes question Do you end up fighting Turbo when adopting these new APIs? search_nodes tool Hotwire search_nodes concept View Transitions API search_nodes question What licenses do Turbo Native libraries use? search_nodes concept Interest Invokers API search_nodes person Ismael Celis search_nodes+get_node_edges project Arkency Knowledge Graph search_nodes takeaway Name Things To Find Their Properties search_nodes concept AI Agent search_nodes tool ChatGPT search_nodes tool Top Secret LLM search_nodes tool langchainrb search_nodes concept Retrieval Augmented Generation search_nodes tool Codex CLI search_nodes project Check search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2018 search_nodes talk Performance Panel wroclove.rb 2024 search_nodes talk Ruby Is Mature Now search_nodes talk Building LLM powered applications in Ruby search_nodes takeaway Read the Ruby standard library search_nodes takeaway Use JVM libraries from Ruby search_nodes talk Ruby Standard Library Hidden Gems Lightning Talk search_nodes tool Distributed Ruby search_nodes takeaway Port Python Libraries With ChatGPT search_nodes concept C Extensions search_nodes tool Standard RB search_nodes tool Ruby LLM search_nodes tool rbspy search_nodes tool RubyGems search_nodes tool Elm search_nodes takeaway Rails leads JS frameworks on Core Web Vitals search_nodes tool Express.js search_nodes tool Fulcro search_nodes tool Action Cable search_nodes tool StimulusReflex search_nodes tool Next.js search_nodes tool Iodine search_nodes tool Preact search_nodes concept Durable Execution search_nodes talk Adventures in durable execution search_nodes tool Durable Objects search_nodes concept Step Execution Record search_nodes tool Restate search_nodes question Long-running automations and sagas search_nodes tool Temporal search_nodes concept Delivery Semantics search_nodes takeaway Tune retry duration to the actor search_nodes concept Saga Pattern search_nodes concept Entity Caching and Snapshotting search_nodes takeaway Eventual Consistency Trade-off search_nodes concept Reservation Pattern search_nodes concept Vector Clock search_nodes question How is the event-write kept consistent with external operations? search_nodes takeaway Immutable Database Raises Mistake Cost search_nodes concept Projector search_nodes tool Sync Space VR search_nodes concept Projection Function search_nodes question Projection freshness and snapshots search_nodes concept Entity Projection search_nodes project Event Store (project) search_nodes concept Idempotent Projectors and Reactors search_nodes tool Speaker Deck search_nodes concept Decider Pattern search_nodes tool aggregate_root search_nodes concept Polymorphic Aggregate search_nodes concept Aggregator search_nodes concept Aggregate Root search_nodes tool decide_rb search_nodes talk Decider Pattern in Ruby Lightning Talk search_nodes takeaway Contribute to Arkency aggregates repository search_nodes concept Nested Aggregates search_nodes concept Aggregate Test Failures search_nodes concept Reactor search_nodes takeaway Per-Event Backups Via Reactors search_nodes tool EventMachine search_nodes concept Embrace The Evented Model search_nodes concept Event Bus search_nodes concept Business Process (Event-to-Command) search_nodes concept Event Handler Error Strategy search_nodes concept Automation Pattern search_nodes resource Ruby parse.y search_nodes tool Polars Ruby search_nodes tool Ruby Packer search_nodes tool Ruby CSV search_nodes takeaway Use existing parser generators and VMs instead of rolling your own search_nodes takeaway Read Ruby source to understand Ruby search_nodes tool Prime (Ruby stdlib) search_nodes talk CSV Parsing Benchmarks search_nodes takeaway Polars Ruby for Fast CSV Parsing search_nodes concept Service Autonomy search_nodes resource Building Microservices search_nodes talk Building uls for microservices search_nodes concept Service-Oriented Architecture search_nodes takeaway Microservices Were Never About HTTP search_nodes takeaway Bounded Contexts Are Natural Microservice Seams search_nodes takeaway Bounded Contexts Are Not Microservices search_nodes takeaway Don't Bring MVC-CRUD Thinking To Services search_nodes question Centralised vs per-service event store? search_nodes tool Oso search_nodes concept Virtual DOM search_nodes concept Immutable Form Runtime API search_nodes tool core-js search_nodes tool Stimulus search_nodes tool MobX search_nodes concept Equivalent Mutation search_nodes concept Event Stream search_nodes concept HTTP Turbo Streams vs WebSocket Turbo Streams search_nodes resource Rocket Real-Time Benchmark search_nodes concept HTTP/2 Server Push search_nodes concept WebSockets search_nodes concept Custom DSL for Specs search_nodes concept Stub Execute Verify search_nodes takeaway Delegate Event-Model-To-Test Translation To LLMs search_nodes takeaway Avoid logic in tests search_nodes concept Logic in Tests search_nodes tool Mockito search_nodes tool Capybara search_nodes concept Time.current Testing Trap search_nodes tool WebMock search_nodes takeaway Treat existing system behavior as a specification search_nodes tool RuboCop search_nodes concept Runtime Types vs Static Types search_nodes tool Steep search_nodes tool Sorbet search_nodes tool sqlite3-ruby search_nodes concept Custom SQLite Functions in Ruby search_nodes concept Branch-Specific SQLite Databases search_nodes tool SQLite search_nodes talk Fantastic Databases and Where to Find Them search_nodes concept Vector Database search_nodes takeaway Add enhanced-sqlite3-adapter for production SQLite on Rails search_nodes concept Database Indexes search_nodes tool sqlpkg search_nodes event Ruby Day search_nodes tool Brotli search_nodes concept Compression Dictionaries search_nodes takeaway Prefer Brotli over gzip when available search_nodes concept Common Table Expression search_nodes tool gzip search_nodes concept HTTP Shared Dictionary Compression search_nodes tool WebP search_nodes tool Babel search_nodes concept Bundle Size Audit search_nodes concept WebAssembly search_nodes concept Data search_nodes company SpaceX search_nodes person Stas search_nodes tool Apollo GraphQL search_nodes tool ruby-asterisk search_nodes concept Ruby Hash as SQL AST search_nodes tool Ruby search_nodes concept Adjacent String Literal Concatenation search_nodes tool Lexer and Parser Generators search_nodes tool Yacc search_nodes concept Reform 3 Parsing Pipeline search_nodes question Fault-tolerant token-by-token parsing for structured output search_nodes concept Sidekiq Middleware search_nodes tool Rack search_nodes tool Rack::Static search_nodes company raceware search_nodes concept Socket Hijacking search_nodes tool JRuby Rack search_nodes tool Faraday search_nodes concept Faraday outbound logging middleware search_nodes talk How to hijack search_nodes concept Rails Is All Or Nothing search_nodes

2 edges