My tech stack.
The hardware, languages, and tools I reach for day to day.
Languages
Python
The language I have written the most of, by a wide margin: quantitative finance, data work, machine learning, scripting, automation, web dev. The ecosystem is hard to beat for getting from an idea to something running: NumPy and Pandas for data, TensorFlow, PyTorch, or sklearn for the models depending on what the project needs. It's also where I started: building a trading bot to run while I was at practice, and Python was the only option that was both approachable and good at stats and data.
TypeScript (and JavaScript)
My default for anything on the web, front end or back, and the language I have shipped the most after Python. I'm very opinionated about types and object shapes. Getting them right catches most of what I would otherwise find at runtime, and that only matters more as a project grows. I mostly build with React and Node. Plain JavaScript still shows up for quick scripts and older codebases. I appreciate the lineage, but I don't find it compelling for anything modern.
C
My systems language. C is where I feel closest to the hardware and what I reach for when performance and control matter more than convenience. Learning memory management, pointers, and data structures in C shaped how I think about every language I have picked up since.
ARM assembly
Building off C, I'm currently learning ARM assembly to get even closer to the metal I use. C taught me what the machine is doing underneath. Now I get to watch it happen.
C++
My favorite of the two extensions to C, and where I go when C alone gets verbose for low latency work. RAII, templates, and the standard library buy real leverage without giving up much control. I have not lived in a large C++ codebase, but I like it every time I am in one. My only gripe is the syntax complexity (why so many ways to do the same thing?)
Rust
The systems language I most want more reps in. The ownership model enforces the discipline I had to hold in my head writing C. I have a couple of Rust projects close to release.
Go
I picked up Go to prepare for an interview and kept using it. Goroutines and channels make concurrency something I actually want to write, and the standard library covers enough that the dependency list stays short. The syntax is some of the best I have used. I have almost nothing bad to say about Go except for importing external packages.
SQL
Daily, for querying, analysis, and keeping data honest. SQL should be standard for any engineer working around a database. You don't have to own it to need good queries against it, and knowing how the engine stores and retrieves your data changes the ones you write. I like MySQL for read and write heavy apps, Postgres for complex queries and out-of-the-box features like RLS.
Java
I learned Java early and came back to it during my master's program. It is genuinely fast. The verbosity is the only thing that keeps me from reaching for it more. I have also used Kotlin for API work and pub/sub queues.
Swift
I have shipped a few small iOS apps with it. The language is not a favorite of mine, but it is hard to argue with how quickly you can get an iPhone app from idea to device, and Xcode makes that a genuinely good place to work.
C#
Picked up through game development in Unity, which is most of what I have ever used it for. I do not build games much anymore, so it sits at the back of the toolbox.
Development tools
VS Code
My editor for everything. The extension ecosystem is unmatched, and I have customized enough of it that the keybindings, the terminal, and the Git tooling all feel like mine instead of somebody's defaults. The UI is perfect (not the modern one. @ VSCode: pls stop workbench.experimental.modernUI).
GitHub
More than somewhere I store my code. Actions runs my CI and my releases, including the workflow that versions and changelogs this site on every merge to main. I've made a lot of bots and automations to make repetitive tasks seamless so I can focus on the stuff I want to work on.
Docker
How I keep development and production honest with each other. Compose is the piece I use most, since running the whole stack locally beats mocking half of it and hoping. Dockerfiles pay back every minute spent on layer caching. The reason I like it as much as I do is simple: I can run code the way production will run it, on any machine.
Kubernetes
For scaling and running containerized services, though most projects reach for it way before they need it. I have stood up clusters on AWS with K3s and K8s, deployed with Helm charts, and routed traffic through Ingress controllers. K3s is underrated for anything small. I use it more than K8s.
AWS
My default cloud. Most of my time goes to EC2, S3, DynamoDB, Lambda, and SageMaker. I have worked in GCP, Azure, and IBM too, and the concepts carry across well enough that the provider is rarely the hard part.
Vercel
Where I deploy most web apps, especially Next.js ones. Preview deploys on every pull request are the feature I would miss most, since opening a link beats reading a diff and pretending I can picture it. Plus the team gets a link instead of a description.
Prisma
My data access layer, from simple reads to complex joins. The generated types are the real selling point, since the schema and my editor never drift apart. The query builder gets awkward at the edges and I drop to raw SQL when it does, most often on migrations. Accelerate goes on projects that need live updates.
Redis
My default for anything that should be fast and does not need to live forever: caching, sessions, rate limits, and light job queues. Pub/sub covers the cases where a service needs to hear about a change without owning it. Building this from scratch changed my perspective on designing for performance.
Kafka
My tool for real time event streaming (assuming WebSockets are not the right fit). Services publish what happened and anything that cares reacts, which is how I keep state consistent across a system without any one service knowing who else is listening. The durable log is the part I actually lean on: a consumer that falls behind or dies replays instead of losing the window. Overkill for a lot of projects and worth every bit of the setup for the rest.
Apache Spark
For big data processing and heavier transformations. I have built distributed pipelines and used in-memory processing where the run time actually mattered. SQL is still where I start, but once the aggregation gets programmatic I would rather debug Python than a two hundred line query.
Databricks
Building off that, I use it daily for extraction, processing, analysis, and debugging. Notebooks against a tuned cluster are hard to beat for exploration, and I like that the same workflow carries into production. I do pull code out of the notebook once it stops being exploratory, because a notebook is a bad home for anything that has to run twice.
Workstation
16” MacBook Pro, M2 Max, 32GB RAM, 1TB SSD (2023)
Training or running large models on Intel silicon was painful enough that I switched, and I have not looked back. The M2 Max handles everything I ask of it, the battery lasts a full working day, and the display holds up for long sessions.
34” LG UltraGear OLED, WQHD, 240Hz, 800R curved
The OLED panel is sharp, the 240Hz refresh is smooth, and the curve keeps the edges in view. Mostly I bought it for the width: three usable windows side by side, no second monitor.
Productivity
Notion
I hated Notion the first time I tried it. Too many options, no obvious starting point, and I just frankly didn't get markdown. Uninstalled within a week. I gave it a second shot later and now it holds everything from project planning to daily notes. Helped get me through grad school.
Jira
My project tracker, run as scrum or kanban depending on what the team needs. I've used Linear as well for smaller projects, but think Jira is better for larger teams and more complex project management needs.
YouTube Premium
An underrated learning and debugging tool. Paying to skip the ads pays for itself, and the same subscription covers background music and podcasts.