Posts on mtlynch.io

Recent content in Posts on mtlynch.io
https://mtlynch.io/posts/ (RSS)
visit blog
Lessons from my First Exit
13 Nov 2024 | original ↗

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...

Using Nix to Fuzz Test a PDF Parser (Part Two)
23 Oct 2024 | original ↗

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...

Using Nix to Fuzz Test a PDF Parser (Part One)
23 Oct 2024 | original ↗

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...

I Sold TinyPilot, My First Successful Business
29 May 2024 | original ↗

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...

Building My First Homelab Server Rack
5 Apr 2024 | original ↗

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...

Why does an extraneous build step make my Zig app 10x faster?
19 Mar 2024 | original ↗

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...

My Sixth Year as a Bootstrapped Founder
16 Feb 2024 | original ↗

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...

Aardvark'd: The Fog Creek Documentary, 18 Years Later
8 Sept 2023 | original ↗

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...

Installing NixOS on Raspberry Pi 4
18 Jul 2023 | original ↗

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...

Deploying Syncthing on a Fly.io Cloud Server
29 May 2023 | original ↗

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...

My Fifth Year as a Bootstrapped Founder
10 Feb 2023 | original ↗

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...

Back Up Encrypted ZFS Data without Unlocking It
29 Jul 2022 | original ↗

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...

I Regret My $46k Website Redesign
21 Jul 2022 | original ↗

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...

Building a Budget Homelab NAS Server (2022 Edition)
23 May 2022 | original ↗

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...

My Fourth Year as a Bootstrapped Founder
1 Feb 2022 | original ↗

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...

How Litestream Eliminated My Database Server for $0.03/month
29 Apr 2021 | original ↗

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...

Guidelines for Freelance Developers Working with Me
12 Mar 2021 | original ↗

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...

My Third Year as a Solo Developer
1 Feb 2021 | original ↗

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...

How to Make Your Code Reviewer Fall in Love with You
2 Dec 2020 | original ↗

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...

Building a Homelab VM Server (2020 Edition)
6 Oct 2020 | original ↗

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,...

How I Collected a Debt from an Unscrupulous Merchant
13 Aug 2020 | original ↗

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: Build a KVM Over IP for Under $100
23 Jul 2020 | original ↗

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...

Key Mime Pi: Turn Your Raspberry Pi into a Remote Keyboard
11 Jun 2020 | original ↗

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...

My Eight-Year Quest to Digitize 45 Videotapes (Part Two)
26 May 2020 | original ↗

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...

My Eight-Year Quest to Digitize 45 Videotapes (Part One)
26 May 2020 | original ↗

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...

Update: Stripe's Response Regarding User Tracking
30 Apr 2020 | original ↗

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...

Stripe is Silently Recording Your Movements On its Customers' Websites
21 Apr 2020 | original ↗

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...

My Second Year as a Solo Developer
31 Jan 2020 | original ↗

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...

A Simple Pre-Rendered Web App Using Vue + Nuxt
19 Dec 2019 | original ↗

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...

Eliminating Distractions from Social Media, Email, and StackOverflow
11 Nov 2019 | original ↗

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...

Hiring Content Writers: A Guide for Small Businesses
30 Sept 2019 | original ↗

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...

The Dumbest Task I Ever Outsourced
13 Aug 2019 | original ↗

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,...

Staying Motivated by Sending Status Updates to Nobody
25 Jun 2019 | original ↗

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...

How to Grow Quickly and Never Turn a Profit
31 May 2019 | original ↗

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...

End-to-End Testing Web Apps: The Painless Way
1 May 2019 | original ↗

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...

My First Year as a Solo Developer
1 Feb 2019 | original ↗

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...

What I Learned About Upwork from a Bumbling Scammer
27 Dec 2018 | original ↗

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...

Retrofitting Apps for Cloud Storage with Zero Code Changes
4 Dec 2018 | original ↗

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...

Why Good Developers Write Bad Unit Tests
9 Nov 2018 | original ↗

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...

How I Tricked Myself into Shipping Too Late
11 Sept 2018 | original ↗

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...

Resurrecting a Dead Library: Part Three - Rehabilitation
20 Aug 2018 | original ↗

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...

Resurrecting a Dead Library: Part Two - Stabilization
6 Aug 2018 | original ↗

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...

Resurrecting a Dead Library: Part One - Resuscitation
24 Jul 2018 | original ↗

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...

What I've Been Doing Since Quitting My Job
29 May 2018 | original ↗

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...

A Follow-Up and Space Duck
1 Mar 2018 | original ↗

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...

Why I Quit Google to Work for Myself
28 Feb 2018 | original ↗

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...

How to Hire a Cartoonist to Make Your Blog Less Boring
19 Jan 2018 | original ↗

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...

KetoHub Update: Month 3
9 Jan 2018 | original ↗

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...

The Perils of Outsourcing Your MVP
6 Dec 2017 | original ↗

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...

Sia-Minio Integration Postmortem
1 Dec 2017 | original ↗

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...

How to Do Code Reviews Like a Human (Part Two)
9 Nov 2017 | original ↗

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...

How to Do Code Reviews Like a Human (Part One)
12 Oct 2017 | original ↗

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...

Create Your Own Low-Cost Cloud Storage App with Sia and Nextcloud
6 Aug 2017 | original ↗

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...

How I Hired a Freelance Editor for My Blog
25 Jul 2017 | original ↗

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...

GreenPiThumb: A Raspberry Pi Gardening Bot
27 Jun 2017 | original ↗

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...

How I Stole Your Siacoin
16 Jun 2017 | original ↗

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...

A Beginner's Guide to Mining Siacoin
20 May 2017 | original ↗

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...

Building a Homelab VM Server
7 May 2017 | original ↗

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...

Adventures in Outsourcing: Cooking with TaskRabbit
11 Jan 2017 | original ↗

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...

Automated Prosper Investing with ProsperBot
26 Nov 2016 | original ↗

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...

Testing Ansible Web App Roles with Selenium
25 Sept 2016 | original ↗

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...

Automatically Deploying ClipBucket with Ansible
6 Sept 2016 | original ↗

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...

Running Sia on a Synology NAS via Docker
30 May 2016 | original ↗

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...

↑ these items are from RSS. Visit the blog itself at https://mtlynch.io/posts/ to find other articles and to appreciate the author's digital home.