Full Width [alt+shift+f] Shortcuts [alt+shift+k]
Sign Up [alt+shift+s] Log In [alt+shift+l]
85
New here? Hi, I’m Michael. I’m a software developer and the founder of TinyPilot, an independent computer hardware company. I started the company in 2020, and it now earns $80-100k/month in revenue and employs six other people. Every month, I publish a retrospective like this one to share how things are going with my business and my professional life overall. Highlights I’m trying to work around manufacturer delays. I’ve decided to hang onto TinyPilot’s office for two more months.
a year ago

More from mtlynch.io

How to Resolve Local Hostnames in OPNSense

My router runs OPNSense Business. I like having an open-source router, but I have a few gripes with it. My biggest issue is that, by default, OPNsense can’t resolve hostnames on my local network. Why can’t OPNsense resolve local hostnames? For every other router I’ve owned in my life, if there’s a computer on my network named foo123 and I run ping foo123, then everything just works, and my computer successfully pings foo123.

a week ago 22 votes
Increase Your Reply Rate on Cold Emails to Me

The term “cold email” refers to emailing someone who you’ve never spoken to before. There are lots of guides on writing cold emails. This one is a bit niche, as it’s about cold emailing a particular person: me. But I guarantee you that it’s the best guide you can find on this hyperspecific topic. I’m publishing my guidelines under the Creative Commons BY-4.0 license, so you’re welcome to reuse or adapt them to guide people in emailing you.

2 weeks ago 25 votes
Overcoming Gotchas in Samsung Secure Erase

I have a few Samsung SSDs, and I always have trouble remembering the process of secure erasing them, as Samsung Magician software is terrible. Here are my notes for overcoming Samsung Magician’s gotchas in the process of secure erasing a Samsung SSD. You need a Windows or MacOS system with a Samsung SSD attached This requirement drives me crazy, as Samsung Magician is creating a bootable USB disk, so it shouldn’t care what’s on your current system, but it does. And Samsung Magician only exists for Windows, MacOS, and Android, so if you’re on Linux, you can’t use it.

2 weeks ago 25 votes
Educational Products: Month 3

Highlights I published the first chapter of my book and was happy with the reception. My attempt to hire a book cover designer flopped. I may have figured out how to support large files on PicoShare. Goal grades At the start of each month, I declare what I’d like to accomplish. Here’s how I did against those goals: Finish two chapters of Refactoring English Result: Finished one chapter and got 75% through the next. Grade: B The first chapter took longer than I expected, as I kept finding parts that I wanted to rewrite. I did find it helpful to take a break for a week to write a second chapter and come back fresh.

3 weeks ago 28 votes
if got, want: A Simple Way to Write Better Go Tests

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, want) } The if got, want :=: pattern works even better in table-driven tests. Here’s an example from my library for parsing social media handles:

3 weeks ago 37 votes

More in indiehacker

Beehiiv vs ConvertKit - the best newsletter software for 2025

Beehiiv vs ConvertKit is a fierce clash of two newsletter software companies. I'll go over differences on pricing, features and lots more.

3 days ago 10 votes
OnlineOrNot Diaries 24

Looking over last year, and a first incident for 2025.

a week ago 16 votes
How to Resolve Local Hostnames in OPNSense

My router runs OPNSense Business. I like having an open-source router, but I have a few gripes with it. My biggest issue is that, by default, OPNsense can’t resolve hostnames on my local network. Why can’t OPNsense resolve local hostnames? For every other router I’ve owned in my life, if there’s a computer on my network named foo123 and I run ping foo123, then everything just works, and my computer successfully pings foo123.

a week ago 22 votes
Living the digital nomad dream in Bangkok

Jesse Schoberg has an enviable life as a founder working from Thailand. He enjoys a great lifestyle at a fraction of the price back in the US. I chatted to him about growing his DropInBlog business into a SaaS success story. Why did you become a founder? My brain doesn&

3 weeks ago 36 votes
if got, want: A Simple Way to Write Better Go Tests

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, want) } The if got, want :=: pattern works even better in table-driven tests. Here’s an example from my library for parsing social media handles:

3 weeks ago 37 votes