Updates about my life and what I learn about creating software| mtlynch.io
The brilliant relationship tip you won't find anywhere else.| mtlynch.io
Updates about my life and what I learn about creating software| mtlynch.io
How to migrate from RAIDZ1 to RAIDZ2 without a spare ZFS server or a boatload of extra disks.| mtlynch.io
How goHardDrive exposed tens of thousands of customer records to anyone with a web browser.| mtlynch.io
Revisiting David Thompson's "My favourite Git commit"| mtlynch.io
There’s an excellent Go testing pattern that too few people know. I can teach it to you in 30 seconds. Instead of writing Go tests like this: // The common, unrefined way. username := GetUser() if username != "dummyUser" { t.Errorf("unexpected username: got %s, want: %s", username, "dummyUser") } Write your tests like this, beginning each assertion with if got, want :=: // The underused, elegant way. if got, want := GetUser(), "dummyUser"; got != want { t.Errorf("username=%s, want=%s", got,...| mtlynch.io
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 manually downloaded a PDF from the IRS website. I’ll start by automating that step.| mtlynch.io
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 a Nix configuration that kicks off a fuzz testing workflow with a single command. The only dependencies are Nix and git.| mtlynch.io
Last week, I was listening to the CoRecursive podcast interview with PowerShell’s lead architect, Jeffrey Snover. One moment in that interview has been stuck in my head the whole week is when Snover argues that graphical user interfaces (GUIs) are inherently “antisocial”: I realized that — you know, that the mouse is antisocial. The GUI is antisocial. So what’s that mean? You have a problem to solve, and you solve it with the GUI.| mtlynch.io
I recently read Julia Evans’ latest zine about git, and one of her tips was to configure your terminal shell prompt to show the git status. Julia’s terminal prompt looks like this: ~/work/homepage (main) $ main is Julia’s current git branch. When she’s in the middle of a git operation like bisect or merge, the terminal changes to this: ~/work/homepage (main|MERGING) $ It had never occurred to me to customize my shell prompt, but I immediately recognized the value.| mtlynch.io
Four years after starting TinyPilot from scratch, I've sold the company and handed complete control over to a new owner.| mtlynch.io
I’m a blogger, and I often commission custom illustrations for my blog posts like this one: An example of an illustration I commissioned for the blog, part of my year-in-review series The blog’s previous illustrator was the awesome Loraine Yow, who worked with me for six years. She recently changed careers, so I’m looking for someone who can take over as the blog’s official illustrator. Benefits Long-term client relationship Wide variety of subjects Room to bring your own creativity a...| Notes on mtlynch.io
I saw that Meta released the Llama 3 AI model, and people seem excited about it, so I decided to give it a try. I don’t have much experience running open-source AI models, and I didn’t see a lot of documentation about how to run them. I tinkered with it for a few hours and got Llama 3 working with Ollama, so I wanted to share my instructions. Provisioning a cloud server with a GPU To run this experiment, I provisioned the following server on Scaleway:| mtlynch.io
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 control flow. To motivate myself, I’ve been benchmarking my Ethereum implementation against the official Go implementation.| mtlynch.io
What I learned building a rack for my home server infrastructure.| mtlynch.io
Six years ago, I quit my job as a developer at Google to create my own self-funded software business. This is a review of my last year and what I've learned so far about bootstrapping software businesses.| mtlynch.io
Have you ever used archive.org’s Internet Wayback Machine? It’s a free tool that’s been archiving the web since 1996. So, if you want to see what Google looked like in 1999, they’ve got it. Internet Archive capture of Google from April 22, 1999 ArchiveBox is like your own, personal Internet Wayback Machine. It’s free and open-source, and you can use it to archive most websites. ArchiveBox is a free, open-source tool that lets you archive websites locally.| mtlynch.io
When I work in my own repositories these days, I always add a Nix flake to the repo so that I can spin up a working development environment on any system with a single command. What do I do when I’m working in someone else’s repo and they don’t want to adopt Nix flakes? Normally, I’d just add the file to my copy of the repo and gitignore it locally so I don’t commit my personally-specific files with the rest of my changes.| mtlynch.io
Zig is a new, independently developed low-level programming language. It’s a modern reimagining of C that attempts to retain C’s performance while embracing improvements from the last 30 years of tooling and language design. Zig makes calling into C code easier than any other language I’ve used. Zig also treats unit testing as a first-class feature, which the C language certainly does not. These two properties of Zig create an interesting opportunity: Zig allows you to add unit tests to...| mtlynch.io
Zig is a new, open-source programming language designed to replace C. I’m still a Zig beginner, so I’m trying to learn the language by using Zig to rewrite parts of existing C applications. One of the first challenges I encountered with Zig is understanding strings. I couldn’t find detailed documentation about how Zig strings work when calling C code, so I’m sharing my findings in case they’re helpful to others who want to use Zig to call C.| mtlynch.io
I read Simon Willison’s post about using Llamafile to experiment with open-source chatbots / LLMs. He made it sound so easy, so I decided to try it out. One of my longtime hobby projects is WanderJest, a site for finding live comedy. One of the challenges of that site is that the canonical information about an upcoming show is often the poster for it. Here’s an example: I’ve been scraping this information by hand, but that’s tedious and time-consuming.| mtlynch.io
Zig is a new, independently developed low-level programming language. It’s a modern reimagining of C that attempts to retain all of C’s performance benefits while also taking advantage of improvements in tooling and language design from the last 30 years. Because Zig is designed to replace C, one of the first-class features is that you can call into C libraries from a Zig application. I couldn’t find any simple examples demonstrating Zig’s C interop functionality, so I decided to writ...| mtlynch.io
I always run into issues installing Jellyfin on TrueNAS core. I fix them, and then I forget a few months later, so these are just my notes to myself of how to install Jellyfin on TrueNAS core. Instructions Install based on these instructions: https://github.com/Thefrank/jellyfin-server-freebsd/blob/main/Installation_TrueNAS_GUI.md#the-advanced-way We need to follow the advanced instructions because TrueNAS plugins are deprecated. Gotcha: Jellyfin server is not available The first few loads af...| mtlynch.io
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.| mtlynch.io
Nix is a broad product with a steep learning curve. It’s capable of everything from installing a single package to managing every file and application on your OS. One useful thing you can do with Nix, even as a complete beginner, is manage your dev environments. Nix lets me have multiple projects on the same system that each have their own independent view of what dependencies are available. I can have one legacy project running Python 2.| mtlynch.io
One of the stumbling blocks I ran into when trying out NixOS was that I couldn’t run it under Proxmox, my preferred virtual machine server. Through some trial and error, I figured out how to install NixOS as a Proxmox container. Download the NixOS container image First, download the latest NixOS x86_x64 container image. For other hardware architectures, see this Github comment. At the time of this writing, the latest NixOS container build is 235933548, but you can just click whatever is the...| mtlynch.io
In creating the tutorial, “Installing NixOS on Raspberry Pi 4,” I ran into a ton of paths that didn’t work. I’ve collected them here for the sake of saving others time retrying the same steps. The standard NixOS aarch64 image doesn’t work When I checked the NixOS download page, I saw that they offered 64-bit ARM images. NixOS offers bootable images for 64-bit ARM systems “Wonderful!” I thought to myself, as the Pi 4 has a 64-bit ARM CPU.| mtlynch.io
I’m still a Nix beginner, and one thing I couldn’t figure out until recently was how to keep parts of my configuration.nix file under source control. My goal I’d like for my Nix configuration files to be modular and reusable, so depending on the system or flake, I can pull in only the configuration files I need. I’d like all my Nix configuration files to be under source control so that different systems can depend on different versions of any file so I don’t have to upgrade every sy...| mtlynch.io
A beginner-friendly tutorial for installing NixOS on a Raspberry Pi 4.| mtlynch.io
I recently bought my first-ever managed networking switch, a TP-Link JetStream TL-SG3428X. The main feature of a managed switch is that it lets you segment your network into VLANs. I was excited about this functionality, but it took me hours of trial and error to get VLANs working. I found TP-Link’s VLAN documentation lacking, so I’m sharing my notes in case they’re helpful to others. Background If you’re not familiar with VLANs, my favorite explainer is Raid Owl’s video on the subj...| mtlynch.io
Nix is a tool for configuring software environments according to source files. I’ve been hearing more and more about Nix on Hacker News and Twitter. The idea of it appeals to me, so I’ve been tinkering with it over the past few weeks. My history with infrastructure as code Ten years ago, I discovered Salt, a tool that allows you to define a computer system’s configuration in source code. I loved the idea of a git repo that defined what services were installed on my computers and VMs.| mtlynch.io
Over the past six months, I’ve been transitioning the fulfillment processes at my e-commerce business to a third-party logistics (3PL) vendor. I didn’t know anything about 3PLs before starting this process, so there were a lot of things I didn’t know to ask about. Here are the list of questions that I recommend e-commerce merchants ask a 3PL if they’re considering working with them for fulfillment. Customer profile Do you have other clients whose order volumes are similar to mine?| mtlynch.io
Jason Cohen’s 2013 Microconf talk, Designing the Ideal Bootstrapped Business with Jason Cohen, is one of the most valuable resources I’ve found for bootstrapped founders. I watched it for the first time in 2020, and I’ve revisited it repeatedly since then. If you’re new to the world of bootstrapped software business, or you’re struggling to gain traction with your business, I highly recommend this talk. Below, I’ve included my notes.| mtlynch.io
How to deploy Syncthing on a Fly.io cloud VM and configure it using built-in tools.| mtlynch.io
Five years ago today, I quit my job as a developer at Google to create my own self-funded software business. This is a review of my last year and what I've learned so far about bootstrapping software businesses.| mtlynch.io
Cypress is an open-source tool for testing web applications end-to-end. I first saw Gleb Bahmutov demo Cypress at a 2018 web dev meetup in New York, and I was blown away. I’ve been using Cypress since I saw it demoed at a dev meetup in 2018. Before discovering Cypress, I had begrudgingly used Selenium. Cypress was a refreshing leap forward, as it offered elegant solutions to tons of pain points that made Selenium impractical to use.| mtlynch.io
I’m a bootstrapped founder of a six-person company, and I spent this week testing different tools for hiring candidates. This post summarizes my experience with the applicant tracking systems (ATS) I found and how well they serve small, bootstrapped businesses. Note: This isn’t affiliate blogspam where I give fake reviews to push you to sign up for whoever gives me a commission. I have no business relationship with any of these companies except as a customer.| mtlynch.io
In a recent Hacker News thread about preparing financially for a possible recession, a commenter suggested investing in iBonds. iBonds are one of those investments I’ve seen in passing every time I read a personal finance book, but I’ve never paid much attention to them. When I saw that iBonds are currently paying 9.62% interest, I decided to give them a closer look. What are iBonds? iBonds are the colloquial name for Series I Treasury savings bonds.| mtlynch.io
Using profiling tools and debugging techniques to improve performance of PicoShare.| mtlynch.io
Mistakes I made working with my first design agency.| mtlynch.io
How I chose parts, built, and configured my first custom home storage server.| mtlynch.io
Four years ago today, I quit my job as a developer at Google to create my own self-funded software business. This is a review of my fourth year and what I've learned so far about bootstrapping software businesses.| mtlynch.io
I've always hated maintaining database servers. Litestream offers a simple alternative without sacrificing reliability or security.| mtlynch.io
I provide this document when advertising dev jobs, and I pay freelancers to read it when they begin working with me.| mtlynch.io
Today is the third anniversary of me 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 for another update.| mtlynch.io
Best practices for code review when you're the author.| mtlynch.io
I built a home server to host my development VMs and went a bit overboard.| mtlynch.io
Using only a Raspberry Pi and an $11 video capture dongle, you can create your own KVM over IP device, allowing you to send keyboard input to a remote computer and capture its display.| mtlynch.io
Using the Pi as a USB gadget, I can impersonate a keyboard and make it type whatever I want through the web browser.| mtlynch.io
Goal This tutorial shows you how to edit digitized video captures into smaller clips that you can publish on your own password-protected MediaGoblin server. You’ll use a free Heroku dyno, so your only ongoing cost for running this private media server is the cost of storage on Google Cloud Storage, which is 2.3 cents per GB. I used this workflow to edit and share my family’s home videos at a cost of only $0.77 per month. For the detailed backstory, check out the blog post, “My Eight-Yea...| mtlynch.io
My journey to create a YouTube of memories from my family's old home videos.| mtlynch.io
Stripe has made several significant, positive changes to its user tracking and privacy policies in the last week.| mtlynch.io
An investigation into how Stripe tracks your users and what you can do to prevent it| mtlynch.io
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 full year, so it's time for another update.| mtlynch.io