← Extractions

Kamal is not harder than your PaaS — Josef Strzibny at wroclove.rb 2026

Josef Strzibny's wroclove.rb 2026 talk walks through deploying Rails apps with Kamal on a single Digital Ocean VM, comparing it to PaaS. He covers Kamal internals (proxy, blue-green deploys, accessories), a cloud-init bootstrap for Ubuntu (unattended-upgrades, fail2ban, UFW, Tailscale, non-root user), running Litestream as an accessory to stream SQLite to Cloudflare R2, secrets, and a demo SerpApi-based keyword tracker. Q&A covers Postgres backups, log/monitoring self-hosting, multi-project hosting on one droplet, Kamal proxy multi-region, deploy targets, non-Rails apps, and image registry mechanics.

Model
claude-opus-4-7
Ingestion
e6f8bff1
Input tokens
396,326
fresh
98,145
cached
252,577
cache write
45,604
Output tokens
16,441
Duration
243.0s
Roundtrips
9
Tool calls
24
Cost
$0.00
Nodes/edges extracted
31 / 67
Read set (nodes/edges)
150 / 2

Nodes (31)

create UFW tool
kind (empty) → tool
name (empty) → UFW
slug (empty) → ufw
attrs (empty) → {"category" => "tool"}
description (empty) → Host-level firewall configured inside the VM (in addition to the cloud firewall). Strzibny's default policy denies ev...
short_description (empty) → Ubuntu's uncomplicated firewall for host-level port filtering.
update Josef Strzibny person
attrs (empty) → {"origin" => "Silesia (Czech side)", "employer" => "SerpApi"}
description Developer and author focused on deployment and infrastructure. → Developer and author focused on deployment and infrastructure. Wrote 'Deployment from Scratch' and the first book on ...
short_description Author of Deployment from Scratch. → Rails deployment author; wrote Kamal Handbook and Deployment from Scratch; works at SerpApi.
update Kamal is not harder than your PaaS talk
attrs {"type" => "talk"} → {"type" => "talk", "alt_title" => "Kamal vs PaaS and how to make better steaks"}
description Talk on Kamal deployment. → Josef Strzibny's wroclove.rb 2026 talk (alt title 'Kamal vs PaaS and how to make better steaks'). Argues Kamal isn't ...
short_description Talk on Kamal deployment. → Josef Strzibny's wroclove.rb 2026 talk on deploying Rails with Kamal as a PaaS alternative.
create Tailscale tool
kind (empty) → tool
name (empty) → Tailscale
slug (empty) → tailscale
attrs (empty) → {"category" => "service"}
description (empty) → Peer-to-peer mesh VPN service (free to start) that creates a secure network between your laptop and servers or betwee...
short_description (empty) → Peer-to-peer mesh VPN, free for small usage.
create unattended-upgrades tool
kind (empty) → tool
name (empty) → unattended-upgrades
slug (empty) → unattended-upgrades
attrs (empty) → {"category" => "tool"}
description (empty) → Ubuntu/Debian package that applies security updates automatically. Installed in Strzibny's cloud-init bootstrap; requ...
short_description (empty) → Debian/Ubuntu package for automatic security updates.
create chrony tool
kind (empty) → tool
name (empty) → chrony
slug (empty) → chrony
attrs (empty) → {"category" => "tool"}
description (empty) → Time-sync service adopted by default on Ubuntu 24.x, so it's no longer necessary to install it yourself in cloud-init...
short_description (empty) → Time synchronization daemon, now default on Ubuntu.
create Blue-Green Deployment concept
kind (empty) → concept
name (empty) → Blue-Green Deployment
slug (empty) → blue-green-deployment
attrs (empty) → {"category" => "pattern"}
description (empty) → Deployment strategy where the new version boots alongside the old one and traffic is switched once the new version is...
short_description (empty) → Gapless deployment strategy running old and new versions in parallel.
create Once project
kind (empty) → project
name (empty) → Once
slug (empty) → once
attrs (empty) → {"status" => "active"}
description (empty) → 37signals' self-hosted software initiative (e.g. Campfire). Referenced by Strzibny as arguably becoming a true PaaS f...
short_description (empty) → 37signals initiative for self-hosted installable software like Campfire.
create Kamal tool
kind (empty) → tool
name (empty) → Kamal
slug (empty) → kamal
attrs (empty) → {"category" => "tool"}
description (empty) → Deployment tool (Rails-ecosystem project) that ships apps to one or more servers via Docker. Splits an application in...
short_description (empty) → Docker-based deployment tool for web apps with blue-green deploys and a built-in proxy.
create Kamal Proxy tool
kind (empty) → tool
name (empty) → Kamal Proxy
slug (empty) → kamal-proxy
attrs (empty) → {"category" => "tool"}
description (empty) → Separate project deployed by Kamal that routes incoming traffic to the right container on a server and performs conta...
short_description (empty) → Kamal's companion reverse proxy that routes and health-checks app containers.
create Kamal Handbook resource
kind (empty) → resource
name (empty) → Kamal Handbook
slug (empty) → kamal-handbook
attrs (empty) → {"type" => "book", "author" => "Josef Strzibny"}
description (empty) → Book by Josef Strzibny, described as the first-ever book on Kamal.
short_description (empty) → Josef Strzibny's book — the first book on Kamal deployment.
create SerpApi company
kind (empty) → company
name (empty) → SerpApi
slug (empty) → serpapi
attrs (empty) → {"industry" => "search API", "free_tier" => "250 searches/month"}
description (empty) → Company providing search APIs that return JSON for Google results, Google Flights, AI Overviews, Amazon products and ...
short_description (empty) → API service returning structured JSON for Google and other search engines.
create Thruster tool
kind (empty) → tool
name (empty) → Thruster
slug (empty) → thruster
attrs (empty) → {"category" => "tool"}
description (empty) → Companion project used via bin/thrust in the Rails Dockerfile to cache assets in front of the app. Strzibny notes the...
short_description (empty) → Rails-ecosystem HTTP/2 proxy providing asset caching for containerized Rails apps.
create Digital Ocean company
kind (empty) → company
name (empty) → Digital Ocean
slug (empty) → digital-ocean
attrs (empty) → {"industry" => "cloud hosting"}
description (empty) → Cloud hosting provider used as the example target in Strzibny's Kamal walkthrough. Strzibny likes Digital Ocean becau...
short_description (empty) → Cloud VM provider with a lightweight do-agent for host metrics.
create do-agent tool
kind (empty) → tool
name (empty) → do-agent
slug (empty) → do-agent
attrs (empty) → {"category" => "service"}
description (empty) → Digital Ocean's host-metrics agent. Installed on a droplet, it reports CPU, memory and network data and enables alert...
short_description (empty) → Digital Ocean's host metrics agent for CPU, memory, network and alerting.
create Ubuntu tool
kind (empty) → tool
name (empty) → Ubuntu
slug (empty) → ubuntu
attrs (empty) → {"category" => "platform"}
description (empty) → Linux distribution used as the OS for the demo Digital Ocean droplet. Strzibny notes his cloud-init script targets Ub...
short_description (empty) → Linux distribution used as the base OS for the demo Kamal droplet.
create cloud-init concept
kind (empty) → concept
name (empty) → cloud-init
slug (empty) → cloud-init
attrs (empty) → {"category" => "practice"}
description (empty) → VM bootstrap mechanism: a user-data script provided at droplet creation time runs on first boot and sets up the syste...
short_description (empty) → User-data bootstrap mechanism for configuring freshly provisioned cloud VMs.
create fail2ban tool
kind (empty) → tool
name (empty) → fail2ban
slug (empty) → fail2ban
attrs (empty) → {"category" => "service"}
description (empty) → Log-scanning security service for Linux. Strzibny installs it via cloud-init because its defaults already protect SSH...
short_description (empty) → Log-scanning service that bans IPs attacking SSH and other services.
create Coolify tool
kind (empty) → tool
name (empty) → Coolify
slug (empty) → coolify
attrs (empty) → {"category" => "platform"}
description (empty) → Self-hosted open-source PaaS (mentioned as 'kifi' in the transcript). Cited alongside Once as an option that has requ...
short_description (empty) → Open-source self-hosted PaaS alternative to Heroku/Vercel.
create Teabags tool
kind (empty) → tool
name (empty) → Teabags
slug (empty) → teabags
attrs (empty) → {"category" => "tool"}
description (empty) → Self-hosted solution mentioned by an audience member in Q&A (from the Once initiative lineage) as an existing replace...
short_description (empty) → Once/DHH-era solution for self-hosted background job processing.
create Deploy many small projects to one Kamal VM takeaway
kind (empty) → takeaway
name (empty) → Deploy many small projects to one Kamal VM
slug (empty) → deploy-many-small-projects-to-one-kamal-vm
attrs (empty) → {"type" => "recommendation"}
description (empty) → For pet projects or small apps, don't provision a separate droplet per app. Put them all on one VM: each project has ...
short_description (empty) → Host multiple independent projects on a single VM by giving each its own Kamal config pointing to the same IP.
create Run Litestream as a Kamal accessory takeaway
kind (empty) → takeaway
name (empty) → Run Litestream as a Kamal accessory
slug (empty) → run-litestream-as-a-kamal-accessory
attrs (empty) → {"type" => "recommendation"}
description (empty) → For SQLite Rails apps deployed via Kamal, configure Litestream as an accessory (own life cycle, its own image, a conf...
short_description (empty) → Ship Litestream alongside SQLite apps as a Kamal accessory with user 1000 to share the volume.
create Layer security in depth on your Kamal VM takeaway
kind (empty) → takeaway
name (empty) → Layer security in depth on your Kamal VM
slug (empty) → layer-security-in-depth-on-your-kamal-vm
attrs (empty) → {"type" => "recommendation"}
description (empty) → Even when features overlap (cloud firewall + UFW + Tailscale + fail2ban + non-root user), keep them all. Security wor...
short_description (empty) → Stack cloud firewall, UFW, fail2ban, Tailscale and a non-root user even if they overlap.
create Use cloud-init instead of Ansible for simple bootstraps takeaway
kind (empty) → takeaway
name (empty) → Use cloud-init instead of Ansible for simple bootstraps
slug (empty) → use-cloud-init-instead-of-ansible-for-simple-bootstraps
attrs (empty) → {"type" => "recommendation"}
description (empty) → When the scope is one VM running Docker and Kamal, Ansible's configuration overhead isn't justified. A cloud-init use...
short_description (empty) → For simple single-VM setups, a cloud-init user-data script beats pulling in Ansible.
create Budget extra RAM for Kamal blue-green deploys takeaway
kind (empty) → takeaway
name (empty) → Budget extra RAM for Kamal blue-green deploys
slug (empty) → budget-extra-ram-for-kamal-blue-green-deploys
attrs (empty) → {"type" => "warning"}
description (empty) → Because Kamal's blue-green deploy briefly runs both old and new containers (and Rails with Solid libraries doubles up...
short_description (empty) → Provision more RAM than you expect — blue-green deploys run old and new versions in parallel.
create Kamal with Postgres backups, replicas and self-hosted monitoring question
kind (empty) → question
name (empty) → Kamal with Postgres backups, replicas and self-hosted monitoring
slug (empty) → kamal-with-postgres-backups-replicas-and-self-hosted-monitoring
attrs (empty) → {"answer_summary" => "Kamal doesn't help specifically with Postgres — run backup containers as accessories; replicas ...
description (empty) → Audience question combining three threads: (a) with Kamal and Postgres, can you get automatic backups, restoration, a...
short_description (empty) → Can Kamal handle Postgres backups/restores/replicas, and what to do for self-hosted logs and monitoring?
create Hosting multiple pet projects on one droplet with Kamal question
kind (empty) → question
name (empty) → Hosting multiple pet projects on one droplet with Kamal
slug (empty) → hosting-multiple-pet-projects-on-one-droplet-with-kamal
attrs (empty) → {"answer_summary" => "Yes. Setup the server once; give each project its own Kamal config with a different service nam...
description (empty) → Audience question: for pet/non-production projects with one user (yourself), can they all live on the same droplet, o...
short_description (empty) → Can you deploy many small projects to the same Digital Ocean droplet with Kamal?
create Kamal Proxy multi-region load balancing roadmap question
kind (empty) → question
name (empty) → Kamal Proxy multi-region load balancing roadmap
slug (empty) → kamal-proxy-multi-region-load-balancing-roadmap
attrs (empty) → {"answer_summary" => "Unknown roadmap; Strzibny has only heard 'something is coming' from DHH, possibly to be reveale...
description (empty) → Audience question: Kamal Proxy has been floated as a load-balancing solution for multi-region deployments — what can ...
short_description (empty) → Where does Kamal Proxy stand on multi-region load balancing?
create Deploying to a separate development server IP question
kind (empty) → question
name (empty) → Deploying to a separate development server IP
slug (empty) → deploying-to-a-separate-development-server-ip
attrs (empty) → {"answer_summary" => "Yes — use Kamal deploy targets (staging/development/PRs) with overrides, selected via -d <desti...
description (empty) → Audience question: if I have Kamal configured and want a development machine on another IP, can I tag or restrict dep...
short_description (empty) → How to tell Kamal to deploy to a different IP for a dev/staging machine?
create Deploying a non-Rails app alongside Rails with Kamal question
kind (empty) → question
name (empty) → Deploying a non-Rails app alongside Rails with Kamal
slug (empty) → deploying-a-non-rails-app-alongside-rails-with-kamal
attrs (empty) → {"answer_summary" => "Yes — Kamal isn't Rails-specific. If a capability isn't in Kamal's CLI, you can often drive Kam...
description (empty) → Audience question: on a VM that already runs a Rails app with Kamal, can you deploy another non-Rails service and hav...
short_description (empty) → Can you deploy a second non-Rails service in the same Kamal-managed VM?
create How Kamal delivers Docker images to servers question
kind (empty) → question
name (empty) → How Kamal delivers Docker images to servers
slug (empty) → how-kamal-delivers-docker-images-to-servers
attrs (empty) → {"answer_summary" => "Traditional path: push to Docker Hub (or similar) with a registry password; servers pull from i...
description (empty) → Audience question on image delivery. Strzibny: traditionally you'd use an external registry like Docker Hub — the bui...
short_description (empty) → What registry does Kamal use and how does the image reach the server?

Edges (67)

create Layer security in depth on your Kamal VM → about → Tailscale
context (empty) → Named as part of the defense-in-depth stack.
relation (empty) → about
source_node_id (empty) → 8f70da0a-e5f0-4565-8de9-a4d7c9af5514
target_node_id (empty) → 27c1da7e-6421-49c8-b749-afa90f9ee7fd
update Josef Strzibny → authored → Kamal is not harder than your PaaS
context (empty) → Delivered this single-speaker talk at wroclove.rb 2026.
update Kamal is not harder than your PaaS → presented_at → wroclove.rb 2026
context (empty) → Given at wroclove.rb 2026.
create Josef Strzibny → attended → wroclove.rb 2026
context (empty) → Speaker at the conference.
relation (empty) → attended
source_node_id (empty) → 9ad3091f-6a53-4043-a18c-f6b194344a86
target_node_id (empty) → c1bfbda9-9fbb-4d7f-8e12-1a7a81621ba9
create Josef Strzibny → works_at → SerpApi
attrs (empty) → {"role" => "employee"}
context (empty) → Recently took a job at SerpApi.
relation (empty) → works_at
source_node_id (empty) → 9ad3091f-6a53-4043-a18c-f6b194344a86
target_node_id (empty) → b5ab53e7-92d7-4242-aa37-70bed2fa9ffd
create Josef Strzibny → authored → Kamal Handbook
context (empty) → Wrote the first-ever book on Kamal.
relation (empty) → authored
source_node_id (empty) → 9ad3091f-6a53-4043-a18c-f6b194344a86
target_node_id (empty) → d42dd8dd-f087-49b5-b403-d0d71faba550
create SerpApi → related_to → wroclove.rb 2026
attrs (empty) → {"role" => "sponsor"}
context (empty) → SerpApi is a sponsor of wroclove.rb 2026.
relation (empty) → related_to
source_node_id (empty) → b5ab53e7-92d7-4242-aa37-70bed2fa9ffd
target_node_id (empty) → c1bfbda9-9fbb-4d7f-8e12-1a7a81621ba9
create Kamal is not harder than your PaaS → about → Kamal
context (empty) → Core subject of the talk.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → b8efd0d6-8dc8-4cbb-a7e2-98c3d8c9fc17
create Kamal is not harder than your PaaS → about → Kamal Proxy
context (empty) → Walks through Kamal Proxy routing, health checks, multi-project hosting.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → 8656622d-4659-45ad-b0d9-93c12d8823d9
create Kamal is not harder than your PaaS → about → Litestream
context (empty) → Demo SQLite Rails app uses Litestream as a Kamal accessory to replicate to R2.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → c8b1820d-3884-4b11-aedc-e33d07ed1896
create Kamal is not harder than your PaaS → about → Docker
context (empty) → Kamal requires Docker locally and on servers; talk covers Dockerfile, named volumes, local registry.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → f4375c6b-4dbe-421e-bf0a-fe1240fd8152
create Kamal is not harder than your PaaS → about → Ruby on Rails
context (empty) → Demo app is a plain rails new with SQLite and Litestream.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Kamal is not harder than your PaaS → about → Digital Ocean
context (empty) → Demo provisions an Ubuntu droplet on Digital Ocean.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → 3bc10e54-5599-4cf4-bb38-97958f0b0f6c
create Kamal is not harder than your PaaS → about → cloud-init
context (empty) → Talk shows a cloud-init script bootstrapping the droplet.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → af28a0f9-45b1-4722-8f97-aa806d060f41
create Kamal is not harder than your PaaS → about → Blue-Green Deployment
context (empty) → Explains Kamal's blue-green deploys and their RAM implications.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → 4b513aae-d4eb-4648-9824-758014a1bd56
create Kamal is not harder than your PaaS → about → SerpApi
context (empty) → Demo app uses SerpApi to track Google keyword rankings.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → b5ab53e7-92d7-4242-aa37-70bed2fa9ffd
create Kamal is not harder than your PaaS → about → Cloudflare R2
context (empty) → Litestream replicates SQLite WAL to R2 in the demo.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → 0abf14da-8707-47ab-9d5b-77938f689470
create Kamal is not harder than your PaaS → about → Thruster
context (empty) → bin/thrust is used in the Rails Dockerfile for asset caching.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → 28b9a801-8a1c-42a8-8a4d-576d469ad89f
create Kamal is not harder than your PaaS → about → Tailscale
context (empty) → Discussed as a way to replace public SSH with a mesh VPN.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → 27c1da7e-6421-49c8-b749-afa90f9ee7fd
create Kamal is not harder than your PaaS → about → fail2ban
context (empty) → Installed via cloud-init; logs inspected when troubleshooting.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → d4c03947-58c3-4f21-a7eb-d1a312705939
create Kamal is not harder than your PaaS → about → UFW
context (empty) → Host firewall layered with the cloud firewall.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → bd3fbccf-a76a-4c05-9919-f36293c45ce9
create Kamal is not harder than your PaaS → about → SQLite
context (empty) → Demo app uses SQLite as the database.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → a65d4872-7d76-4774-a7d5-e29e615de75a
create Kamal Proxy → related_to → Kamal
context (empty) → Separate project deployed by Kamal to handle HTTP routing and health checks.
relation (empty) → related_to
source_node_id (empty) → 8656622d-4659-45ad-b0d9-93c12d8823d9
target_node_id (empty) → b8efd0d6-8dc8-4cbb-a7e2-98c3d8c9fc17
create Kamal → uses → Docker
context (empty) → Kamal uses Docker locally and on target servers to build and run images.
relation (empty) → uses
source_node_id (empty) → b8efd0d6-8dc8-4cbb-a7e2-98c3d8c9fc17
target_node_id (empty) → f4375c6b-4dbe-421e-bf0a-fe1240fd8152
create Josef Strzibny → recommends → Kamal
context (empty) → Advocates Kamal as a practical PaaS alternative.
relation (empty) → recommends
source_node_id (empty) → 9ad3091f-6a53-4043-a18c-f6b194344a86
target_node_id (empty) → b8efd0d6-8dc8-4cbb-a7e2-98c3d8c9fc17
create Josef Strzibny → recommends → Digital Ocean
context (empty) → Recommends it for Kamal deployments thanks to do-agent metrics and cloud-init support.
relation (empty) → recommends
source_node_id (empty) → 9ad3091f-6a53-4043-a18c-f6b194344a86
target_node_id (empty) → 3bc10e54-5599-4cf4-bb38-97958f0b0f6c
create Josef Strzibny → recommends → Tailscale
context (empty) → Recommends Tailscale to replace public SSH.
relation (empty) → recommends
source_node_id (empty) → 9ad3091f-6a53-4043-a18c-f6b194344a86
target_node_id (empty) → 27c1da7e-6421-49c8-b749-afa90f9ee7fd
create Josef Strzibny → recommends → Litestream
context (empty) → Recommends running Litestream as a Kamal accessory for SQLite backups.
relation (empty) → recommends
source_node_id (empty) → 9ad3091f-6a53-4043-a18c-f6b194344a86
target_node_id (empty) → c8b1820d-3884-4b11-aedc-e33d07ed1896
create Digital Ocean → related_to → do-agent
context (empty) → do-agent is Digital Ocean's own host-metrics agent.
relation (empty) → related_to
source_node_id (empty) → 3bc10e54-5599-4cf4-bb38-97958f0b0f6c
target_node_id (empty) → 07ecf186-abae-4737-9f06-357f3b6e203c
create cloud-init → related_to → Ubuntu
context (empty) → cloud-init script in the talk targets Ubuntu.
relation (empty) → related_to
source_node_id (empty) → af28a0f9-45b1-4722-8f97-aa806d060f41
target_node_id (empty) → 529490f2-70b3-4770-ad5a-82a4f9c82f4f
create cloud-init → related_to → unattended-upgrades
context (empty) → Cloud-init bootstrap installs unattended-upgrades.
relation (empty) → related_to
source_node_id (empty) → af28a0f9-45b1-4722-8f97-aa806d060f41
target_node_id (empty) → 2b1446cb-9ef6-4b7a-a491-969329d61153
create cloud-init → related_to → fail2ban
context (empty) → Cloud-init bootstrap installs fail2ban.
relation (empty) → related_to
source_node_id (empty) → af28a0f9-45b1-4722-8f97-aa806d060f41
target_node_id (empty) → d4c03947-58c3-4f21-a7eb-d1a312705939
create cloud-init → related_to → UFW
context (empty) → Cloud-init configures UFW inside the VM.
relation (empty) → related_to
source_node_id (empty) → af28a0f9-45b1-4722-8f97-aa806d060f41
target_node_id (empty) → bd3fbccf-a76a-4c05-9919-f36293c45ce9
create cloud-init → related_to → chrony
context (empty) → chrony is now an Ubuntu default so no longer needs installing via cloud-init.
relation (empty) → related_to
source_node_id (empty) → af28a0f9-45b1-4722-8f97-aa806d060f41
target_node_id (empty) → c35b2f98-9d77-40a9-8bcb-63a2699c9a5a
create cloud-init → related_to → Tailscale
context (empty) → Optionally installs and authenticates Tailscale during bootstrap.
relation (empty) → related_to
source_node_id (empty) → af28a0f9-45b1-4722-8f97-aa806d060f41
target_node_id (empty) → 27c1da7e-6421-49c8-b749-afa90f9ee7fd
create Kamal → uses → Blue-Green Deployment
context (empty) → Kamal's deploy model uses blue-green releases for gapless rollouts.
relation (empty) → uses
source_node_id (empty) → b8efd0d6-8dc8-4cbb-a7e2-98c3d8c9fc17
target_node_id (empty) → 4b513aae-d4eb-4648-9824-758014a1bd56
create Once → related_to → 37signals
context (empty) → Once is 37signals' self-hosted software initiative.
relation (empty) → related_to
source_node_id (empty) → 76016188-6f92-4f8a-8731-949496041f2c
target_node_id (empty) → b7de50f4-07ca-48d4-8f62-4e9a4c7acafb
create Teabags → related_to → Once
context (empty) → Teabags is part of the Once/DHH ecosystem of self-hosted solutions.
relation (empty) → related_to
source_node_id (empty) → eb79bde6-1699-4b77-b9f2-9dfa3ce288a5
target_node_id (empty) → 76016188-6f92-4f8a-8731-949496041f2c
create Kamal is not harder than your PaaS → about → Once
context (empty) → Contrasted with Kamal as a possible true PaaS for third-party apps.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → 76016188-6f92-4f8a-8731-949496041f2c
create Kamal is not harder than your PaaS → about → Coolify
context (empty) → Cited alongside Once as a PaaS-like option with app requirements, unlike Kamal.
relation (empty) → about
source_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
target_node_id (empty) → 3b95a219-a7a1-4320-a61b-bfdeb102a023
create Deploy many small projects to one Kamal VM → from_talk → Kamal is not harder than your PaaS
context (empty) → Core recommendation delivered in the talk.
relation (empty) → from_talk
source_node_id (empty) → 8ff3f84c-3762-4271-9315-9150ac9d410d
target_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
create Run Litestream as a Kamal accessory → from_talk → Kamal is not harder than your PaaS
context (empty) → Demo pattern used throughout the talk.
relation (empty) → from_talk
source_node_id (empty) → e27c624b-9241-49e6-a217-931eb6206e78
target_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
create Layer security in depth on your Kamal VM → from_talk → Kamal is not harder than your PaaS
context (empty) → Security posture Strzibny argues for.
relation (empty) → from_talk
source_node_id (empty) → 8f70da0a-e5f0-4565-8de9-a4d7c9af5514
target_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
create Use cloud-init instead of Ansible for simple bootstraps → from_talk → Kamal is not harder than your PaaS
context (empty) → Strzibny explicitly contrasts cloud-init with Ansible for small setups.
relation (empty) → from_talk
source_node_id (empty) → 8eb01cd1-14fb-42ad-b645-70621c6ee26b
target_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
create Budget extra RAM for Kamal blue-green deploys → from_talk → Kamal is not harder than your PaaS
context (empty) → Raised as a practical consequence of Kamal's deploy model.
relation (empty) → from_talk
source_node_id (empty) → 515f23cc-692a-4542-b112-07adc7316fc6
target_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
create Run Litestream as a Kamal accessory → about → Litestream
context (empty) → Takeaway is about configuring Litestream.
relation (empty) → about
source_node_id (empty) → e27c624b-9241-49e6-a217-931eb6206e78
target_node_id (empty) → c8b1820d-3884-4b11-aedc-e33d07ed1896
create Run Litestream as a Kamal accessory → about → Kamal
context (empty) → Takeaway is about Kamal accessory mechanics.
relation (empty) → about
source_node_id (empty) → e27c624b-9241-49e6-a217-931eb6206e78
target_node_id (empty) → b8efd0d6-8dc8-4cbb-a7e2-98c3d8c9fc17
create Layer security in depth on your Kamal VM → about → fail2ban
context (empty) → Named as part of the defense-in-depth stack.
relation (empty) → about
source_node_id (empty) → 8f70da0a-e5f0-4565-8de9-a4d7c9af5514
target_node_id (empty) → d4c03947-58c3-4f21-a7eb-d1a312705939
create Layer security in depth on your Kamal VM → about → UFW
context (empty) → Named as part of the defense-in-depth stack.
relation (empty) → about
source_node_id (empty) → 8f70da0a-e5f0-4565-8de9-a4d7c9af5514
target_node_id (empty) → bd3fbccf-a76a-4c05-9919-f36293c45ce9
create Use cloud-init instead of Ansible for simple bootstraps → about → cloud-init
context (empty) → Takeaway centers on using cloud-init scripts.
relation (empty) → about
source_node_id (empty) → 8eb01cd1-14fb-42ad-b645-70621c6ee26b
target_node_id (empty) → af28a0f9-45b1-4722-8f97-aa806d060f41
create Budget extra RAM for Kamal blue-green deploys → about → Blue-Green Deployment
context (empty) → Explains RAM cost of blue-green deploys.
relation (empty) → about
source_node_id (empty) → 515f23cc-692a-4542-b112-07adc7316fc6
target_node_id (empty) → 4b513aae-d4eb-4648-9824-758014a1bd56
create Kamal with Postgres backups, replicas and self-hosted monitoring → asked_at → Kamal is not harder than your PaaS
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → a0755c28-19f0-4ee4-af92-7cd72f5d5edd
target_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
create Hosting multiple pet projects on one droplet with Kamal → asked_at → Kamal is not harder than your PaaS
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → 780b341b-adbd-4c08-96aa-9f6b62b85acd
target_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
create Kamal Proxy multi-region load balancing roadmap → asked_at → Kamal is not harder than your PaaS
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → f8dc65da-f32a-4996-82c0-0d2aae294ed4
target_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
create Deploying to a separate development server IP → asked_at → Kamal is not harder than your PaaS
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → 2681e0cf-625f-4105-8192-a01fcd86012c
target_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
create Deploying a non-Rails app alongside Rails with Kamal → asked_at → Kamal is not harder than your PaaS
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → 09074c83-3b20-47f9-af7a-457ba1f9f478
target_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
create How Kamal delivers Docker images to servers → asked_at → Kamal is not harder than your PaaS
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → cd5b9439-f665-458a-b11c-22fe00ad5886
target_node_id (empty) → c1f757f9-af12-4aa4-8058-b883882b7767
create Kamal with Postgres backups, replicas and self-hosted monitoring → about → Grafana
context (empty) → Mentioned as part of the self-hosted stack (with Prometheus).
relation (empty) → about
source_node_id (empty) → a0755c28-19f0-4ee4-af92-7cd72f5d5edd
target_node_id (empty) → 4df60298-9aa7-49dd-b487-47dbc09379f0
create Kamal with Postgres backups, replicas and self-hosted monitoring → about → Prometheus
context (empty) → Mentioned as part of the self-hosted stack (with Grafana).
relation (empty) → about
source_node_id (empty) → a0755c28-19f0-4ee4-af92-7cd72f5d5edd
target_node_id (empty) → 4afe605c-464c-4dfe-8493-fada9935e1d0
create Kamal with Postgres backups, replicas and self-hosted monitoring → about → 37signals
context (empty) → Cited as running a self-hosted Grafana/Prometheus stack.
relation (empty) → about
source_node_id (empty) → a0755c28-19f0-4ee4-af92-7cd72f5d5edd
target_node_id (empty) → b7de50f4-07ca-48d4-8f62-4e9a4c7acafb
create Kamal with Postgres backups, replicas and self-hosted monitoring → about → Teabags
context (empty) → Referenced as an existing self-hosted solution from the Once ecosystem.
relation (empty) → about
source_node_id (empty) → a0755c28-19f0-4ee4-af92-7cd72f5d5edd
target_node_id (empty) → eb79bde6-1699-4b77-b9f2-9dfa3ce288a5
create Kamal Proxy multi-region load balancing roadmap → about → Kamal Proxy
context (empty) → Question is specifically about Kamal Proxy capabilities.
relation (empty) → about
source_node_id (empty) → f8dc65da-f32a-4996-82c0-0d2aae294ed4
target_node_id (empty) → 8656622d-4659-45ad-b0d9-93c12d8823d9
create Kamal Proxy multi-region load balancing roadmap → about → DHH
context (empty) → DHH told Strzibny 'something is coming' but didn't elaborate.
relation (empty) → about
source_node_id (empty) → f8dc65da-f32a-4996-82c0-0d2aae294ed4
target_node_id (empty) → 51ed6191-ce15-4ca5-9eed-d55908e5ab88
create Hosting multiple pet projects on one droplet with Kamal → about → Kamal Proxy
context (empty) → Answer hinges on Kamal Proxy routing by hostname.
relation (empty) → about
source_node_id (empty) → 780b341b-adbd-4c08-96aa-9f6b62b85acd
target_node_id (empty) → 8656622d-4659-45ad-b0d9-93c12d8823d9
create Deploying to a separate development server IP → about → Kamal
context (empty) → Covers Kamal deploy targets and -d destination flag.
relation (empty) → about
source_node_id (empty) → 2681e0cf-625f-4105-8192-a01fcd86012c
target_node_id (empty) → b8efd0d6-8dc8-4cbb-a7e2-98c3d8c9fc17
create How Kamal delivers Docker images to servers → about → Docker
context (empty) → Question about Docker image registry and delivery mechanics.
relation (empty) → about
source_node_id (empty) → cd5b9439-f665-458a-b11c-22fe00ad5886
target_node_id (empty) → f4375c6b-4dbe-421e-bf0a-fe1240fd8152
create How Kamal delivers Docker images to servers → about → Kamal
context (empty) → About Kamal's registry defaults and tunneling.
relation (empty) → about
source_node_id (empty) → cd5b9439-f665-458a-b11c-22fe00ad5886
target_node_id (empty) → b8efd0d6-8dc8-4cbb-a7e2-98c3d8c9fc17

Read set

150 nodes

concept Isolate Deployment Types search_nodes talk Kamal is not harder than your PaaS search_nodes+get_node_edges takeaway Tests and Deployment in Under One Second search_nodes concept Single-Machine Deployment search_nodes tool dry-cli search_nodes tool knapsack_pro search_nodes concept Zero-Disconnect Deployment search_nodes tool Render search_nodes tool Jumpstart Pro search_nodes company Kami search_nodes concept Hybrid Search search_nodes concept AI Agent search_nodes project Check search_nodes concept GraphQL max_depth search_nodes takeaway Name Things To Find Their Properties search_nodes talk Events events events search_nodes concept Retrieval Augmented Generation search_nodes tool ChatGPT search_nodes concept Google SXG Cache search_nodes concept Vector Database search_nodes tool Litestream search_nodes tool litestream-ruby search_nodes tool SQLite search_nodes takeaway Run Litestream from day one search_nodes question How do you handle backups with SQLite? search_nodes tool LiteFS search_nodes tool libSQL search_nodes concept Branch-Specific SQLite Databases search_nodes question Biggest table and total database size? search_nodes question Is starting with SQLite a lock-in if I later need Postgres? search_nodes company OVH search_nodes takeaway Sign serverlessforruby.org petition search_nodes tool Heroku search_nodes takeaway Buy Faster Hardware search_nodes concept GitHub Self-Hosted Runner search_nodes tool Cloudflare R2 search_nodes tool CircleCI search_nodes company Cloudflare search_nodes tool Amazon Route 53 search_nodes resource Rocket Real-Time Benchmark search_nodes concept DNS geolocation routing search_nodes tool Sync Space VR search_nodes tool Requestly search_nodes tool Claude Code search_nodes tool Apollo GraphQL search_nodes tool Cloudflare Workers search_nodes tool Docker search_nodes takeaway Build your gem in a Docker container search_nodes tool Docker Compose search_nodes tool dry-container search_nodes takeaway Dockerize Exotic Dependencies search_nodes concept Build Gems in Docker Isolation search_nodes tool Amazon ECS search_nodes question Scaling Sidekiq Elastically search_nodes tool Kubernetes search_nodes person Josef Strzibny search_nodes+get_node_edges concept CI Matrix Strategy search_nodes takeaway Gradual migration via steps search_nodes concept Logux Proxy search_nodes takeaway Signed On-the-fly URLs search_nodes talk How to hijack search_nodes tool Ruby on Rails search_nodes tool Ruby search_nodes question Can you reliably run Rails on JRuby? search_nodes event Rails World search_nodes resource Woman on Rails search_nodes tool Rails 5.2 search_nodes takeaway Ruby as a Data Management Language search_nodes tool Rails 8.1 search_nodes tool Active Admin search_nodes project logux-rails search_nodes takeaway Bump asset version when debugging multi-layer caches search_nodes concept Cache Preheating search_nodes talk Rails Spotlight Chrome Extension Lightning Talk search_nodes takeaway Port Python Libraries With ChatGPT search_nodes question Generate code once vs instruct LLM per request search_nodes concept Rubber Duck Debugging search_nodes person DHH search_nodes resource awesome-ddd search_nodes talk Build Your Own Internal CLI Tools Lightning Talk search_nodes talk Scientific Ruby Lightning Talk search_nodes talk Code Golfing in Ruby Lightning Talk search_nodes talk Configuration Again Lightning Talk search_nodes tool Traveling Ruby search_nodes tool server-engine search_nodes tool Hatchbox search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2018 search_nodes talk Performance Panel wroclove.rb 2024 search_nodes talk Ruby Is Mature Now search_nodes talk Building LLM powered applications in Ruby search_nodes tool GitHub Actions search_nodes concept Direct Upload to Cloud search_nodes tool Apollo GraphQL Platform search_nodes company 37signals search_nodes company Zendesk search_nodes project Basecamp search_nodes resource Ruby Gem Fellowship Fund search_nodes tool PagerDuty search_nodes tool Klaviyo search_nodes project Trezy search_nodes tool PostHog search_nodes tool Prometheus search_nodes tool Grafana search_nodes takeaway Reuse existing observability infrastructure search_nodes tool Honeycomb search_nodes question Alerts on logs vs metrics at scale search_nodes takeaway Batteries-Included Observability search_nodes takeaway Connect engineers to observability costs search_nodes tool Datadog search_nodes takeaway Observability becomes addictive search_nodes takeaway OpenTelemetry lowers vendor lock-in but switching costs remain search_nodes tool Google Search Console search_nodes takeaway Ask the Most Human Question Possible search_nodes project Ruby News search_nodes takeaway Rate-limit login forms with a skip path search_nodes question Protecting against ffmpeg vulnerabilities search_nodes concept Selective MFA Rollout search_nodes takeaway Isolate ffmpeg due to its vulnerability history search_nodes takeaway MFA improves account-sharing health search_nodes concept Unique Per-Site Email Leak Detection search_nodes tool log4j search_nodes concept Timing-Based Enumeration search_nodes question DDoS risk of on-the-fly processing search_nodes question Book recommendation for cross-cultural communication search_nodes concept Handwritten Incentive List and Action Plan search_nodes company Pragmatic Bookshelf search_nodes resource The Culture Map search_nodes resource Drive search_nodes resource The Staff Engineer's Path search_nodes takeaway Master Your Tools search_nodes project Solid Cache search_nodes project Solid Queue search_nodes tool Bootsnap search_nodes concept Connection Pool for Redis search_nodes concept Russian Doll Caching search_nodes concept Static Page Caching via nginx search_nodes talk Better WebPerformance with Rails search_nodes question Application-Level Back Pressure For Sidekiq search_nodes question Which tools do you use to monitor, triage, and fix performance problems? search_nodes tool New Relic search_nodes tool Sentry search_nodes takeaway Narrow the Blocker by Comparing Environments search_nodes tool AppSignal search_nodes question How to triage performance problems? search_nodes

2 edges