Janko Marohnić

@janko.io

Senior Ruby engineer, father, dancer. Creator of Shrine, rodauth-rails and vim-test.

Just in case you still use any Basecamp products, DHH is crashing out about his AI product gently pointing out that it’s bad for him to have extermination fantasies about the Roma people.

DHH tweet saying “This is why we need competition and open weights in Al. Imagine a world where only Anthropic sat as the moral arbiter of acceptable speech. Fucking ridiculous. (Grok of course did it no problem, same too with Kimi K).” when presented with his blog post using a slur about the Roma people.

Genuinely, I find myself working harder. One of my super powers was I was faster than you at designing & writing what I needed to. I needed that time saved to be able to regulate, avoid burnout. Now that’s taken from me. I can’t outpace you. You (proverbial) got to catch up to me for free.

I just released Insta, a new snapshot testing library for Ruby, live at RubyConf in Las Vegas! Extracted from Herb's test suite and inspired by @mitsuhiko.at's fantastic insta library for Rust. `gem "insta"`

Bild

🚀 Zed v1.11 is out! Zed now has dedicated Staged Changes and Unstaged Changes multibuffers where you can review, stage, unstage, or restore individual hunks. Thanks drbh!

Broadcasting Turbo refresh adds an extra round trip and a debounce delay. Broadcasting the content directly fixes that, but introduces a race condition. Here's how to keep fast, immediate updates without race conditions: radan.dev/articles/tur...

When broadcasting a Turbo refresh is not enough: faster UX with versioned immediate updates

The simplest way to make a page collaborative with Hotwire and Rails is to subscribe to changes and broadcast a refresh when relevant models update.

radan.dev

Just upgraded Shrine demo apps & wiki from Uppy v2 to v5, Rails 6.x to 8.x, replaced Webpacker with importmaps, and upgraded Docusaurus v2 => v3. Something that would be a PITA to do manually was done in a breeze by Claude Code 🥂

RubyEvents Guides is now live. Over the last few months, I talked to Rubyists who want to help the community keep going. Some want to restart a local meetup. Some are organizing their first small conference. Some already run events and want to make the next one better.

Bild

People encouraging investing forget to mention that inflation is also a compounding negative force. "If you invest $100/mo for 10 years with 10% annual return, you will have put in $12k but would have ~$20k total". Adjusted for inflation in Czechia, that would be ~$10k invested and ~$13k total.

RDoc 8.0.0 is out now. This is the biggest RDoc release in years, and it brings together a lot of the Ruby documentation work I talked about at RubyKaigi. Also, RDoc now has a logo!

Bild

I asked Claude to generate release notes for Shrine... and I didn't want to change anything afterwards 😮 Like, it wrote them better and more comprehensive than I would have. It's great that this part can be automated now 🤘🏻 Much better than automated GH release notes that just list every commit.

Released Shrine 3.8.0 that does single-request uploads to S3 again for smaller files instead of always using multipart uploads. This should fix any performance/spending regression you might have experienced. Sorry for that! 😅

The difference between contributing to open source and just consuming it is not so much skill, it's how much time you're willing to invest to solve your problem "the right way".

It would be nice if Foo = Data.define(...) do BAR = "baz" end defined `Foo::BAR` constant, but it defines a top-level `::BAR` instead. I'm wondering if it's even possible lexically for Ruby to define nested constants inside a proc definition. One workaround I just found is `self::BAR = "baz"`.