← Extractions

wroclove.rb 2024 — Prevent Account Sharing (Andrei Kaleshka)

Andrei Kaleshka's first English talk at wroclove.rb 2024 on preventing paid-account credential sharing in a Ruby on Rails music-education app. He walks through data collection with paper_trail and a login_sessions table, charting indicators in Metabase, rolling out devise-two-factor email MFA selectively to users with 4+ active sessions, and reports a ~27% lift in signups.

Model
claude-opus-4-7
Ingestion
1e927be1
Input tokens
550,282
fresh
485,614
cached
57,979
cache write
6,689
Output tokens
10,588
Duration
165.7s
Roundtrips
6
Tool calls
17
Cost
$0.00
Nodes/edges extracted
24 / 42
Read set (nodes/edges)
486 / 2

Nodes (24)

update Andrei Kaleshka person
description Ruby developer at an outsourced company, working as main developer and sometimes tech lead depending on the project. ... → Ruby developer at an outsourced company, working as main developer and sometimes tech lead depending on the project. ...
update Prevent account sharing talk
attrs {"type" => "talk"} → {"type" => "talk", "first_english_talk" => "true"}
description Talk at wroclove.rb 2024. → Andrei Kaleshka's wroclove.rb 2024 talk (his first English-language talk) on fighting credential sharing in a Ruby on...
short_description Talk at wroclove.rb 2024. → wroclove.rb 2024 talk on detecting and curbing shared credentials in a Rails app.
create paper_trail tool
kind (empty) → tool
name (empty) → paper_trail
slug (empty) → paper_trail
attrs (empty) → {"category" => "library"}
description (empty) → Ruby gem that records changes to Active Record models as versions — trivial to install on an existing Ruby on Rails a...
short_description (empty) → Ruby gem for tracking changes to Active Record models as a version log.
create Metabase tool
kind (empty) → tool
name (empty) → Metabase
slug (empty) → metabase
attrs (empty) → {"category" => "service"}
description (empty) → Open-source BI tool for exploring data via charts, numbers and dashboards. Easy to set up (~5 minutes via the Docker ...
short_description (empty) → Open-source business-intelligence tool for charts and dashboards over a database.
create devise-two-factor tool
kind (empty) → tool
name (empty) → devise-two-factor
slug (empty) → devise-two-factor
attrs (empty) → {"category" => "library"}
description (empty) → Ruby gem extending Devise with two-factor authentication. Used in the Prevent Account Sharing talk with email-based v...
short_description (empty) → Devise extension adding two-factor authentication to Rails apps.
create Amazon CloudFront tool
kind (empty) → tool
name (empty) → Amazon CloudFront
slug (empty) → amazon-cloudfront
attrs (empty) → {"category" => "service"}
description (empty) → AWS CDN service that sits in front of the Rails application as a proxy. Has an optional feature that enriches every p...
short_description (empty) → AWS content delivery network, also used as a request-proxy exposing geo/IP headers.
create Fingerprint tool
kind (empty) → tool
name (empty) → Fingerprint
slug (empty) → fingerprint
attrs (empty) → {"category" => "service"}
description (empty) → Commercial third-party service that identifies returning browsers/devices via fingerprinting, used to detect shared a...
short_description (empty) → Third-party browser/device fingerprinting service for identifying returning users.
create Stripe tool
kind (empty) → tool
name (empty) → Stripe
slug (empty) → stripe
attrs (empty) → {"category" => "service"}
description (empty) → Online payments platform. Used in the Prevent Account Sharing talk as the source of truth for revenue — the team watc...
short_description (empty) → Online payments platform widely used by SaaS applications.
create devise_token_authenticatable tool
kind (empty) → tool
name (empty) → devise_token_authenticatable
slug (empty) → devise_token_authenticatable
attrs (empty) → {"category" => "library"}
description (empty) → Extension for Devise that adds authentication-token support for API clients. Used in the Prevent Account Sharing talk...
short_description (empty) → Devise extension adding token-based authentication for API clients.
create Account Sharing concept
kind (empty) → concept
name (empty) → Account Sharing
slug (empty) → account-sharing
attrs (empty) → {"category" => "practice"}
description (empty) → Situation in a paid-subscription application where one user shares their credentials with friends, family or stranger...
short_description (empty) → Users reusing paid credentials with others, hurting subscription revenue.
create Login Session Tracking concept
kind (empty) → concept
name (empty) → Login Session Tracking
slug (empty) → login-session-tracking
attrs (empty) → {"category" => "pattern"}
description (empty) → Pattern of creating a database record for every user login and injecting its id into the browser's cookie session, so...
short_description (empty) → Persisting each user login as a database record identified via cookies.
create Selective MFA Rollout concept
kind (empty) → concept
name (empty) → Selective MFA Rollout
slug (empty) → selective-mfa-rollout
attrs (empty) → {"category" => "pattern"}
description (empty) → Risk-management pattern from the Prevent Account Sharing talk: instead of turning MFA on for every user — which risks...
short_description (empty) → Enabling MFA only for users flagged as violating account-sharing rules.
create Scaffolding Before Features concept
kind (empty) → concept
name (empty) → Scaffolding Before Features
slug (empty) → scaffolding-before-features
attrs (empty) → {"category" => "methodology"}
description (empty) → Analogy drawn in the Prevent Account Sharing talk to the construction industry: before starting a building, scaffoldi...
short_description (empty) → Collect data and define indicators before rolling out a risky feature.
create Music Education SaaS project
kind (empty) → project
name (empty) → Music Education SaaS
slug (empty) → music-education-saas
attrs (empty) → {"domain" => "music education", "status" => "active"}
description (empty) → The application at the center of the Prevent Account Sharing talk. A Ruby on Rails product that sells online courses ...
short_description (empty) → Rails application selling online classes and courses for musicians.
create Collect data before enabling risky features takeaway
kind (empty) → takeaway
name (empty) → Collect data before enabling risky features
slug (empty) → collect-data-before-enabling-risky-features
attrs (empty) → {"type" => "recommendation"}
description (empty) → When you face implementing a feature whose impact on the product is hard to predict (like MFA), stop and think first:...
short_description (empty) → Define indicators and capture data before rolling out hard-to-predict features.
create Learn SQL to analyze your product takeaway
kind (empty) → takeaway
name (empty) → Learn SQL to analyze your product
slug (empty) → learn-sql-to-analyze-your-product
attrs (empty) → {"type" => "recommendation"}
description (empty) → Even with a BI tool like Metabase, preparing the data into meaningful charts required writing custom SQL. The speaker...
short_description (empty) → Analyzing application indicators effectively requires writing custom SQL.
create MFA improves account-sharing health takeaway
kind (empty) → takeaway
name (empty) → MFA improves account-sharing health
slug (empty) → mfa-improves-account-sharing-health
attrs (empty) → {"type" => "insight"}
description (empty) → Outcome reported in the Prevent Account Sharing talk: after enabling email-based MFA weekly for users with 4+ concurr...
short_description (empty) → Selective MFA significantly reduces account sharing and boosts signups.
create Record CloudFront request headers on sessions takeaway
kind (empty) → takeaway
name (empty) → Record CloudFront request headers on sessions
slug (empty) → record-cloudfront-request-headers-on-sessions
attrs (empty) → {"type" => "lesson-learned"}
description (empty) → AWS CloudFront has an optional feature that attaches IP, location, latitude/longitude and other details to every requ...
short_description (empty) → CloudFront can enrich requests with IP/geo headers but accuracy is limited.
create Why a limit of four login sessions? question
kind (empty) → question
name (empty) → Why a limit of four login sessions?
slug (empty) → why-a-limit-of-four-login-sessions
attrs (empty) → {"answer_summary" => "The app has multiple device surfaces (desktop, mobile web, iOS, upcoming React Native), the bus...
description (empty) → Audience member argues four devices per user is still generous — most people use one or two at a time. Andrei answers...
short_description (empty) → Q&A: why was four chosen as the maximum concurrent sessions per user?
create How is MFA enabled per user — manual or automated? question
kind (empty) → question
name (empty) → How is MFA enabled per user — manual or automated?
slug (empty) → how-is-mfa-enabled-per-user-manual-or-automated
attrs (empty) → {"answer_summary" => "Automated: a SQL query on the login_sessions table identifies users with 4+ active sessions and...
description (empty) → Audience asks whether enabling MFA per user is done manually or by automation. Andrei answers that a SQL query identi...
short_description (empty) → Q&A: is flagging which users get MFA manual or script-driven?
create Do you protect against shared cookies? question
kind (empty) → question
name (empty) → Do you protect against shared cookies?
slug (empty) → do-you-protect-against-shared-cookies
attrs (empty) → {"answer_summary" => "No — the solution does not protect against sharing of raw session cookies."}
description (empty) → Audience asks what happens if a sophisticated user shares their session cookies (not username/password) with someone ...
short_description (empty) → Q&A: is cookie sharing between users mitigated?
create Why MFA via email and not authenticator app or SMS? question
kind (empty) → question
name (empty) → Why MFA via email and not authenticator app or SMS?
slug (empty) → why-mfa-via-email-and-not-authenticator-app-or-sms
attrs (empty) → {"answer_summary" => "Minimize user friction to avoid churn: no phone numbers on file (no SMS), authenticator apps ad...
description (empty) → Audience asks why MFA via a second device or an authenticator app was considered unsuitable, and what made email MFA ...
short_description (empty) → Q&A: rationale for picking email-based MFA.
create Do users just create new shared accounts to dodge MFA? question
kind (empty) → question
name (empty) → Do users just create new shared accounts to dodge MFA?
slug (empty) → do-users-just-create-new-shared-accounts-to-dodge-mfa
attrs (empty) → {"answer_summary" => "Not analyzed yet — acknowledged as a fair next step. Main win so far: revenue stopped dropping."}
description (empty) → Audience asks whether users drop their accounts and simply create new ones with a new shared email to continue sharin...
short_description (empty) → Q&A: have you checked whether flagged users re-register with a shared email?
create What does the application do? question
kind (empty) → question
name (empty) → What does the application do?
slug (empty) → what-does-the-application-do
attrs (empty) → {"answer_summary" => "A music-education SaaS that sells online courses/classes for musicians."}
description (empty) → Closing audience question. Andrei answers that the application is an education platform for musicians that sells onli...
short_description (empty) → Q&A: what is the product behind the case study?

Edges (42)

create Music Education SaaS → uses → paper_trail
context (empty) → Installed to collect historical data.
relation (empty) → uses
source_node_id (empty) → bf2260ce-2012-408b-8636-402d443f48c4
target_node_id (empty) → c94cfb12-f5f2-4321-be12-b73efd47e871
create Music Education SaaS → uses → Devise
context (empty) → Base authentication stack.
relation (empty) → uses
source_node_id (empty) → bf2260ce-2012-408b-8636-402d443f48c4
target_node_id (empty) → 9113bde3-534a-47d0-8333-e171c4b55e79
create Music Education SaaS → uses → devise-two-factor
context (empty) → Email-based MFA for flagged users.
relation (empty) → uses
source_node_id (empty) → bf2260ce-2012-408b-8636-402d443f48c4
target_node_id (empty) → d05fd6e1-4c37-46a3-8f53-feaa90dc2fcf
update Andrei Kaleshka → authored → Prevent account sharing
context (empty) → Andrei delivered this as his first English-language talk.
update Prevent account sharing → presented_at → wroclove.rb 2024
context (empty) → Talk given at wroclove.rb 2024.
create Prevent account sharing → about → Account Sharing
context (empty) → Entire talk is about detecting and reducing credential sharing.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → f35a0d81-c597-4f6b-880f-72e0f1466ade
create Prevent account sharing → about → Login Session Tracking
context (empty) → Introduces a login_sessions table as the core mechanism.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → 6e163e58-41c1-4ae0-b90d-489f3b10f748
create Prevent account sharing → about → Selective MFA Rollout
context (empty) → Enables MFA only for users who violate the 4+ sessions rule.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → 9f8983a0-c0d7-4752-88ab-b401c55067e5
create Prevent account sharing → about → Scaffolding Before Features
context (empty) → Construction-scaffolding analogy motivates collecting data before rolling out MFA.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → fef4f998-1493-403f-be84-bc5b7be6f35d
create Prevent account sharing → about → Music Education SaaS
context (empty) → The case-study application.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → bf2260ce-2012-408b-8636-402d443f48c4
create Prevent account sharing → about → paper_trail
context (empty) → Used to start collecting historical data.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → c94cfb12-f5f2-4321-be12-b73efd47e871
create Prevent account sharing → about → Metabase
context (empty) → Used to chart the indicators.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → 29e6eb96-90a0-4194-9745-1f0266d21b15
create Prevent account sharing → about → devise-two-factor
context (empty) → Gem used to implement email-based MFA on top of Devise.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → d05fd6e1-4c37-46a3-8f53-feaa90dc2fcf
create Prevent account sharing → about → Devise
context (empty) → Base authentication gem; warden hooks are leveraged to manage login sessions.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → 9113bde3-534a-47d0-8333-e171c4b55e79
create Prevent account sharing → about → devise_token_authenticatable
context (empty) → Used to authenticate the iOS app.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → dba46ba1-d8f9-4ded-bb90-9a601e3242d5
create Prevent account sharing → about → Amazon CloudFront
context (empty) → CloudFront headers (IP, geo, lat/long) are recorded on each login session.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → 5663b347-93f4-4252-99ce-4a2be65d8123
create Prevent account sharing → about → Fingerprint
context (empty) → Evaluated as a third-party solution and rejected.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → 590f34b9-17a9-4ada-9ebe-19170c5d0619
create Prevent account sharing → about → Stripe
context (empty) → Revenue on Stripe tracked as one of the indicators.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → e3389b72-3041-48ce-95c9-e1d0e2e23c8b
create Prevent account sharing → about → Ruby on Rails
context (empty) → The application is a Rails application.
relation (empty) → about
source_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Music Education SaaS → uses → Ruby on Rails
context (empty) → Built on Rails.
relation (empty) → uses
source_node_id (empty) → bf2260ce-2012-408b-8636-402d443f48c4
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Music Education SaaS → uses → devise_token_authenticatable
context (empty) → Authenticates iOS clients.
relation (empty) → uses
source_node_id (empty) → bf2260ce-2012-408b-8636-402d443f48c4
target_node_id (empty) → dba46ba1-d8f9-4ded-bb90-9a601e3242d5
create Music Education SaaS → uses → Metabase
context (empty) → Charts indicators.
relation (empty) → uses
source_node_id (empty) → bf2260ce-2012-408b-8636-402d443f48c4
target_node_id (empty) → 29e6eb96-90a0-4194-9745-1f0266d21b15
create Music Education SaaS → uses → Amazon CloudFront
context (empty) → Fronts application requests and injects geo/IP headers.
relation (empty) → uses
source_node_id (empty) → bf2260ce-2012-408b-8636-402d443f48c4
target_node_id (empty) → 5663b347-93f4-4252-99ce-4a2be65d8123
create Music Education SaaS → uses → Stripe
context (empty) → Billing and revenue tracking.
relation (empty) → uses
source_node_id (empty) → bf2260ce-2012-408b-8636-402d443f48c4
target_node_id (empty) → e3389b72-3041-48ce-95c9-e1d0e2e23c8b
create Collect data before enabling risky features → from_talk → Prevent account sharing
context (empty) → Core closing takeaway of the talk.
relation (empty) → from_talk
source_node_id (empty) → b24f144b-3636-46ed-a5f9-60b9082248e4
target_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
create Learn SQL to analyze your product → from_talk → Prevent account sharing
context (empty) → Closing advice from the speaker.
relation (empty) → from_talk
source_node_id (empty) → 068c74c2-543a-4968-9043-9abf6c49b5d7
target_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
create MFA improves account-sharing health → from_talk → Prevent account sharing
context (empty) → Result reported after the selective MFA rollout.
relation (empty) → from_talk
source_node_id (empty) → 2b13ae1e-375f-4512-ada9-b54ec17c47d2
target_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
create Record CloudFront request headers on sessions → from_talk → Prevent account sharing
context (empty) → Lesson learned about CloudFront geolocation quality.
relation (empty) → from_talk
source_node_id (empty) → 3a5b7ea9-165a-4eac-920c-28a9ac4e57b0
target_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
create Collect data before enabling risky features → about → Scaffolding Before Features
context (empty) → Takeaway rephrases the scaffolding analogy.
relation (empty) → about
source_node_id (empty) → b24f144b-3636-46ed-a5f9-60b9082248e4
target_node_id (empty) → fef4f998-1493-403f-be84-bc5b7be6f35d
create MFA improves account-sharing health → about → Selective MFA Rollout
context (empty) → Result of the selective MFA approach.
relation (empty) → about
source_node_id (empty) → 2b13ae1e-375f-4512-ada9-b54ec17c47d2
target_node_id (empty) → 9f8983a0-c0d7-4752-88ab-b401c55067e5
create Record CloudFront request headers on sessions → about → Amazon CloudFront
context (empty) → About using CloudFront headers for session telemetry.
relation (empty) → about
source_node_id (empty) → 3a5b7ea9-165a-4eac-920c-28a9ac4e57b0
target_node_id (empty) → 5663b347-93f4-4252-99ce-4a2be65d8123
create Why a limit of four login sessions? → asked_at → Prevent account sharing
context (empty) → Q&A question at the talk.
relation (empty) → asked_at
source_node_id (empty) → 69d10a6a-cf2a-4f47-bd35-dae179412c6e
target_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
create How is MFA enabled per user — manual or automated? → asked_at → Prevent account sharing
context (empty) → Q&A question at the talk.
relation (empty) → asked_at
source_node_id (empty) → 169d7d14-0d85-4071-a308-dd202ea91809
target_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
create Do you protect against shared cookies? → asked_at → Prevent account sharing
context (empty) → Q&A question at the talk.
relation (empty) → asked_at
source_node_id (empty) → 367b0265-9700-43ed-8c3b-45e3eff90137
target_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
create Why MFA via email and not authenticator app or SMS? → asked_at → Prevent account sharing
context (empty) → Q&A question at the talk.
relation (empty) → asked_at
source_node_id (empty) → e6fee7df-6611-46f0-aad0-9554520c2800
target_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
create Do users just create new shared accounts to dodge MFA? → asked_at → Prevent account sharing
context (empty) → Q&A question at the talk.
relation (empty) → asked_at
source_node_id (empty) → dda5f080-2ca2-4e9b-a96e-7916c60c3014
target_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
create What does the application do? → asked_at → Prevent account sharing
context (empty) → Closing Q&A question.
relation (empty) → asked_at
source_node_id (empty) → 2386e0f9-4c48-425e-8edf-216b33582fe2
target_node_id (empty) → 516b9afb-2d96-4460-ba38-c190cebbc820
create Why MFA via email and not authenticator app or SMS? → about → devise-two-factor
context (empty) → About why the email factor was chosen over TOTP/SMS.
relation (empty) → about
source_node_id (empty) → e6fee7df-6611-46f0-aad0-9554520c2800
target_node_id (empty) → d05fd6e1-4c37-46a3-8f53-feaa90dc2fcf
create Why a limit of four login sessions? → about → Login Session Tracking
context (empty) → Discusses the planned cap on concurrent login sessions.
relation (empty) → about
source_node_id (empty) → 69d10a6a-cf2a-4f47-bd35-dae179412c6e
target_node_id (empty) → 6e163e58-41c1-4ae0-b90d-489f3b10f748
create How is MFA enabled per user — manual or automated? → about → Selective MFA Rollout
context (empty) → About the automation that selects users for MFA.
relation (empty) → about
source_node_id (empty) → 169d7d14-0d85-4071-a308-dd202ea91809
target_node_id (empty) → 9f8983a0-c0d7-4752-88ab-b401c55067e5
create What does the application do? → about → Music Education SaaS
context (empty) → Reveals the application domain.
relation (empty) → about
source_node_id (empty) → 2386e0f9-4c48-425e-8edf-216b33582fe2
target_node_id (empty) → bf2260ce-2012-408b-8636-402d443f48c4
create Andrei Kaleshka → attended → wroclove.rb 2024
context (empty) → Spoke at the conference.
relation (empty) → attended
source_node_id (empty) → 3280fd8c-3dfa-4d42-bf04-970c90024d3d
target_node_id (empty) → 748e0524-a102-41d4-97dc-575881583d91

Read set

486 nodes

tool CircleCI list_nodes_by_kind tool Citus list_nodes_by_kind tool ClickHouse list_nodes_by_kind+search_nodes tool Clojure list_nodes_by_kind tool ClojureScript list_nodes_by_kind tool CockroachDB list_nodes_by_kind tool Codecov list_nodes_by_kind tool git bisect list_nodes_by_kind tool GitHub Actions list_nodes_by_kind tool GitHub Releases list_nodes_by_kind tool Glimmer list_nodes_by_kind tool minitest list_nodes_by_kind tool Miro list_nodes_by_kind tool MobX list_nodes_by_kind tool mruby list_nodes_by_kind tool Mutant list_nodes_by_kind tool MySQL list_nodes_by_kind tool .NET list_nodes_by_kind tool New Relic list_nodes_by_kind tool WebP list_nodes_by_kind tool Webpacker list_nodes_by_kind tool webpagetest.org list_nodes_by_kind+search_nodes tool Wolfram Language list_nodes_by_kind tool Workspaces list_nodes_by_kind tool Xcode list_nodes_by_kind tool Yacc list_nodes_by_kind tool Zencoder list_nodes_by_kind tool Zoom list_nodes_by_kind takeaway Rate-limit login forms with a skip path search_nodes concept Timing-Based Enumeration search_nodes concept Multi-Tenancy search_nodes concept Checks, Tests, Reviews and Flags search_nodes takeaway Gradual migration via steps search_nodes event Advent of Code list_nodes_by_kind event Brighton Ruby list_nodes_by_kind event EmberConf list_nodes_by_kind event Eventide Summit 2023 list_nodes_by_kind event Hacktoberfest list_nodes_by_kind event KanDDDinsky list_nodes_by_kind event Rails World list_nodes_by_kind event wroclove.rb 2018 list_nodes_by_kind+search_nodes event wroclove.rb 2019 list_nodes_by_kind+search_nodes event wroclove.rb 2022 list_nodes_by_kind+search_nodes event wroclove.rb 2023 list_nodes_by_kind+search_nodes event wroclove.rb 2024 list_nodes_by_kind+search_nodes event wroclove.rb 2025 list_nodes_by_kind event wroclove.rb 2026 list_nodes_by_kind+search_nodes person Aaron Patterson list_nodes_by_kind person Adam Okoń list_nodes_by_kind person Adam Piotrowski list_nodes_by_kind person Adrian Marin list_nodes_by_kind person Agnieszka Małaszkiewicz list_nodes_by_kind person Akira Matsuda list_nodes_by_kind person Alberto Brandolini list_nodes_by_kind person Amanda list_nodes_by_kind person Amelia Walter-Dzikowska list_nodes_by_kind person Andrei Bondarev list_nodes_by_kind person Andrei Kaleshka list_nodes_by_kind person Andrew Kane list_nodes_by_kind person Andrey Sitnik list_nodes_by_kind person Andrzej Krzywda list_nodes_by_kind person Andrzej Śliwa list_nodes_by_kind person Andy Kroll list_nodes_by_kind person Andy Maleh list_nodes_by_kind person Anita Jaszewska list_nodes_by_kind person Anton Davydov list_nodes_by_kind person Armin Pašalić list_nodes_by_kind person Arturo Herrero list_nodes_by_kind person Ayush Newatia list_nodes_by_kind person Bartosz Blimke list_nodes_by_kind person Bertrand Meyer list_nodes_by_kind person Caio Almeida list_nodes_by_kind person Charles Nutter list_nodes_by_kind person Chikahiro Tokoro list_nodes_by_kind person Chris Oliver list_nodes_by_kind person Claude Lévi-Strauss list_nodes_by_kind person Damir Zekić list_nodes_by_kind person Dan Kubb list_nodes_by_kind person David Halasz list_nodes_by_kind person DHH list_nodes_by_kind person Dimitry Salahutdinov list_nodes_by_kind person Elisabeth Kübler-Ross list_nodes_by_kind person Emiliano Della Casa list_nodes_by_kind person Eric Evans list_nodes_by_kind person Eric Normand list_nodes_by_kind person Erwin Kroon list_nodes_by_kind person Ethan Garofolo list_nodes_by_kind person Galileo Galilei list_nodes_by_kind person Garry Kasparov list_nodes_by_kind person G.K. Chesterton list_nodes_by_kind person Gottfried Wilhelm Leibniz list_nodes_by_kind person Greg Molnar list_nodes_by_kind person Greg Navis list_nodes_by_kind person Greg Young list_nodes_by_kind person Isaac Newton list_nodes_by_kind person Ismael Celis list_nodes_by_kind person Ivan Nemytchenko list_nodes_by_kind person Jakub Rodzik list_nodes_by_kind person Jan list_nodes_by_kind person Janko Marohnic list_nodes_by_kind person Jared list_nodes_by_kind person Joel Drapper list_nodes_by_kind person John Gallagher list_nodes_by_kind person Josef Strzibny list_nodes_by_kind person José Valim list_nodes_by_kind person Julik Tarkhanov list_nodes_by_kind person Karol Szuster list_nodes_by_kind person Koichi Sasada list_nodes_by_kind person Krzysztof Hasiński list_nodes_by_kind person Kuba Suder list_nodes_by_kind person Louis Antonopoulos list_nodes_by_kind person Lucian Ghinda list_nodes_by_kind person Łukasz Reszke list_nodes_by_kind person Łukasz Szydło list_nodes_by_kind person Maciej Rząsa list_nodes_by_kind person Maciek list_nodes_by_kind person Magnus Carlsen list_nodes_by_kind person Marco Heimeshoff list_nodes_by_kind person Mariusz Gil list_nodes_by_kind person Markus Schirp list_nodes_by_kind person Mark Zuckerberg list_nodes_by_kind person Martin Fowler list_nodes_by_kind person Martin Gamsjaeger list_nodes_by_kind person Masahiro Nakagawa list_nodes_by_kind person Mateusz Nowak list_nodes_by_kind person Matthias Verraes list_nodes_by_kind person Matz list_nodes_by_kind person Max Howell list_nodes_by_kind person Michał Bronikowski list_nodes_by_kind person Michał (Helpling) list_nodes_by_kind person Michal Matyas list_nodes_by_kind person Michał Młoźniak list_nodes_by_kind person Michał Zajączkowski de Mezer list_nodes_by_kind person Mike Perham list_nodes_by_kind person Miron Marczuk list_nodes_by_kind person Nate Berkopec list_nodes_by_kind person Nathan Ladd list_nodes_by_kind person Nick Schwaderer list_nodes_by_kind person Nick Sutterer list_nodes_by_kind person Nicolò Rebughini list_nodes_by_kind person Norbert Wójtowicz list_nodes_by_kind person Pavo list_nodes_by_kind person Paweł Dąbrowski list_nodes_by_kind person Paweł Pacana list_nodes_by_kind person Paweł Pokrywka list_nodes_by_kind person Paweł Strzałkowski list_nodes_by_kind person Peter Solnica list_nodes_by_kind person Piotr Solnica list_nodes_by_kind person Radoslav Stankov list_nodes_by_kind person Rafael Zamaris list_nodes_by_kind person Rafał Cymerys list_nodes_by_kind person Rafał Rothenberger list_nodes_by_kind person René Descartes list_nodes_by_kind person Rich Hickey list_nodes_by_kind person Romeu Moura list_nodes_by_kind person Ryan Townsend list_nodes_by_kind person Scott Bell list_nodes_by_kind person Scott Bellware list_nodes_by_kind person Scott Wlaschin list_nodes_by_kind person Sebastian Wilgosz list_nodes_by_kind person Sergey Ivanov list_nodes_by_kind person Sergey Sergyenko list_nodes_by_kind person Seth Horsley list_nodes_by_kind person Sharon Rosner list_nodes_by_kind person Shona list_nodes_by_kind person Shugo Maeda list_nodes_by_kind person Stefan Wintermeyer list_nodes_by_kind person Stephan Schmidt list_nodes_by_kind person Stephen Margheim list_nodes_by_kind person Stephen Wolfram list_nodes_by_kind person Steve Ballmer list_nodes_by_kind person Szymon Fiedler list_nodes_by_kind person Szymon Kulec list_nodes_by_kind person Tomasz Donarski list_nodes_by_kind person Victor Shepelev list_nodes_by_kind person Vladimir Dementyev list_nodes_by_kind person Wojtek Wrona list_nodes_by_kind person Xavier Noria list_nodes_by_kind person Yaroslav Shmarov list_nodes_by_kind person Yatish Mehta list_nodes_by_kind person Yehuda Katz list_nodes_by_kind tool Abbrev list_nodes_by_kind tool Action Cable list_nodes_by_kind tool actions/checkout list_nodes_by_kind tool actions/upload-artifact list_nodes_by_kind+search_nodes tool Active Admin list_nodes_by_kind tool activerecord-multi-tenant list_nodes_by_kind+search_nodes tool Active Storage list_nodes_by_kind tool acts_as_api list_nodes_by_kind tool acts_as_paranoid list_nodes_by_kind tool acts_as_tenant list_nodes_by_kind tool AES list_nodes_by_kind tool aggregate_root list_nodes_by_kind+search_nodes tool Akamai list_nodes_by_kind tool Amazon ECS list_nodes_by_kind+search_nodes tool Amazon Elastic Transcoder list_nodes_by_kind+search_nodes tool Amazon Route 53 list_nodes_by_kind+search_nodes tool Amazon S3 list_nodes_by_kind+search_nodes tool Amazon Web Services list_nodes_by_kind tool Android Studio list_nodes_by_kind tool Angular list_nodes_by_kind tool anyway_config list_nodes_by_kind tool Apache HTTP Server list_nodes_by_kind tool Apache Kafka list_nodes_by_kind tool Apartment list_nodes_by_kind tool Apple QuickTime list_nodes_by_kind tool AppSignal list_nodes_by_kind tool Argon2 list_nodes_by_kind+search_nodes tool async list_nodes_by_kind tool Avo list_nodes_by_kind tool awk list_nodes_by_kind tool AWS DataSync list_nodes_by_kind+search_nodes tool AWS Elastic Load Balancer list_nodes_by_kind+search_nodes tool AWS Lambda list_nodes_by_kind+search_nodes tool Babel list_nodes_by_kind tool bcrypt list_nodes_by_kind tool BME280 list_nodes_by_kind+search_nodes tool Brotli list_nodes_by_kind tool Browserslist list_nodes_by_kind tool bump gem list_nodes_by_kind+search_nodes tool C++ list_nodes_by_kind tool CarrierWave list_nodes_by_kind tool carrierwave_backgrounder list_nodes_by_kind tool carrierwave-video list_nodes_by_kind tool Cassandra list_nodes_by_kind tool Cells list_nodes_by_kind tool Celluloid list_nodes_by_kind tool ChatGPT list_nodes_by_kind+search_nodes tool chess.com list_nodes_by_kind tool colors.js list_nodes_by_kind tool Cordova list_nodes_by_kind tool core-js list_nodes_by_kind tool Crystal list_nodes_by_kind tool Crystal Ball list_nodes_by_kind tool cssbundling-rails list_nodes_by_kind tool curl list_nodes_by_kind tool curses list_nodes_by_kind tool Datadog list_nodes_by_kind tool DBM / SDBM / GDBM list_nodes_by_kind tool Deface list_nodes_by_kind tool Dependency list_nodes_by_kind+search_nodes tool Devise list_nodes_by_kind+search_nodes tool devise_token_auth list_nodes_by_kind+search_nodes tool Discourse list_nodes_by_kind tool Distributed Ruby list_nodes_by_kind tool Django list_nodes_by_kind tool Docker list_nodes_by_kind tool dry-cli list_nodes_by_kind tool dry-container list_nodes_by_kind tool dry-struct list_nodes_by_kind tool dry-types list_nodes_by_kind tool dry-validation list_nodes_by_kind tool EDN list_nodes_by_kind tool Elasticsearch list_nodes_by_kind tool Electron list_nodes_by_kind tool Elixir list_nodes_by_kind tool Elm list_nodes_by_kind tool Ember.js list_nodes_by_kind tool Entity Store list_nodes_by_kind tool Erlang list_nodes_by_kind tool esbuild list_nodes_by_kind tool ESLint list_nodes_by_kind tool ESP32 list_nodes_by_kind tool ESP-IDF list_nodes_by_kind tool Ethereum list_nodes_by_kind tool EventMachine list_nodes_by_kind tool FactoryBot list_nodes_by_kind tool Faker list_nodes_by_kind tool Faker.js list_nodes_by_kind tool Falcor list_nodes_by_kind tool FFmpeg list_nodes_by_kind tool ffprobe list_nodes_by_kind tool file (Unix command) list_nodes_by_kind tool find-slow script list_nodes_by_kind tool fish shell list_nodes_by_kind tool flag_shih_tzu list_nodes_by_kind tool Flow list_nodes_by_kind tool FreeRTOS list_nodes_by_kind tool Fulcro list_nodes_by_kind tool Fulcro Inspect list_nodes_by_kind tool Go list_nodes_by_kind tool Golf Script list_nodes_by_kind tool Grafana list_nodes_by_kind+search_nodes tool GraphQL list_nodes_by_kind+search_nodes tool gRPC list_nodes_by_kind tool Guard list_nodes_by_kind tool gzip list_nodes_by_kind tool Hanami list_nodes_by_kind tool hanami-events list_nodes_by_kind tool heapy list_nodes_by_kind tool Heckle list_nodes_by_kind tool Heroku list_nodes_by_kind tool Homebrew list_nodes_by_kind tool Hotwire list_nodes_by_kind tool htmx list_nodes_by_kind tool HTTP/2 list_nodes_by_kind tool ImageMagick list_nodes_by_kind tool image_processing gem list_nodes_by_kind tool Initializer list_nodes_by_kind tool interactor list_nodes_by_kind tool Iodine list_nodes_by_kind tool IronRuby list_nodes_by_kind tool iTerm2 list_nodes_by_kind tool Java list_nodes_by_kind tool Jekyll list_nodes_by_kind tool JIRA list_nodes_by_kind tool jq list_nodes_by_kind tool JRuby list_nodes_by_kind tool jsbundling-rails list_nodes_by_kind tool JSON API Resources list_nodes_by_kind tool Jumpstart Pro list_nodes_by_kind tool Kerbal Space Program list_nodes_by_kind tool Klaviyo list_nodes_by_kind+search_nodes tool knapsack_pro list_nodes_by_kind tool Kotlin list_nodes_by_kind tool Laravel list_nodes_by_kind tool Leela Chess Zero list_nodes_by_kind tool left-pad list_nodes_by_kind tool libvips list_nodes_by_kind tool Lichess list_nodes_by_kind tool log4j list_nodes_by_kind tool Logux list_nodes_by_kind tool macOS say command list_nodes_by_kind tool Matrix (Ruby stdlib) list_nodes_by_kind tool merb list_nodes_by_kind tool MessageDB list_nodes_by_kind tool methods gem list_nodes_by_kind tool Midjourney list_nodes_by_kind tool Mimic list_nodes_by_kind tool mini_magick list_nodes_by_kind tool MinIO list_nodes_by_kind tool nginx list_nodes_by_kind tool Node.js list_nodes_by_kind tool npm list_nodes_by_kind tool Opal list_nodes_by_kind tool OptionParser list_nodes_by_kind tool Outlook list_nodes_by_kind tool Paperclip list_nodes_by_kind+search_nodes tool parallel_tests list_nodes_by_kind tool Pathom list_nodes_by_kind tool Perl list_nodes_by_kind tool PgBouncer list_nodes_by_kind tool PgHero list_nodes_by_kind+search_nodes tool Phlex list_nodes_by_kind tool Phoenix list_nodes_by_kind tool Phoenix LiveView list_nodes_by_kind tool PHP list_nodes_by_kind tool Plezi list_nodes_by_kind tool PostgreSQL list_nodes_by_kind tool power_assert list_nodes_by_kind tool Power BI list_nodes_by_kind+search_nodes tool Preact list_nodes_by_kind tool Prime (Ruby stdlib) list_nodes_by_kind tool PR Labeler list_nodes_by_kind tool Prometheus list_nodes_by_kind tool Protocol Buffers list_nodes_by_kind tool PStore list_nodes_by_kind tool Puma list_nodes_by_kind tool Pundit list_nodes_by_kind tool PureScript list_nodes_by_kind tool QEMU list_nodes_by_kind tool Rack list_nodes_by_kind tool Rack::Static list_nodes_by_kind tool Rails 5.2 list_nodes_by_kind tool rails_event_store list_nodes_by_kind+search_nodes tool Rails Event Store Event Browser list_nodes_by_kind tool RBS list_nodes_by_kind tool React list_nodes_by_kind tool React Native list_nodes_by_kind tool RealtimeBoard list_nodes_by_kind+search_nodes tool Redis list_nodes_by_kind tool Redmine list_nodes_by_kind tool Redux list_nodes_by_kind tool Refile list_nodes_by_kind tool Reform list_nodes_by_kind tool Release Drafter list_nodes_by_kind tool Representable list_nodes_by_kind tool RequestStore list_nodes_by_kind tool reviewdog list_nodes_by_kind tool ROM list_nodes_by_kind tool RSpec list_nodes_by_kind tool Rubinius list_nodes_by_kind tool RuboCop list_nodes_by_kind tool Ruby list_nodes_by_kind tool Ruby Browser Detection Gem list_nodes_by_kind tool ruby-contracts list_nodes_by_kind tool Ruby Event Store list_nodes_by_kind+search_nodes tool RubyGems list_nodes_by_kind+search_nodes tool Ruby on Rails list_nodes_by_kind tool Ruby Packer list_nodes_by_kind tool ruby/setup-ruby list_nodes_by_kind tool Rust list_nodes_by_kind tool Sequel list_nodes_by_kind tool server-engine list_nodes_by_kind tool Shrine list_nodes_by_kind tool Sidekiq list_nodes_by_kind tool Solidus list_nodes_by_kind tool Sonic Pi list_nodes_by_kind tool Sorbet list_nodes_by_kind tool Spree list_nodes_by_kind tool Spring list_nodes_by_kind tool SQLite list_nodes_by_kind tool Standard RB list_nodes_by_kind tool Stimulus list_nodes_by_kind tool StimulusReflex list_nodes_by_kind tool Stockfish list_nodes_by_kind tool Strada list_nodes_by_kind tool streamio-ffmpeg list_nodes_by_kind tool Sumo Logic list_nodes_by_kind tool Swift list_nodes_by_kind tool Sync Space VR list_nodes_by_kind tool Tailwind CSS list_nodes_by_kind tool TestBench list_nodes_by_kind tool test-prof list_nodes_by_kind tool ThingSpeak list_nodes_by_kind tool Thor list_nodes_by_kind tool Trailblazer list_nodes_by_kind tool Traveling Ruby list_nodes_by_kind+search_nodes tool TruffleRuby list_nodes_by_kind tool TSort list_nodes_by_kind tool TTY toolkit list_nodes_by_kind tool Turbo list_nodes_by_kind tool Turbo Drive list_nodes_by_kind tool Turbo Frames list_nodes_by_kind tool Turbo Laravel list_nodes_by_kind tool Turbo Native list_nodes_by_kind tool Turbo Streams list_nodes_by_kind tool TypeScript list_nodes_by_kind tool Tyrant list_nodes_by_kind+search_nodes tool Unicorn list_nodes_by_kind tool Uppy list_nodes_by_kind tool ViewComponent list_nodes_by_kind talk Prevent account sharing search_nodes+get_node_edges company Auth0 search_nodes concept Open Banking Provider search_nodes concept Direct Upload to Cloud search_nodes concept Logux Proxy search_nodes takeaway Contribute to Arkency aggregates repository search_nodes concept Unique Per-Site Email Leak Detection search_nodes company Transloadit search_nodes takeaway Trailblazer tracing saves thousands of debugging hours search_nodes project logux-rails search_nodes concept Trailblazer Workflow search_nodes takeaway Use Logux for optimistic UI with Rails search_nodes question Can parts of Eventide, Rails Event Store and Trailblazer be combined in one project? search_nodes talk Better ActiveRecord IRB Output Gem Lightning Talk search_nodes concept EXPLAIN / EXPLAIN ANALYZE search_nodes question Cross-region business reporting aggregation search_nodes takeaway UI Data Is Never Truly Fresh search_nodes takeaway Name Things To Find Their Properties search_nodes takeaway Use devise_token_auth for API tokens search_nodes question Using external auth providers instead of Devise search_nodes question Have you reported these issues upstream to Devise? search_nodes talk Devise pitfalls and way to tighten security search_nodes takeaway Limit Devise password length to 72 bytes search_nodes concept ActiveRecord Encryption search_nodes concept DNS geolocation routing search_nodes takeaway Use 302 not 301 for region redirects search_nodes takeaway CDN is not always the answer search_nodes takeaway Add SEO alternate links across regions search_nodes concept Magic bytes MIME detection search_nodes concept Command UUID Deduplication search_nodes concept Data Tokenization search_nodes talk Sonic Pi Music Performance search_nodes talk Building LLM powered applications in Ruby search_nodes talk One machine please, make it Turing search_nodes talk No 'Pundit' Intended search_nodes resource Short Ruby Newsletter search_nodes project gemcheck search_nodes talk Phantom Migrations Gem Lightning Talk search_nodes takeaway Use Ruby Packer for Single-Binary CLIs search_nodes takeaway Use Refinements for Coordinated Modernization search_nodes talk Fantastic Databases and Where to Find Them search_nodes takeaway Sign serverlessforruby.org petition search_nodes project Trezy search_nodes project rails_event_store/ecommerce search_nodes company SpaceX search_nodes question Should 'add item' be split into add-new and increase-existing? search_nodes talk Event Sourcing and Actor model in Ruby search_nodes concept Event Sourcing search_nodes talk Introduction To Event Sourcing How To Use It With Ruby search_nodes takeaway Don't be afraid of event sourcing search_nodes takeaway Adopt event sourcing gradually search_nodes talk Applying CQRS & Event Sourcing on Rails applications search_nodes question Can you do DDD without event sourcing? search_nodes takeaway Hiring For Event Sourcing Trade-off search_nodes

2 edges