← Extractions

Smuggling, hijacking and proxying remote console sockets with Rack and Ruby

David Halasz's wroclove.rb 2019 talk on how ManageIQ implements in-browser VNC remote consoles in Ruby, covering blocking vs non-blocking socket I/O, epoll, Rack socket hijacking for WebSocket upgrades, and a proof-of-concept 'PURR' protocol that downgrades an HTTP upgrade to raw TCP to tunnel VNC/SSH to a native desktop client.

Model
claude-opus-4-7
Ingestion
78c3c03e
Input tokens
126,516
fresh
67,966
cached
50,929
cache write
7,621
Output tokens
10,030
Duration
141.0s
Roundtrips
5
Tool calls
15
Cost
$0.00
Nodes/edges extracted
29 / 44
Read set (nodes/edges)
77 / 3

Nodes (29)

update David Halasz person
attrs (empty) → {"location" => "Brno, Czech Republic", "nationality" => "Hungarian", "twitter_handle" => "(mentioned on slide)"}
description Conference speaker. → Hungarian-born Ruby developer living in Brno, Czech Republic. Works at Red Hat on the ManageIQ project, mostly on in-...
short_description Conference speaker. → Red Hat engineer working on ManageIQ in-browser remote consoles.
update How to hijack talk
attrs {"type" => "talk"} → {"type" => "talk", "full_title" => "Smuggling, hijacking and proxying in-browser remote console sockets with Rack and...
description Talk at wroclove.rb 2019. → wroclove.rb 2019 talk by David Halasz titled 'Smuggling, hijacking and proxying in-browser remote console sockets wit...
short_description Talk at wroclove.rb 2019. → Talk on smuggling, hijacking and proxying remote-console sockets in Ruby/Rack.
create Red Hat company
kind (empty) → company
name (empty) → Red Hat
slug (empty) → red-hat
attrs (empty) → {"industry" => "open-source software"}
description (empty) → Open-source software company where David Halasz works on ManageIQ. New hires go to an orientation where they can pick...
short_description (empty) → Open-source software company; employer of the speaker.
create ManageIQ project
kind (empty) → project
name (empty) → ManageIQ
slug (empty) → manageiq
attrs (empty) → {"mascot" => "George", "status" => "active", "license" => "open-source", "language" => "Ruby/Rails"}
description (empty) → Open-source hybrid cloud infrastructure management platform maintained by Red Hat. Written in Ruby on Rails with over...
short_description (empty) → Open-source hybrid cloud and virtualization management platform.
create VNC concept
kind (empty) → concept
name (empty) → VNC
slug (empty) → vnc
attrs (empty) → {"category" => "protocol"}
description (empty) → Remote Desktop protocol used by ManageIQ to expose VM consoles. Hypervisors such as VMware and VirtualBox expose a VN...
short_description (empty) → Remote desktop protocol providing access to a graphical session.
update WebSockets concept
description Protocol underlying real-time web apps such as chat. Action Cable speaks WebSockets only, which excludes a small perc... → HTTP-upgraded bi-directional protocol (HTTP/1.1, not HTTP/2). Established via an HTTP GET with an Upgrade header to w...
create Blocking I/O concept
kind (empty) → concept
name (empty) → Blocking I/O
slug (empty) → blocking-i-o
attrs (empty) → {"category" => "pattern"}
description (empty) → Traditional socket I/O model: read/write operations block the calling thread until the OS buffer has space (write) or...
short_description (empty) → I/O model where reads/writes wait for the OS buffer to be ready.
create Non-blocking I/O concept
kind (empty) → concept
name (empty) → Non-blocking I/O
slug (empty) → non-blocking-i-o
attrs (empty) → {"category" => "pattern"}
description (empty) → I/O model where read_nonblock/write_nonblock return immediately; when not ready they raise IO::WaitReadable/WaitWrita...
short_description (empty) → Socket I/O that returns immediately with EAGAIN/EWOULDBLOCK instead of blocking.
create Bouncing Select concept
kind (empty) → concept
name (empty) → Bouncing Select
slug (empty) → bouncing-select
attrs (empty) → {"category" => "pattern"}
description (empty) → Technique David Halasz devised for writing a non-blocking bidirectional socket proxy on top of IO.select. Sockets rea...
short_description (empty) → Dynamic-array IO.select pattern to avoid spin-lock in bidirectional proxies.
create IO.select concept
kind (empty) → concept
name (empty) → IO.select
slug (empty) → io-select
attrs (empty) → {"category" => "practice"}
description (empty) → Ruby method that calls the POSIX select syscall to wait for sockets to become ready for reading or writing. Not ideal...
short_description (empty) → Ruby wrapper over the POSIX select system call.
create epoll concept
kind (empty) → concept
name (empty) → epoll
slug (empty) → epoll
attrs (empty) → {"category" => "architecture", "platform" => "Linux"}
description (empty) → Linux kernel facility that splits select into two calls — one to register sockets and one to wait — avoiding the per-...
short_description (empty) → Linux scalable I/O event notification mechanism.
create kqueue concept
kind (empty) → concept
name (empty) → kqueue
slug (empty) → kqueue
attrs (empty) → {"category" => "architecture", "platform" => "BSD/macOS"}
description (empty) → BSD/macOS equivalent of Linux epoll. David Halasz's proxy library falls back to IO.select bouncing on macOS and invit...
short_description (empty) → BSD/macOS scalable event notification mechanism analogous to epoll.
create Socket Hijacking concept
kind (empty) → concept
name (empty) → Socket Hijacking
slug (empty) → socket-hijacking
attrs (empty) → {"category" => "pattern"}
description (empty) → Rack feature that lets an application grab the raw TCP socket behind an HTTP request and escape the normal request/re...
short_description (empty) → Rack mechanism to take over the raw socket behind a request.
create PURR project
kind (empty) → project
name (empty) → PURR
slug (empty) → purr
attrs (empty) → {"status" => "active", "license" => "open-source"}
description (empty) → Experimental protocol by David Halasz standing for 'Protocol Upgrade Raw Request'. Mirrors the WebSocket handshake — ...
short_description (empty) → Protocol Upgrade Raw Request — tunnel TCP through an HTTP upgrade.
create Puma tool
kind (empty) → tool
name (empty) → Puma
slug (empty) → puma
attrs (empty) → {"category" => "service"}
description (empty) → Concurrent Rack web server used by David Halasz to run the PURR demo server.
short_description (empty) → Concurrent Rack-compatible Ruby web server.
create EventMachine tool
kind (empty) → tool
name (empty) → EventMachine
slug (empty) → eventmachine
attrs (empty) → {"category" => "library"}
description (empty) → Classic Ruby event-driven networking library. David Halasz considered it for the remote-console proxy but discarded i...
short_description (empty) → Reactor-pattern event-driven I/O library for Ruby.
create Celluloid tool
kind (empty) → tool
name (empty) → Celluloid
slug (empty) → celluloid
attrs (empty) → {"category" => "library"}
description (empty) → Actor/concurrency library for Ruby. David Halasz considered it but discarded it alongside EventMachine because of inc...
short_description (empty) → Actor-based concurrency library for Ruby.
create async tool
kind (empty) → tool
name (empty) → async
slug (empty) → async
attrs (empty) → {"category" => "library"}
description (empty) → Newer Ruby concurrency framework based on fibers. Not available when David Halasz started the project; he notes he wo...
short_description (empty) → Fiber-based asynchronous I/O framework for Ruby.
create Auto-yielding Fibers concept
kind (empty) → concept
name (empty) → Auto-yielding Fibers
slug (empty) → auto-yielding-fibers
attrs (empty) → {"category" => "architecture"}
description (empty) → Fibers that transparently yield on sleep/wait/IO.select calls, turning blocking I/O into non-blocking I/O automatical...
short_description (empty) → Fibers that yield automatically on blocking I/O, like Go/Crystal.
create Crystal tool
kind (empty) → tool
name (empty) → Crystal
slug (empty) → crystal
attrs (empty) → {"category" => "language"}
description (empty) → Language with Ruby-like syntax whose fiber-based concurrency model (with automatic yielding on I/O) is analogous to w...
short_description (empty) → Compiled language with Ruby-like syntax and built-in concurrency.
update Rack tool
description Low-level web-server interface that is the basis of all Ruby web frameworks. Shrine is built on Rack rather than Rail... → Low-level web-server interface that is the basis of all Ruby web frameworks. A Rack server is anything that responds ...
create Splice sockets in the kernel takeaway
kind (empty) → takeaway
name (empty) → Splice sockets in the kernel
slug (empty) → splice-sockets-in-the-kernel
attrs (empty) → {"type" => "recommendation"}
description (empty) → Audience recommendation at the end of the Q&A: for a pure TCP-tunneling proxy like PURR, the bytes never need to reac...
short_description (empty) → Use kernel splice to move bytes between two sockets without copying to userspace.
create Use bouncing IO.select to avoid spin-lock in bidirectional proxies takeaway
kind (empty) → takeaway
name (empty) → Use bouncing IO.select to avoid spin-lock in bidirectional proxies
slug (empty) → use-bouncing-io-select-to-avoid-spin-lock-in-bidirectional-proxies
attrs (empty) → {"type" => "lesson-learned"}
description (empty) → When proxying in both directions with IO.select, a naive loop spin-locks at 100% CPU when only one side is ready. The...
short_description (empty) → Remove ready sockets from IO.select arrays until a transmission actually happens.
create EPOLLONESHOT removes ready sockets automatically takeaway
kind (empty) → takeaway
name (empty) → EPOLLONESHOT removes ready sockets automatically
slug (empty) → epolloneshot-removes-ready-sockets-automatically
attrs (empty) → {"type" => "insight"}
description (empty) → Using the Linux EPOLLONESHOT flag lets the kernel remove a socket from the epoll interest set once it becomes ready, ...
short_description (empty) → EPOLLONESHOT gives bouncing-select behavior for free on Linux.
create Use Rack socket hijacking for long-running connections takeaway
kind (empty) → takeaway
name (empty) → Use Rack socket hijacking for long-running connections
slug (empty) → use-rack-socket-hijacking-for-long-running-connections
attrs (empty) → {"type" => "recommendation"}
description (empty) → Rack's request/response model does not fit WebSockets or similar persistent connections. The Rack hijacking API lets ...
short_description (empty) → Detach the raw socket from Rack to run a proxy thread outside the request cycle.
create Why implement the proxy in Ruby? question
kind (empty) → question
name (empty) → Why implement the proxy in Ruby?
slug (empty) → why-implement-the-proxy-in-ruby
attrs (empty) → {"answer_summary" => "ManageIQ only runs Ruby, so a Ruby solution was the pragmatic choice."}
description (empty) → Audience question at the end: there are better stacks for a proxy — why Ruby? Answer: ManageIQ is a Ruby/Rails enviro...
short_description (empty) → Audience asks why build a network proxy in Ruby rather than a faster language.
create Why not just install a client binary? question
kind (empty) → question
name (empty) → Why not just install a client binary?
slug (empty) → why-not-just-install-a-client-binary
attrs (empty) → {"answer_summary" => "Going through the management app enables RBAC, OTPs, quotas and temporary-access scopes."}
description (empty) → Audience question: for the native-console flow, why not skip the HTTP tunnel and just let the client install a binary...
short_description (empty) → Why go through HTTP at all instead of a direct native VNC client?
create VNC↔WebSocket frame translation question
kind (empty) → question
name (empty) → VNC↔WebSocket frame translation
slug (empty) → vnc-websocket-frame-translation
attrs (empty) → {"answer_summary" => "Browser remote console translates frames (not very efficient in Ruby); PURR smuggling just rout...
description (empty) → Audience question on the browser-side remote console: is there post-processing between VNC frames and WebSocket frame...
short_description (empty) → How is VNC translated to WebSocket frames, and is it efficient in Ruby?
create Do all Red Hat developers get a Red Hat? question
kind (empty) → question
name (empty) → Do all Red Hat developers get a Red Hat?
slug (empty) → do-all-red-hat-developers-get-a-red-hat
attrs (empty) → {"answer_summary" => "Yes, new-hire orientation lets employees pick a hat."}
description (empty) → Casual audience question: do all Red Hat developers get a hat? Answer: yes — new hires go to an orientation where the...
short_description (empty) → Whether Red Hat gives every new hire a red hat.

Edges (44)

update David Halasz → authored → How to hijack
context (empty) → Presenter of the talk
update How to hijack → presented_at → wroclove.rb 2019
context (empty) → Given at wroclove.rb 2019
create David Halasz → works_at → Red Hat
attrs (empty) → {"role" => "engineer"}
context (empty) → Speaker states he works for Red Hat
relation (empty) → works_at
source_node_id (empty) → 8596ec85-2603-4772-9dce-8b1a5ce40c17
target_node_id (empty) → b8adbc24-a0a8-4b53-8afd-df15f24f5b81
create David Halasz → works_on → ManageIQ
attrs (empty) → {"role" => "developer, remote consoles"}
context (empty) → Works on in-browser remote consoles in ManageIQ
relation (empty) → works_on
source_node_id (empty) → 8596ec85-2603-4772-9dce-8b1a5ce40c17
target_node_id (empty) → 9d8b9550-aa1d-4e81-9f40-adc17768f140
create ManageIQ → uses → Ruby on Rails
context (empty) → ManageIQ is a Ruby/Rails application with over a million LOC
relation (empty) → uses
source_node_id (empty) → 9d8b9550-aa1d-4e81-9f40-adc17768f140
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create How to hijack → about → ManageIQ
context (empty) → Talk centers on ManageIQ's remote-console architecture
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → 9d8b9550-aa1d-4e81-9f40-adc17768f140
create How to hijack → about → VNC
context (empty) → Explains VNC-in-browser remote consoles and VNC smuggling over HTTP
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → 3cd7feed-c824-4d0e-8f6e-4c65beb5ee7a
create How to hijack → about → WebSockets
context (empty) → WebSocket upgrade is the browser-side transport for the remote console
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → aed5cd48-754d-4e28-81ee-a14e040adf2b
create How to hijack → about → Rack
context (empty) → Relies on Rack's call interface and hijacking API
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → ce1ce440-06a4-4527-a39f-556a7b635334
create How to hijack → about → Socket Hijacking
context (empty) → Rack socket hijacking is central to the proxy design
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → 800ecfe8-41af-4f3e-a69f-672dd56cd5d3
create How to hijack → about → Blocking I/O
context (empty) → Discusses buffered blocking read/write on sockets
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → ada2f188-870e-4b5d-9adb-f0f4eaaabc55
create How to hijack → about → Non-blocking I/O
context (empty) → Contrasts non-blocking IO with threaded blocking IO
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → 1fa9067d-5845-408a-97c8-2f6bf021f6fb
create How to hijack → about → IO.select
context (empty) → Base building block for the proxy event loop
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → baf650cb-746e-423d-b3aa-cf2b95225a5f
create How to hijack → about → Bouncing Select
context (empty) → Speaker's own technique for avoiding spin-lock in bidirectional proxies
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → 9f5e2045-72fc-4295-8ca6-85a8ebcb1d2a
create How to hijack → about → epoll
context (empty) → Ports the bouncing technique to epoll with EPOLLONESHOT
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → e2dec52d-4361-4982-9a8f-10258c805d63
create How to hijack → about → kqueue
context (empty) → Mentioned as the BSD/macOS alternative backend
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → 42c1e943-1664-4f66-960a-25d361e7dba2
create How to hijack → about → PURR
context (empty) → Second half of the talk introduces the PURR protocol
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → cfcf2113-87d2-4a65-b8c1-b69dc9f0268c
create How to hijack → about → EventMachine
context (empty) → Considered and rejected because of async PostgreSQL
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → f5ea8d9f-1815-450c-ba00-8f3c9f31dfb2
create How to hijack → about → Celluloid
context (empty) → Considered and rejected because of async PostgreSQL
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → f89bbf0e-2d53-43c6-93e1-4783bdcba447
create How to hijack → about → async
context (empty) → Would have been the author's preferred choice if it had existed
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → 4d8e2014-65dc-4a6f-bc12-9ff52b673763
create How to hijack → about → Auto-yielding Fibers
context (empty) → Promised feature for Ruby 3 that would simplify the proxy
relation (empty) → about
source_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
target_node_id (empty) → ae2d9986-815a-4988-9b4b-7e427d661ed2
create David Halasz → works_on → PURR
attrs (empty) → {"role" => "author"}
context (empty) → Author of the PURR experimental protocol and server library
relation (empty) → works_on
source_node_id (empty) → 8596ec85-2603-4772-9dce-8b1a5ce40c17
target_node_id (empty) → cfcf2113-87d2-4a65-b8c1-b69dc9f0268c
create PURR → uses → Rack
context (empty) → PURR server exposes a Rack-like block API and can mount in Rails routes
relation (empty) → uses
source_node_id (empty) → cfcf2113-87d2-4a65-b8c1-b69dc9f0268c
target_node_id (empty) → ce1ce440-06a4-4527-a39f-556a7b635334
create PURR → uses → Puma
context (empty) → Demo PURR server is run under Puma
relation (empty) → uses
source_node_id (empty) → cfcf2113-87d2-4a65-b8c1-b69dc9f0268c
target_node_id (empty) → 39300066-39d4-4bb3-b15b-0fb67a3d3867
create PURR → related_to → VNC
context (empty) → Primary use case is tunneling VNC from hypervisor to a native desktop client
relation (empty) → related_to
source_node_id (empty) → cfcf2113-87d2-4a65-b8c1-b69dc9f0268c
target_node_id (empty) → 3cd7feed-c824-4d0e-8f6e-4c65beb5ee7a
create ManageIQ → uses → Rack
context (empty) → Remote console proxy is implemented on top of Rack
relation (empty) → uses
source_node_id (empty) → 9d8b9550-aa1d-4e81-9f40-adc17768f140
target_node_id (empty) → ce1ce440-06a4-4527-a39f-556a7b635334
create ManageIQ → uses → Socket Hijacking
context (empty) → Uses Rack hijacking to run the VNC↔WebSocket proxy thread
relation (empty) → uses
source_node_id (empty) → 9d8b9550-aa1d-4e81-9f40-adc17768f140
target_node_id (empty) → 800ecfe8-41af-4f3e-a69f-672dd56cd5d3
create Auto-yielding Fibers → related_to → Crystal
context (empty) → Crystal implements concurrency using auto-yielding fibers, cited as the model
relation (empty) → related_to
source_node_id (empty) → ae2d9986-815a-4988-9b4b-7e427d661ed2
target_node_id (empty) → 0fa06732-9c5e-4fb8-af70-1c291e340c33
create Splice sockets in the kernel → from_talk → How to hijack
context (empty) → Audience suggestion during the Q&A
relation (empty) → from_talk
source_node_id (empty) → 8d6d2009-92fa-46d1-91d8-47e628a18894
target_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
create Splice sockets in the kernel → about → PURR
context (empty) → Applies specifically to the TCP-tunneling PURR case where bytes don't need to reach userspace
relation (empty) → about
source_node_id (empty) → 8d6d2009-92fa-46d1-91d8-47e628a18894
target_node_id (empty) → cfcf2113-87d2-4a65-b8c1-b69dc9f0268c
create Use bouncing IO.select to avoid spin-lock in bidirectional proxies → from_talk → How to hijack
context (empty) → Key lesson of the talk
relation (empty) → from_talk
source_node_id (empty) → 368c1873-f79e-40ef-9ab5-78fb4c47bcef
target_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
create Use bouncing IO.select to avoid spin-lock in bidirectional proxies → about → Bouncing Select
context (empty) → Describes the bouncing-select technique
relation (empty) → about
source_node_id (empty) → 368c1873-f79e-40ef-9ab5-78fb4c47bcef
target_node_id (empty) → 9f5e2045-72fc-4295-8ca6-85a8ebcb1d2a
create EPOLLONESHOT removes ready sockets automatically → from_talk → How to hijack
context (empty) → Insight from the epoll section of the talk
relation (empty) → from_talk
source_node_id (empty) → b962b240-c301-478b-bd78-93c67d018228
target_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
create EPOLLONESHOT removes ready sockets automatically → about → epoll
context (empty) → About the EPOLLONESHOT flag
relation (empty) → about
source_node_id (empty) → b962b240-c301-478b-bd78-93c67d018228
target_node_id (empty) → e2dec52d-4361-4982-9a8f-10258c805d63
create Use Rack socket hijacking for long-running connections → from_talk → How to hijack
context (empty) → Takeaway from the Rack hijacking section
relation (empty) → from_talk
source_node_id (empty) → 3a459378-26c0-4fec-84ef-ba1511744467
target_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
create Use Rack socket hijacking for long-running connections → about → Socket Hijacking
context (empty) → Direct advice about using the hijacking API
relation (empty) → about
source_node_id (empty) → 3a459378-26c0-4fec-84ef-ba1511744467
target_node_id (empty) → 800ecfe8-41af-4f3e-a69f-672dd56cd5d3
create Why implement the proxy in Ruby? → asked_at → How to hijack
context (empty) → Q&A question
relation (empty) → asked_at
source_node_id (empty) → d8a060c0-5530-477c-9ea9-b289921012dd
target_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
create Why implement the proxy in Ruby? → about → ManageIQ
context (empty) → Answer points to ManageIQ's Ruby-only environment
relation (empty) → about
source_node_id (empty) → d8a060c0-5530-477c-9ea9-b289921012dd
target_node_id (empty) → 9d8b9550-aa1d-4e81-9f40-adc17768f140
create Why not just install a client binary? → asked_at → How to hijack
context (empty) → Q&A question
relation (empty) → asked_at
source_node_id (empty) → ae1f16bb-f7c1-4256-94d5-df25fb55329b
target_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
create Why not just install a client binary? → about → PURR
context (empty) → Concerns the PURR native-console flow
relation (empty) → about
source_node_id (empty) → ae1f16bb-f7c1-4256-94d5-df25fb55329b
target_node_id (empty) → cfcf2113-87d2-4a65-b8c1-b69dc9f0268c
create VNC↔WebSocket frame translation → asked_at → How to hijack
context (empty) → Q&A question on efficiency of frame translation
relation (empty) → asked_at
source_node_id (empty) → 20cbc708-dc9b-4e42-8aff-111aa5a7aaf6
target_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
create VNC↔WebSocket frame translation → about → VNC
context (empty) → Specifically about VNC frame handling
relation (empty) → about
source_node_id (empty) → 20cbc708-dc9b-4e42-8aff-111aa5a7aaf6
target_node_id (empty) → 3cd7feed-c824-4d0e-8f6e-4c65beb5ee7a
create Do all Red Hat developers get a Red Hat? → asked_at → How to hijack
context (empty) → Casual Q&A question
relation (empty) → asked_at
source_node_id (empty) → df13d124-3607-4093-8562-9062b3379227
target_node_id (empty) → ff2e73b5-9578-4dd5-9eb5-6ad3e3ae85b4
create Do all Red Hat developers get a Red Hat? → about → Red Hat
context (empty) → About Red Hat's new-hire hat tradition
relation (empty) → about
source_node_id (empty) → df13d124-3607-4093-8562-9062b3379227
target_node_id (empty) → b8adbc24-a0a8-4b53-8afd-df15f24f5b81

Read set

77 nodes

concept Process Manager search_nodes takeaway Sign serverlessforruby.org petition search_nodes project granite search_nodes tool Grafana search_nodes tool Heroku search_nodes project imageflow search_nodes takeaway Contribute to Arkency aggregates repository search_nodes tool Iodine search_nodes tool mini_magick search_nodes tool aggregate_root search_nodes company Transloadit search_nodes tool Rust search_nodes question Should enterprise libraries be paid or free? search_nodes tool GraphQL search_nodes resource Rocket Real-Time Benchmark search_nodes tool Sync Space VR search_nodes concept Direct Upload to Cloud search_nodes tool RealtimeBoard search_nodes concept Interface Wrapper for Ruby search_nodes tool Rack search_nodes tool Ruby on Rails search_nodes talk When REST is Not Enough: Implementing Alternative Protocols in Ruby on Rails search_nodes tool Plezi search_nodes tool Action Cable search_nodes tool Shrine search_nodes talk Handling file uploads for modern developer search_nodes talk Rubyana Gems and the Ractorous Rubetta Stones! search_nodes concept WebSockets search_nodes concept tus protocol search_nodes concept Zero-Disconnect Deployment search_nodes tool Protocol Buffers search_nodes project AnyCable search_nodes tool HTTP/2 search_nodes talk Cables! Cables! Cables! search_nodes concept WebAssembly search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2025 search_nodes talk Development with axioms search_nodes talk Building LLM powered applications in Ruby search_nodes talk Spice up your life with eql search_nodes talk UringMachine — High Performance Concurrency for Ruby Using io_uring search_nodes concept Sometimes Nothing Is Enough search_nodes person David Halasz search_nodes+get_node_edges person Julik Tarkhanov search_nodes tool Ruby search_nodes person DHH search_nodes person Emiliano Della Casa search_nodes person Adam Okoń search_nodes person Matz search_nodes person Akira Matsuda search_nodes takeaway Signed On-the-fly URLs search_nodes takeaway Switch on HTTP/2 search_nodes question DDoS risk of on-the-fly processing search_nodes tool Brotli search_nodes takeaway Extract the slow server out of Ruby search_nodes talk Event Sourcing and Actor model in Ruby search_nodes concept Global Interpreter Lock search_nodes project Eventide search_nodes takeaway Start with Action Cable, switch when performance hurts search_nodes project LiteCable search_nodes resource serverlessforruby.org Petition search_nodes takeaway Upgrade Ruby version for free speed search_nodes talk How to hijack get_node_edges talk Kamal is not harder than your PaaS search_nodes concept Function as a Service search_nodes tool ThingSpeak search_nodes tool Go search_nodes tool Erlang search_nodes tool Elixir search_nodes tool Clojure search_nodes talk Adventures in durable execution search_nodes takeaway Replay-Based Debugging search_nodes

3 edges