Cordiali saluti!
1,682 karma · joined February 19, 2010
Cordiali saluti!
We converted Freshflow into a GmbH and needless to say it was expensive.
Double taxation is not better.
I explain in the post how the other options are worse.
Love seeing projects like this.
If you know what good looks like, the tools are incredible. If you don't, they help you produce plausible wrong things faster.
When artifacts are cheap, differentiation comes from quality.
But "same amount of software" is the part I do not buy. When something gets much cheaper, people usually want more of it. A lot of software does not exist today because it is too expensive to build or maintain. If that cost drops, the surface area of what is worth automating expands.
I think engineering work will move toward owning more, reviewing more, making better product decisions, and being accountable for a larger surface area.
To the points the post makes: as the author of RubyLLM, I've built several chat interfaces streaming from LLMs with Hotwire. They handle token by token streaming, full message restreaming at the end, role parsing, etc. They work great and the code is concise and beautiful.
Certain apps' hot paths are on the client, so it makes sense that Figma pays a lot of attention to that. However, did you know that Figma use Rails under the hood?
Ruby deserves a different story than what's shown here.
Complexity? We migrated in 30 minutes. It’s just Async blocks, not goroutine scheduling gymnastics.
Not claiming it’s a silver bullet - the post explicitly says “use threads for CPU work”. But for I/O-bound LLM streaming, the massive improvement is real and in production.
The `Async do` wrapper just at the orchestration level, not throughout your codebase. That's a huge difference in practice.
Regarding pgbouncer - yes, it helps with connection pooling, but you still have the fundamental issue of 25 workers = 25 max concurrent LLM streams. Your 26th user waits. With fibers, you can handle thousands on the same hardware because they yield during the 30-60s of waiting for tokens.
Sure, for pure performance you'd pick another language. But that's not the point - the point is that you can get much better performance for IO-bound workloads in Ruby today, without switching languages or rewriting everything.
It's about making Ruby better at what it's already being used for, not competing with system languages.
Happy to answer any questions.
Switched to async-job in 30 minutes. No code changes needed. No max_threads = our AI app went from barely handling 25 users to thousands on the same hardware.
The beautiful part: existing libraries like RubyLLM automatically get async performance because Net::HTTP yields to fibers. No special async versions needed. No async/await keywords polluting your codebase.
After a decade in Python's asyncio world, this feels like how async should have been done. You get massive concurrency without the complexity tax.
Happy to discuss the technical details or migration experience. The future of Ruby AI apps is here, and it's surprisingly simple.
Have you noticed how every AI interface needs to let you choose between models? The current select element is embarrassingly inadequate when you need to show more than just text labels. You want to display model capabilities, performance indicators, context sizes - not just "GPT-4" vs "Claude 3.7" as plain text.
What we're really seeing is specific applications where conversation makes sense, not a wholesale revolution. Natural language shines for complex, ambiguous tasks but is hilariously inefficient for things like opening doors or adjusting volume.
The real insight here is about choosing the right interface for the job. We don't need philosophical debates about "the future of computing" - we need pragmatic combinations of interfaces that work together seamlessly.
The butter-passing example is spot on, though. The telepathic anticipation between long-married couples is exactly what good software should aspire to. Not more conversation, but less need for it.
Where Julian absolutely nails it is the vision of AI as an augmentation layer rather than replacement. That's the realistic future - not some chat-only dystopia where we're verbally commanding our way through tasks that a simple button press would handle more efficiently.
The tech industry does have these pendulum swings where we overthink basic interaction models. Maybe we could spend less time theorizing about natural language as "the future" and more time just building tools that solve real problems with whatever interface makes the most sense.
Valid point. I'm actually already working on testing better streaming using async-http-faraday, which configures the default adapter to use async_http with falcon and async-job instead of thread-based approaches like puma and SolidQueue. This should significantly improve resource efficiency for AI workloads in Ruby - something I'm not aware is implemented by other major Ruby LLM libraries. The current approach with blocks is idiomatic Ruby, but the upcoming async support will make the library even better for production use cases. Stay tuned!