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

123 points by ecmascript ↗ HN
This question has most likely been asked before, but since our industry moves fast I want to ask it still. You guys that roll your own operation, what is your business (no need to out yourselves) and what tech stack did you choose to complete it?

Also, if you don't mind, do you think the tech you chose had any effects on your success? If it did, why?

117 comments

[ 3.2 ms ] story [ 212 ms ] thread
I’m not a solo business owner, but if I had to guess, I’d say that the ones who are successful turn their weakness into a strength by using some obscure tech stack that they’re a wizard with but that no one else uses. It’s a trite thought here on HN, but if I were a one-man shop I really would try to use a Lisp dialect.
I hope you see the irony in your comment
I think maybe he is being sarcastic...
(comment deleted)
Python
(comment deleted)
ruby + heroku + vue + postgres
lamp for web app, python for ml bits, node for a couple of things that have handy node packages.

I use pretty much anything that gets the job done with the least dev time.

Django, Python 3, Django REST Framework, PostgreSQL, ElasticSearch, uWSGI, nginx, Celery, RabbitMQ, Ubuntu, Ansible, Sentry.io, Gitlab, Hetzner, Cloudflare, Create React App.

Effects on success: I already knew this stack (no time lost learning new tech), can run with a very tight budget (suitable for starting a business on the side). And, obviously, this is a great stack that will scale far into the future if needed.

Mine is almost exactly the same (though don't always need ES/Celery/Rabbit).

I've been working on building out a productized offering of a starter kit for this stack: https://www.saaspegasus.com

Pretty much mine as well.

Would maybe add Docker (without K8s or any orchestration).

Almost the same: Django/Python/DRF/PgSQL. But:

- I use Redis with Celery instead of RabbitMQ (not because it's better, but can be picked for other usages like caching, etc.)

- I use Heroku to ease deployment instead of having to deal with servers (but I'd like to add serverless to my stack, Heroku is not optimal for SPA deployment)

- Angular instead of React (mostly because at the time, I absolutely wanted to use Ionic)

Effects on success: fast to run, very reliable back-end, no need to be expert in Javascript and tooling (because angular/ionic is very opinionated)

Bad effect: need to deal with 2 languages in parallel can be exhausting sometimes.

PHP/Laravel, Javascript/VueJS, ElasticSearch, MySQL, Memcached, NGINX, SQS, SLS, everything on AWS
Backend: OSX, Vagrant, Ubuntu 16.04, Python 3.7, Falcon (APIs), Ansible (local VM provisioning and deployment), SQLAlchemy, Postgres, GraphQL (through Graphene and Graphene-SQLAlchemy), Kong (API gateway)

Frontend: Angular 7, Angular Material 7, Apollo GraphQL

SaaS (free tiers): Auth0, Sentry.io, Smallchat, Braintree, Netlify

Hosting: Hetzner

My current venture (https://www.podalong.com) is using Elixir/Phoenix Framework/Vue.js for the front end, a couple various Golang services for background stuff, and Elasticsearch for search.

This was my first project using Elixir/Phoenix and it’s been really fantastic, I couldn’t recommend it enough for being very productive and it’s fairly performant to boot.

The mobile app was built using Flutter (again my first project with Flutter), and it has honestly been great. I come from a Java background and Dart is extremely similar so it took no time at all to get acclimated.

Very cool. How has the learning process been for you? Where did you start and have there been any particularly challenging parts?
Flask, Python 3, MySQL, SQL Alchemy, React, Google App Engine, Google Cloud Storage, Google SQL
Web: .NET Core, VueJS, SQL Server

Mobile: Xamarin

CI/CD: Azure Devops, AKS

Reason for choosing it: 15+ years of experience with C#, Vue is easy to learn, Xamarin is also C# for both Android and iOS

Nowadays you can mostly solve any problems with wildly different tech combinations, so I increasingly feel that the tech does not matter.

So i guess sticking with what you already know is the best when starting out.

Finding product/market fit is waaaay more difficult than learning new tech.

You will have time to optimize it later when you get traction and the product kept together by duct tape starts to fall apart under pressure.

Working on an email hosting company. Stack is Kotlin, Postgres, Docker, AWS.

It's likely been helpful because it's a stack I'm good with, and it has very mature tooling and libraries (via JVM). The alternative was basically C, which has higher quality mailserver libraries but seemed a lot harder to work with from my point of view.

For https://swissdevjobs.ch (job board for Software Developers) I go with a very simple stack:

Backend: NodeJS, Express, MongoDB

Frontend: React (CRA), React-Router, React-Leaflet (for maps)

Infrastructure: AWS, S3

Bonus point: no single test written (neither backend, nor frontend), project is up and running for >1year

Django 2.2 / Python 3.7, Docker Compose, jQuery, Bootstrap, Vue, Nginx, PostgreSQL, Ubuntu, Bitbucket

Server: Digital Ocean / AWS

SaaS: Airtable, Helpscout, Sendinblue, Sendgrid, balsamiq, StatusCake, Typeform

Currently building a product. I use node (Strapi CMS), Create React App (+ Typescript). I'm planning to use Heroku.
Desktop: F#, Mono

Mobile: Xamarin

CI/CD: GitlabCI(Linux), GithubActions(macOS+Windows)

Soon: Rust

I run https://quailhq.com -- point-of-sale software for antique stores.

---

Data: Postgres

APIs: Java + Dropwizard

Frontend: Typescript, transitioning from Angular (1.x) to React

Hosting is on a cluster of cheap Linodes, and transactional email is handled by Postmark. Shout out to both of those services, which have been rock-solid compared to others I've tried. I absolutely think the choice of tech has helped Quail succeed -- it's boring software built with boring technology, which leaves me free to focus on the more interesting parts of the business.

I'm also working on a Java + Dropwizard project. MongoDB is the option I went with as a DB, and SendGrid for transactional emails.

Did you evaluate Digital Ocean as an option?

I create and sell business software for writing invoices and managing customers. It is also available for rent and I use the following stack for my own cloud:

Debian, KVM, Apache, MySQL (with Percona for clustering), GlusterFS, rSync, HAProxy, PHP, jQuery

I actually own 3 servers :) I know, it's super boring, but this stack has only failed me once in about five years.

Yes, in my opinion this stack has helped me a lot in earning a living with my company because it just works and saves me time to do other things that earn money.

Can you share me the details of your service? I need simplest solution for Customer registering order, Verifying order against stock availability to create invoce and delivering it. An affiliate/reference management will be plus.
You can take a look: https://www.open3a.de The software is mostly in German, so I'm not sure if it's a fit ;)
Great, yes It is not fit for my needs. Still a good product. As it is open source, you should make a github repo and invite contributors for the global translation module.
Yes, I could do that, but I could not support the users of e.g. a spanish version because my spanish is quite poor. This is why I settled for the german speaking market. That's Austria, Switzerland and Germany. Still enough money to earn :)
You really don't need to support any one. It is an OSS none can blame if you don't fix his issue. All you do is just invite him to contribute changes they want ;)

Think it like, I am an Indian and want this software in Hindi/Gujarati/Tamil. What I will do is grab your global English file, Translate the appropriate part of strings to my choice of language and push those changes to your software. which means user who are capable will support ecosystem.

I just use the simplest and most boring things that work.

Most of my software is written in Haskell, with the Yesod framework handling all the HTTP stuff. Data is mostly persisted in PostgreSQL, with some caching and queueing stuff done in Redis. I try to avoid JavaScript if I can help it. When I do need a richer UI, I'll add small bits of plain JavaScript, sometimes with jQuery. When I need a more complex UI, I use Elm. Everything runs on NixOS machines on AWS.

Not wrestling with constant runtime errors and not being afraid to make broad sweeping changes means I can adapt the software to the business more quickly.

Haskell is not boring.
The way I use it is really rather boring.

I liked Ruby on Rails, but I didn't like the magic, nor did I like the runtime errors.

That's basically how I use Haskell/Yesod. A better Ruby/Rails.

You certainly can do very interesting things with Haskell, but nothing compels you to. Writing boring software in a boring way with Haskell is totally fine, and works well for my businesses.

I'll clarify though that I'm not suggesting I do OOP in Haskell, if anyone reads that into what I wrote.

The post is tongue in cheek. Haskell for backend and NixOS for deployment ... a rather exotic setup even by HN standards.
I don't see it that way.

I don't think relative obscurity makes the technology itself exciting. I certainly didn't choose these technologies to be different, or to be fashionable. If I wanted to play with shiny toys, there are so many others to choose from. The shiny toys don't really appeal to me. I have businesses to run, and the technologies I chose are from a position of total pragmatism.

I sincerely believe it's easier to use Haskell and NixOS for applications of beyond trivial scale than, say, Ruby and Ansible. And I say that from experience.

> I just use the simplest and most boring things that work. Most of my software is written in Haskell…

As simple as possible, but not simpler!

web: python, web2py, nginx, uwsgi, jquery, bootstrap

db: postgres

hosting: centos on linode servers

external services: mailgun, geoipservice, paypal, paddle

I started building my company back in the hey-day of PaaS, when Heroku, Google App Engine, and to a lesser degree Amazon Elastic Beanstalk were all the rage.

When starting from nothing, these were incredible platforms. Features like the OS, web server, memcache, taskqueues, databases, startup-scripts, emailing, and auto-scaling were all built-in with almost no configuration.

The PaaS wave has pretty much come and gone. Now you need to think about and choose your linux image. If you want memcache, setup your own Redis server. For taskqueues, you need to master RabbitMQ. For email, sign up for Sendgrid or another service. App Engine still exists, but they keep stripping features from it, and push you to standalone services.

When you get very large, you'll likely need to migrate to these more tunable services eventually, but when you're just starting out, it's a huge boost in productivity to have these basic services available that just work for a large majority of use-cases.

My guess is that most of the PaaS users were smaller companies / solos that didn't have the bandwidth to manage all these services and also build their app, and I suspect many operated in the free tier. Google probably recognized they weren't making money in the space, and shifted gears to focus on larger companies that required far more complex setups, and generated far more in fees.

It's a shame there has been such a strong movement away from PaaS, it was far easier in the past to get a fully functioning platform up and running than it is today.

Ubuntu, Postgres, Java 11, Spring Boot, nginx, Digital Ocean, Amazon SES and S3, Ansible, Javascript as "sprinkles", otherwise Web 1.0.
Back end PHP/CodeIgniter, Front end TypeScript (no libraries), DB MySQL, ML / Scripts Python3, SCM git.

Database upgrades are stores in an upgrades/<version>/upgrade.sql format. There can also be upgrades/<version>/upgrade.sh shell scripts.

For testing: back end is a bunch of single files run through a small, purpose built wrapper. Front end uses Jest.

Git hooks run locally for pre-commit and releases. Deployment is handled automatically by GitHub web hooks. The server handles any upgrade file (upgrade.sql and / or upgrade.sh) as triggered by GitHub web hooks. General rule of thumb here is never commit or push to master unless you're confident everything is ready (this only really works for a single person!)

Application server runs on a single instance Debian VM on Azure. MySQL runs on a separate VM instance on Azure, with a failover configured. There's also a read-only MySQL replica which is used for pulling large amounts of reporting data.

For backup (outside of that provided by Azure), there's a series of shell scripts running on cron to dump the database to an encrypted and time stamped backup. These are periodically fetched by other servers in different locations. Backups are kept for every business hour of operation. For user generated files (>1TB per year), rsync is run every hour on a couple of backup machines. Backups are manually checked by a person (for completeness and restorability) once per month. Automated backup checks are run daily on cron.

The longest down time that has been had in six years is fifteen minutes which was due to a bad database upgrade.