Week 8: I picked a good toolchain
Some people like to read this newsletter to hear what it's like to start a business. Some others like to read it to follow the emotional ups and downs. But I know a lot of you are reading to hear about something I haven't yet spent much time on: the technical details.
With 4 weeks to go, this newsletter's going into the weeds of what my toolchain looks like. I'll talk about it in the context of the three things I worked on this week: the docs, the billing, and the product itself.
The docs stack
A big part of running an early-stage business amounts to putting up a good website.
Think about it: you’re trying to get your pitch out to as many people as possible. A great landing page is the only place where you can tighten your pitch to perfection and know your audience will see it without the distortion of conversation.
For ShadowTraffic, I have two main properties: the landing page and the docs subdomain. I need web tools that let me move fast, yet retain flexibility in how things look and feel.
For the docs, I chose Mkdocs with the Material plugin. I’ve had experience using these tools in the past. They’re easy to use, highly configurable, and have only gotten better since I last tried them.
I updated just a few of the defaults, overriding the theme to match my Tailwind colors.
My Mkdocs build is served out of an S3 bucket with static site hosting. Because I wanted my site to be SSL-enabled, I had to serve the S3 bucket through CloudFront. It’s a little tricky to set up at first, but one of the benefits of using CloudFront is that acquiring a domain certificate piece is easy—you can register it with Certificate Manager.
For my domain registry, I’m using Porkbun. I don’t have much to say other than it works great and seems to have competitively priced domain names.
I have to admit that I’ve always wondered if some of the newer tools like Framer would obviate a lot of the work here. I haven’t tried them because my sites tend to be interactive and JavaScript-heavy, and I worry that I’ll be trying to use them in a way they weren’t intended.
The billing stack
I complained a lot on social media this week about billing. Like the docs stack, perhaps there was an easier way to do it, but I went with a tried and true approach.
For payments, I picked Stripe. I hadn’t used it until now, but I have to say that I can see why they’re the market leader. For the most part, their product feels complete, yet simple.
When someone goes to ShadowTraffic and (hopefully!) buys it, Stripe will fire off a webhook connected to AWS Lamda. I wrote a little Lambda function that creates a license key and emails it to you with SES.
This was the most complicated piece to put together because it’s not obvious how to integrate, test, and debug all of these pieces as one. Lambda has notoriously bad iteration times, and it’s not simple to figure out how to set it up locally.
With enough willpower, I managed to make it work.
The product stack
Last but not least, there’s ShadowTraffic itself. I wrote it purely in Clojure. That’s had two main benefits:
The JVM ecosystem has become very mature. As just one example, this week I debugged a memory leak with Java Mission Control. I had excellent visibility into what my program was doing, and it didn’t take me long to figure out why I was leaking heap space.
I’m able to cross-compile my code into ClojureScript. That animation on my landing page? That’s the actual version of ShadowTraffic running in your browser. Not bad for just a few extra days of work.
That’s it for this week. I’m battling a cold and I’m ready for some time off.

