← Extractions

Introduction To Event Sourcing: How To Use It With Ruby

Pavel (Paweł Strzałkowski) from Visuality introduces event sourcing at wroclove.rb 2022 using the Eventide toolkit. He walks through core concepts — events vs commands, streams, consumers, handlers, projections, pub/sub — and demos MessageDB on Postgres with an account/deposit/withdraw example and a two-account funds-transfer process.

Model
claude-opus-4-7
Ingestion
8559cee4
Input tokens
739,755
fresh
574,595
cached
152,733
cache write
12,427
Output tokens
14,933
Duration
247.7s
Roundtrips
10
Tool calls
30
Cost
$0.00
Nodes/edges extracted
20 / 46
Read set (nodes/edges)
260 / 5

Nodes (20)

update Introduction To Event Sourcing How To Use It With Ruby talk
attrs {"type" => "talk"} {"date" => "2022-03-11", "type" => "talk"}
description Talk at wroclove.rb 2022. Paweł ('Pavel') Strzałkowski's wroclove.rb 2022 talk introducing event sourcing in Ruby via the Eventide project. Ope...
short_description Talk at wroclove.rb 2022. Pavel's wroclove.rb 2022 introduction to event sourcing in Ruby using the Eventide toolkit.
update Paweł Strzałkowski person
attrs (empty) {"role" => "software developer / consultant", "nationality" => "Polish"}
description Ruby developer building production AI apps with MCP and OAuth. Software developer and consultant at Visuality (a software house in Warsaw / 'Orso'). Interested in domain-driven des...
short_description Ruby developer, AI and MCP. Polish Ruby developer and consultant at Visuality; event sourcing and DDD enthusiast.
create Visuality company
kind (empty) company
name (empty) Visuality
slug (empty) visuality
attrs (empty) {"industry" => "software consultancy", "location" => "Warsaw, Poland"}
description (empty) Software house based in Warsaw ('Orso' in the transcript), where Paweł Strzałkowski works as a software developer / c...
short_description (empty) Polish software house in Warsaw employing Ruby consultants.
create MessageDB tool
kind (empty) tool
name (empty) MessageDB
slug (empty) messagedb
attrs (empty) {"category" => "service"}
description (empty) Event/message store used by the Eventide project. Implemented as a single table on top of PostgreSQL, shipped as a Ru...
short_description (empty) Postgres-backed single-table message store for event sourcing, distributed as a Ruby gem.
create TestBench tool
kind (empty) tool
name (empty) TestBench
slug (empty) testbench
attrs (empty) {"category" => "library"}
description (empty) Test framework shipped with the Eventide project. Usable in any Ruby project, including Rails. Pavel jokes that to us...
short_description (empty) Eventide's opinionated test framework for Ruby, used in place of RSpec.
create Consumer concept
kind (empty) concept
name (empty) Consumer
slug (empty) consumer
attrs (empty) {"category" => "pattern"}
description (empty) In Eventide, a consumer is a long-running process (analogous to a Sidekiq worker) that continually reads messages fro...
short_description (empty) Process that continuously reads messages from a category, dispatches them to handlers, and writes new messages.
create Command Stream concept
kind (empty) concept
name (empty) Command Stream
slug (empty) command-stream
attrs (empty) {"category" => "pattern"}
description (empty) A stream whose messages are the commands requested from a specific entity (e.g. 'command-order-7' contains AddLineIte...
short_description (empty) Stream containing all commands addressed to a particular entity instance.
update Event Stream concept
description Partitioning strategy in event sourcing where events related to a single aggregate (e.g. one order, one ice-cream bus... The most important kind of stream in event sourcing: it contains every event that has happened for an entity (e.g. 'o...
short_description Per-aggregate partition of an event log enabling scoped replay. Stream containing all events produced for a particular entity instance.
create Append-Only Log concept
kind (empty) concept
name (empty) Append-Only Log
slug (empty) append-only-log
attrs (empty) {"category" => "architecture"}
description (empty) Storage pattern underlying event sourcing: events are appended at the end of a log in the order they really happened ...
short_description (empty) Storage model where records are only appended in order, never modified or deleted.
create Pub/Sub Messaging concept
kind (empty) concept
name (empty) Pub/Sub Messaging
slug (empty) pub-sub-messaging
attrs (empty) {"category" => "pattern"}
description (empty) Messaging pattern where publishers write messages to a category (e.g. a stream) without knowing who will consume them...
short_description (empty) Messaging pattern where publishers and subscribers interact only through named categories.
create Don't Lose Data Unintentionally takeaway
kind (empty) takeaway
name (empty) Don't Lose Data Unintentionally
slug (empty) don-t-lose-data-unintentionally
attrs (empty) {"type" => "warning"}
description (empty) Core message of Pavel's talk: if a system can reach a given state through two different paths and you can't tell whic...
short_description (empty) Store every business-relevant change; you can't put a future price on data you never captured.
create Split Reads From Writes With Projections takeaway
kind (empty) takeaway
name (empty) Split Reads From Writes With Projections
slug (empty) split-reads-from-writes-with-projections
attrs (empty) {"type" => "recommendation"}
description (empty) Write to the system via commands that produce events in the event store (source of truth), and read from projections ...
short_description (empty) Project event streams into any read-optimized database to separate writes from reads.
create UI Data Is Never Truly Fresh takeaway
kind (empty) takeaway
name (empty) UI Data Is Never Truly Fresh
slug (empty) ui-data-is-never-truly-fresh
attrs (empty) {"type" => "insight"}
description (empty) When stakeholders insist read models must be instantaneously consistent, remind them that displayed data is already s...
short_description (empty) Business should accept a few seconds of projection lag; fresh data is already stale on display.
create Meaning of the projection sequence number question
kind (empty) question
name (empty) Meaning of the projection sequence number
slug (empty) meaning-of-the-projection-sequence-number
attrs (empty) {"answer_summary" => "It's the event's position within its stream — a version number enabling time travel and step-by...
description (empty) Audience asks what the 'sequence' line in the projection sample code means. Answer: it's the event's position within ...
short_description (empty) Why does the projection code reference an event's position in the stream?
create Projections affecting many streams at once question
kind (empty) question
name (empty) Projections affecting many streams at once
slug (empty) projections-affecting-many-streams-at-once
attrs (empty) {"answer_summary" => "By default a projection operates on one stream. Cross-stream projections are modelable but non-...
description (empty) Audience: if a user change affects all their orders' projections, how is that executed — in parallel, sequentially? A...
short_description (empty) How are projections handled when one action affects multiple order streams?
create GDPR and losing data intentionally question
kind (empty) question
name (empty) GDPR and losing data intentionally
slug (empty) gdpr-and-losing-data-intentionally
attrs (empty) {"answer_summary" => "Keep GDPR-sensitive data in a separate stream that can be dropped, or encrypt and lose the key ...
description (empty) Audience asks how to reconcile immutable events with GDPR 'right to be forgotten'. Answer: design the system so GDPR-...
short_description (empty) How to comply with GDPR when events are immutable?
create Data consciously dropped vs unintentionally lost question
kind (empty) question
name (empty) Data consciously dropped vs unintentionally lost
slug (empty) data-consciously-dropped-vs-unintentionally-lost
attrs (empty) {"answer_summary" => "Agreed in principle, but without discipline teams lose data unintentionally. Event sourcing is ...
description (empty) Audience pushes back that in practice teams consciously decide what to store (for debugging/revenue/legality). Pavel ...
short_description (empty) Isn't it normal to consciously decide what to store and what to drop?
create NoSQL vs Postgres for an event store question
kind (empty) question
name (empty) NoSQL vs Postgres for an event store
slug (empty) nosql-vs-postgres-for-an-event-store
attrs (empty) {"answer_summary" => "Deferred. Event versioning is a broad topic worth a separate conversation."}
description (empty) Audience asks whether a schemaless store (MongoDB, DynamoDB) would be better than Postgres for an event store, given ...
short_description (empty) Would MongoDB or DynamoDB be better than Postgres for storing versioned events?
create How often should projections be rebuilt? question
kind (empty) question
name (empty) How often should projections be rebuilt?
slug (empty) how-often-should-projections-be-rebuilt
attrs (empty) {"answer_summary" => "It's a business decision. Default to near-instant projections; a few seconds of lag is usually ...
description (empty) Audience asks whether every event must end with a projection, and how fresh read models need to be. Answer: it's a bu...
short_description (empty) Does every event have to trigger a projection, and how fresh must read models be?
create Projection freshness and snapshots question
kind (empty) question
name (empty) Projection freshness and snapshots
slug (empty) projection-freshness-and-snapshots
attrs (empty) {"answer_summary" => "Keep streams short; make decisions against freshly-projected write-side state seeded from snaps...
description (empty) Follow-up: how do we know a projection is fresh, and isn't it expensive to reproject from the beginning every time? A...
short_description (empty) How do you avoid reprojecting from the beginning on every decision?

Edges (46)

update Paweł StrzałkowskiauthoredIntroduction To Event Sourcing How To Use It With Ruby
context (empty) Pavel delivered this talk at wroclove.rb 2022.
update Introduction To Event Sourcing How To Use It With Rubypresented_atwroclove.rb 2022
context (empty) Talk given at wroclove.rb 2022.
create Paweł Strzałkowskiworks_atVisuality
attrs (empty) {"role" => "software developer / consultant"}
context (empty) Pavel introduces himself as a software developer / consultant at Visuality.
relation (empty) works_at
source_node_id (empty) c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) 8954f74e-db48-4fe7-a7ad-0438aea232b9
create Paweł Strzałkowskiattendedwroclove.rb 2022
context (empty) Speaker at the 2022 edition.
relation (empty) attended
source_node_id (empty) c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) cfc5cfd3-25a6-46c2-8b5d-626986c71c24
create Paweł Strzałkowskihas_skillEvent Sourcing
attrs (empty) {"level" => "expert"}
context (empty) Pavel states he is extremely interested in event sourcing and uses it professionally.
relation (empty) has_skill
source_node_id (empty) c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Paweł Strzałkowskihas_skillDomain-Driven Design
attrs (empty) {"level" => "intermediate"}
context (empty) Pavel lists DDD as one of his daily interests.
relation (empty) has_skill
source_node_id (empty) c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) 6e2f88bd-e521-41a3-91d4-aeb5f8fd2486
create Paweł Strzałkowskihas_skillEventStorming
context (empty) Pavel cites EventStorming among his interests.
relation (empty) has_skill
source_node_id (empty) c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) f531d860-d7e6-449c-8289-ffa29995f7d1
create Paweł StrzałkowskirecommendsEventide
context (empty) Pavel recommends the Eventide toolkit and Slack community as the way to start with event sourcing in Ruby.
relation (empty) recommends
source_node_id (empty) c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
create Paweł StrzałkowskirecommendsScott Bell
context (empty) Recommends a Scott Bell presentation on writing autonomous services as one of two 'watch this if you take one thing a...
relation (empty) recommends
source_node_id (empty) c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) 1a9bf14a-9bd6-4ad1-b80f-5484b342dd14
create Paweł StrzałkowskirecommendsGreg Young
context (empty) Recommends Greg Young's foundational event sourcing presentations; 'the presentation that got me started'.
relation (empty) recommends
source_node_id (empty) c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) 45e8eebf-faf5-48d2-a2fe-fb21ff38b80a
update Introduction To Event Sourcing How To Use It With RubyaboutEvent Sourcing
context Referenced by Krzywda as Pavel's preceding wroclove.rb 2022 talk where read models were introduced. Central topic: event sourcing as a pattern for storing data in an append-only log.
create Introduction To Event Sourcing How To Use It With RubyaboutEventide
context (empty) All concepts are introduced in the context of the Eventide Ruby toolkit.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
create Introduction To Event Sourcing How To Use It With RubyaboutMessageDB
context (empty) Demos MessageDB install, CLI, interactive test writer and viewer.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 78f59d89-9ba4-40bd-b4b4-1f898046e3fd
create Introduction To Event Sourcing How To Use It With RubyaboutTestBench
context (empty) Mentions TestBench as Eventide's test framework.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 6582919f-afe1-4cd1-9f91-82abad210290
create Introduction To Event Sourcing How To Use It With RubyaboutAppend-Only Log
context (empty) Defines event sourcing as a pattern for storing data in an append-only log.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 55af4712-bf8e-4fbe-82b2-654f0954a14f
create Introduction To Event Sourcing How To Use It With RubyaboutEntity Projection
context (empty) Shows projection code folding events into an Account entity from empty state.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 28ae0d67-fcf9-4a6a-adb3-fb01e56cc520
create Introduction To Event Sourcing How To Use It With RubyaboutRead Model
context (empty) Explains projecting event streams into read models (relational, graph, document).
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) d0fcf0df-1ca2-47f0-b431-8dbac005b44d
create Introduction To Event Sourcing How To Use It With RubyaboutPub/Sub Messaging
context (empty) Describes Eventide's pub/sub via consumers reading from categories.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) b483686a-1e8d-4ccf-bcd3-318d16fb27b3
create Introduction To Event Sourcing How To Use It With RubyaboutConsumer
context (empty) Introduces consumers as long-running processes reading, processing and writing messages.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 86e5c9ef-011c-4506-a10a-8b39b9b9c6b8
create Introduction To Event Sourcing How To Use It With RubyaboutCommand Handler
context (empty) Handlers dispatch messages by type and publish resulting events.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) e72326d6-a168-47a5-a1f7-dea8b50d49e3
create Introduction To Event Sourcing How To Use It With RubyaboutEvents and Commands
context (empty) Distinguishes events (something that happened) from commands (request to do something).
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 772380ce-dd09-4d23-bda6-1acfbec76487
create Introduction To Event Sourcing How To Use It With RubyaboutCommand Stream
context (empty) Shows command-order-7 as the command stream for an order entity.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 0263614c-5688-46bb-bac0-cb64e3761f30
create Introduction To Event Sourcing How To Use It With RubyaboutEvent Stream
context (empty) Introduces the event stream as the source of truth for an entity's state.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 8c314bcf-2bbd-4b0d-b2aa-5cdc649e632d
create Introduction To Event Sourcing How To Use It With RubyaboutSnapshotting
context (empty) Notes snapshots (Eventide default ~100 events) so projections don't replay from the beginning.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 0c37afd4-ec51-45d4-976d-ed8c6e0a7321
create Introduction To Event Sourcing How To Use It With RubyaboutEntity Store
context (empty) Shows Eventide's Entity Store binding an entity class with its projection.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 111a5c90-99c8-44b7-8e32-b25d2b578053
create Introduction To Event Sourcing How To Use It With RubyaboutSaga Pattern
context (empty) The funds-transfer example is effectively a process manager / saga across two account streams.
relation (empty) about
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) b9cda322-dd18-40b0-84d9-b7e002665b86
create EventideusesMessageDB
context (empty) MessageDB is the Postgres-backed message store shipped as part of Eventide.
relation (empty) uses
source_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
target_node_id (empty) 78f59d89-9ba4-40bd-b4b4-1f898046e3fd
create EventideusesPostgreSQL
context (empty) MessageDB is implemented on top of Postgres.
relation (empty) uses
source_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
target_node_id (empty) 46fc2697-69fc-436b-ac82-250ba4370273
create EventideusesTestBench
context (empty) TestBench is Eventide's own test framework.
relation (empty) uses
source_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
target_node_id (empty) 6582919f-afe1-4cd1-9f91-82abad210290
create Nathan Laddworks_onMessageDB
attrs (empty) {"role" => "co-maintainer"}
context (empty) Co-principal of the Eventide project, which ships MessageDB.
relation (empty) works_on
source_node_id (empty) c2047c7c-2316-4c38-af4f-1e8a78f80206
target_node_id (empty) 78f59d89-9ba4-40bd-b4b4-1f898046e3fd
create Scott Bellworks_onMessageDB
attrs (empty) {"role" => "co-maintainer"}
context (empty) Co-maintainer of Eventide's Postgres-backed message store.
relation (empty) works_on
source_node_id (empty) 1a9bf14a-9bd6-4ad1-b80f-5484b342dd14
target_node_id (empty) 78f59d89-9ba4-40bd-b4b4-1f898046e3fd
create Meaning of the projection sequence numberasked_atIntroduction To Event Sourcing How To Use It With Ruby
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) 2a2a95fd-b027-48ad-bb52-1c83e424020d
target_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
create Projections affecting many streams at onceasked_atIntroduction To Event Sourcing How To Use It With Ruby
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) f9559cb4-58d8-4eef-b7bc-39f6dea60080
target_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
create GDPR and losing data intentionallyasked_atIntroduction To Event Sourcing How To Use It With Ruby
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) 60dc595a-19da-47e3-93a4-7946fc299681
target_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
create Data consciously dropped vs unintentionally lostasked_atIntroduction To Event Sourcing How To Use It With Ruby
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) 4e09703c-0434-4037-b879-c3811c5a3e42
target_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
create NoSQL vs Postgres for an event storeasked_atIntroduction To Event Sourcing How To Use It With Ruby
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) 96aeaf59-fbda-42b7-b110-e68bf1ca3097
target_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
create How often should projections be rebuilt?asked_atIntroduction To Event Sourcing How To Use It With Ruby
context (empty) Asked during Q&A.
relation (empty) asked_at
source_node_id (empty) 857c54dd-a6fa-4e09-9f49-bf0763d913e6
target_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
create Projection freshness and snapshotsasked_atIntroduction To Event Sourcing How To Use It With Ruby
context (empty) Follow-up during Q&A.
relation (empty) asked_at
source_node_id (empty) 6aee9d6d-a578-47e3-8278-ce9bc5987dd9
target_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
create Don't Lose Data Unintentionallyfrom_talkIntroduction To Event Sourcing How To Use It With Ruby
context (empty) Core maxim Pavel reiterates: you cannot price data you didn't know you should have stored.
relation (empty) from_talk
source_node_id (empty) ef1d9307-2353-4fac-b61d-bc1a0538250f
target_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
create Split Reads From Writes With Projectionsfrom_talkIntroduction To Event Sourcing How To Use It With Ruby
context (empty) Takeaway from Pavel's account/read-model slide.
relation (empty) from_talk
source_node_id (empty) 35ccd221-1989-4491-adfa-aeeabb37f046
target_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
create UI Data Is Never Truly Freshfrom_talkIntroduction To Event Sourcing How To Use It With Ruby
context (empty) Pavel's answer to the 'how often should we project' Q&A.
relation (empty) from_talk
source_node_id (empty) d84625d8-420c-432d-b397-337737a89c70
target_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
create GDPR and losing data intentionallyaboutEvent Sourcing
context (empty) Asks how immutable event stores reconcile with GDPR right to be forgotten.
relation (empty) about
source_node_id (empty) 60dc595a-19da-47e3-93a4-7946fc299681
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create NoSQL vs Postgres for an event storeaboutMessageDB
context (empty) Compares Postgres-backed MessageDB to NoSQL alternatives for event storage.
relation (empty) about
source_node_id (empty) 96aeaf59-fbda-42b7-b110-e68bf1ca3097
target_node_id (empty) 78f59d89-9ba4-40bd-b4b4-1f898046e3fd
create Projection freshness and snapshotsaboutSnapshotting
context (empty) Asks about Eventide's built-in snapshotting mechanism.
relation (empty) about
source_node_id (empty) 6aee9d6d-a578-47e3-8278-ce9bc5987dd9
target_node_id (empty) 0c37afd4-ec51-45d4-976d-ed8c6e0a7321
create Introduction To Event Sourcing How To Use It With Rubyrelated_toEvents events events
context (empty) Both are introductions to event sourcing in Ruby delivered at wroclove.rb; Pavel's is framed inside Eventide while Da...
relation (empty) related_to
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 43a82c04-35a9-48fe-b93a-b3ab57e5c0be
create Introduction To Event Sourcing How To Use It With Rubyrelated_toEvent Sourcing Anti Patterns and Failures
context (empty) Pavel's talk is the 'introduction' companion to Nathan Ladd's anti-patterns talk in the Eventide ecosystem.
relation (empty) related_to
source_node_id (empty) cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) 1a847342-76f9-432b-a5f5-82154448650d

Read set

260 nodes

concept Event Sourcing search_nodes takeaway Event Sourcing Is Not A Silver Bullet search_nodes takeaway Hiring For Event Sourcing Trade-off search_nodes takeaway Event Sourcing Is About State Not Distribution search_nodes takeaway Event Sourcing Enables Distribution search_nodes concept Snapshotting search_nodes takeaway Event Sourcing Mind Shift Trade-off search_nodes question Can you do DDD without event sourcing? search_nodes question How to persist commands in an event-sourced system? search_nodes question What is an entity? search_nodes tool image_processing gem search_nodes talk Scientific Ruby Lightning Talk search_nodes+list_nodes_by_kind tool TruffleRuby search_nodes tool Representable search_nodes tool Rails 5.2 search_nodes project Ruby Romania search_nodes project imageflow search_nodes tool mini_magick search_nodes talk Orchestrating video transcoding in ruby search_nodes+list_nodes_by_kind tool streamio-ffmpeg search_nodes project Eventide search_nodes talk Events events events search_nodes+list_nodes_by_kind concept Event Store search_nodes concept Event Bus search_nodes takeaway Name Things To Find Their Properties search_nodes concept Undo Event search_nodes tool RealtimeBoard search_nodes concept Command UUID Deduplication search_nodes tool Entity Store search_nodes tool Sonic Pi search_nodes concept Domain-Driven Design search_nodes resource Implementing Domain-Driven Design search_nodes resource Domain-Driven Design: Patterns, Principles and Practices search_nodes resource Domain-Driven Design: Tackling Complexity in the Heart of Software search_nodes talk Might & Magic of Domain-Driven Design search_nodes+list_nodes_by_kind talk The pillars of Domain Driven Design search_nodes+list_nodes_by_kind resource Domain-Driven Rails search_nodes concept DDD Whirlpool search_nodes concept Domain Storytelling search_nodes question Risk of misidentifying domains during legacy re-architecture search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2018 search_nodes talk Mutation testing workshop wroclove.rb 2019 search_nodes+list_nodes_by_kind talk Building LLM powered applications in Ruby search_nodes+list_nodes_by_kind talk Data Management With Ruby search_nodes+get_node_edges+list_nodes_by_kind question Where do you read from without event sourcing? search_nodes person Greg Young search_nodes question What is the biggest challenge with this approach? search_nodes person Nathan Ladd search_nodes concept Read Model search_nodes concept CQRS search_nodes concept Projection Function search_nodes takeaway Don't Conflate Entity, Handler and Projection search_nodes concept Entity Projection search_nodes takeaway Use CQRS And Event Sourcing Independently search_nodes concept Projector search_nodes question Do events store current state, and how does replay perform? search_nodes takeaway Handlers Must Control Their Dependencies search_nodes tool PostgreSQL search_nodes concept Message Store search_nodes tool PgBouncer search_nodes tool DBM / SDBM / GDBM search_nodes tool SQLite search_nodes tool Sequel search_nodes concept Logux Proxy search_nodes takeaway Time Travel Superpower search_nodes talk From PostgreSQL to SQLite in Rails search_nodes+list_nodes_by_kind concept Saga Pattern search_nodes concept Entity Coupled To Messaging search_nodes concept At-Least-Once Plus Idempotence Recipe search_nodes tool Redis search_nodes talk Message Bus Decoupling Lightning Talk search_nodes+list_nodes_by_kind concept Delivery Semantics search_nodes takeaway Use at-least-once plus idempotence to build self-healing systems search_nodes question Deduplicating Jobs For The Same Record search_nodes concept Service Autonomy search_nodes person Scott Bell search_nodes concept GitHub Self-Hosted Runner search_nodes resource Rocket Real-Time Benchmark search_nodes talk Forms Are Dead: Building Agentic Workflows in Ruby search_nodes+list_nodes_by_kind company SpaceX search_nodes concept State Machine search_nodes concept Breadth-First Search for Code Removal search_nodes takeaway Buy Faster Hardware search_nodes tool GitHub Actions search_nodes tool libvips search_nodes tool Preact search_nodes tool WebP search_nodes takeaway Add Fun to Keep Remote Workshops Human search_nodes concept Timeline Visualization search_nodes tool Ruby search_nodes tool ROM search_nodes talk Multi-region data governance in Rails application search_nodes+list_nodes_by_kind takeaway Upgrade Ruby version for free speed search_nodes talk Business logic in Ruby search_nodes+list_nodes_by_kind tool Distributed Ruby search_nodes talk An Introduction to Test Bench search_nodes+list_nodes_by_kind tool test-prof search_nodes tool parallel_tests search_nodes tool Standard RB search_nodes tool Crystal Ball search_nodes tool FactoryBot search_nodes tool power_assert search_nodes question Has Mutant been run against popular Ruby libraries? search_nodes tool minitest search_nodes tool Sync Space VR search_nodes company Transloadit search_nodes tool Tailwind CSS search_nodes tool FFmpeg search_nodes concept EventStorming search_nodes resource Introducing EventStorming search_nodes concept Remote EventStorming Split-Merge Structure search_nodes question Asynchronous EventStorming Experience search_nodes takeaway Stickies Translate Directly To Code search_nodes question Convincing Developers to Participate in EventStorming search_nodes person Adam Okoń search_nodes tool jq search_nodes tool Rust search_nodes talk Event Sourcing and Actor model in Ruby search_nodes+list_nodes_by_kind talk Introduction To Event Sourcing How To Use It With Ruby search_nodes+list_nodes_by_kind+get_node_edges talk Event Sourcing Anti Patterns and Failures search_nodes+list_nodes_by_kind talk Applying CQRS & Event Sourcing on Rails applications search_nodes+list_nodes_by_kind tool Ruby Event Store search_nodes resource Rails Architect Master Class search_nodes talk 10 Things You Never Wanted To Know About Reform 3 list_nodes_by_kind talk 18 months of using hotwire and viewcomponent in production list_nodes_by_kind talk Accidentally building a neural network — A Ruby product recommendation journey list_nodes_by_kind talk Adventures in durable execution list_nodes_by_kind talk Better WebPerformance with Rails list_nodes_by_kind talk Beyond the current state Time travel to the rescue! list_nodes_by_kind talk Building a Production-Ready AI App: MCP & OAuth on Rails list_nodes_by_kind talk Building Beautiful UIs with Ruby A Rails-Native Approach list_nodes_by_kind talk Building on Bluesky's AT Protocol with Ruby list_nodes_by_kind talk Building Rails SPAs in Frontend Ruby with Glimmer DSL for Web list_nodes_by_kind talk Building uls for microservices list_nodes_by_kind talk Cables! Cables! Cables! list_nodes_by_kind talk Component Driven UI with ViewComponent list_nodes_by_kind+search_nodes talk Configuration Again Lightning Talk list_nodes_by_kind talk Counterintuitive Rails pt. 1 list_nodes_by_kind talk Counterintuitive Rails pt. 2 list_nodes_by_kind talk Dealing With A Project's Complexity In A Changing Environment list_nodes_by_kind talk Debug like a scientist list_nodes_by_kind talk Developer, Programmer, and AI list_nodes_by_kind+search_nodes talk Development with axioms list_nodes_by_kind talk Devise pitfalls and way to tighten security list_nodes_by_kind talk Doctrine of Useful Objects Separate Fact from Fiction in OOD list_nodes_by_kind talk Enterprise Rails Panel list_nodes_by_kind talk Ethereum Smart Contracts Lightning Talk list_nodes_by_kind talk Ever shorter feedback loop list_nodes_by_kind+search_nodes talk Extracting logic from templates with Hanami Views list_nodes_by_kind talk FaaS for Ruby Lightning Talk list_nodes_by_kind talk Fantastic Databases and Where to Find Them list_nodes_by_kind talk Fix Production Bugs 20x Faster list_nodes_by_kind talk From open source to IPO list_nodes_by_kind talk Functional Programming as Naming Lightning Talk list_nodes_by_kind talk Gaming With Ruby and VMs Lightning Talk list_nodes_by_kind talk Gregorian Calendar list_nodes_by_kind talk Grokking FP For The Practicing Rubyist list_nodes_by_kind talk Handling file uploads for modern developer list_nodes_by_kind talk How (and why) to run SQLite in production list_nodes_by_kind talk How I brought LCP down to under 350 ms list_nodes_by_kind talk How To Ensure Systems Do What We Want And Take Care Of Themselves list_nodes_by_kind talk How to hijack list_nodes_by_kind talk How To Package A Rails Engine Generation To Automation list_nodes_by_kind talk How wroclove.rb impacts developers and companies list_nodes_by_kind talk International cooperation in IT teams list_nodes_by_kind talk Introducing Sorbet into your Ruby codebase list_nodes_by_kind talk Is the monolith a problem list_nodes_by_kind talk It is not so bad, after all list_nodes_by_kind talk JavaScript and Frontend Panel list_nodes_by_kind talk JRuby: Professional-Grade Ruby list_nodes_by_kind talk Kamal is not harder than your PaaS list_nodes_by_kind talk LATERAL Joins Rails Performance Lightning Talk list_nodes_by_kind talk Lightning Talk on Email Leaks and Senior Developer Titles list_nodes_by_kind+search_nodes talk Methods Gem for Ruby Method References list_nodes_by_kind talk Mutant on steroids list_nodes_by_kind talk MVCC for Ruby developers list_nodes_by_kind talk My core skill never was the typing list_nodes_by_kind talk Native apps are dead, long live native apps list_nodes_by_kind talk Next Token! list_nodes_by_kind talk Nightmare neighbours caveats of Rails based mutlitenancy list_nodes_by_kind talk No-build Utopia: Modern User Experiences with Rails & Web Standards list_nodes_by_kind talk No 'Pundit' Intended list_nodes_by_kind talk Offline Sandwich Focus Workflow list_nodes_by_kind talk One machine please, make it Turing list_nodes_by_kind talk On the tasteful journey to Yippee list_nodes_by_kind talk Optimistic ul list_nodes_by_kind talk Optimizing performance in Rails apps with GraphQL layer list_nodes_by_kind talk Outdated Browser Detection list_nodes_by_kind talk Performance of Distributed Applications list_nodes_by_kind+search_nodes talk Prevent account sharing list_nodes_by_kind talk Reforging (or rather rebrewing) the support for open-source list_nodes_by_kind talk Removing Code with Breadth-First Search list_nodes_by_kind talk Rewrite with confidence list_nodes_by_kind talk Rubyana Gems and the Ractorous Rubetta Stones! list_nodes_by_kind talk Ruby has literally always had types list_nodes_by_kind talk Ruby on a $4 Computer list_nodes_by_kind talk Ruby Rendezvous Method Call, Proc, and Beyond list_nodes_by_kind talk Ruby Standard Library Hidden Gems Lightning Talk list_nodes_by_kind talk Securing Rails applications list_nodes_by_kind talk Setup and operation of mutation testing in agentic world list_nodes_by_kind talk Sidekiq Batches Lightning Talk list_nodes_by_kind+search_nodes talk Sonic Pi Music Performance list_nodes_by_kind talk Spice up your life with eql list_nodes_by_kind talk SUPER AIN'T SUPER From OOP To FP and Beyond! list_nodes_by_kind talk Testing Randomness list_nodes_by_kind talk The Curse of Service Object list_nodes_by_kind talk The good, the bad and the remote — collaborative domain modeling with EventStorming list_nodes_by_kind talk Toolbelt of a Seasoned Bug Hunter list_nodes_by_kind talk To Refine or Not to Refine list_nodes_by_kind talk Towards the post framework future list_nodes_by_kind talk Typical DDDomains In Rails Apps list_nodes_by_kind talk Understanding coupling list_nodes_by_kind talk Under The Hood And On The Surface Of Sidekiq list_nodes_by_kind+search_nodes talk UringMachine — High Performance Concurrency for Ruby Using io_uring list_nodes_by_kind talk Webmock unmocked list_nodes_by_kind talk When REST is Not Enough: Implementing Alternative Protocols in Ruby on Rails list_nodes_by_kind talk Why I Like Mentoring Lightning Talk list_nodes_by_kind talk Working with RailsEventStore in Cashflow Management System list_nodes_by_kind talk Write a Blog Lightning Talk list_nodes_by_kind person Paweł Strzałkowski search_nodes concept Developer vs Programmer search_nodes takeaway Be kind and build useful things search_nodes resource Better Software Design podcast search_nodes person Julik Tarkhanov search_nodes company Pragmatic Bookshelf search_nodes company YouTube search_nodes concept Command Handler search_nodes concept Command Bus search_nodes question When is a command considered processed? search_nodes takeaway Reuse Command Model Aggregate For Response search_nodes concept Command Form search_nodes concept Event Handler Error Strategy search_nodes concept Events and Commands search_nodes takeaway Action Cable Crowded-Channel Trade-off search_nodes project AnyCable search_nodes project rails_event_store/ecommerce search_nodes concept Rails Testing Pyramid (Ivan's version) search_nodes tool Cells search_nodes tool Rails Event Store Event Browser search_nodes takeaway Immutable Database Raises Mistake Cost search_nodes question How do you search across millions of events for top items? search_nodes tool rails_event_store search_nodes project Event Store (project) search_nodes tool Sidekiq search_nodes concept Sidekiq Batches search_nodes question Scaling Sidekiq Elastically search_nodes takeaway Prefer Small Sidekiq Jobs search_nodes concept Sidekiq Middleware search_nodes takeaway Keep Sidekiq Job Parameters Simple search_nodes question Sidekiq And Redis Cluster search_nodes question Application-Level Back Pressure For Sidekiq search_nodes concept Progressive Web Apps search_nodes person Paweł Pokrywka search_nodes concept Live Reload search_nodes

5 edges