Ask HN: Companies of one, what is your tech stack?
172 points| amitprasad | 3 years ago | reply
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
[+] [-] koonsolo|3 years ago|reply
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
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
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
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.
[+] [-] unknown|3 years ago|reply
[deleted]
[+] [-] 0xblinq|3 years ago|reply
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
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
[+] [-] nicbou|3 years ago|reply
[+] [-] nicbou|3 years ago|reply
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
Kudos!
[+] [-] elAhmo|3 years ago|reply
[+] [-] fariszr|3 years ago|reply
Checkout https://caddyserver.com , auto SSL, fast and simple.
[+] [-] nibbleshifter|3 years ago|reply
[+] [-] boruto|3 years ago|reply
[+] [-] pavlov|3 years ago|reply
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
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
curios to know more on this - what you could do better using Lua logic?
[+] [-] sanjayio|3 years ago|reply
[+] [-] RulerOf|3 years ago|reply
[+] [-] kureikain|3 years ago|reply
- 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
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
[+] [-] sojanofficial|3 years ago|reply
[+] [-] Dracophoenix|3 years ago|reply
[+] [-] glennsl|3 years ago|reply
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
[+] [-] samanator|3 years ago|reply
- 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
[+] [-] hdra|3 years ago|reply
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
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
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
[+] [-] reducesuffering|3 years ago|reply
[+] [-] alexcroox|3 years ago|reply
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
- Linode Ubuntu - Vue - Laravel PHP - PostgreSQL - Tailwind
That's it. Keeps me focused.
[+] [-] likortera|3 years ago|reply
[+] [-] bhu1st|3 years ago|reply
[+] [-] hakanderyal|3 years ago|reply
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
[+] [-] hstan4|3 years ago|reply
[+] [-] buro9|3 years ago|reply
* 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
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
[+] [-] raphinou|3 years ago|reply
[+] [-] spotijk|3 years ago|reply
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
"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.