Ask HN: If you are starting in 2024, what is the most productive solo dev stack?

36 points by kirso ↗ HN
Most answers to tech stacks take into account "knowing what you know best".

However, for people who are starting out, without the goal or aim becoming a software engineer and aside of the golden trio (html, css, javascript). What would you learn today to build web apps (both static content and interactive experiences)?

97 comments

[ 3.1 ms ] story [ 116 ms ] thread
Without becoming a software engineer? None. Work for 1 hour a month in the developed world to make enough money to pay for, say, a month on https://wpengine.com/, and get to working on the actual website, not its infra.

Even Python will take someone starting from zero anywhere between 10-100 hours to fully grok. A phenomenal time investment if you have any professional interest at all in computers, but if you truly don't, a ridiculous one.

100 hours to grok Python from zero as an upper bound? You must to be a rockstar.
It helps if you have other languages learned before learning Python.
Ah, but no, I really was assuming we are starting from scratch.
It might be possible to become comfortable with Python language within 100 hours. But I can't see how anybody could come up to speed with even the essential set of "batteries" without prior web standards, etc knowledge.
i.e. in professional capacity. Hence the criteria of "# of jobs" does not apply.
For static content: no stack, just html and css, and serve from GitHub Pages.

Maybe Wordpress or Squarespace if you want to do something dynamic.

Anything beyond that and you will need to become a software engineer, or at least learn some programming and server ops.

You can also serve JS from github pages for dynamic sites. You just can't host a back-end server or data store.
Hard to say. I go with DHH: the one that makes you happy. Since you won’t know maybe just pick something mainstream. But I am against nodejs because I find the NPM ecosystem, imports, TS setup and config etc. messy and time consuming versus literally anything else. For example Go, Python, Ruby, Java, .NET, PHP are all reasonable.
Yet any one opinion is just that - one opinion. I find node easy and quick, and some of the ones in your easy list to be easy while others are time-consuming and odd. We're both right - it is all a question of what you are used to.

So for someone just starting out, I agree - just pick one. You'll learn it, it is will make sense, you will be productive, and because you only know one thing everything else will seem weird. If you keep doing things, you'll learn more and then things will seem less weird.

> it is all a question of what you are used to.

In a Dunning-Kruger kind of way? As in, without having the familiarity with other options, you can't recognize how slow and difficult it is?

You T shape it. Play with other frameworks. And also read blogs by people using those frameworks. Keep learning!
For static pages, regular HTML and CSS will be sufficient. For dynamic ones, I would choose Laravel (a PHP framework). I'll give a rather unpopular opinion, but in the beginning, you don't need to become a master in PHP and know every function. The Laravel documentation will guide you step by step when you want to add authentication or create a simple feature for adding dynamic content. There are also plenty of community tutorials. If simplicity is important to you, I would advise against going the fullstack JS route. The Node.js environment or more specifically a framework like Next.js is very convoluted. You'll have to combine packages and functionalities yourself, and constantly changing versions will significantly complicate it.
What if you need javascript? What would you recommend in addition ti to laravel? Or is Laravel enough?
I would argue adding JavaScript on top of Laravel will make you slower. You can use Blade as the templating engine (or how JS people would call "Server Side Rendering" but which has been default for most full stack frameworks). Otherwise you need to create 2 additional interfaces, one for backend and one for frontend. And an additional layer of error handling.

I personally prefer Symfony over Laravel because of it's modularity and extensibility, but Laravel has the edge on getting started quickly and available SaaS features (such as billing modules and stuff).

If you need SPA-ish features, you could use htmx and if you need some on-site interactivity, I like Alpine.js.

Alpine + Livewire is the go-to stack for SPA-like Laravel functionality these days. If you "need" JavaScript for form purposes, Filament is well worth taking a look at as well.
Checkout Inertiajs , it’s and adapter for Laravel to integrate it with react or vue
> For static pages, regular HTML and CSS will be sufficient.

Not if we are talking about productivity, as asked here. HTML is rather simple to learn, but can be annoying enough to write. And let's not start talking about CSS is for a beginner...

Using some flavor of markdown and convert it to html would be far more productive. There is enough software around for enabling people a fast start, and you have the option to still enhance it with html&css (probably javascript too?).

I tried Hugo and Jekyll and such, but it felt out of flow, and I felt going through docs and setting up builds was more effort than just writing it in HTML. The true benefit of HTML IMO is being able to just save something in a plaintext editor and then open it right away.

These days you can probably just write whatever format you like and Claude or ChatGPT will convert it to HTML.

I spent hours researching the right Markdown to HTML renderer. Writing HTML by hand would've been faster. There's dozens of these frameworks and none are perfect.
Or use something like strapdown and let the client handle rendering.

https://naereen.github.io/StrapDown.js/

The strapdown website works surprisingly well with Javascript disabled & is less than 50KiB excluding images. It does take (just barely) perceptibly longer to load than a traditional site.

But I've generally seen sites using this strategy to be a lot more bloated and slow, so please be considerate of that if you can.

When I clicked that link I saw a flash of unstyled content, so that's immediately worse than HTML.

My point was that if you count the time spent looking for the perfect renderer, HTML is faster and easier to write than Markdown unless you're writing a book. You just added another option someone has to spend time evaluating to the pile.

There is no need to look for the "perfect" renderer. That reminds me of the authors that won't write unless they have the best notebook, pen, etc. Just write your content and throw strapdown on it. Who really cares if there's a flash of unstyled content?
Also consider Pug (formerly called Jade). It's a bit more verbose than Markdown, but it's really nice because you can skip closing tags (it's indent-based like Python), can use CSS selector syntax (same as Emmet e.g. `div#someId.someClass`), and you can paste in regular HTML and have that work as well.

There's also file includes, template syntax like loops/if-statements, inherited templates, inline Javascript syntax, "filters" for including Markdown and other languages, and much more

Ruby on Rails if you are a beginner.

If you are experienced, Rails/Laravel but I'd loop Clojure in too.

Doesn't Rails have like an insane learning curve? (I might be as well wrong) at at least compared to other frameworks.
I'll still keep shilling Parse Server + Parse Dashboard for back end. It's open source, it plugs into MongoDB, which is very scalable for when the day comes to replace it with something else. It has things like auth, password reset, cloud functions, etc built in, and there's tutorials for email adapters. It does much of the things you can do on Firebase, but easier and cheaper.

Dealing with the DB is extremely easy too - it handles relations within databases, queries, and the UI of Parse Dashboard is simple like your regular online spreadsheets. It's very easy to normalize DBs and all that.

Old article I wrote on how to set it up in half an hour: https://smuzani.medium.com/setting-up-a-mobile-backend-serve...

For front end, JS + jQuery + Bootstrap works fine for basic interactive experiences.

You probably don't need React level stuff unless you're building a social media site or similar. One of the advantages of React is that it's easy to communicate what's happening to team members without documentation, but this is unneeded if you're solo.

There's disadvantages though - you have to optimize things like all your JS files, and handle reloading from cache when you've updated a JS file. There's no "clean" or "modular" code; if you made a bar like the " new | threads | past ..." the top of this page, you use find and replace. But I have sites that run perfectly fine for years on this, without much issue in maintenance.

Another bonus with simple HTML+CSS+jQuery+Bootstrap is that you can also host it on some really cheap servers. Netlify is free at first, but it does not scale well to say, 10k visits/day.

You might be interested in Pocketbase. Lots of overlap. It’s really good.
Oh, this is nice! Thanks for the recommendation!

On a glance, it looks like Pocket Base is easier and faster to set up but Parse Server might scale better, just because it's tied in with MongoDB by default. SQLite is an interesting choice, but 10k persistent real time connections is pretty much near the point where you should be hiring someone to scale it up.

Supporting Google login out of the box is a major plus, and the dashboard works great on mobile.

At least it seems not to need 600 dependencies like Parse Server does.
I gotta say, back when I worked in an old company they built a service for a client using Parse Server that still works great today, although nowadays it is fully self hosted. It has its limitations, but it’s a good abstraction for simple use cases, and it handles a lot of traffic without problems.
What do you mean by fully self hosted? Not on heroku? On a physical server? Some confuse it with Parse, which ran on their PaaS, before it was open sourced.

I do like it as a middle "low code option" as opposed to the complex no code options like Wordpress or doing the whole stack to build something that might not even sell. Honestly, Firebase has caught up to it in development speed and documentation, but Firebase feels ironically less scalable.

I meant they have an AWS instance with Parse Server running nowadays. It currently deals with a lot of government parking services in the southeast of Brazil. Kinda cool to see it keep existing so far, and I have a friend who managed to keep it reasonably updated with the current version of Parse Server.
For static, I would choose HTML, CSS, and JS (Basically a framework and library like React).

I usually use Laravel, Vue, and InertiaJS for the fullstack. Even though I considered trying a new stack for [1], I decided to stick with what I am familiar with. One reason is because Laravel already integrates well with queues. However, I am not a fan of MySQL and am thinking about switching to a different database.

[1] https://replyhub.co

Probably a full stack framework such as rails or Phoenix. I will argue rails because even if i don't love it, once you learn activeadmin it becomes really fast to build features with it
Clojure/clojurescript
I love Clojure and CLJS but unless you're already familiar with those ecosystem I'd not recommend them for a solo dev starting a new project.
Isn't cljs kinda deprecated now that google closure compiler got shut down?
That's great news! I'll check clojurescript again when they get ride of Google closure
The most productive stack is the one you already know.

If you know Python choose a Python stack, if you know Java choose a Java stack.

within the language you know choose the most used one or the most boring one who existed for more than 10 years.

This answer is such a cop-out. I know Rails very well, but I'm still a million times more productive in Phoenix than I ever was in Rails. Sure, it took some time to learn Phoenix and get up to speed, but if I could go back I'd have made the switch much earlier.

What is the advice here exactly: "never learn anything new"?

I agree with this sentiment. I know half a dozen or even a dozen programming languages (some more than others obviously) and my first project is almost always a web project. Not every language has a decent streamlined / full feature web framework (I really havent found one for Rust yet that has everything OOTB) so you have to build your own pieces (which I've done with CherryPy, though learning Django was a boost, imagine had I never tried Django as suggested above), but now and then new projects emerge. ASP .NET is fantastic, but if a project requires libraries I cannot find for .NET I may opt for Python altogether, which is part of why I with IronPython got more love and attention from Microsoft more directly. With their backing I could see Python on .NET being much more prevalent. Jython is basically in a weird limbo state, and I doubt Oracle will ever have the brain cells to invest in open source in a way that pays them back endlessly.

The real take away is, there's always new web tech you've never heard of that makes you infinitely more productive.

Blazor is peak web development for me right now. The ability to design components and not have to leave C# for UI logic is amazing.

I don't offer advice, I answered a question and platitudes like "I'm million times more productive in Phoenix than I ever was in Rails" makes my "cop-out" "a million times" better than anything you can answer.

If you're starting in 2024 and want/need to be productive right away, use what you already know.

Nobody said anything about "never learn anything new". If you have a job and other people are paying you, the expectation is to deliver, not to "learn this cool thing" and be in awe about you "journey of self discovery" while on the payroll. If you really believe you can learn a language, it's libs and frameworks "in a weekend" and forget that's just another humble brag nerds tend to tell others, then we don't even can proceed with this conversation.

Learning is good and needed, learning is hard and takes time. Respect it.

I think thats exactly what the question is not though.

There are too many un-opinionated answers like this. What if I don't respectfully don't know any stack? (my case).

Thats what the initial question was about.

What do you like about Phoenix? I've never used Rails, but I've tried Django which was inspired by Rails and hated it.

However, I'm interested in Erlang/Elixir, so I'd like to hear what the upsides of Phoenix are.

I really like React Create App on the front end with AWS API Gateway connected to AWS Lambdas. I use AWS Cognito for user login and AWS DynamoDB for my data store. Hosting is dirt cheap to start and scales well if your app takes off. The downside is that you're coupled to AWS.
The official RCA is deprecated. Is there a fork you recommend?
NextJS does more than create-react-app, but you're not required to use all those extra features. You can use it to just escape the tedium of configuring JS tooling.
I spent 4 hours trying to figure out how to build a static nextjs website. I ended up giving up and switching to astro. You basically need to understand SSR to do static sites.
Vite is the closest thing we have to a Create React App successor. It does most of what CRA did in its heyday, while subsisting on far fewer dependencies. Run `npm create vite@latest` and just follow the CLI prompts.
someone told me about vite. ill try that out next. I switched to astro for a blog after giving up with nextjs, and it works pretty well for a blog. not sure about a front end app though.
You could build a blog with Vite and @mdx-js/react, but that honestly might be overkill. Astro is definitely tailored towards the blog use case. Gatsby is another older framework that's oriented more towards building a blog, but I'm not a huge fan of how it insists on making you use GraphQL. Eleventy is another popular choice for JS powered static sites if you're not set on using React.
I’ve used gatsby before and it’s clunky and not well supported any more.
Take a look at Remix. Great DX. No vendor lockin.
Part of my stack selection process these days is considering how well LLM tools like ChatGPT and Claude "know" the stack in question.

Using libraries that have been around for a few years and have accumulated a lot of training data is a huge productivity boost here, because LLM tools can both write code that uses them and usefully explain and debug them when they go wrong.

It's weird and a little uncomfortable to have this as part of my selection criteria, but if I want to maximize the rate at which I can build things it's honestly a useful rule of thumb.

How do you go about determining the aptitude of a particular LLM with a particular stack? What does your evaluation look like?
"Vibes"

Seriously. The only way that works for me is to spend a bunch of time messing around with a model trying out different things.

I really want to have a more repeatable process for this. I've been tinkering with a way of setting up my own automated evals to run against different models but I'm a fair way off having something usable there.

For programming libraries I find that my assumptions usually hold: if a live set is widely used and has been around for a few years it's likely to get good results.

I picked the WTForm Python library recently for this reason.

Isn't this identical to a dev from five years ago saying "I picked X stack because of the community"?

ChatGPT learns from blog posts, forums, etc. If there's a vibrant and helpful community around a stack, ChatGPT has a lot to work with. If it's obscure, not so much.

It's similar to that, yes.

The difference is that I didn't use to rate that as one of my highest selection criteria, because if a new library was well designed and well documented enough I wouldn't feel the need for large amounts of community support.

Today if a new library is well designed and well documented I still might pick a more mature competitor purely for the LLM advantage.

I recently started writing a toy kernel in the Zig programming language and I came upon this realization. The Copilot support was really bad and it was trying to autocomplete with C code, which was correct semantically but wasn't valid Zig code.

It might seem non-important to many, but I was writing a big amount of boilerplate code, tests, etc. and I have a feeling I would've been much more productive just sticking with C.

It really depends on what you're building, but Django is still undefeated for 95% of the things a solo dev will want to create. Everyone here recommends React, but all the interactivity usually doesn't add business value, just complexity and slowness.
How is it compared to Rails? It seems like the world is just divided between server first or JS framework first depending on how much interactivity. In my case i just need some API calling, retrieving data, rendering it on the dashboard (just text, no graphs) and pushing some of the content to another API.
I haven't used Rails, but I assume the two are similar. Django is more popular, which probably means more of an ecosystem, but if you need a simple API, either will do.
Is there a good "drag and drop" option on the UX/UI side? I assume .NET is one?
For me , it is typescript all the down from nodejs , react to react native . The ecosystem is big . Whatever issue you had, there’re likely tons of resources on the web. It makes me very productive and can easily switch context between server , web and mobile as it is just the same typescript
If you’re just starting out a full batteries included thing will work best, meaning database and frameweok with history of stability, popularity and long term support. Ruby on Rails, php with laravel, Python with Django. Because any framework that’s not married to an orm means more voices you have to make and less support and more problems. No js framework meets these criteria although nextjs gets kind of close imo.
FE: Angular + Material (Maybe blazor if no experience with JS/TS)

BE: .NET or Spring Boot

Database: SQLite (eventually PostgreSQL in Docker container)

Hosting: Hetzner

An under-appreciated advantage of single-devs is ease of refactoring.

In the time it takes a big team to schedule a pre-meeting for discussing changing a schema, solo-devs can whip through many huge cross-cutting refactors across their entire architecture without anyone complaining about broken merges.

Building a real, successful thing generally involves more time and more learning about the customer space than you expect at the outset. As a single dev, you have a massive advantage over big teams in your ability to make huge fast change in the architecture of your product.

Here's the controversial part of this: if you want to maximize your ability to make big changes, you want a strongly-typed codebase (for me that's TypeScript on the front-end and C# on the backend because of the quality of the refactoring tooling for it). There's no formal guarantee that strong typing will keep your code working across big refactorings, but in practice it just works. You focus on getting the inner loops right and the compiler and IDE takes care of the rest.

Yes, you can probably write the first iteration faster in a dynamically typed language, but when you start making those big changes that are your unfair competitive advantage against larger teams, the strong typing combined with modern IDE tooling capabilities means a working system remains a working system even as you treat it like completely malleable clay.

I'm also a fan of modular monoliths, again for ease of major refactoring (if you're not familiar with it, check out for example TurboRepo in the node.js space). You can organize an enormous amount of code well using this technique, including having things partitioned to hand off to other devs or multiple teams if you happen to eventually want to scale up from single dev to multi-dev.