← 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 SalahutdinovauthoredOptimistic ul
context (empty) Dimitry presents the optimistic UI talk at wroclove.rb 2019.
update Optimistic ulpresented_atwroclove.rb 2019
context (empty) Talk delivered at wroclove.rb 2019.
create Dimitry Salahutdinovworks_atAmplifr
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 Salahutdinovworks_onlogux-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 ulaboutOptimistic 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 ulaboutLogux
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 ulaboutlogux-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 ulaboutAmplifr
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 ulaboutRAIL 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 ulaboutOffline-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 ulaboutLast-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 ulaboutLogux 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 ulaboutUndo 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 ulaboutLogux 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 ulaboutEvent 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 ulaboutDistributed 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 ulaboutWebSockets
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 ulaboutRedux
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 ulaboutRuby 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 Sitnikworks_onLogux
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 LoguxusesWebSockets
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 LoguxusesRedux
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 LoguxusesNode.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-railsusesLogux
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-railsusesRuby 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 AmplifrusesLogux
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 AmplifrusesRuby 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 Railsfrom_talkOptimistic 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 RailsaboutLogux
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 Railsaboutlogux-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 SalahutdinovrecommendsLogux
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 ulrelated_toEvents 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 Davydovattendedwroclove.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