Janko Marohnić's Avatar

Janko Marohnić

@janko.io.bsky.social

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

185 Followers  |  112 Following  |  138 Posts  |  Joined: 24.10.2024  |  2.0771

Latest posts by janko.io on Bluesky

Video thumbnail

Because you needed a video of a Porcupine eating an apple... You're welcome #bluesky... ☺️

04.08.2025 21:40 — 👍 12914    🔁 1677    💬 321    📌 125

I was a Vim user before I switched to Zed 🙂

I tried making NeoVim work, but I realized it’s a whole other ecosystem, and I couldn’t deal with all that re-configuration of my vimfiles 😅

31.07.2025 14:19 — 👍 2    🔁 0    💬 1    📌 0

I’m thoroughly interested about the possibility of baking Turbo Mount functionality into ERB and making it feel native to mount components.

I couldn’t quite connect the dots how the previous levels would help us reach this. It sounds almost too good to be true!

28.07.2025 20:55 — 👍 0    🔁 0    💬 1    📌 0

They were too busy making the PR review UI worse 😜

28.07.2025 20:52 — 👍 1    🔁 0    💬 0    📌 0
Post image

Claude wrote two commits in Go for me, a language that I do not understand the first thing about, and those commits were accepted in the OSS project Thruster:

28.07.2025 16:56 — 👍 2    🔁 1    💬 1    📌 0

For me the biggest pain points are having to ditch the class shorthand with some Tailwind utilities, multiple syntax variants, and significant trailing whitespace.

Maybe HTML has the latter as well, but least its syntax is consistent and used by the rest of the world (counting JSX here).

23.07.2025 19:31 — 👍 4    🔁 0    💬 0    📌 0

Here's the post I mentioned—how AI coding agents enabled my leap from a decade of Ruby-only development to contributing to Sorbet, RBS parser, and ZJIT

railsatscale.com/2025-07-19-ai-coding-agents-are-removing-programming-language-barriers/

22.07.2025 18:05 — 👍 8    🔁 1    💬 1    📌 0
RailsConf 2025 - The Modern View Layer Rails Deserves: A Vision for 2025 and Beyond

RailsConf 2025 - The Modern View Layer Rails Deserves: A Vision for 2025 and Beyond

I just published a recap of my RailsConf 2025 talk on my blog!

Herb v0.4.0 is out, now with the Herb Linter, a Formatter preview, and deeper editor integration for HTML+ERB.

Plus: a look at ReActionView, my vision for the future of the Rails view layer.

#railsconf #railsconf2025 @rubycentral.org

17.07.2025 09:28 — 👍 45    🔁 11    💬 3    📌 1

We provide an internal API for another service (also owned by us). That API is spread across various controllers.

It seemed simpler to provide unified rate limiting for any request this service makes to us. This is what we currently have set up with rack-attack (we check the auth token).

18.07.2025 06:39 — 👍 0    🔁 0    💬 0    📌 0
Post image

That's my 2nd blocker for replacing rack-attack.

The 1st one is the inability to access rate limiting state for response headers to communicate rate limits to the caller. This is what we have at the moment:

17.07.2025 19:59 — 👍 0    🔁 0    💬 1    📌 0

It's not actually possible to apply Rails rate limiting *across* controllers, is it?

I thought that `:name` would override the default grouping, but I see that controller path is unconditionally part of the cache key.

17.07.2025 19:59 — 👍 0    🔁 0    💬 1    📌 0

TIL that preserving scroll position on Turbo refresh is independent from morphing, i.e. you can have one without the other.

This is great news, because keeping Stimulus components unbroken after morphing is more challenging than I expected 😅

15.07.2025 14:51 — 👍 0    🔁 0    💬 0    📌 0
Post image

@thorstenball.com Happy for the AGENT.md standard 🙌

Could Zed also be added to the list of tools that support this file? 🙂

15.07.2025 10:51 — 👍 2    🔁 0    💬 1    📌 0

Man, the Raycast extension looks neat! Didn’t know it’s able to approximate color utilities, I’ve been using AI for that.

04.07.2025 17:14 — 👍 0    🔁 0    💬 0    📌 0
Post image

Finally launched a sponsorship program for Tailwind CSS, with a bunch of cool perks ✨

💬 Private Discord community
🤖 Cursor/Claude rules
🎨 Beautiful VS Code themes
🔍 Raycast extension
📚 Early documentation
🫣 Behind-the-scenes source code + Figma files

We're calling it Tailwind Insiders 🚀

04.07.2025 15:53 — 👍 74    🔁 6    💬 4    📌 5

Yeah, I dislike HAML more than Slim. At least in Slim I can use a syntax that's closer to HTML (`p[foo="bar"]`), the % in HAML don't resonate with me.

When I switched to Zed, it took me a while to realize there is a tree-sitter grammar & Zed extension for Slim. So, I'm happy for that at least 😊

30.06.2025 09:56 — 👍 2    🔁 0    💬 0    📌 0

Would be great if we weren’t using Slim at work 🙈

Slim has no tooling, isn’t Tailwind-friendly, and requires inconsistent syntax in general.

27.06.2025 18:45 — 👍 3    🔁 0    💬 2    📌 0

The Ruby extension v0.10.0 for @zed.dev is out, featuring Herb LSP by @marcoroth.dev and bundle-aware debugger support. Happy vide coding!

27.06.2025 05:05 — 👍 18    🔁 4    💬 2    📌 2

That was my first reaction. Solargraph vs Ruby LSP is enough of a split already. And Ruby LSP is backed by Shopify, so you know it will continue to be improved.

I don’t need to optimize for 20k LOC ruby files like the OP, that’s insane to me 😄

23.06.2025 12:52 — 👍 2    🔁 0    💬 1    📌 0
Herb HTML+ERB Language Tools

Herb HTML+ERB Language Tools

As a next step for Herb, I'm happy to announce the release of the Herb Language Server and VS Code extension.

Built on top of Herb's HTML-aware ERB parser to bring diagnostics, instant feedback, and structural awareness to HTML+ERB files.

Still early. Feedback is very much welcome!

20.06.2025 23:16 — 👍 53    🔁 12    💬 1    📌 3
Post image

After hearing this a lot: "no debugger = no Zed"—we’re excited to share that Zed's Debugger has finally launched! 🎉

zed.dev/debugger

18.06.2025 17:56 — 👍 208    🔁 37    💬 10    📌 12

What are good tools for tracking that?

18.06.2025 17:46 — 👍 2    🔁 0    💬 1    📌 0

Larger-scale surgical changes are more within reach now. Things like converting our Sass code into (Lightning) CSS.

I can say "convert all Sass variables to CSS properties", and it does a pretty good job. That's not a simple search-and-replace, because of the `:root { ... }` around initialization.

15.06.2025 11:30 — 👍 1    🔁 0    💬 0    📌 0

Learning how to use AI tools was pretty overwhelming for me at first, often with underwhelming results.

But now I notice how my mindset has shifted. I no longer feel like making boring changes that I know AI could do for me. I want to focus on creative stuff that seems like a less beaten path.

15.06.2025 11:25 — 👍 2    🔁 0    💬 1    📌 0

Dropping older Rubies is not a breaking change. Rubygems/Bundler simply won't offer newer versions of your gem to people on older versions of Ruby, so it can't break existing apps. Therefore, you don't need a major version bump.

13.06.2025 13:54 — 👍 0    🔁 0    💬 0    📌 0

Is it better to have Rubocop via Ruby LSP than via Rubocop LSP?

I haven’t uses any of them to be honest, I don’t remember Rubocop LSP working for me.

12.06.2025 06:36 — 👍 0    🔁 0    💬 1    📌 0
Preview
GitHub - joeldrapper/rubyschema Contribute to joeldrapper/rubyschema development by creating an account on GitHub.

It gives me a lot of joy to make YAML config less shit with this project. YAML and I do not get along.

github.com/joeldrapper/...

11.06.2025 23:35 — 👍 13    🔁 2    💬 1    📌 0

Can we just not abbreviate these concepts? 😄

When I first saw AuthN and AuthZ mentioned in a library wiki, I thought these were new authentication concepts I didn't know about 🤷‍♂️

06.06.2025 19:09 — 👍 2    🔁 0    💬 0    📌 0
Preview
Why agents are bad pair programmers LLM agents make bad pairs because they code faster than humans think. I'll admit, I've had a lot of fun using GitHub Copilot's agent mode in VS Code (https://justin.searls.co/tubes/2025-04-19-17h46m37s/) this month. It's invigorating to watch it effortlessly write a working method on the first try. It's a relief when the agent unblocks me by reaching for a framework API I didn't even know existed. It's motivating to pair with someone even more tirelessly committed to my goal than I am. In fact, pairing with top LLMs evokes many memories of pairing with top human programmers. The worst memories. Memories of my pair grabbing the keyboard and—in total and unhelpful silence—hammering out code faster than I could ever hope to read it. Memories of slowly, inevitably becoming disengaged after expending all my mental energy in a futile attempt to keep up. Memories of my pair hitting a roadblock and finally looking to me for help, only to catch me off guard and without a clue as to what had been going on in the preceding minutes, hours, or days. Memories of gradually realizing my pair had been building the wrong thing all along and then suddenly realizing the task now fell to me to remediate a boatload of incidental complexity in order to hit a deadline. So yes, pairing with an AI agent can be uncannily similar to pairing with an expert programmer. ## The path forward (#the-path-forward) What should we do instead? Two things: 1. The same thing I did with human pair programmers who wanted to take the ball and run with it: I let them have it. In a perfect world, pairing might lead to a better solution, but there's no point in forcing it when both parties aren't bought in. Instead, I'd break the work down into discrete sub-components for my colleague to build independently. I would then review those pieces as pull requests. Translating that advice to LLM-based tools: give up on editor-based agentic pairing in favor of asynchronous workflows like GitHub's new Coding Agent (https://github.blog/news-insights/product-news/github-copilot-meet-the-new-coding-agent/), whose work you can also review via pull request 2. Continue to practice pair-programming with your editor, but throttle down from the semi-autonomous "Agent" mode to the turn-based "Edit" or "Ask" modes. You'll go slower, and that's the point. Also, just like pairing with humans, try to establish a rigorously consistent workflow as opposed to only reaching for AI for troubleshooting. I've found that ping-pong pairing (https://martinfowler.com/articles/on-pair-programming.html#PingPong) with an AI in Edit mode (where the LLM can propose individual edits but you must manually accept them) strikes the best balance between accelerated productivity and continuous quality control Give people a few more months with agents and I think (hope) others will arrive at similar conclusions about their suitability as pair programmers. My advice to the AI tool-makers would be to introduce features to make pairing with an AI agent more qualitatively similar to pairing with a human. Agentic pair programmers are not inherently bad, but their lightning-fast speed has the unintended consequence of undercutting any opportunity for collaborating with us mere mortals. If an agent were designed to type at a slower pace, pause and discuss periodically, and frankly expect more of us as equal partners, that could make for a hell of a product offering. Just imagining it now, any of these features would make agent-based pairing much more effective: • Let users set how many lines-per-minute of code—or words-per-minute of prose—the agent outputs • Allow users to pause the agent to ask a clarifying question or push back on its direction without derailing the entire activity or train of thought • Expand beyond the chat metaphor by adding UI primitives that mirror the work to be done. Enable users to pin the current working session to a particular GitHub issue. Integrate a built-in to-do list to tick off before the feature is complete. That sort of thing • Design agents to act with less self-confidence and more self-doubt. They should frequently stop to converse: validate why we're building this, solicit advice on the best approach, and express concern when we're going in the wrong direction • Introduce advanced voice chat to better emulate human-to-human pairing, which would allow the user both to keep their eyes on the code (instead of darting back and forth between an editor and a chat sidebar) and to light up the parts of the brain that find mouth-words more engaging than text Anyway, that's how I see it from where I'm sitting the morning of Friday, May 30th, 2025. Who knows where these tools will be in a week or month or year, but I'm fairly confident you could find worse advice on meeting this moment. As always, if you have thoughts, e-mail 'em (justin@searls.co).

Why agents are bad pair programmers

30.05.2025 05:54 — 👍 12    🔁 5    💬 3    📌 0

That’s why I use Standard for sane Rubocop defaults.

I would have been downright unable to introduce Rubocop to some apps if it wasn’t for Standard.

I don’t use its CLI, I just import its YAML file in rubocop.yml and still disable cops I dislike.

04.06.2025 16:26 — 👍 1    🔁 0    💬 1    📌 0

@janko.io is following 20 prominent accounts