Updated November 8 2024
The following are most of the tools that I use day to day to build software. They are the tools I most understand, most rely on and the tools that I am most fond of. I think people might be surprised at how vanilla my set up is. I am typically the last person to adopt a new tool because I favour the things I know how to use productively.
Qualities of Good Tools
Over the years, I've tried lots of tools. The ones that have stuck around for me share some mix of these qualities:
- Simple
- Fast
- Approachable
- Composable
Client-Side
Most of the time, I just need a little bit of extra interactivity. HTMX is the tool I now turn to for this first.
I'll be honest, when I first tried TS, I really didn't like it. I wasn't used to type-safe programming and thought having to declare the type of everything was unneesary. Now, having seen so many problems arise from type-unsafe projects, I sware by type safety.
There are times where a lot of interactivity is needed. When that happens, I will build a server-side API and use React to interface with it. React is still really good. I find that I can go very far with its STL and swr
.
I resisted Tailwind for a long time, but as I started doing a lot more prototyping, I came to appreciate its utility. Now that I use an LLM to generate a lot of my client-side code, I find that I'm more productive asking for inline tailwind classes rather than writing lots of my own CSS boiler plate.
I have used other tools for bundling like Webpack, Babel, Gulp and Grunt in the past. I find them all to ask the developer to learn and configure far too much. Parcel is the tool I turn to to make compiling my JS and CSS a non-event.
Server-Side
Before 2013 I wrote server-side code in PHP. I credit Brendan Lynch with introducing me to Python and the basic tools. The language has come a long way since 2.7. It's my favourite programming lanuage and the one I recommend without hesitation to anyone.
More often than not, I use Flask to create web apps. I find that it's just the right amount of abstraction for most of my projects.
When I need to build an API, I turn to FastAPI. It's the fastest way to get a basic API off the ground and I love using Pydantic to handle my data and generate OpenAPI schemas.
Redis is the database I turn to for caching, session storage and pub/sub. It's fast, elegant and the integration with Python is seamless.
Mongo gets a lot of criticism, but it's scaled very well for Ada and I appreciate not having to declare a schema before saving data.
Infra has never been of much interest to me. I can run kubectl
and have deployed to AWS in the past, but I have always favored paying PaaS' like Fly to worry about my infrastructure whenever possible. I also usually work at the early stages of projects where costs are not as important to tune.
Before 2021, I used Heroku to deploy applications to the internet. I moved away from Heroku because the platform began showing a lack of maintenance from their acquirers.
Before 2016 I would use Digital Ocean droplets and run and update applications. If I wanted to trade a bit of value for complexity, I would move a project off Heroku to Digital Ocean.
Computer Hardware
Mac Studio
This computer is terrific value. It's very fast, virtually silent and has all of the ports I need. My configuration has tons of RAM and a GPU for running ollama locally for experimentation with open source models.
Apple Pro Display XDR
I use this display for most of my work. It's bright, has great color and the size is perfect for my needs.