Ask HN: Freelance website builders/maintainers, what's in your 2024 toolkit?

118 points by petecooper ↗ HN
I am returning to freelance website work after the end of a lengthy contract in an unrelated field. I am completely disconnected from current best practices on platforms & tools to build and maintain websites.

I have some local and national clients who have requested website overhauls, some from the ground up with a respectable budget (mostly national) and others under the single-page basic web presence umbrella with less money available (mostly local).

If you're a freelancer working with building & maintaining websites, I would like to know more about how you build and maintain them. What's in your toolkit? Server-side, front-side, desktop apps…anything goes.

Thank you.

81 comments

[ 3.2 ms ] story [ 165 ms ] thread
I'm a big fan of Firebase. The local emulators make working with it really productive since you can iterate locally against the full stack very quickly. SSO and auth are easy to use; way easier than Cognito. For most clients, it will be virtually free to operate until they reach significant traffic. For your static front-ends, Firebase hosting is fully integrated into Google Cloud CDN with no extra setup. You can extend it to full Google Cloud if you need to (e.g. connect endpoints to Cloud Run if you have container workloads). The Firebase Functions integration is really, really nice and allows for strongly typed invocations if you are using TypeScript. Real time with Firestore is easy and, again, free for most small customers. You can use any FE engine with it - React, Vue, vanilla. The Web Frameworks integration with Functions lets you deploy dynamic backends as well into Cloud Functions.

If I need SEO, I'll build using a framework like Nuxt.js or Astro.js and statically generate the output and host in Firebase Hosting. If I don't need SEO, I'll build regular SPAs using React or Vue.

The overall DX is really good compared to Amplify (closest alternative).

Supabase is also promising if you want to work with a relational DB.

I kind of just assumed people were still using wordpress… especially for projects that require SEO.

Aren’t you having problems with clients wanting to update content on their own?

Projects that require SEO will benefit from static site generation (SSG).

My use cases have limited customer managed content, but it's not hard to connect SSG to headless CMS for authoring.

I don't recommend non-managed WP these days because of how much effort it takes to keep it from getting compromised.

The competition to coded websites is Webflow agencies. Webflow has made websites somewhat predictable to build, enabling agencies to offer flat-rate pricing.

I think a questions you should ask is "What are the client needs that no-code doesn't serve", and explore that. Or, "What are the technical needs for deploying an hybrid coded+low-code stack", e.g. setting up reverse proxies that combine multiple backends.

Altough not freelance, but I operate almost 10 websites atm. I use Remix on pretty much all of them since the dx is great and goes fast to develop more complex things. I host every site on one dedicated server from Hetzner with the Caddy webserver as a reverse proxy in front. I have super fast load times and a cheap monthly bill. I could 10x the traffic and it wouldn't be near hitting the limit of the server and it's like €18/month.
I do a lot of WP hosting and my recent anecdotal experience is that big-popular-named hosting service outperforms premium-tech-oriented hosting service. $15/month versus $125/month. I was shocked. Worked with premium service too, but they were not interested in delving. After 8+ years of being their customer.

Point is, for others — don’t automatically assume well reviewed premium ho$ting is what you need. It may, in fact, be a lot slower.

>big-popular-named hosting service

Any particular recommendations?

I have sites on both Siteground and Hostinger. Happy with both. If you're new to WP or hosting or care about website vitality, pay a little extra for "access to a human" technical support. Still cheap. If you're very particular about configs it's probably better to go with roll-you-own. I'm pretty happy to stick with what's offered -- WP appliance versus customization.

As always: download your backups regularly, though.. I have yet to be bitten in this regard (plenty of other instances across 20+ years of doing this kind of stuff). If this is really important to you, automate the download or go with a host that will backup to Google Drive or similar.

My go-to right now is Typescript, Nuxt ("Next.js for VueJS"), PrimeVue and Supabase. I'm using Vuetify (Material Design toolkit) for an SPA, but PrimeVue is nice for general websites. Nuxt provides SSR/SSG and lets me use a single framework for both sides. All of the above naturally have quirks to get used to. ;)

If I write a backend, it's in Go. It has nice concurrency primitives that lets me structure code the way I want, and memory is managed safely. Using PostgreSQL to store things.

Hosting is with Firebase or on a Hetzner instance with Docker/Podman containers.

Edit: When on Hetzner: using Traefik as a reverse proxy to handle authentication and TLS.

Postgres <> Firebase

Does not compute, aka what are you saying?

If I build a custom backend, I use PostgreSQL and hosting on Hetzner.

Otherwise I use Supabase/Firebase for storage and (mostly) Firebase for hosting.

For marketing sites: Wordpress with a custom theme,ACF, and some other plugins, with WP-Rocket, behind a WAF. Integrate it with whatever service the client uses.

Then hand it over or maintain it for them.

Lately I have been using Framer which is awesome.

Trying to stay away from any JS framework or build system for my sanity.

Have a +1, I’m with you all the way. Of course, brace yourself for downvotes: this is HN, so by default WordPress will get voted down and so will anyone who says not to use JS as a front end :-)
This approach makes sense for even non-freelance deployments. Our primary income earner is a beast, with a custom workflow engine, orchestrated across multiple Docker containers in the cloud etc. However, our marketing site is a Wordpress site with a standard set of plugins, and I don't think I have a single line of custom code on it.
As you might know not one tool fits all, I still have strong preferences for the following. It helps me get going faster and get things done right first time and helps in ease of maintenance.

Language: Typescript.

Frontend Framework: Astrojs [1] or qwik [2]

Frontend Library: React if it requires 3d and other frame-motion like animations, else will not use any frontend library or might throw solidjs if required for some state etc.

Backend: Cloudflare functions, google functions

Auth: Lucia-Auth [3] if required

IDE: VS code with neovim , once deployed to git, I might some time use code-spaces

CSS: DaisyUI [4] with tailwind or Bulma

CSS Library: TailwindUI [5] makes most of the components ready to use and comes from the makers

CMS: Astro content collections or Sanity [6]

Deployment: Cloudflare (Highly preferred) or linode/digitalocean/netlify

Database: turso [7] or neon postgres [8] with (drizzle orm) or cloudflare durable objects

1. https://github.com/withastro/astro

2. https://github.com/BuilderIO/qwik

3. https://github.com/lucia-auth/lucia

4. https://github.com/saadeghi/daisyui

5. https://tailwindui.com/

6. https://www.sanity.io/

7. https://turso.tech/

8. https://neon.tech/

Also huge fan of firebase and their emulators and whole eco-system.

This list is great, and fascinating because I haven't heard of most of it and don't use a single thing on it for my personal or client projects.

I appreciate seeing what stacks work for other people, and also very much appreciate the illustration of how NOT homogenous things actually are out there in the world (despite certain blogs and developer influencers trying to convince you otherwise)

A second vote for this being a great list. This fills in some gaps for libraries I didn't know existed, such as lucia.

I'm going to try out Astro!

Great list. I’m using many of the same tools.

Want to throw in Remix into this list. It’s been a breath of fresh air compared to many convoluted systems these days.

> VS code with neovim

Do you mean VS code with a plugin that makes it look and feel like neovim, or is there a way to make both clients edit the same buffer at the same time?

Sorry for not being clear. It is a plugin with VS code.
How come I don't see anyone recommending ruby and ruby on rails? I am curious as I am going this route.
rails is not a bad choice. you might outgrow it, but once you hit that threshold your scale will be quite substantial and the correct/next path forward will become clear.
In the context of a single freelancer, scale tends to refer to the number of developers, and the size of the client's budget, moreso than the number of requests. I would anticipate that the thresholds you have in mind will probably never be hit by these types of clients.
Because Hacker News is a horrendous place to gauge technologies.
Seriously, some of the responses make me think that they weren’t written by freelancers.
Many of the responses appear to entirely ignore the operative word ('freelancer') and are just descriptions of their personal webdev stack, where the only user is them.
As much as I love ruby and the rails structure, and while I continue to write projects with rails, I no longer really recommend it to peers.

The TS/JS ecosystem is just much larger and that comes with newer libraries, tools and has better support. Getting setup with a basic CRUD rails app is quick, but the more advanced work; auth, deployments, scale, etc. can be frustrating for newcomers.

Not a fan of how they’re going all in on Hotwire. Although I haven’t been following those advancements much lately.

They really need to have some easy way to just roll their api only mode with a stand alone frontend, along with documentation on configuring that.

You just can’t beat the proficiency of using the same types on front and backend. I did enjoy trying out redwoodjs.

I did. It's just not the cool kid anymore, and given that discussion is focused on freelancing, there are other options that may be better for padding your billable hours :-)
No one in here is going to agree with me because I'm not cool, but I don't care, "I've seen it all!!"

I have an employer, and we work with a particular stack, but if I was doing my own thing I would work native each an every time... If you work with apps, xcode and Swift, Android? Android Studio and Kotlin/Java, Windows desktop? Windows Forms and .NET %CURRENT_DOTNET_ITERATION%... Web? pick a solid framework with tons of support and libraries, django, rails, phoenix, et al. Minimize the use of JS libraries/frameworks or remove altogether, forget about fads that mix markup with javascript and logic, and even style (these days). Do not build stuff based on a web browser just so you can call it multi-platform, you will end up shipping a crappy abstraction with a poor UI and even worse performance, because remember, you are playing solo, cant afford the optimizations of large product teams, be pragmatic... deployments/CICD/devops DIY, don't trust services that advertise themselves as a panacea for deployments, remember Heroku f* everyone sideways... learn and use stuff like Dokku or Kamal...

> Do not build stuff based on a web browser just so you can call it multi-platform, you will end up shipping a crappy abstraction with a poor UI and even worse performance (...)

In many cases this sounds better than shipping for only one platform - or not shipping at all.

Plus, if your app idea is basically served by the features that a web app or a PWA offers, then you can write it more or less once (might need a few standalone browser checks in specific places) and deploy on multiple devices, for example, with https://www.pwabuilder.com/

I'm doing that right now. I'm having enough troubles with payment integration and proper auth and back end stuff, there's no way I could ship for web and two different mobile platforms at all without cutting too many corners.

> remember Heroku f* everyone sideways

Can you elaborate please? I hosted an API on heroku recently. I have no problem so far. Should I be concerned?

They used to have a free tier that they killed out of the blue [0]. The cautionary tale is that you cannot just trust these services, they might change the rules at any given time... You can however learn to deploy your own servers and manage your deployments with FOSS tools like the ones I reference.

0: https://help.heroku.com/RSBRUH58/removal-of-heroku-free-prod...

no, Heroku is fine, as long as you have a basic understanding. If your service becomes a runaway hit, your heroku bill may get big, I assume that's what OP is referring to.
It's just expensive and is less of a value add than it was when deployment tools were painful (especially for Rails applications)
You're going to make cross-platform native apps for the local pizza shop who wants to display opening hours and the menu on some kind of webpage? No one here is going to agree with you because the question is specifically about building websites as a freelancer, and you're replying something akin to "don't make websites, trust me I'm not a freelancer." Well okay then?
Native apps certainly do have their plus points, but for use cases like small local business that customers will order from pretty infrequently, a website is the way to go. I don't want another app on my phone that I'll use once and then never again for a year or so. And of course, websites are still the way to go when you just want to put some information up publicly for people to access without any interactivity involved. You wouldn't have an app just to display your store services and timings.
I think you are basically correct: the answer is usually boring technology. That should be everybody's default, and you should have to demonstrate why that is inappropriate on a case-by-case basis. But you should have to demonstrate it to a very skeptical and knowledgeable audience, who will probably roll their eyes when you talk about all the advantages of whatever eight month old technology you are excited to use. If the argument relies on phrases like "look at how many stars it has on github", or "here's a blog post about how great it works", or "big companies use it ... on some brochure sites" then it should not pass the filter.
I'm really happy and productive with Django, DRF, React, React Router, and React Query.

Mostly I just use Django alone with nothing on top, not even a frontend framework.

Where do you deploy for compute/storage? What about needing additional workers? How do you replicate your prod env in dev?
Django rest framework is really great, there’s a bit of a learning curve learning about the viewsets and how permission classes work and things like that, but once you get over that hurdle its so easy to make REST APIs that just hook up so cleanly to models.

I implemented a few custom authentication classes for things like group permissions on read / write for shared projects internally and just hooking this all up means I can write huge new modules that “just” slot in, in just a few hours. IMO they have the abstraction layers just right, it makes me really productive.

MS Visual Studio.
Why the downvotes? It was an honest answer from a longtime freelance web developer.
Laravel for any business type App. It's super easy to deploy, writing custom business logic is easy. There's RAD libraries like Orchid if you need basic UI for the users. There's baked in everything from SMS messages, Payment procesing, Oauth, 2FA, API endpoints and so much more.

Laravel has "Spark" which is a Saas specific starter kit you can utilize too.

PHP is easy to deploy, easy to host, and easy to sub-contract work out. It's really reliable, well understood, developers are low cost, very stable, etc.

When I was doing freelance work, PHP/Laravel was always what I used. It's incredibly simple to deploy compared to the modern "cloud native" stack I use at my day job.
I almost never see it on HN Jobs and that always surprises me. PHP is like the unsung hero around here. Are people really like hiring golang svelte and nodejs in droves or is it just a bias here?
I work daily on a Raspberry Pi 4 with 8GB. I run Raspberry OS with a local Apache2 server. I use gedit (Gnome text editor, only syntax highlighting, line numbers and a little file browser) to program PHP, MySQL and a little Javascript. GIMP I use for editing photos and creating images (also for print). Kdenlive works for editing small to medium size videos. Firefox, Thunderbird, Filezilla, Rhythmbox and SuperTuxKart are also necessary for my workday.

I cannot think of a simpler setup. I'm not even a minimalist, I just can't stand Windows and Apple. Annoying software, blegh. Or paying thousands of bucks for a more powerful computer that I don't need. The RPi4 just works. Quick enough. And then it gets out of the way.

GEdit is nice as is, but there are language server plugins e.g. if you need better navigation.
I'm testing some plugins now. They don't really add to my workflow, it seems. But I have a very simple workflow and my code base is small enough.

What I would like to see is a shrinked code overview to fit the full vertical size of the scroll bar. And some way to find selected occurrences in other files in the code base (same directory, possibly other files).

Hi Pete,

For those of your clients who requested website overhauls, they'll probably prefer to keep their new websites on the same location, as their own hosting, usually it's a cPanel hosting account, like HostGator or GoDaddy, so WordPress is a first choice, if you (and they?) enjoy using it.

But as you mentioned they're local businesses, with limited budget and needs for basic web presence, they would probably love to manage their websites on their own and WordPress may look scary for most of the less technical users. You can try Kopage (https://kopage.com), similar to WordPress, it can be self-hosted, but it works in the cloud in the first place. And it's free.

A little disclaimer: Kopage is one of my projects, and this was the exact reason it was created in the first place, as a tool as user-friendly and intuitive as possible for our own clients, so they can manage their own websites and don't be afraid to break something.

There's a white-label plan if you'd like to offer it under your own brand.

Looks nice. First thing I wanted to try was setting up a dynamic source of content (e.g. a table that repeats its rows from a data source I specify) but I couldn't figure out how. How can I include dynamic content in my site using external data sources like a REST api?
This will sound like cheating but I argue for the time it saves me, both in creation and on-going maintenance, and delivering a quality finished project: Squarespace.

The clients are happy, if they get to the point where they want to manage the content themselves, and for less than $300/yr they get hosting, access to a payment processor if they need it, and domain renewal. It's been a no-brainer.

I do same, but with Wordpress and Elementor builder. It's good enough for most small scale clients on nano-size budget. But Squarespace is a solid tool too!
I don't feel that's cheating. In many ways you're a better option than a generalist, since I assume you've become an expert on that platform. I know others who focus on Shopify, Wix, etc.
React and TailwindCSS for everything now. I'm fed up of churn, fed up of the constant stream of new UI toolkits and static site this and Next that and Svelte the other.

I spent my "new technology budget" on upgrading most of my projects to vite, which already kind of annoyed me, but it does seem a tad faster than Webpack and keeps my projects from bitrotting away so, eh.

I actually increased my use of React in the last year or so by using it to render to HTML/PDF on the back-end now as well, combining it with weasyprint or puppeteer to pump out the final PDF's.

To be clear: I currently try to build everything web related (websites, static pages, webapps, PDF's, electron apps) with React now.

anybody got resource recommendations to get started on freelancing? Never done it before, but considering starting
As a team we use - NextJS (AppRouter) for the UI, TailwindCSS + shadcn ui - Custom CMS built on top of Strapi for the backend - We use self-hosted GitLab and for every project we have CI/CD by default. - For every project (even simple landings) we use server from Contabo. It’s like 6$ for 6GB RAM and 400GB SSD - Everything is dockerized and gets deployed using gitlab-runner. - Traefik is used as reverse-proxy - Minio is used as a storage (with some tweaks for caching) - Postgres is DB of choice

Everything lives as scripts. Only Next UI is developed from scratch for each customer.

Some of the suggestions in this thread are completely nuts. If you are building a traditional marketing website for a client, you're doing your client a disservice if you don't use a CMS or hosted platform like Wordpress, Squarespace, Webflow, Shopify etc. You should be delivering something to them that it easy to maintain and document. If they need to get somebody in to help in 5 years, they shouldn't need to find a be full-stack web-app developer.
Here!

https://wpengine.com/support/sync-new-post-and-pages/#Import...

I had to scroll up a bit to see the heading. They couldn't figure out how to jump to the #anchor apparently no one is actually looking at the new user experience. This wouldn't happen to me. It just wouldn't.

https://5help.squarespace.com/hc/en-us/articles/204965388-Im....

I would not make links like: 5help.squarespace.com/hc/en-us/articles/204965388-Importing-Blogger-or-WordPress-blog-posts#:~:text=Log%20into%20your%20Squarespace%205%20site.%20In%20the,URL%20that%20visitors%20use%20to%20visit%20that%20blog. but there it is. Ready for consumption.

https://webflow.com/updates/csv-import

Seems good enough if you can find the page.

https://help.shopify.com/en/manual/products/import-export/im...

Along with a long list of expensive plugins they will need if they want to keep the custom functionality. It will lack some thing but have other things that hopefully somewhat make up for it.

One should also have a new terms of service and user agreement ready in case of migration.

You see? If you prepare for it clients can downgrade whenever they like and everything becomes a nail.

I don’t see? What point is being made here?
You point out this flaw in the plan:

> You should be delivering something to them that it easy to maintain and document. If they need to get somebody in to help in 5 years, they shouldn't need to find a be full-stack web-app developer.

Privately I call it the bus factor heist. It is when you get paid or promise to do something then quickly die before having to do the work.

To avoid or at least remedy that I have some documents and some code to help the next dev migrate things. A platform might also have some feature that is hard or impossible to replicate. Say they end up using other software that only plays well with specific platforms. Ideally there would also be a way back to the custom website.

I'm not saying you are wrong but people (like myself) are already invested in the mistake.

For example: I calculate a very low delivery cost by town or neighborhood name. It's very simple as the radius doesn't involve many places and they never move or change name. Addresses in the longest village in the country has only one street and the distance ranges from 0.5 to 10km. If the customer lives there it needs to be slightly more specific.

I think on shopify this could be replaced with easyroutes[1] But woah! That thing brings a bazillion features that are not needed. It's wonderful but not mission critical. I'm not even sure if it can match the existing implementation. Is it worth $450/month?

Some things melt, some expire fast, some food stuffs are fragile. The drivers know to get rid of the expensive wedding cake first and drive slowly. Easyroutes amazingly efficient route planner is simply not needed. However accurate I cant make schedules from that.

[1] - https://www.roundtrip.ai/easyroutes/pricing

I use Django for basic sites and complex web-apps.

Some sites are dead simple, with an SQLite data store, and static content served directly. Some apps are running on AWS ECS, auto scaling up to hundreds of VMs in response to bursty workloads.

Generally though, I’m running docker compose for local development environments, and docker swarm in production. (Until autoscaling requires something like ECS)

Docker makes it easy to define everything in code. (A redis instance, worker instances vs web instances, db, etc)

I'm also using Django for my clients and have built out a lot of code generation so that I can get off the ground faster. It's really a lovely framework for getting stuff done.
I use Sytescope.com for all my clients. We build all their pages in a fraction of the time and if they feel like taking the wheel for updates, they are more than welcome to.

99% of the time there isn't this service can't do.

How do I make blocks (e.g tables, lists, ing src, etc) and other various parts of my page use a dynamic source of data from an external REST api? Or would that use case fall into the 1%?
If it’s static & can be edits to content that could easily render out as static (such as some reStructuredText files) I always reach for Soupault so I can create something super lightweight, bespoke for the job, but extendable with plugins & tools that don’t lock me into a specific system… it’s mostly just the composition of applications delivered by my package manager, piped thru stdin/stdout, & glued together with this tool. The last thing you need are tools that are complicated, inflexible, aren’t built to last a decade of low maintenance, & whose outputs or dependencies are hard to make something reproducible when just building a website.
Depending on the clients' complexity and needs, I like to structure the work as:

Tier 1 (just need a basic site): Use the built-in website builders from their domain provider or hosted static site generators, like GoDaddy, Github Pages, etc.

Tier 2 (need plugins or ecommerce): If they require some more functionality like email lists or selling products then use services like Wordpress, Squarespace, or Shopify to build their site.

Tier 3 (extra data complexity): For sites that have more structured data that is not satisfied with tier 2, then use something like Webflow or Framer. These allow you to add more data types and categories to build unique pages.

Tier 4 (custom app) If they are building something unique that is complicated to build with the previous tiers, then my preferred stack to use is Django, Django Rest Framework, HTMX, Tailwind. Django-cms or Wagtail are also proven CMS to help build their site.

You should also consider serverless apps like Google Cloud Run or AWS Fargate so you don't worry too much about the infrastructure unless it is absolutely necessary to roll your own.

Tier 5 (a little bit of everything): Combine tiers with subdomains. For example, build their blog or marketing site on webflow, but have a custom API or an authenticated interface with a Django/DRF backend.

Ultimately, you need to see what level of technology your client is comfortable with and how you want to leave the project as your contract ends. Don't try to build a overtly complicated system that will give you more headaches later when the client calls on you again.

I know you're asking about developer tools - the main ones I use include:

* Webflow (in case the client needs something relatively unsophisticated)

* Django / HTMX / AlpineJS / Django Ninja (in case the client needs a full CRUD application with more powerful capabilities).

I also want to shamelessly plug - if you are looking to do freelance or contract work, and you want an easy way to manage the contract, engagements, milestones, and invoices, consider using withpartly.com.

I'm the founder and CEO, and looking for freelancers / contractors to play around with the alpha product (for free).