![]() |
|
![]() |
| I love that so much. You just don't see wacky solutions like this any more. I guess it's a good thing, but this career has gotten a hell of a lot less fun and interesting. |
![]() |
| Get NUC, or one of those refurbished Dell or HP mini PCs. They have plenty of CPU power, consume very little idle power, and friendly to Linux. |
![]() |
| Cloudflare Tunnel provides you a publicly routable address for free. With wireguard you would still need a VM somewhere, and if you are hosting your own VM, then whats the point? |
![]() |
| Sounds weird to read that from Western Europe where even the most rural places have fiber!
I understand that the USA is big, but no fiber in SF? |
![]() |
| A mac mini is pretty beefy for hosting a blog!
I’ve had a number of database-driven sites hosted on $5/month VPS that have been on the front page here with minimal cpu or memory load. |
![]() |
| What kind of Mac mini do you use (cpu and ram)? I’m really interested in making the same thing but I’m not sure if the base M4 mini is enough with just 16gb of ram. |
![]() |
| Pretty cool. Wouldn't work for me as my ISP is horrendously unreliable (Rogers in Canada, I swear they bounce their network nightly), but I might consider colocating a mac mini at a datacenter. |
![]() |
| A MacBook Air solves this problem very nicely!
Not only does is have a built in UPS, but also comes with a screen, keyboard and trackpad for you need to do admin tasks physically att the console! |
![]() |
| Lol, by just reading I knew it was. Then I used an AI detection tool and it says 100% sure it is AI-generated. You know how hard it is to get 100% sure it is AI-generated ? |
![]() |
| Most "AI detection tools" are just the equivalent of a Magic 8 ball.
In fact, most of them are just implemented by feeding an LLM the text, and asking "is it AI generated?". You cannot trust that answer any more than any other LLM hallucination. LLMs don't have a magic ability to recognise their own output. Even if your "detection tool" was using exactly the same model, at the same exact version... unless the generation was done with 0 temperature, you just wouldn't be able to confirm that the tool would actually generate the same text that you suspect of being LLM-generated. And even then, you'd need to know exactly the input tokens (including the prompt) used. Currently, the only solution is watermarking, like what Deepmind created: https://deepmind.google/discover/blog/watermarking-ai-genera... but even that, it requires cooperation from all the LLM vendors. There's always going to be one (maybe self-hosted) LLM out there which won't play ball. If you're going to accuse someone of pushing LLM-generated content, don't hide behind "computer said so", not without clearly qualifying what kind of detection technique and which "detection tool" you used. |
![]() |
| > They give useful probabilities
Yes, compared to an all-or-nothing approach, it's better to be upfront about the uncertainty, especially if the tool surfaces the probability by-sentence. But how are those probabilities computed? You mention gptzero, but https://gptzero.me/technology doesn't clarify at all how it works. They link papers using GPTZero (i.e. from other researchers), e.g. https://arxiv.org/pdf/2310.13606 And these very same papers highlight how everything is still unknown > Despite their wide use and support of non-English languages, the extent of their zero- shot multilingual and cross-lingual proficiency in detecting MGT remains unknown. The training methodologies, weight parameters, and the spe- cific data used for these detectors remain undis- closed. GPTZero seems to be better than some of the alternatives, but other discussions here on HN when it was launched highlight all of the false positives and false negatives it yielded: https://news.ycombinator.com/item?id=34556681 https://news.ycombinator.com/item?id=34859348 But all of that is pretty old, there have been a couple of posts in the last year about it, but both are about the business, rather than the quality of the tool itself. https://hn.algolia.com/?dateRange=pastYear&page=0&prefix=fal... So, to check if now it's any better I tried it myself: I got it to yield a false negative (50% human and 50% AI rating, for a text which was wholly AI-generated), and I haven't got it to yield a false positive. But all of this is just anecdotal evidence, I haven't run a rigorous study. For sure, if some competent people believe that the tool won't generate false positives, I'll be mindful of it and (In the rare cases in which I write a long posts/blog articles, etc.) I'll check that it doesn't erroneously flag what I write. It's bittersweet: if a tool that can be relied upon really exist, that would be good news. But if that tool is closed source (just like ChatGPT, Gemini, etc.) that doesn't inspire confidence. What if the closed source detection tool will suddenly start erroneously flagging a subset of human texts which it didn't before? At least, even with the closed source LLMs, we have a bunch of papers that explain their mechanism. I hope that GPTZero will be more forthcoming about the way it works. |
![]() |
| you can inject personal stuff to make it feel original, but huge chunks are still AI-generated. Just get the first 4/5 paragraphs and paste in gptzero |
![]() |
| Not everyone can make a dramatic switch of languages and frameworks. Turbo is excellent at what it does. Pure joy to use, replacing much of our Vue frontend. |
![]() |
| GraphQL is not arbitrary queries into your database! Folks need to really quit misunderstanding that.
You can define any schema and relations you want, it's not an ORM. |
![]() |
| This is a silly argument and sounds like a hot take from someone who's never used this. You could say the same about REST or whatever. It has nothing to do with "the database". |
![]() |
| It is arbitrary queries though? I can send any query that matches your schema and your graphql engine is probably going to produce some gnarly stuff to satisfy those queries. |
![]() |
| The Rails support for multi-model, nested form updates is superb.
Separate entities on the backend - a unified update view if that’s what’s desired. No need for any outside dependencies. |
![]() |
| As someone who co-founded one of the most successful Ruby on Rails consultancies in the world: building CRUD apps is a _fantastic_ business.
There are two types of complexity: essential and incidental. Sometimes, a straightforward CRUD app won't work because the product's essential complexity demands it. But at least as often, apps (and architectures, and engineering orgs, and businesses) are really just CRUD apps with a bunch of incidental complexity cluttering up the joint and making everything confusing, painful, and expensive. I've served dozens of clients over my career, and I can count on one hand the number of times I've found a company whose problem couldn't more or less be solved with "CRUD app plus zero-to-one interesting features." No technologist wants to think they're just building a series of straightforward CRUD apps, so they find ways to complicate it. No businessperson wants to believe their company isn't a unique snowflake, so they find ways to complicate it. No investor wants to pour their money into yet another CRUD app, so they invent a story to complicate it. IME, >=90% of application developers working today are either building CRUD apps or would be better off if they realized they were building CRUD apps. To a certain extent, we're all just putting spreadsheets on the Internet. I think this—more than anything else—explains Rails' staying power. I remember giving this interview on Changelog ( https://changelog.com/podcast/521 ) and the host Adam asking about the threat Next.js posed to Rails, and—maybe I'd just seen this movie too many times since 2005—it didn't even register as a possible contender. Any framework that doesn't absolutely nail a batteries-included CRUD feature-set as THE primary concern will inevitably see each app hobbled with so much baggage trying to roundaboutly back into CRUD that it'll fall over on itself. |
![]() |
| True hah. Of course even if they didn't already most AI libs are actually C++ libs that Python interfaces with, and Ruby has probably the best FFI of any language. |
![]() |
| then you have to rewrite your whole app to use asyncio keywords and colored ORM methods. A gevent monkey patch, or eventually nogil concurrency makes a lot more practical sense. |
![]() |
| Many thanks, I very much appreciate your thoughtful answer. I've added some of the context for my question here: https://news.ycombinator.com/item?id=43144841
Re types, I think what I really want is just comprehensive static analysis. Coming from Rust, where I can immediately pull up every single call site for a given function (or use of a struct, etc.), I find refactoring Ruby/Rails code to be comparatively very painful. It is several orders of magnitude more laborious and time-consuming than it should be, and I just don't find the justification for that cost convincing - I'd trade every last bit of Rails' constant runtime metaprogramming cleverness for more static analysis. What I like about Rails is its batteries-included nature, but I honestly could do without those batteries materialising via auto-magic includes and intercepted method calls. I appreciate that that's just the culture of Ruby though, so I don't expect Rails to ever change. The lack of cutesiness in Elixir sounds lovely. I don't know if functional approaches could make up for a lack of typing for me; I think I'd need to try it. I've used and enjoyed Haskell, but of course that's very strongly typed. |
![]() |
| I have the same experience with typing in Elixir. It's hard to explain without experiencing it yourself, but the dynamic typing just doesn't feel like as big of a deal as it might in other languages. Elixir's guardrails (such as pattern matching in function heads, which you mentioned) get you most of the benefits - and you still get the convenience and simplicity of a dynamic language. It's a great balance.
I'm looking forward to the upcoming gradual type system - it can only be an improvement - but I would still encourage people to try Elixir now, and let go of their preconceptions about static typing. Wrote about it more here: https://arrowsmithlabs.com/blog/you-might-not-need-gradual-t... |
![]() |
| > Performance of what, exactly? Hard to beat the concurrency model and performance under load of elixir.
The performance of my crummy web apps. My understanding is that even something like ASP.NET or Spring is significantly more performant than either Rails or Phoenix, but I'd be very happy to be corrected if this isn't the case. I appreciate the BEAM and its actor model are well adapted to be resilient under load, which is awesome. But if that load is substantially greater than it would be with an alternative stack, that seems like it mitigates the concurrency advantage. I genuinely don't know, though, which is why I'm asking. > Elixir is gaining set theoretic type system, so you are showing up at the right time. https://hexdocs.pm/elixir/main/gradual-set-theoretic-types.h... Neat! Seems clever. Looks like it's very early days, though. |
![]() |
| Fortran? R? C? C++? Even Java may occasionally make a good showing here (depending on what you are doing).
Having seen... things... unless it's written by people with the right skillset (and with funding and the right environment), that it exists doesn't mean you should use it (and the phrase "it's a trap" comes to mind sadly). https://scicomp.stackexchange.com/a/10923/1437 applies (and note I still wouldn't call Julia mainstream yet), so while I'm not saying people shouldn't try, the phrase "don't roll your own crypto" applies just as much to the numeric and scientific computing fields. |
![]() |
| That's over simplifying things ... no, complex gems cannot simply be transformed to Elixir with ChatGPT. You'd have to have an expert in both languages fixing all the bugs. |
![]() |
| Do you mean Ruby lacks syntactic support for adding type annotations inline in your programs?
I am one of the authors of RDL (https://github.com/tupl-tufts/rdl) a research project that looked at type systems for Ruby before it became mainstream. We went for strings that looked nice, but were parsed into a type signature. Sorbet, on the other hand, uses Ruby values in a DSL to define types. We were of the impression that many of our core ideas were absorbed by other projects and Sorbet and RBS has pretty much mainstream. What is missing to get usable gradual types in Ruby? |
![]() |
| If you want something more similar to Next.JS but in the python world, now you have https://fastht.ml/, which also has a big performance benefit over Django. Hahaha, same as Next.JS over Rails, because it is much more bare bones. But I would say that fasthtml has the advantage of being super easy to integrate more AI libraries from the python world.
|
![]() |
| Any language can get you a maintenance nightmare, but a lack of types and a monolith will get you there faster.
Nothing in ruby forces you to make it a monolith of course, but the lack of types hurts |
![]() |
| The language encourages metaprogramming, and disencourages typing. This makes maintenance much more complicated when compared to other languages such as Python, typescript or PHP. |
![]() |
| I don't really know if I would agree on saying that RoR failed, from recent my experiences, it's still a sought after tool for startups.
I do share your opinion on the untyped part, it's a bit of a bummer but there are gems to Ruby that helps with that. Regarding the monkey patches, it's a concern many have and because of that, there is now a cleaner way of doing it! It's called a refinement. It's like monkey patching but in a more controlled way where you don't affect the global namespace. https://docs.ruby-lang.org/en/master/syntax/refinements_rdoc... |
![]() |
| Nobody said they still run on Ruby, but it’s far from “RoR failed”. Other example would be GitHub, still runs on Rails. Shopify, still runs on Rails. I agree, less people doing coding in Ruby, I myself written last line of Ruby a decade ago, but saying “RoR has failed” is just not true.
Update: found a thread here on HN: https://news.ycombinator.com/item?id=29834840 I doubt they’ve rewritten everything to Java for the last three years. |
![]() |
| Loco is worth keeping an eye on for Rust: https://loco.rs/
The Go community is more framework-averse, preferring to build things around the standard library and generally reduce third-party dependencies. Go also tends to be used more for backends, services and infrastructure and less for fullstack websites than Ruby/Python/PHP/C#. |
![]() |
| I suspect long-term LLMs spell the end of typed language popularity in most application programming contexts.
I agree with The Grug Brained Developer (https://grugbrain.dev/) that “type systems most value when grug hit dot on keyboard and list of things grug can do pop up magic. this 90% of value of type system or more to grug”. This already is being heavily replaced by LLMs (e.g. copilot) in many people’s workflows. Co-pilot’s suggestions are already mostly higher level, and more useful, than the static typing auto-complete. I believe the quality-of-autocomplete gap between typed and untyped languages has already largely converged in 2025. Co-pilot today writing TypeScript just doesn’t produce overwelmingly better auto-complete results than JavaScript. Compare with 4 years ago, where Javascript auto-complete was trash compared with TS. And even then, people argued the merits of untyped: all else being equal, less is more. What happens when “all else” IS equal? ;-) Currently, static typing can help the LLM generate its code properly, so it has value in helping the LLM itself. But, once the LLM can basically hold your whole codebase in its context, I don’t see much use for static typing in implementing the “hit dot on keyboard, see list of things you can do” advantage. Essentially, the same way type inference / auto lets languages skip repetitive specification typing, by holding your whole codebase in memory the LLM can mostly infer the type of everything simply by how it is called/used. LLMs take type inference to the next level, to the degree that the type barely needs to be specified to know “press ., see what you can do” I rarely use the static typing type of auto-completion when programming now, almost everything I accept is a higher level LLM suggestion. Even if that’s not true for you today, it might be tomorrow. Is the remaining 10% of “formal correctness” worth the extra volume of characters on the screen? I suspect Rust will do well into the distant LLM future (used in contexts where formal correctness is relatively important, say kernels), and I suspect TypeScript will decrease in popularity as a result of LLMs. |
![]() |
| The last time I tried this it created idiomatic code from scratch. I prompted it in phases though, and I suspect if I had asked it for more at once it might've used a generator. |
![]() |
| Also wanted to mention Django & Python because Python is evidently doing even better in the age of AI and building back-end heavy ML apps with it is much than in Javascript land. |
![]() |
| > sidenote - is NextJS really the best “convention over configuration” approach for react? I’d love to just use ember, but most of the community has moved to react, but I really enjoy the opinionated approach
You might like Remix [0] (I do). [0]: https://remix.run |
![]() |
| It is a batteries included _front end_ framework. You don't need to worry about compiling, routing, code splitting, etc. Most of the things you described should be handled by the back end service |
![]() |
| After all these years, rails is still my favorite framework to build with. Although I have become increasingly bored/frustrated with the front-end development in rails, which lacks a solid rails-way. |
![]() |
| > front-end development in rails, which lacks a solid rails-way.
Hotwire/Turbo/Stimulus with import maps is the prescribed way. Tailwind is emerging as the preferred CSS lib. |
![]() |
| To go in the other direction, static site generators (SSGs) also have a place on the menu. Build locally. Host them on your favorite CDN. I personally really like Zola (Rust), inspired by Hugo (Go). |
![]() |
| Starting today in what scenario would RoR would be a better option than Next.js for building web app? Assuming one has to start from 0 -> 1 . |
![]() |
| Airbnb, Shopify and GitHub I can say never migrated away from RoR. The others I don't know.
Shopify is actually quite active in Ruby development and famously uses the new JIT compiler. |
![]() |
| Shopify made the new Ruby JIT compiler. [0] They're on the Rails Foundation, as is 1Password, among others.
Stripe is still in on Ruby too; they're behind the Sorbet gradual type system, and Ruby is a first-class language for working with their API. I always hear the stereotype of companies starting on Rails and migrating later, and I think it sticks around because it makes some level of intuitive sense, but it doesn't actually appear to happen all that often. I guess successful companies don't see the need to rewrite a successful codebase when they can just put good engineers to work on optimising it instead. [0] https://shopify.engineering/ruby-yjit-is-production-ready |
![]() |
| I wouldn't say Rails is the most simple and abstracted way to build a web application. More so than Next.js, yes, but there are both older and newer technologies that keep things simpler. |
![]() |
| It's still my favourite web framework. I just wish the Ruby language had better support for type annotations (like Python does). Then it'd be sorta perfect for me |
![]() |
| >It became the foundation for numerous successful companies
And after the MVP phase passed and the company became successful, they usually rewrote the software in something else. |
![]() |
| I can point to plenty of companies that have rewritten products at scale. That said, specifically relevant to the article, I believe Shopify and GitHub continue to run Ruby on Rails. |
![]() |
| I'd rather be neither ... but ...
I'd MUCH rather be a pessimist in Europe, languishing with an energy 9mm pointed at my head ... than an optimist under the Trump/Elon cabal ... RIP DHH. |
![]() |
| Now run those numbers per-capita (UK has been arresting around 3k a year for mean tweets). Democratic Germany has been rounding people up as well but I can't find their specific stats. |
![]() |
| So I've found the claim on a fact-check website [0]. It claims that these numbers are not "mean tweets" but a wide range of criminal activity, including e.g. harassing in e-mail or "terrorism offences" and "threats of violence". Now some can argue that it shouldn't be a crime, nevertheless, I do not think that this proves your claim about
> Moral point? “Democratic” European countries lock up more people for “mean” tweets and silent protests than autocratic Russia (who doesn’t claim to be democratic btw). (Which, I don't think is true. I believe it is very-very false.) [0] : https://pa.media/blogs/fact-check/russia-has-far-more-restri... |
![]() |
| Sadly that is what a lot of people in the US have been doing from 2012 - 2022. Choosing a tech stack NOT based on what the people associated with it tweet is a relatively new thing. |
![]() |
| That's not all DHH is saying and I suspect that you know that.
This isn't a majority position in Germany and probably not in many other European countries either: https://world.hey.com/dhh/leave-it-to-the-germans-94dd4bbe In fact DHH admits as much in that very post. Many Europeans I know (if we're trading anecdotes) find it deeply infuriating that an American vice president would meddle in German interior politics in such a way. > Kind of tracks with their current trajectories I guess. This is flamebait and against the spirit of the site. |
![]() |
| I have no interest in debating the merits of these jingoist talking points. I merely pointed out that "DHH's opinions are just average European opinions" is wrong. |
![]() |
| The US are okay with releasing the J6ers and White Boys while in Europe we prefer to treat hate-speech, threats and inciting violence as the crime it is. Those three I quoted from the 60 minute clip DHH posted.
Just in December eight people were convicted in France for the beheading of teacher Samuel Paty. The lie of a schoolgirl skipping class led to a social media campaign against Paty, an imprisoned imam issued a Fatwa and then the murder of Paty by an 18-yr-old Chechen muslim. https://en.wikipedia.org/wiki/Murder_of_Samuel_Paty So far those eight adults and six teens got sentenced but there are idiots who think it's cool to praise the murderer (who was shot by the police) as martyr and get themselves into prison/deported for that. I don't care what anyone's reasoning was, but no one's feeling can be hurt that much that it justifies the killing of another human being. I guess in the US, where nothing can be done about almost daily school shootings, there's nothing they could do about this sort of Freedom of Speech, even worse: Not accepting election results and inciting an attack on Congress still gets you re-elected. It's sad DHH doesn't see that a few years in Malibu have turned him into a Free Speech Absolutist. Freedom of Speech must end where it hurts others or even touches the limits of their freedom. |
![]() |
| I do! I also look forward to working with your trans friends if they're capable and can get along with people who have different opinions than they do. That's what adults do. |
![]() |
| what problem does nextjs solve?
So as to not be disingenuous, I suspect you're making a false dichotomy that rails = backend and nextjs = frontend and so they solve different problems? |
![]() |
| Why? That's like somebody saying Linux has to distance itself from Linus because they have some sort of grudge against them or they don't like the authoritarian position they have over the project. |
Every time I share a project I provide two links, one for my vps and another one for GitHub pages. Usually my projects run on the client, so I have never experienced the hug of death myself.