Skip to content

What I’ve Learned Searching for a New Startup Idea, Part 2

(this is part two of a series of blog posts about what I’m learning as I hunt for a new startup idea to work on with my cofounder) Find the Best Talent Hire only great people. Eliminate toil incrementally, even at the early stages. Slow growth to avoid hiring B players; this will result in a net decrease in product velocity. This model breaks at some point in a company’s growth, but I think you can keep a small-and-mighty team for longer than one would expect. This was a key advantage Stripe had in its early days. Be Curious and Start Small Have childlike curiosity. Don’t be afraid to build something silly, small, or seemingly useless. Too much filtering of ideas on the outset can cause you to miss something big…

Continue Reading

What I’ve Learned Searching for a New Startup Idea, Part I

I’m a couple of months into hunting for a new startup idea to work on with my cofounder. I’ve learned a lot and I’m trying to capture these learnings as I go to share them. Finding an idea to build a new business around is an interesting process: it’s much different than having a burning problem that you got excited enough about to quit your job. Finding a big idea is similar to being an investor—mixing analytics, experimentation, serendipity, patience, and convictions about what the future looks like into a specific bet on an industry, future trends, product shape, and initial feature wedge…

Continue Reading

Raspberry Pi Configuration Tips & Tricks

Through an unfortunate turn of events, my SD card of my raspberry pi got corrupted. Apparently this happens quite often: SD cards are not designed for constant activity like a standard SSD drive (this was news to me!). This time around, I decided to run many of the applications I put on the pi in docker containers (here they are), so it’s all self-documented. Below are notes on what I learned while setting up the pi again, and some misc devops-style tips & tricks that would be useful in any linux server environment. The nice thing about a pi is it gives you the excuse to learn about interesting linux internals. (I’ve written about my raspberry pi setup process in the past, if you want to read the precursor to this post)…

Continue Reading

Learning Elixir and Ecto

I’m finally posting a long-running learning document that I wrote as I I continued work on my original Elixir side project. I stopped working on this for at least a year and recently picked it back up as part of exploring some technologies for my next startup. This post got way longer than I expected, but hopefully, it’s a great compendium of notes and learnings from someone trying to learn Elixir who has a strong understanding of ruby, python, javascript, etc. What I’m learning Here’s what I’m going to be learning: How does Ecto work? Supervisor, tasks, processes, etc. "Let it Crash" philosophy. What exactly does this mean in practice?..

Continue Reading

Converting a Node Project from CommonJS to ESM

I had a small JavaScript project (deployed via AWS lambda, which I’ll write about later on). I needed to add a very simple package to the project—detect-cloudflare—which sent me down a deep rabbit hole: My project was written years ago using CommonJS (i.e. require). cloudflare-detect included a bunch of packages for a very simple task, which bothers me. Plus, the IP address ranges were out of date and the package hadn’t been updated in years, I decided I wanted to update it. Should be easy, right? (this is never a good thing for an engineer to say) I updated the project and got all of the tests passing without too much effort. Nice! When I went to use the newly refactored package in my project it failed with this error. Uh oh…

Continue Reading

Using Ansible to Setup Custom Dotfiles

A while back I posted about using Ansible for an Elixir application. I recently wanted to update this application and add a couple of new features: Add my dotfiles to the server in a similar way to GitHub codespaces (using this role) Add brew, mostly for my dotfiles to work Automate more of the dokku-based setup Here’s the heavily commented ansible config for a dokku-based application (not specific to Elixir): Ansible learnings Some additional learnings this time around: lookup('env','HOME') is the directory of the environment that ansible is executed from, i.e. your computer directory. Same goes with lookup('file', '~/something')…

Continue Reading

Automating Elixir Package Deployment with GitHub Actions

I enjoy Elixir, although I know it doesn’t make sense to use it for most production applications. However, I try to use it for side projects when I can, even just because it’s such a fun and beautiful language to program in. One thing I’ve been fascinated with recently is automating the entire release process for packages using conventional commits with GitHub actions. This post walks through how to make that happen, and some other bits around Elixir project setup. Here’s the example project with all of the learnings from this post in place…

Continue Reading

Re-learning Modern PHP

A while back, I ran into Monica (a sort of fancy address book). I started to use and self-host the project as part of tinkering with my raspberry pi and then wanted to make a couple of improvements to the project. This was a good excuse to explore the PHP world and see how things have evolved since I touched the language over a decade ago. I’m surprised to say this, but working with PHP was not nearly as painful as I thought it would be. The language and tooling have evolved nicely over the years. If I was forced to use PHP as my daily driver, I wouldn’t be too disappointed!..

Continue Reading

Executing Multiple SQL Statements in Elixir

Working with raw SQL in the Elixir/Ecto world is not easy. I thought executing a multi-line SQL file in a database migration would be easy; it’s not. Here’s what I learned: The execute function does not support executing multiple statements at once. It’s perplexing that there’s no direct solution for this in Elixir. While AyeSQL claims raw SQL support, it mandates a one-statement-at-a-time approach. This limitation is particularly problematic when importing SQL designed to create triggers spanning multiple lines. For simple SQL tasks, you might consider splitting the raw SQL into multiple lines: But only if your SQL is well-formed and relatively simple…

Continue Reading