In April of this year, I sold TinyPilot, the bootstrapped hardware company I founded and ran for four years. I wrote a post in May that told the story of the sale, but I’d like to share more about the practical lessons I learned from the experience. In this post, I’m sharing what went well, what I want to improve in the future, and what surprised...
This is the second half of a post about using Nix to automate a fuzz testing workflow. At this point, I can run honggfuzz against pdftotext, but it takes a bit of manual effort to get things started. I promised in part one that I’d get all of the installation and fuzzing down to a single command. Downloading tricky PDFs In my ad-hoc fuzzing, I...
Fuzz testing is a technique for automatically uncovering bugs in software. The problem is that it’s a pain to set up. Read any fuzz testing tutorial, and the first task is an hour of building tools from source and chasing down dependencies upon dependencies. I recently found that Nix eliminates a lot of the gruntwork from fuzz testing. I created...
My first two years as a bootstrapped founder went poorly. I could barely find any paying customers, and all of my businesses lost money. I began questioning my decision to quit my cushy Google job. In mid-2020, yet another of my businesses had flopped, and it was only kind of COVID’s fault. Desperate for a distraction, I made a little contraption...
Seven years ago, I built my first home server. It made my software development work faster and more enjoyable, so I’ve gotten more into the home server scene. I built a custom storage server, another development server, and a dedicated firewall. At some point, my wife gently observed that my office was filling with unsightly wires. “What?” I...
For the past few months, I’ve been curious about two technologies: the Zig programming language and Ethereum cryptocurrency. To learn more about both, I’ve been using Zig to write a bytecode interpreter for the Ethereum Virtual Machine. Zig is a great language for performance optimization, as it gives you fine-grained control over memory and...
Six years ago, I quit my job as a developer at Google to create my own bootstrapped software company. For the first few years, all of my businesses flopped. The best of them earned a few hundred dollars per month in revenue, but none were profitable. Halfway through my third year, I created a device called TinyPilot. It allows users to control...
In 2005, Joel Spolsky’s software company, Fog Creek, filmed a documentary about their summer internship program. The film is called Aardvark’d: 12 Weeks with Geeks, and it follows four college interns as they design, implement, and launch a completely new software product. That’s not the interesting part. Looking back on this documentary 18 years...
Nix is a tool that allows you to define your software environment from code. Nix has several components to it, and one of the most interesting to me is NixOS, which lets you use Nix tooling to define your entire OS configuration using plaintext files. I only recently started experimenting with Nix, and there’s a huge amount to learn. One of the...
I recently discovered Syncthing, an open-source tool for syncing files across multiple machines. Setting up Syncthing on my personal devices was easy, but I went on an interesting journey deploying it to a cloud server. Why run Syncthing in the cloud? Syncthing synchronizes files peer to peer. That means that at least two of my devices have to be...
Five years ago, I quit my job as a developer at Google to create my own bootstrapped software company. For the first few years, all of my businesses flopped. None of them earned more than a few hundred dollars per month in revenue, and they all had negative profits. Halfway through my third year, I created a device called TinyPilot. It allows...
I recently built my first home TrueNAS server. I use it to store the bulk of my personal and work data, so I’ve been learning how to make the most of TrueNAS and its filesystem, ZFS. Today, I want to tell you about backing up encrypted data. My homelab TrueNAS server One of the neat features of ZFS is that you can make backups of encrypted data...
Two years ago, I created a website for my business. By combining my terrible design skills with a decent-looking template, I created a site that looked okay. I told myself that if the business took off, I’d hire a real designer to make it look professional. TinyPilot website, before design changes A year later, the business was generating...
This year, I decided to build my first ever home storage server. It’s a 32 TB system that stores my personal and business data using open-source software. The server itself cost $531, and I bought four disks for $732, bringing the total cost to $1,263. It’s similar in price to off-the-shelf storage servers, but it offers more power and...
Four years ago, I quit my job as a developer at Google to create my own self-funded software company. For the first few years, all of my businesses flopped. They all operated at a loss, and none of them earned more than a few hundred dollars per month in revenue. Halfway through my third year, I created a network administration device called...
Here’s a riddle. My web app keeps all of its data in a SQL database. I can spontaneously tear it down, deploy the code to a different hosting platform, and the app will still serve all the same data. Running my app in production costs $0.03 per month. How is this possible? That’s easy. You have a separate database server running somewhere that...
I’ve been hiring software developers and other freelancers for the past seven years. Even though I write most code myself, hiring other developers is a tremendous force multiplier that frees up time for other parts of my business. Freelancers work well if you manage the relationship properly, but there are hundreds of ways it can go wrong. The...
Today is the third anniversary of quitting my job at Google to build my own software business. I posted updates at the end of my first and second years, so it’s time to share my progress. The year things clicked into place In my first two years working for myself, I earned less than $10k total. My goal for the third year was to earn $20k in...
When people talk about code reviews, they focus on the reviewer. But the developer who writes the code is just as important to the review as the person who reads it. There’s scarcely any guidance on preparing your code for review, so authors often screw up this process out of sheer ignorance. This article describes best practices for...
For the past five years, I’ve done all of my software development in virtual machines (VMs). Each of my projects gets a dedicated VM, sparing me the headache of dependency conflicts and TCP port collisions. Three years ago, I took things to the next level by building my own homelab server to host all of my VMs. It’s been a fantastic investment,...
A few years ago, I learned a handy technique for resolving disputes with uncooperative businesses. It’s simple to understand and easy to implement. You don’t need lawyers or a prominent social media presence. All it requires is for you to behave like an organized professional. This technique recently resolved a problem so effectively that I had...
TinyPilot is my inexpensive, open-source device for controlling computers remotely. It works even before the operating system boots, so I use TinyPilot to install new OSes and debug boot failures on my bare metal homelab servers. This post details my experience creating TinyPilot and shows how you can build your own for under $100 using a...
Recent versions of the Raspberry Pi support USB on-the-go (USB OTG), which allows them to impersonate USB devices such as keyboards, thumb drives, and microphones. To take advantage of this, I made an open-source web app that turns my Pi into a fake keyboard. I call it Key Mime Pi. This post demonstrates how Key Mime Pi works and how you can...
In part one, I described my arduous journey to capture my old home movies in digital format and divide them into individual scenes. After processing all the clips, I wanted the experience of exploring them to be as simple as looking up clips on YouTube. Because these videos are my family’s private memories, actual YouTube is too public. I needed...
For the last eight years, I’ve carried around this box of videotapes through four different apartments and one house. They’re family home videos from my childhood. After 600+ hours of work, I finally digitized and organized them well enough to throw away the original tapes. Here’s what the footage looks like now: All of my home videos, digitized...
Last week, I published a blog post describing how Stripe recorded visitor behavior on their customers’ websites. In short, Stripe’s JavaScript library collected information about URLs users visited and telemetry about their mouse movements, even when the site never displayed any Stripe payment forms. I suspected that most Stripe customers were...
Among startups and tech companies, Stripe seems to be the near-universal favorite for payment processing. When I needed paid subscription functionality for my new web app, Stripe felt like the natural choice. After integration, however, I discovered that Stripe’s official JavaScript library records all browsing activity on my site and reports it...
Two years ago, I quit my developer job at Google to build my own software business. A year later, I posted an update about my finances, happiness, and lessons learned. Today marks the end of my second year, so it’s time for another update. How I made and spent money Metric 2018 2019 Change Revenue $2,262 $7,254 +$4,992 (+220%) Expenses $23,133...
In this post, I’ll show you how to pre-render pages using Vue and Nuxt. This method combines the convenient development experience of Vue without forfeiting critical features like social sharing or search engine optimization. This tutorial assumes no experience with Vue or Nuxt. I’ll explain everything along the way. The problem with Vue Like...
You open Gmail to write a note to your friend. Before you begin, you notice that you’ve received six new messages. It pains you to leave emails unopened, so you read them immediately. Two hours later, you realize that you never wrote that note to your friend. This happened to me constantly, and it wasn’t just Gmail. I’d look at my phone to check...
If you write original content for your business, you know how quickly it drains your time and mental energy. It’s extremely challenging to write articles or blog posts that readers find engaging, clear, and eloquent. You may have considered hiring a freelance writer, but it’s daunting if you’ve never done it before. Where do you find writers? How...
I derive immense satisfaction from outsourcing my chores. All of my friends have heard me encourage them to place a higher value on their free time and delegate their errands. Few of them heed my advice, and it’s probably because they know about the time I paid someone $96 to clean a $39 keyboard. It all started with a writing class Back in 2016,...
At my last job, status meetings with my manager were outstandingly efficient. He never ran me through the typical drill of listing list off everything I did since our last meeting. Instead, we jumped right to the meaty topics of career growth, team development, and challenging technical problems. How did my manager have the right context so that...
Early last year, I launched a nutrition site called Is It Keto. From November 2018 until March 2019, the site was my full-time focus. Every month, visitors increased by 50% to 150%, an exhilarating growth rate that far outpaced any of my previous projects. There was only one pesky detail standing between me and tremendous profits: money. For...
Okay, I know you’re skeptical. Other guides have promised you painless web app tests only to reveal that their solution requires some hyper-specific tech stack or a paid third-party service. I won’t do that to you. This guide provides a straightforward and flexible template for end-to-end tests that you can apply to almost any web app. The only...
On February 1st, 2018, I quit my job as a software engineer at Google to start my own single-person software company. It’s exactly one year later, so it feels like an apt time to reflect on how that decision affected my finances, lifestyle, and happiness. How I made and spent money Profit and loss chart via Bench. One way of looking at the chart...
For years, I’ve hired freelancers through a site called Upwork. The site attracts many different professionals, so I’ve used it to find everything from cartoonists to software developers to copy editors. Some were great, some were disastrous, but none of them had ever tried to scam me outright. That is, until I met Lizzie. Lizzie’s freelancer...
I recently installed a media sharing app to one of my servers. It was simple to install, but it hid a dastardly trap for long-term maintenance. Every time a user uploaded a file, the web app saved it to the local filesystem. If I ever blew away the server and rebuilt it, I’d have to backup and restore every file manually. The better architecture...
Congratulations! You’ve finally written so many lines of code that you can afford a beach house. You hire Peter Keating, an architect world-famous for his skyscrapers, who assures you that he has brilliant plans for your beachfront property. Months later, you arrive at the grand unveiling. Your new home is an imposing five-story behemoth of...
Many software founders fail for a simple reason: they ship too late. They spend years developing a product in a vacuum only to see it crumble the first time a real customer touches it. The Indie Hackers podcast features many such stories. The show’s stated mission is to help listeners learn from the mistakes of startup founders, but host...
I love refactoring. Nothing satisfies me more than untangling spaghetti code to reveal its underlying logic in a clear, intuitive way. I’ve learned that refactoring requires diligence. In my younger and more reckless days, I would rush into a legacy codebase and tear apart the code without any concern for controlled changes. Inevitably, days or...
In this post, I demonstrate how to retrofit automated tests onto an untested legacy library. This is part two of a three-part series about how I resurrected ingredient-phrase-tagger, a library that uses machine learning to parse cooking ingredients (e.g., “2 cups milk”) into structured data. Read part one for the full context, but the short...
When I arrived on the scene, it wasn’t a pretty sight. I saw formerly active, cheerful Python classes in a sorry state of atrophy, having gone years without exercise. Functions at all levels of abstraction were crammed together inhumanely under the label utils. I tried to read the UI code but found something obstructing it. After a closer look, I...
I worked as a software engineer for Google from 2014 to 2018. On February 1st, I quit my job and formed my own single-person software company. That was four months ago, so I thought I’d share an update on how things are going. What’s it like not having a job? That’s the most common question people ask. What’s it like? For the first few days, I...
The response to yesterday’s post about leaving Google has been unexpected and overwhelming. It was extremely gratifying to hear that my story resonated with so many people. Hundreds of readers from a variety of industries all across the globe have written me to tell me how they related to my experience. I’ve never written anything before that’s...
For the past four years, I’ve worked as a software developer at Google. On February 1st, I quit. It was because they refused to buy me a Christmas present. Well, I guess it’s a little more complicated than that. The first two years Two years in, I loved Google. When the annual employee survey asked me whether I expected to be at Google in five...
I had just completed a passionate blog post. Too passionate, maybe, as I had written over 8,000 words. That’s 1000x longer than the average Buzzfeed article. Worse, it was a giant wall of text with nary a visual element to break it up aside from some screenshots and a few tables. Ooh, exciting tables! An Illustrated Book of Bad Arguments by Ali...
In early October, I launched a new website, KetoHub, a recipe aggregator for keto meals. Each month, I’ve evaluated the site’s progress to decide how it’s doing and what areas need improvement. I’m doing my evaluation of December publicly. Here’s what was good, bad, and learnable about KetoHub last month. Improvements in December New logo The...
A few months ago, I had a brilliant idea for a website. Then, I had an even brillianter idea: build the website, but outsource all the work. Every great website starts with an MVP: the minimum viable product. It demonstrates the idea in its simplest form to test whether anyone is interested. When Twitter launched their MVP, you could only tweet...
One of the best things I learned from working at Google is the practice of blame-free postmortems. When something goes wrong, you wait until the dust settles, then write a report analyzing what happened. The report explains how the problem occurred and defines concrete steps the team can take to mitigate the problem in the future. I saw a good...
This is the second half of my article about how to communicate well and avoid pitfalls in code reviews. Here, I focus on techniques to bring your code review to a successful close while avoiding ugly conflict. I laid the groundwork in Part One, so I recommend starting there. If you’re impatient, here’s the short version: a good code reviewer not...
Lately, I’ve been reading articles about best practices for code reviews. I notice that these articles focus on finding bugs to the exclusion of almost every other component of a review. Communicating issues you discover in a constructive and professional way? Irrelevant! Just identify all the bugs, and the rest will take care of itself. So I had...
In today’s post, I’m going to show you how to set up your own cloud storage web app, similar to Dropbox or Google Drive, but with substantially lower costs. This solution provides cloud storage at ~$0.60 per TB/month. By comparison, the same storage would cost $8.25 per month on Dropbox or $10 per month on Google Drive. Video tutorial I created a...
A year in blogging I started this blog in May of last year. I don’t mean to brag, but by last April, after less than a year of blogging, I was pulling in upwards of 20 visitors per day, several of whom were not spam bots. That number reached as high as 50 visitors on days when I made a new post and begged for readers through every social media...
Introduction This is the story of GreenPiThumb: a gardening bot that automatically waters houseplants, but also sometimes kills them. The story begins about a year ago, when I was struck by a sudden desire to own a houseplant. A plant would look nice, supply me with much needed oxygen, and imply to guests that I’m a responsible grown-up, capable...
A seedy reddit post The night was June 9th, 2017. It was a typical Friday night for me. I was watching Netflix and checking reddit partying with cool kids. Suddenly, I saw this post on the “New” tab of the /r/siacoin subreddit: If you’re not familiar with Siacoin, it’s a cryptocurrency that allows you to rent out your spare hard disk space or buy...
This guide is out of date. This post describes mining Sia with a desktop graphics card (GPU), but custom mining hardware is now available for Sia. The custom hardware has made Sia GPU mining non-viable. This guide will still work, but you may never reach payout, even with a high-end GPU. Overview Sia is a decentralized, peer-to-peer network for...
Note: This article describes a VM build in 2017. For the 2020 version, see, “Building a Homelab VM Server (2020 Edition).” Overview I do the bulk of my home development work in virtual machines (VMs). My main desktop PC is a Windows 10 machine, so I had always run my VMs from within VirtualBox. This setup worked fine, but I was starting to become...
Overview For the past few years, I’ve been outsourcing tasks from my daily life whenever possible. I tend to be more limited in time than money, so if paying $30 can save me an hour, I consider that a good deal. I recently started experimenting with the keto diet, which focuses on low carbs. I’ve had good experience with the diet, but it limits...
Overview I started investing in peer to peer lending in 2014 through a site called Prosper. I thought peer to peer lending was a neat idea and could potentially earn lucrative returns. When I began, I chose each of my loan investments manually, but over time, I have automated this process by building a lending bot called ProsperBot that invests...
Overview Ansible is an excellent tool for deploying web apps. Ansible allows us to define web apps in terms of the different “roles” that compose our web app (e.g. web server, database server, application server). As our roles and the interactions between them become more complex, we need appropriately stronger ways of testing our roles to verify...
Overview ClipBucket is an open source video hosting platform, similar in functionality to YouTube or Vimeo. In this guide, we’ll walk through how to deploy ClipBucket to a server using the configuration management tool, Ansible. tl; dr - Just Install ClipBucket I don’t care about Ansible or any of your thoughts and feelings about using it to...
Overview Sia is a decentralized, peer-to-peer network for buying and selling computer storage space. If you have extra storage space, Sia allows you to sell it to others who want to store their files on the Sia cloud network. Hosting a Sia server on your personal laptop or desktop can be challenging. People typically turn off their personal...