top | item 32960033

Ask HN: Companies of one, what is your tech stack?

172 points| amitprasad | 3 years ago | reply

Companies of one meaning either a solo developer or just you managing the entire operation.

Following in the spirit of user ecmascript’s annual posts, I’d like to follow up and ask this year’s (overdue) round.

Last year’s discussion post: https://news.ycombinator.com/item?id=28299053

198 comments

order
[+] koonsolo|3 years ago|reply
You're going to love to hate this: Best choice I made was using WordPress!

I run https://rpgplayground.com, a web tool to make RPG games without coding (6000+ user published games) The app itself is written in Haxe. My website is WordPress.

Haxe because it will be easy to port to any device.

Why was WordPress the best choice? Basically everything you need has a plugin.

I needed a forum: bbPress

I needed a community where my members post updates: BuddyPress

I need to send out a newsletter, and most Saas options are crazy expensive: plugin mailster.co, 1 time payment. (Using critsend.com)

Needed some faq page with search, needed a captcha for registering, experimented with ads, post updates to discord, user reporting system, ... You name it, there is a plugin for that.

I also have an external person who writes my newsletters, but isn't allowed push the "publish" button. All thanks to the user roles functionality.

Of course I needed my own plugin to integrate my app and show shared games. I could have written that myself, but then I would lose out on time developing my tool. So I was able to hire a cheap php WordPress developer who made my custom plugin. Went great!

WordPress is so crazy powerfull, that if you want to create some community website, it offers everything you need.

I know my experience is not what many of you would expect, so therefore thought it was interesting to share it with you.

[+] brtkdotse|3 years ago|reply
Good on you. WordPress is a fantastic piece of software and I think a lot of the nose wrinkling and hemming a hawing about security comes from people installing suspect plugins.

If you stick with the core product and set a very high bar for which plugins you install, Wordpress is rock solid

[+] neurostimulant|3 years ago|reply
> Of course I needed my own plugin to integrate my app and show shared games. I could have written that myself, but then I would lose out on time developing my tool. So I was able to hire a cheap php WordPress developer who made my custom plugin. Went great!

Yes, wordpress is wonderful if you don't have to write your own plugins and themes yourself. But if you do, you'd wish you were using something else though. You pay for those extensibility, backward compatibility and huge plugin ecosystem by sacrificing developer experience.

[+] gingerlime|3 years ago|reply
where did you find a good developer for Wordpress? there are so many that it’s hard to separate wheat from chaff. Especially when it comes to doing things with security/authorization.

As a CTO/developer who works with Ruby/Rails and hates php, I think you made the best choice! Especially as a solo who needs these types of “auxillary” functionality. Wordpress is crazy productive in this way. Their plugin ecosystem, ease of upgrades, admin interface with roles is amazing. And the extensibility using filters and hooks is insane. I sometimes wish other libraries could offer this customization abstraction, even though it’s hard to reason about hooks and filters and it’s weird to get used to. But so powerful.

[+] 0xblinq|3 years ago|reply
From the user/product point of view, WordPress might be awesome for all the reasons you stated.

As a developer, WordPress makes you feel miserable if you ever worked in any other framework/ecosystem. That's my experience at least.

[+] aaronbrethorst|3 years ago|reply
Hosting on Render.

Stack: Postgresql+Rails+Hotwire.

I really dig Stimulus and Turbo Frames. It took me a little while to really wrap my head around Turbo Streams. I think the documentation is pretty bad compared to the rest of the Hotwire stack, but—holy moly—once I had it working, it's really like a superpower for front-end development. Using Turbo Streams reminds me a bit of the sort of 'head exploding' moments I had first working with Rails back in 2007 or so. https://www.hotwired.dev

UI: I use Tailwind and Tailwind UI, and aggressively componentize the UI with ViewComponent to make it easier and more manageable to build reusable components and to keep from shooting myself in the foot. Tailwind would be frustrating to use if you crafted bespoke UI elements on every page, but it's an absolute godsend if you're componentizing all of your UI. (Also, if you're not componentizing your UI, why are you wasting so much of your time?) https://www.tailwindcss.com

APM: I use https://skylight.io for performance monitoring, and https://sentry.io for exception tracking.

[+] 12907835202|3 years ago|reply
I just looked at turbostreams. Is the main purpose to have reactive elements without a full SPA which you might have with Vue or React?
[+] nicbou|3 years ago|reply
Your landing page is great. It's very straightforward.
[+] nicbou|3 years ago|reply
I run https://allaboutberlin.com

It runs on Craft CMS inside Docker on DigitalOcean. I chose Craft because it lets you create custom post types with custom fields really easily. The matrix fields let you have rich text mixed with other widgets. All of this was a pain in WordPress.

On the other hand, using not-WordPress means that you're on your own. You can't hammer a bunch of plugins together and call it a day.

The theme is entirely custom-made. It's not exactly groundbreaking, but I've spent a lot of time optimising for page speed and content readability. It's heavily inspired by the NHS' website.

I use nginx to bind everything together and cache responses. I wasted way too much time getting cache purging and automatic SSL certs to work. It has no business being that complicated. I regret taking 5 years to look at Cloudflare.

The tools and calculators (https://allaboutberlin.com/tools/) are built with Vue, with vanilla JS business logic libraries.

[+] brtkdotse|3 years ago|reply
Just wanted to let you know I’m I deeply impressed by your work with your site, your whole no-nonsense philosophy really vibes with me.

Kudos!

[+] elAhmo|3 years ago|reply
This looks really amazing! I wish I knew about this website when I lived in Berlin a few years ago. Keep up the great work!
[+] fariszr|3 years ago|reply
If you want to avoid the headache of doing basic things in nginx.

Checkout https://caddyserver.com , auto SSL, fast and simple.

[+] nibbleshifter|3 years ago|reply
I owe you a round of beers for that website, it was massively helpful during my time living in Berlin.
[+] boruto|3 years ago|reply
That site was incredibly helpful to me when I first moved to berlin. Cheers.
[+] pavlov|3 years ago|reply
I have some stuff running with minimal maintenance, never any surprises, just chugging along year after year.

These services are practically stackless: there’s a Node app with Express as the only dependency. No database, persistence to local files, entire data model cached in memory as JavaScript objects. When the service restarts, it rebuilds the memory image from the file system. The data formats are a mix of mostly append-only logs (JSON lines) and some plain JSON for objects where it doesn’t make sense to keep the full change history. Backups and restore to another server are super easy when there’s a bunch of files and a single Node script to launch.

Lately I’ve been building a hobby product where the front-end is stackless too. Plain HTML and modern JavaScript, using ES modules in the browser. No build chain at all. I don’t need to support IE so all modern language features are natively available, and the app is small enough that a bundler doesn’t deliver huge benefits. This means I don’t have access to npm, but so far it’s been fine because browsers do so much these days and the APIs have improved tremendously in the past decade.

I’ll probably stick with stackless for anything I maintain alone and doesn’t have huge growth expectations. But I wouldn’t expect to convince anyone else in a professional environment, so in the real world there’s no escaping from half-gig node_modules and complex Docker builds and all that dance.

[+] tothrowaway|3 years ago|reply
I run several SaaS apps on a single big OVH server. It handles 6 million non-cached requests per day. The backend stack is pretty basic: Django/Python, MySQL, redis (pub/sub) for websockets. But the secret sauce is OpenResty. I use Lua scripts to do more sophisticated page caching (because the builtin nginx caching is so primitive), DDoS protection, handling websockets, offloading long running requests, and routing between my unix socket upsteams. It's a poor man's Cloudflare in 1500 lines of Lua.

The apps were made long before Docker was a thing, so they just run as regular ol' processes, locked down as much as possible with systemd magic. I originally used uwsgi as my wsgi server, but it turns out gunicorn is vastly more efficient so I use it exclusively now.

I run a warm standby server at Hetzner so I can route traffic there in a pinch. I have a second warm standby running at my house because I'm truly paranoid about automated account bans (despite the very innocuous nature of my business). Backups are at rsync.net.

My single point of failure is DNS. I had a good relationship with DNSMadeEasy so I was not too worried about automated bans. But they were just bought by DigiCert, so that's a problem now.

Payments are handled with Stripe and PayPal. I added PayPal (despite my hatred of the company) just because I'm scared Stripe will ban me without warning, for no reason, and won't communicate with me.

For user uploads, I have an aiohttp Python server that streams files to Wasabi and Backblaze, and caches them in nginx at the same time. So my cloud bandwidth bill is usually 0.

The websocket layer is kind of wonky. Originally, I used the Python websockets asyncio library to do everything. It worked for a while, and then I had to make it multi-process to spread the load. But it was just eating resources like crazy. I decided to use OpenResty's websocket stuff to handle the connections, but I didn't want to write all the complex application logic in Lua. So I used Redis pub/sub to pass messages back and forth from OpenResty-land to a pool of (sync) Python processes. It worked much better. That said, I'm a novice with asyncio, so I could very easily be to blame for the original performance problems.

And sorry, I won't tell you the name of my apps (I don't need any more competitors!)

[+] CoolCold|3 years ago|reply
> I use Lua scripts to do more sophisticated page caching (because the builtin nginx caching is so primitive)

curios to know more on this - what you could do better using Lua logic?

[+] sanjayio|3 years ago|reply
Isn’t a poor man’s Cloudflare just Cloudflare? The DDOS and caching are free.
[+] RulerOf|3 years ago|reply
OpenResty has a clever answer to just about every problem.
[+] kureikain|3 years ago|reply
I used a weird stack of:

- Rails: so I have a UI quickly together with some admin and a interactive shell to allow me interact with the app easiser - GoodJobs:https://github.com/bensheldon/good_job Used this for any Rails based job - Postgres for everything. No Redis. I found redis is a source of pain when it misbehave and reach max mem with eviction policy. When Redis mem is big, restart it take quite a bit of time. - Huge server: I rent hetzner server and scale vertically. - Golang + sqlc: I used Rails SQL schema to pair it with golang sqlc https://sqlc.dev/ it makes write SQL way easier - Stimulus - Docker Compose for Rails deployment - SCP/Systemd for go-based servic

https://mailwip.com is my email forwarding saas app.

[+] m12k|3 years ago|reply
Rails (6.1), Postgres, Redis, Sidekiq

Hosted on Heroku, using Sentry for error tracking, New Relic for performance monitoring, Sendgrid for email. Recently ditched Google Analytics in favor of Plausible for general analytics and Ahoy (Rails middleware) for deeper in-house analytics. Using Intercom for support/chat widget, but planning to switch to Chatwoot. Considering moving off Heroku, but the most obvious contender, Render, doesn't yet have high availability postgres with automatic failover.

Deployment is set up so any push to the master branch on GitHub is automatically deployed to production. Merging to the master branch can only be done via a PR, and needs green status from both linter (Rubocop), tests (Rspec run on CircleCI, both unit and integration) and coverage (100% test coverage required, verified by codecov.io).

UI is Bootstrap (but feeling long in the tooth), and server side rendering with a sprinkling of javascript. Still mulling over hotwire/turbo vs alpine vs stimulus vs react for some upcoming UI that requires more interactivity.

[+] reillyse|3 years ago|reply
Have a very similar setup to yourself. I'd recommend ECS using RDS for postgres. Code pipeline for building. I find it very seamless and a hell of a lot cheaper than heroku.
[+] sojanofficial|3 years ago|reply
Will be happy to have you on-board Let us know if you need any help with Chatwoot setup.
[+] Dracophoenix|3 years ago|reply
What's your opinion on Vercel or Netlify hosting?
[+] glennsl|3 years ago|reply
Building an agtech platform (with quite a few other people, including a designer and data scientist, but I'm currently the sole developer, and for the most part it was built by a single developer).

Backend: Rust, rocket, sqlx, postgres + a little bit of R. Ansible for deployment.

Frontend: Rescript + React. Also a significant portion of Rust/WASM, but that was a mistake I'm trying to undo.

In short, statically typed and functional(-ish).

[+] farmin|3 years ago|reply
Nice. Are you able to share what you are working on and why WASM was a mistake?
[+] samanator|3 years ago|reply
Services:

- Web backend in go using html templates and some js

- Frontend in plain js and scss

- go server for cron jobs

- postgres for store

- redis for queueing

- ngingx for load balancing and ssl termination

- certbot for ssl

Each of those services is a docker image, all of those images are tied together in a docker compose file. One for dev, one for prod.

Terraform for object store, server, and volume infrastructure.

Bash scripts for deployment using ssh.

[+] nelsonic|3 years ago|reply
If you want an ultra productive, easy to learn and a delight to deploy+maintain stack, consider PETAL: Phoenix, Elixir, Tailwind, Alpine.js & LiveView. See: https://github.com/dwyl/technology-stack
[+] hdra|3 years ago|reply
I dont know if LiveView is easy to learn though, maybe easy to learn the happy path, but when things are outside the normal path, things can be hard to figure out/understand, even when they know the basic HTTP stuffs.

At least thats been my experience with it ~3months back. I was familiar enough with elixir/phoenix/channels to source dive and figure out whats happening, and today i know liveview well enough to avoid the weird interactions, but I imagine it can be a pretty miserable experience for beginners to start with.

[+] franky47|3 years ago|reply
TypeScript monolith based on the following:

Server-side: Node.js, Fastify, Prisma, Handlebars (email templating)

Front-end: Next.js, Chakra UI, React Query, Comlink (web workers), Dexie (IndexedDB), Recharts, Formik.

Tooling: TypeScript, ESBuild, Jest, Playwright

Backing services: PostgreSQL, Redis, MailPace (transactional emails)

Deployment/Ops: GitHub Actions, Clever Cloud hosting

[+] flexdinesh|3 years ago|reply
Not a company but I’ve been experimenting with different tech stack options over the last 6 months to find a simple tech stack with an independent frontend and an independent backend with a hosted database. The goal is not just to build but also be able to maintain without much complexity and not spend a lot of money on hosting.

Backend: Building a REST/GraphQL API that could be deployed to Cloudflare workers is a no brainer. Super cheap and incredibly fast and when you need to scale it’s still ridiculously cheap. I’d probaby go with REST with swagger + openapi-typescript to generate types on the frontend because honestly GraphQL is a lot of work for one person to maintain.

Frontend: Next.js server render or ISG hosted on Vercel. I'd throw Tailwind on too for rapidly styling your pages.

Database: Prisma with Postgres so it could be typed and works well with other tools. I still haven’t figured where to host Postgres easily. Looking for something like Mongo Atlas where I could grab the connection URL easily and has affordable free/paid plans.

[+] skunkworker|3 years ago|reply
You could use something like the cockroachdb free tier, its pretty close in Postgres in syntax, with some minor differences.
[+] reducesuffering|3 years ago|reply
Railway sounds exactly like what you're looking for in hosting Postgres.
[+] alexcroox|3 years ago|reply
BE - Lambda function URLs, Node, Fastify, Knex with Objection.js, RDS Proxy Postgres

FE - Vue2, Nuxt, Tailwind

Native - Capacitor 100% code sharing with web FE. Fastlane to automate build/signing/submissions

Cloudflare workers acting as a proxy for both FE cache and BE API rate limiting/maintenance mode read from KV store.

I made a crude diagram: https://t20654125.p.clickup-attachments.com/t20654125/133842...

[+] sideproject|3 years ago|reply
I try to keep things very simple + boring for Newsy (https://newsy.co)

- Linode Ubuntu - Vue - Laravel PHP - PostgreSQL - Tailwind

That's it. Keeps me focused.

[+] likortera|3 years ago|reply
After like 8 years working with node/react, this year I got into this exact stack.. and OMG... feels like cheating. I had forgotten life could be easier.
[+] bhu1st|3 years ago|reply
How are you doing business wise? Newsy sounds like a great platform to get value from left out domains.
[+] hakanderyal|3 years ago|reply
Hosting: Bare metal on Hetzner.

Backend: Python / SqlAlchemy

DB: Postgres

Cache: Redis

Frontend: React / Redux / Emotion / Socket.io

Reverse Proxy: Traefik

Marketing Site: Next.js

CDN/File hosting: Cloudflare, R2

Backups: Tarsnap

Deployment: Docker / Docker Compose

Server configuration: Ansible

Mobile: React Native

Payments: Stripe

Email (Transactional/Marketing): Postmark

If I were to start today, I would probably start with something else. But this stack has served me well for years, and still going strong with 36 apps and counting. I'm constantly evolving it as the tech progresses.

[+] wuschel|3 years ago|reply
Nice. But now that you made me curious: what would you start with now and why?
[+] hstan4|3 years ago|reply
What types of apps do you make for there to be 36 total?
[+] buro9|3 years ago|reply
These are my business, I run these:

* PostgreSQL database.

* Go for an API.

* Python + Django for a UI.

* Linode hosting, very few larger boxes rather than lots of small boxes.

These are not my business, I want to pay someone to do these or I want such simplicity that it's a non-issue:

* Grafana Cloud for monitoring and alerts (nearly all Prometheus based, but some log based alerts and log based dashboards).

* A few Excel spreadsheets, which I keep as Excel to enable easier sharing with accountant. Besides, he's probably sharing Word docs back to me.

* Syncthing + a NAS for file storage of the business files and accounts.

* I do all payments via PayPal. I wanted to use Stripe but people really want to pay with PayPal so I centralised there.

* I use Xero to track accounts, assets, etc.

I pay about USD 1k per month in various hosting costs, then the Xero subscription, and an annual subscription for MS Office which I consider part of the accounting costs. I use a local small business accountant who only charges GBP 250 for annual accounts.

[+] rozenmd|3 years ago|reply
I run an uptime monitoring + status page service: https://onlineornot.com

Uptime monitoring:

- fly.io w/ redundancy on AWS

- Redis

- Node.js

- Postgres

Uptime monitoring frontend:

- Next.js

- Tailwind CSS

Status Pages:

- Remix (React) frontend, heavily cached on Cloudflare Workers

[+] spotijk|3 years ago|reply
We're building enterprise software that runs mostly on-premise as well as we're offering some libraries for sending SMS and E-mail.

I try to avoid trends and only run on simple, straightforward but most of all proven and stable tech.

The core software is a mix of C++ and C#. Mostly moving toward C# for new features.

I use JetBrains TeamCity for continuous integration and testing. Where test scripts are mostly VBScript or Powershell. Using plain old self-hosted SVN for versioning.

Backoffice; like sales and licensing servers are all ASP classic.

The website is a custom WordPress template running at a shared hosting company.

Also, I strongly believe in 'dogfooding' as in 'Eat your own dogfood'. I use my own software products wherever I can. That really helps me find weaknesses and improve on usability.

For me it's worth a lot if new functionality, once built, can be left alone an add value for as long as possible.

[+] nullfish|3 years ago|reply
https://dddice.com - 3D dice roller

"Use boring technology" - Laravel, MySQL, Fly.io for hosting

We automate nearly all aspects of the business as well. If a task needs to be done more than once, it's worth automating. GitHub actions to test/deploy, admin pages for all activities such as marketplace submissions, payouts, tax reports, chargebacks/refunds ... If there is ever a problem with a purchase, we have ways to reply and refund all with the click of a button.

We recently switched from a VPS to Fly.io and PlanetScale as well and it's been working quite nicely. As we grow to more regions, it's nice to know we can deploy servers close to our users with a single command.