← Extractions

Optimistic UI with Logux — wroclove.rb 2019

Dimitry Salahutdinov (backend developer at Amplifr) presents Logux, a framework for building optimistic UIs over WebSockets that treats client and server as components of a distributed system. He explains the motivation for optimistic UI, challenges with network/server errors and merge conflicts, and demos the Logux Ruby gem integrating with Rails through a Logux proxy.

Model
claude-opus-4-7
Ingestion
7f2fe111
Input tokens
398,140
fresh
299,503
cached
93,759
cache write
4,878
Output tokens
10,085
Duration
175.2s
Roundtrips
11
Tool calls
25
Cost
$0.00
Nodes/edges extracted
15 / 33
Read set (nodes/edges)
132 / 3

Nodes (15)

update Dimitry Salahutdinov person
attrs (empty) → {"role" => "backend developer", "location" => "Russia"}
description Conference speaker. → Backend developer from the middle of Russia, family man with three kids, doing open-source work after midnight. Works...
short_description Conference speaker. → Backend developer at Amplifr; speaker on optimistic UI and Logux.
update Optimistic ul talk
description Talk at wroclove.rb 2019. → Talk at wroclove.rb 2019 by Dimitry Salahutdinov. Argues that spinners upset users and that UIs should optimistically...
short_description Talk at wroclove.rb 2019. → Dimitry Salahutdinov's wroclove.rb 2019 talk on optimistic UI with Logux.
create Amplifr company
kind (empty) → company
name (empty) → Amplifr
slug (empty) → amplifr
attrs (empty) → {"industry" => "social media automation"}
description (empty) → Social content automation service providing business with content workflow, scheduling, and analytics. Originally a p...
short_description (empty) → Social content automation service for workflow, scheduling, and analytics.
create Logux tool
kind (empty) → tool
name (empty) → Logux
slug (empty) → logux
attrs (empty) → {"category" => "framework"}
description (empty) → Framework invented by Andrey Sitnik for building optimistic, real-time web UIs. Treats modern web apps as distributed...
short_description (empty) → Framework for optimistic, real-time UI treating client and server as a distributed system.
create Andrey Sitnik person
kind (empty) → person
name (empty) → Andrey Sitnik
slug (empty) → andrey-sitnik
description (empty) → Inventor of the Logux framework for optimistic UI and real-time web applications. Mentioned by Dimitry Salahutdinov a...
short_description (empty) → Creator of the Logux framework.
create logux-rails project
kind (empty) → project
name (empty) → logux-rails
slug (empty) → logux-rails
attrs (empty) → {"status" => "active", "license" => "open-source"}
description (empty) → Ruby gem created at Amplifr to integrate Logux with Rails. Easy to configure (set the Logux proxy back URL and mount ...
short_description (empty) → Ruby gem integrating Logux with Ruby on Rails applications.
create Optimistic UI concept
kind (empty) → concept
name (empty) → Optimistic UI
slug (empty) → optimistic-ui
attrs (empty) → {"category" => "pattern"}
description (empty) → UI pattern in which the interface changes state immediately upon user action — e.g. flipping the submit button into s...
short_description (empty) → UI pattern that immediately reflects success, assuming most requests will succeed.
create Redux tool
kind (empty) → tool
name (empty) → Redux
slug (empty) → redux
attrs (empty) → {"category" => "library"}
description (empty) → JavaScript library for managing application state via dispatched actions against a central store. Logux's client wrap...
short_description (empty) → JavaScript state container where actions are dispatched to a central store.
create RAIL Performance Model concept
kind (empty) → concept
name (empty) → RAIL Performance Model
slug (empty) → rail-performance-model
attrs (empty) → {"category" => "practice"}
description (empty) → Google's user-centric performance model that aims developers to ensure UI quality. Dimitry Salahutdinov cites its fin...
short_description (empty) → Google user-centric performance model with a 100ms UI response budget.
create Offline-First concept
kind (empty) → concept
name (empty) → Offline-First
slug (empty) → offline-first
attrs (empty) → {"category" => "practice"}
description (empty) → Design approach that treats brief offline periods as the norm rather than an exception, queueing local changes and sy...
short_description (empty) → Design approach treating the network as optional and intermittently available.
create Last-Write-Wins concept
kind (empty) → concept
name (empty) → Last-Write-Wins
slug (empty) → last-write-wins
attrs (empty) → {"category" => "pattern"}
description (empty) → Simple conflict-resolution strategy for concurrent edits: the latest-timestamped write wins and earlier changes are n...
short_description (empty) → Conflict-resolution strategy keeping only the most recent write to a field.
create Logux Proxy concept
kind (empty) → concept
name (empty) → Logux Proxy
slug (empty) → logux-proxy
attrs (empty) → {"category" => "architecture"}
description (empty) → Logux component that forwards all incoming events over HTTP, letting any backend (e.g. Ruby/Rails) consume them and p...
short_description (empty) → Two-way HTTP gateway forwarding Logux events between Logux server and backend.
create Undo Event concept
kind (empty) → concept
name (empty) → Undo Event
slug (empty) → undo-event
attrs (empty) → {"category" => "pattern"}
description (empty) → Special Logux event used to handle server-side errors in optimistic UI. When the backend rejects an action, it emits ...
short_description (empty) → Logux event rolling back an optimistic change when the server reports an error.
create Logux Time-Shift Ordering concept
kind (empty) → concept
name (empty) → Logux Time-Shift Ordering
slug (empty) → logux-time-shift-ordering
attrs (empty) → {"category" => "architecture"}
description (empty) → Logux's approach to event ordering without a global clock. The client computes a time shift as the difference between...
short_description (empty) → Ordering events via server/client time-shift and a per-client incrementing counter.
create Use Logux for optimistic UI with Rails takeaway
kind (empty) → takeaway
name (empty) → Use Logux for optimistic UI with Rails
slug (empty) → use-logux-for-optimistic-ui-with-rails
attrs (empty) → {"type" => "recommendation"}
description (empty) → Logux is a suitable framework for optimistic UI that ships features of the modern web — live updates, offline-first, ...
short_description (empty) → Logux integrates with existing Rails apps to deliver optimistic, real-time UIs.

Edges (33)

update Dimitry Salahutdinov → authored → Optimistic ul
context (empty) → Dimitry presents the optimistic UI talk at wroclove.rb 2019.
update Optimistic ul → presented_at → wroclove.rb 2019
context (empty) → Talk delivered at wroclove.rb 2019.
create Dimitry Salahutdinov → works_at → Amplifr
attrs (empty) → {"role" => "backend developer"}
context (empty) → Introduces himself as a backend developer at Amplifr, a social content automation service.
relation (empty) → works_at
source_node_id (empty) → 0b82db04-c512-4b80-8215-81850885d850
target_node_id (empty) → 69c7cbe1-8655-45e1-87ba-eb7e1a61a00a
create Dimitry Salahutdinov → works_on → logux-rails
attrs (empty) → {"role" => "creator"}
context (empty) → Created the Ruby gem at Amplifr to integrate Logux with Rails.
relation (empty) → works_on
source_node_id (empty) → 0b82db04-c512-4b80-8215-81850885d850
target_node_id (empty) → 643047cb-aec1-4387-89ee-590658acbe87
create Optimistic ul → about → Optimistic UI
context (empty) → Central topic of the talk.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → 2c94f291-e91e-4255-8915-1c45aaec6d64
create Optimistic ul → about → Logux
context (empty) → Talk introduces Logux as the framework for building optimistic UIs.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → 6c47c3b3-dfd2-471e-8a80-1b3ee37e88ca
create Optimistic ul → about → logux-rails
context (empty) → Demonstrates the logux-rails Ruby gem for Rails integration.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → 643047cb-aec1-4387-89ee-590658acbe87
create Optimistic ul → about → Amplifr
context (empty) → Uses Amplifr features (project rename, post discussion, currency rate updates) as demos.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → 69c7cbe1-8655-45e1-87ba-eb7e1a61a00a
create Optimistic ul → about → RAIL Performance Model
context (empty) → Cites Google's RAIL model's 100ms response budget to motivate optimistic UI.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → 37601a36-0c32-4981-85fc-7fdbc2c7d9ad
create Optimistic ul → about → Offline-First
context (empty) → Discusses being offline as a recurring short-duration reality and Logux's offline support.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → e401a869-8d28-4477-adff-d0b8aa229996
create Optimistic ul → about → Last-Write-Wins
context (empty) → Explains Logux's automatic conflict resolution strategy.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → c948d07c-5bea-4ba1-b7cd-6a4c457c438c
create Optimistic ul → about → Logux Proxy
context (empty) → Covers the Logux proxy component for integrating any backend over HTTP.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → f7dbcaeb-00d5-4ec9-850b-f645bef914b7
create Optimistic ul → about → Undo Event
context (empty) → Explains Logux's undo-event mechanism for server-error rollback.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → 92f54a79-3b40-4249-9287-39751674827d
create Optimistic ul → about → Logux Time-Shift Ordering
context (empty) → Explains Logux's time-shift plus counter approach to event ordering.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → 04b2e7cb-4da3-482c-8dfc-22c83503ba57
create Optimistic ul → about → Event Sourcing
context (empty) → Introduces event sourcing as a computer-science idea underlying Logux's approach.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → 687c9da2-de87-4fb2-a758-c7498f394fd5
create Optimistic ul → about → Distributed Systems
context (empty) → Frames modern web apps as distributed systems whose clients/servers synchronize messages.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → 9dc18c33-b8cf-4660-b9c6-c7597a746b99
create Optimistic ul → about → WebSockets
context (empty) → Logux builds on WebSockets for real-time bi-directional communication.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → aed5cd48-754d-4e28-81ee-a14e040adf2b
create Optimistic ul → about → Redux
context (empty) → Logux client wraps Redux with a compatible API.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → a68b3e41-37fd-4690-8a5a-2996adf91c74
create Optimistic ul → about → Ruby on Rails
context (empty) → Talk focuses on integrating Logux with existing Rails backends.
relation (empty) → about
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Andrey Sitnik → works_on → Logux
attrs (empty) → {"role" => "creator"}
context (empty) → Invented the Logux framework.
relation (empty) → works_on
source_node_id (empty) → 74613628-553b-4e86-a4c7-cbf2ddec6923
target_node_id (empty) → 6c47c3b3-dfd2-471e-8a80-1b3ee37e88ca
create Logux → uses → WebSockets
context (empty) → Logux uses WebSockets for real-time data transfer between server and client.
relation (empty) → uses
source_node_id (empty) → 6c47c3b3-dfd2-471e-8a80-1b3ee37e88ca
target_node_id (empty) → aed5cd48-754d-4e28-81ee-a14e040adf2b
create Logux → uses → Redux
context (empty) → Logux client wraps Redux with a compatible API for state synchronization.
relation (empty) → uses
source_node_id (empty) → 6c47c3b3-dfd2-471e-8a80-1b3ee37e88ca
target_node_id (empty) → a68b3e41-37fd-4690-8a5a-2996adf91c74
create Logux → uses → Node.js
context (empty) → Logux reference implementation (server and client) is written with Node.js.
relation (empty) → uses
source_node_id (empty) → 6c47c3b3-dfd2-471e-8a80-1b3ee37e88ca
target_node_id (empty) → 9aeec77e-7dee-4054-85fe-541434a0d272
create logux-rails → uses → Logux
context (empty) → Gem plugs a Rails backend into Logux via the Logux proxy.
relation (empty) → uses
source_node_id (empty) → 643047cb-aec1-4387-89ee-590658acbe87
target_node_id (empty) → 6c47c3b3-dfd2-471e-8a80-1b3ee37e88ca
create logux-rails → uses → Ruby on Rails
context (empty) → Integrates Logux with Ruby on Rails applications.
relation (empty) → uses
source_node_id (empty) → 643047cb-aec1-4387-89ee-590658acbe87
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Amplifr → uses → Logux
context (empty) → Amplifr integrates Logux with its Rails backend for optimistic UI and live updates.
relation (empty) → uses
source_node_id (empty) → 69c7cbe1-8655-45e1-87ba-eb7e1a61a00a
target_node_id (empty) → 6c47c3b3-dfd2-471e-8a80-1b3ee37e88ca
create Amplifr → uses → Ruby on Rails
context (empty) → Amplifr's backend is a Rails application.
relation (empty) → uses
source_node_id (empty) → 69c7cbe1-8655-45e1-87ba-eb7e1a61a00a
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Use Logux for optimistic UI with Rails → from_talk → Optimistic ul
context (empty) → Concluding recommendation of the talk.
relation (empty) → from_talk
source_node_id (empty) → 07ceaa9e-b358-499c-9fe5-82d68ce6cead
target_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
create Use Logux for optimistic UI with Rails → about → Logux
context (empty) → Recommends Logux as a suitable framework for optimistic UI.
relation (empty) → about
source_node_id (empty) → 07ceaa9e-b358-499c-9fe5-82d68ce6cead
target_node_id (empty) → 6c47c3b3-dfd2-471e-8a80-1b3ee37e88ca
create Use Logux for optimistic UI with Rails → about → logux-rails
context (empty) → Highlights the Ruby gem as the integration point with Rails.
relation (empty) → about
source_node_id (empty) → 07ceaa9e-b358-499c-9fe5-82d68ce6cead
target_node_id (empty) → 643047cb-aec1-4387-89ee-590658acbe87
create Dimitry Salahutdinov → recommends → Logux
context (empty) → Recommends Logux as a suitable framework for optimistic UI with modern-web features.
relation (empty) → recommends
source_node_id (empty) → 0b82db04-c512-4b80-8215-81850885d850
target_node_id (empty) → 6c47c3b3-dfd2-471e-8a80-1b3ee37e88ca
create Optimistic ul → related_to → Events events events
context (empty) → Dimitry points to Anton Davydov's next-day event-sourcing talk for a deeper dive.
relation (empty) → related_to
source_node_id (empty) → 35d4eb9f-69d5-456d-b0a9-7a30230fc683
target_node_id (empty) → 43a82c04-35a9-48fe-b93a-b3ab57e5c0be
create Anton Davydov → attended → wroclove.rb 2019
context (empty) → Gave the following day's event-sourcing talk referenced by Dimitry.
relation (empty) → attended
source_node_id (empty) → 1e0f75d3-87ae-490e-b066-1ba0f800bec7
target_node_id (empty) → 8bcc988a-785d-4dfa-a063-1daa7ba349c0

Read set

132 nodes

concept Distributed Systems search_nodes concept Vector Clock search_nodes takeaway Silver Bullet Anti-Pattern search_nodes talk Optimistic ul search_nodes+get_node_edges concept Sometimes Nothing Is Enough search_nodes concept Embrace The Evented Model search_nodes concept Virtual DOM search_nodes concept Stalling For Time search_nodes question Does per-field validation blow up UI complexity? search_nodes tool Uppy search_nodes concept Command Form search_nodes concept View-Biased Event Schemas search_nodes tool MobX search_nodes project Ruby Romania search_nodes person Adam Okoń search_nodes person Julik Tarkhanov search_nodes takeaway Buy Faster Hardware search_nodes concept Developer vs Programmer search_nodes concept GitHub Self-Hosted Runner search_nodes takeaway Be kind and build useful things search_nodes tool reviewdog search_nodes tool GraphQL search_nodes talk Developer, Programmer, and AI search_nodes concept Task-Driven UI search_nodes tool Preact search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2026 search_nodes talk Building LLM powered applications in Ruby search_nodes talk Towards the post framework future search_nodes talk Mutation testing workshop wroclove.rb 2019 search_nodes talk Data Management With Ruby search_nodes concept Reactive Programming search_nodes tool React search_nodes concept Current State search_nodes concept Idempotent Projectors and Reactors search_nodes concept State Machine search_nodes talk Business logic in Ruby search_nodes concept CSS-in-JS search_nodes concept Event Sourcing search_nodes concept Event Store search_nodes takeaway Use CQRS And Event Sourcing Independently search_nodes takeaway Hiring For Event Sourcing Trade-off search_nodes concept Snapshotting search_nodes takeaway Event Sourcing Mind Shift Trade-off search_nodes question How to persist commands in an event-sourced system? search_nodes takeaway Event Sourcing Enables Distribution search_nodes question What is an entity? search_nodes question Can you do DDD without event sourcing? search_nodes concept WebSockets search_nodes resource Rocket Real-Time Benchmark search_nodes concept Real-time Web Applications search_nodes concept Zero-Disconnect Deployment search_nodes tool Action Cable search_nodes project AnyCable search_nodes talk Cables! Cables! Cables! search_nodes question VNC↔WebSocket frame translation search_nodes takeaway Start with Action Cable, switch when performance hurts search_nodes takeaway Extract the slow server out of Ruby search_nodes tool Ruby on Rails search_nodes concept Cynefin Framework search_nodes tool Ember.js search_nodes project monolith framework search_nodes tool Rack search_nodes tool Discourse search_nodes tool Active Admin search_nodes tool Ruby search_nodes tool Heroku search_nodes question What is the biggest challenge with this approach? search_nodes talk Introduction To Event Sourcing How To Use It With Ruby search_nodes question Where do you read from without event sourcing? search_nodes talk Event Sourcing and Actor model in Ruby search_nodes takeaway Act as a perfect tool on reviews search_nodes company Transloadit search_nodes tool Release Drafter search_nodes takeaway Name Things To Find Their Properties search_nodes talk Offline Sandwich Focus Workflow search_nodes tool webpagetest.org search_nodes tool PR Labeler search_nodes concept Unique Per-Site Email Leak Detection search_nodes takeaway Adopt CSS-in-JS for modern component-based frontends search_nodes tool Elm search_nodes tool Fulcro search_nodes tool jsbundling-rails search_nodes tool Node.js search_nodes tool Electron search_nodes tool TypeScript search_nodes tool Babel search_nodes tool nginx search_nodes tool Iodine search_nodes tool PureScript search_nodes takeaway Sign serverlessforruby.org petition search_nodes person Dimitry Salahutdinov search_nodes person Anton Davydov search_nodes+get_node_edges person Sergey Sergyenko search_nodes concept Command UUID Deduplication search_nodes concept Direct Upload to Cloud search_nodes concept tus protocol search_nodes tool jq search_nodes takeaway Contribute to Arkency aggregates repository search_nodes tool aggregate_root search_nodes talk Events events events search_nodes tool RealtimeBoard search_nodes resource Short Ruby Newsletter search_nodes project Petri Nets Performance Prediction Gem search_nodes talk Performance of Distributed Applications search_nodes concept Waterfall Analysis search_nodes concept Page Load Time Budget search_nodes talk Better WebPerformance with Rails search_nodes talk Toolbelt of a Seasoned Bug Hunter search_nodes takeaway Replay-Based Debugging search_nodes talk When REST is Not Enough: Implementing Alternative Protocols in Ruby on Rails search_nodes question How do you order events across distributed systems? search_nodes takeaway Eventual Consistency Trade-off search_nodes concept Eventual Consistency search_nodes talk Adventures in durable execution search_nodes concept Reservation Pattern search_nodes concept Entity Caching and Snapshotting search_nodes question Isn't the dry-container recipe global state? search_nodes tool dry-container search_nodes concept Progressive Web Apps search_nodes takeaway Time Travel Superpower search_nodes tool Tailwind CSS search_nodes tool esbuild search_nodes concept Live Reload search_nodes takeaway Share Browser-Support Config Across Front-End And Back-End search_nodes tool Browserslist search_nodes talk Building uls for microservices search_nodes

3 edges