
I thought I’d detail my current programming setup. It’s continuously changing, quite fast, lately. But I think a snapshot is useful.
Are there areas of my tooling or processes that you’d like more detail on? Let me know, and I may say more in a future post.
Fair warning: This post contains affiliate links.
My work machine is currently an HP Z2 Mini G4 Workstation, with 32 GB of ram. I run Debian Linux with i3 as my window manager. I have two monitors (one, two), an external webcam and mic for meetings, and an external hard drive for extra storage.
I have a manual standing desk converter that sits on top of my desk to allow me to work standing or sitting as desired. I have a small dry-erase whiteboard organizer on the desk, too, that I can use to jot down notes as I work.

My primary IDE is Zed. I use it specifically because its collaboration features work well on Linux, where I’ve had mixed results using VS Code for collaboration on Linux. I pay for GitHub Copilot and use my Copilot AI for chat and completions in Zed instead of Zed’s own AI offering.
I also still have VS Code installed, though. Currently I mainly use it when I want to get a CodeRabbit code review on a repository that I don’t own, and so can’t authorize CodeRabbit to review directly.
I’m a bit bummed that I can’t make the VS Code-based Cursor my daily driver since when I last used it I was so impressed with its AI features.
Speaking of code review, I use GitHub Actions on basically all my projects to automate running code quality checks. On most projects this includes Vitest, ESLint, Knip, and Prettier. I also have Copilot and CodeRabbit configured to automatically add review feedback on any PRs where I have enough permissions to do so.
I use Warp for my terminal. It has built-in AI that I use to help me make Linux configuration changes. Recently it’s also added more-robust agentic coding abilities that I’ve been experimenting with recently. Impressed so far. It also lets me store custom rules and prompts I can use with the AI features, and it allows me to share a terminal window when I’m collaborating with someone else on a task.
The other two terminal-based coding tools I’ve been using recently are CodeBuff and Claude Code.
Unfortunately I’m still limited by costs and/or tool limits on all these tools—Warp, CodeBuff, and Claude Code. These tools are getting better and better, but they aren’t yet to the point where I can let them run wild on client work, which means I’m mostly using them on side projects. And it’s harder to justify blowing $300 in a month on coding tools when the work I’m using them for isn’t directly bring in money.
I use Obsidian to capture information related to my work and projects. I use the Obsidian web clipper extension in my browser to clip web pages. I use Obsidian plugins to sync my notes to S3-like cloud storage (remotely-save), and to let me use AI to chat with an individual note (obsidian-copilot). I use daily notes for miscellaneous scratch pads.
I have one-note-per-task journals I use for tracking my work on tasks. So when I have a new task, I add a new note with the name of the task as the title to an appropriate Tasks folder. Then, inside this note, whenever I work on the task, I add a subheading with the current date, and document what I’m doing within that date’s section. I always add the new section to the top of the note, so the most recent work I’ve done on the task is at the top. This approach helps me get into a task quickly by reminding me of where I was at when I last worked on it, and reduces the burden on my working memory.
I track my activity in two ways. I have ActivityWatch which automatically collects detailed information about how I’m spending my time. And I have a custom script that keeps track of how much time I’m spending using my work computer, and posts that to a Beeminder goal.
I use Beeminder extensively to track and enforce my work goals. I have goals for time spent using my work computer, time spent on specific clients and projects, handling work email, shipping UVIs for TaskRatchet, handling finance tasks, and sending invoices and reports to clients. I try to keep all my Beeminder commitments manageable, and keep most of my work-related deadlines in the late morning or very early afternoon to avoid burnout given my ability to work in the afternoon isn’t consistent.
I use Slack, Discord, Telegram, and Thunderbird, all to varying degrees, for work communication. For TaskRatchet we recently switched from FreshDesk to Zoho Desk for handling support emails. I have a custom Slack support bot that we use to ease TaskRatchet support tasks.
When researching I use Perplexity and DuckDuckGo mainly, resorting to Google only when the other tools fail to find what I need. Though, with Warp as my terminal and Copilot in my IDE, many times my questions can be answered without using a browser (Chromium in my case) at all.
I’ve found myself using Claude recently when I need to draft an extensive prompt, e.g. to store as a saved prompt in Warp. Claude’s side-by-side artifact view for drafting documents is super useful for that.
I haven’t found AI to be that useful in writing yet. I’ve experimented with different times at using AI to write, but it always feels like it’s breaking the connection between speaker and writer, and personally I don’t like that. For now, I prefer authenticity over polish.
I have used AI a couple of times to write reports for clients, where it would be reasonable to say a trade-off between authenticity and functionality is perfectly fine. However I didn’t actually find that it saved me any time, since it results in a much longer report that I then have to carefully fact-check and revise. And the improved quality of the final product is arguable.
I use PayPal for invoicing clients. I use PayPal and Wise to pay subcontractors, depending on their preference. I use YNAB for tracking my business expenses on a day-to-day basis. I use Keeper Tax when I’m ready to file my taxes. I use Stripe as my payment provider for TaskRatchet. I also have a custom dashboard that I use to partially-automate various invoicing and reporting tasks.
For web hosting, I currently use a mix of Render.com and Cloudflare, and I’m moving more and more toward Cloudflare. This is mainly because deploying many small projects is expensive with Render.com. Setting aside pricing, Render.com is a magnificent developer experience.
For time tracking I use a combination of Beeminder and a custom in-house time tracker (“Narthbugz”) which runs on top of a self-hosted Baserow instance.