JP Camara

JP Camara

@jpcamara.com

Principal software engineer @Wealthbox. Husband/Father. Health, travel, tech and Ruby enthusiast. Tech blog at https://jpcamara.com Jokes at https://logicalconclusionscomic.com

1.3K followers766 following684 posts

Totally resonates. I agree with a lot of DHH’s talk, but it just felt like entirely the wrong venue. If not there, you got only that keynote. Without the energy of the following talks and interactions, it’s a bizarre vibe you’re left with about the future of Rails

Jared Norman@jardo.dev

besides being full of holes, DHH's latest keynote also had near nothing to say to Rails users. cool cool cool. https://jardo.dev/what-about-rails

Giving Jev a try by integrating it into yrby collaborative agents Each agent is connected to the document and receiving updates. It then decides using Jev which topic it wants to be involved in

Since i'm speaking now, i've got a ticket up for grabs to @sfruby.com! I'd love to help a fellow Rubyist out, who's maybe been on the fence due to cost. Hit my DMs if that's you! Please only reach out if you truly think you can attend 🙏

JP Camara@jpcamara.com

I'm speaking at @sfruby.com! Buy a ticket and come say hi!

Plus, aiming to have first-class Lexxy support. yrby has support for tiptap/prosemirror/rhino ootb as well, but lexxy-realtime makes it just a drop-in and a couple lines of code

JP Camara@jpcamara.com

yrby is getting to a really strong place. I’m running it in production, and I’ve expanded quite a bit beyond my meager early ambitions I want it to be the first-class answer for realtime collaboration in Ruby/rails, without having to reach for node or any other tool

yrby is getting to a really strong place. I’m running it in production, and I’ve expanded quite a bit beyond my meager early ambitions I want it to be the first-class answer for realtime collaboration in Ruby/rails, without having to reach for node or any other tool

Docs-driven development: when you make a documentation site for your gem and suddenly have to stare at the interface like a normal user and not the author, so you completely rework it to be more friendly/ergonomic 😮‍💨

Here’s the SolidQueue batches 2.5 year architectural journey, filled with O(n^2) algorithms, hot row contention, excessive jobs, and much in between. There’s a strong chance you’ll learn a thing or two - I certainly did 😮‍💨 jpcamara.com/2026/08/31/s...

jpcamara.comSolidQueue Batches: evolution and architectureWhen Rosa first released SolidQueue, she did a fantastic talk on the internals of how it works and what trade-offs she made when building it. You should give it a watch. It’s where I first learned how...

Working on MissionControl batches support - any suggestions? One thing I noticed so far is I didn't add the ability to delete a finished/failed batch

The docs on SolidQueue batches are… solid 😉 In addition, I wrote up this blog post to dig in a bit further on how to use batches in SolidQueue, including some code inspiration - like splitting a RubyLLM chat into parallel sub agents using batches jpcamara.com/2026/08/24/a...

jpcamara.comA Guide to using Batches in SolidQueueSolidQueue is the default queue system shipped with Ruby on Rails. It’s a great choice for your jobs, and works out of the box with Postgres, SQLite and MySQL. It took two and a half years, but as of ...

"Yrb-lite" was a meh name. My initial intent was just to get the most basic thing out, but it's decently robust as it is and i'm having fun expanding it further. Yrb and Y-Ruby aren't available, so I renamed it to "yrby" ("yer-bee"). github.com/jpcamara/yrby

github.comGitHub - jpcamara/yrby: Yjs/yrs-backed collaborative editing for Rails over ActionCable/AnyCable, with reliable document sync and presence awareness.Yjs/yrs-backed collaborative editing for Rails over ActionCable/AnyCable, with reliable document sync and presence awareness. - jpcamara/yrby
JP Camara@jpcamara.com

Spent the last couple weeks working on a gem/package to support Yjs in Rails ActionCable/@anycable.io The result is yrb-lite: github.com/jpcamara/yrb... I'm pretty happy with where it is at so far! Still got work to do, but def give it a try if you're curious about realtime editing

Spent the last couple weeks working on a gem/package to support Yjs in Rails ActionCable/@anycable.io The result is yrb-lite: github.com/jpcamara/yrb... I'm pretty happy with where it is at so far! Still got work to do, but def give it a try if you're curious about realtime editing

github.comGitHub - jpcamara/yrb-lite: Yjs/yrs-backed collaborative editing for Rails over ActionCable/AnyCable, with reliable document sync and presence awareness.Yjs/yrs-backed collaborative editing for Rails over ActionCable/AnyCable, with reliable document sync and presence awareness. - jpcamara/yrb-lite

“It’s 10pm, do you know where your children are?” I added this to my “when good threads go bad” post Does anyone else remember these ads?! May have only been a USA thing

It’s late, and you get alerts that web requests are failing. Page loads hang endlessly. The server isn’t responding, requests are queueing up. What do you do?! "When good threads go bad" is a deep dive into stuck threads, how to deal with them, and what to avoid. jpcamara.com/2025/12/30/w...

jpcamara.comWhen good threads go bad👋🏼 This is part of series on concurrency, parallelism and asynchronous programming in Ruby. It’s a deep dive, so it’s divided into several parts: Your Ruby programs are always multi-threaded: Part 1 ...

🙇‍♂️ 🙇‍♂️ 🙇‍♂️

Irina Nazarova@inazarova.bsky.social

My favorite talk!! @jpcamara.com used Yjs and @anycable.io to build a collaborative text editor in a Rails app, and it was super fun trying it out live with other folks during his talk.

In Sidekiq, you can add a special method to your job class called `sidekiq_retry_in`. This method allows you to dynamically adjust retry behavior. For instance, based on the exception raised you can return a different duration in seconds. /1

TIL if you want to return the duration in seconds, returning it as an Integer is a _hard_ requirement There is a _specific_ check that the class is Integer. If you accidentally return a float, Sidekiq ignores it and reverts to its built-in delay policy. Be careful!

Had an incredible time at @sfruby.com Fantastic talks, amazing people, and great vibes across the board So much to dig into and unpack around tooling, AI, development patterns and our collective ownership in the future of Rails Community day was such a great finish

I'm not sure @ankane.bsky.social is human - maybe some kind of open source being from the future 😂 I said to a colleague - "we'll see, but it's ankane, so it's entirely possible it'll get done soon". Less than an hour later, it was updated 🤯

If you are anywhere near SF Ruby Conf and haven't bought a ticket yet, the time is now! This conf is gonna be 🔥🔥🔥

Irina Nazarova@inazarova.bsky.social

🪩⚠️ Alert: @sfruby.com is in 10 days ! ! ! What's inside: 💎 two dozen new and hot Ruby startups like @bolt.new 💎 authors of RubyLLM, Herb, Active Agent, Inertia Rails, ZJIT, and more 💎engineers scaling Ruby and Rails at Chime, Cisco, Intercom, Shopify 💎afterparty by GitButler 🪩 (see part 2)

View full thread

If you read my article on ruby thread interrupts and bitmasks, this will be very familiar! jpcamara.com/2025/10/22/b... I asked koichi if signals were the inspiration, and he confirmed it. It was fun to see the connection and what can be an inspiration for central language apis! 10/11 🧵

4) "When good threads go bad" coming soon! Dan shows how jobs are executed in the `process` method, which has this hefty section utilizing `handle_interrupt`. He does a great job describing how it works, and my next article will dig deeper into if you're interested! 11/11 🧵

View full thread

`compare_by_identity` sets the hash to compare keys by their reference instead of their value. Not day-to-day useful but a fascinating option, and utilized nicely in Sidekiq 8/11 🧵

3) The design of Ruby thread interrupts seem heavily influenced by linux signals When referring to the linux signal docs, I noticed a startling resemblance - it included `raise` and `kill` functions, a list of pending signals, and a way to block signals using bitmasks with pthread_sigmask 9/11 🧵

View full thread

`handle_signal` can do what it wants! No reentrancy requirements! No special requirements at all in fact - we're back in the regular flow of our program! Super clever. 2) Two weird hash methods big Hash doesn't want you to know... 6/11 🧵

View full thread

The full reasons for that are explained in docs.ruby-lang.org/en/3.4/signa..., and have to do with a concept called "reentrancy". But mike bypasses all of that by using using IO.pipe. The io writer is safe to write to in the trap, so that's all it does, it writes the signal. 4/11 🧵

docs.ruby-lang.orgsignals - Documentation for Ruby 3.4signals: Caveats for implementing Signal. trap callbacks As with implementing signal handlers in C or most other languages, all code passed to Signal.

Meanwhile, the main loop for sidekiq is always waiting on the io reader, calling a blocking method, `wait_readable` in the while loop. Signal received -> write the signal -> wait_readable returns truthy -> while loop runs and calls `handle_signal` with the signal read 5/11 🧵

1) @mike.contribsys.com is a exceedingly clever! 2) I've used Ruby for 12+ years now, and I learned new Hash methods from this article 3) The design of Ruby thread interrupts seem heavily influenced by linux signals 4) My next article "when good threads go bad" will pair nicely with this! 2/11 🧵