It's time to build

May 2021 Retrospective

Time to build

Photo by C Dustin on Unsplash

May was another solid month, and I’m excited about some upcoming changes in my life which I’m not quite ready to announce. Watch this space!

In the meantime here’s the retro.

Notables

  • Another record-breaking month of profits. Ho hum.
  • Recycling a conference talk wasn’t as easy as I expected.
  • I celebrated my birthday with some introspection.
  • It’s time to build.

Last Month’s Profit

Project Profit Monthly Change
SaaS Pegasus $6558.93 124.55%
Place Card Me $1847.88 48.03%
Chat Stats $85.69 -29.95%
Total $8492.50 97.88%

Another record month! This is the first time I’ve crossed $8K in a month and a pace of over $100K for a year.

Place Card Me continues to perform similar to pre-covid days and Pegasus remains the workhorse.

I’ve been playing with more interesting ways to visualize my ongoing progress and created a new visualization for my side project dashboard. If you squint it still looks like linear progress, which has me feeling optimistic.

All time profits

All time profits broken out by project

Last Month’s Goals

# Goal Grade
1 Ship something in Pegasus B
2 Do something novel and/or whimsical B+

Ship something in Pegasus

I did ship two minor releases, with a grab-bag of small changes and a dj-stripe library upgrade that was causing headaches for several customers (which I implemented myself in dj-stripe). I gave myself a B because I had hoped to do something more substantial, but got sidetracked.

Do something novel and/or whimsical

I wasn’t sure how to grade this one, but I did spend more time than usual on things I would call “frivolous”, including doing an AMA on Indie Hackers, and resurrecting my Twitter analytics project to help Josh Pigford decide who to follow.

I also spent more time than usual doing writing and big-picture reflection (more below).

Time

May 2021 Time

Time breakdown for May 2021

Another similar month to my last few, with the majority of my non-Dimagi time going to Pegasus.

Here’s that same visualization but for time spend:

All time hours

All time spent broken out by project

I could say a lot about this graph, but what I find most remarkable now is how consistent my Pegasus time has been over the last 6 months (and really the last year if you ignore the dip after our second child was born).

Pegasus is truly and firmly entrenched as my “main side hustle” if those words make sense. Maybe even my main hustle!

Commentary

Some random thoughts on the month past.

On open source incentives and realizing no one really has their shit together

Addressing the dj-stripe issue was fun because—for the first time in a long time—I was impacted enough by a bug in an open-source library that I decided to fix it myself. I was also able to mostly fix the project’s tests in the process.

I’ve spent most of my career making open source software, and so having the opportunity to give back felt great. But also it’s not like I was doing it out of the kindess of my heart.

I never would have worked on the issue if I didn’t have direct incentive to do so—in this case, to eliminate a complex support issue for Pegasus customers. Also, I have the general sense—not concretely thought through—that being a contributor to the most popular Django/Stripe library will generally be strategically useful for me and Pegasus long term, e.g. by establishing credibility, forming relationships with the core team, etc.

Point being: open source is great, but what’s really great is aligning open source incentives with financial upside. And the best kind of financial upside is not donations, but someone like me with a financial stake in working on the library.

The other funny experience with dj-stripe was just realizing that even mature open source libraries used by hundreds of projects still don’t really have their shit together. For example, I assumed when my tests failed locally that it must be an environment issue, but nope, they were just known to be broken for the past few commits. Whoops.

This is in no way a knock on dj-stripe—if anything, I’ve had a far-better-than-average experience working with their maintainers. It’s more a general observation that from the outside of any company, project, or even person it’s easy to assume that they have it all figured out. When they probably don’t.

So reminder to everyone who thinks that me, or anyone else actually has their shit together: we don’t. Behind the scenes, we’re all just trying to stay afloat and make progress on our stuff, and we wish everything were better but there’s only so much time in the day…

You just don’t see any of that until you get to peek inside things. Something I hope these public retros also help with.

Recycling conference talks: easier said than done

The thing I spent the most time on this month was my DjangoCon EU talk, which is happening in two days (eek!).

Which is crazy, because the whole reason I signed up to do the talk was that I had already given it. So I figured it’d be basically zero work to recycle it.

So what happened? The answer is some combination of imposter syndrome and my opinions changing.

I wrote the talk—and really my whole Django Javascript guide—at a time where I had specific, strong opinions about the right way to use Django and JavaScript together.

But since then my opinions have evolved a bit. I no longer always recommend a hybrid architecture, and I’ve come to better understand more of their downside. I still think hybrid apps are great, and almost always right for full-stack Django developers doing their own projects (i.e. me). But they’re not perfect for everyone.

So now I’m in a position where I’ve got this talk that reflects the opinions of my past self, but my current self wants to convey a lot more nuance. And on top of that, the talk was already rushed, so I’m not sure how to cut content to make room for any more discussion. Plus if I change things drastically then I no longer match the conference talk description that I’ve already committed to.

Not to mention that I somehow have the sense—no idea if this true—that DjangoCon EU is more prestigious than PyCon ZA where I last gave the talk, and so I worry that there will be a bunch of super-opinionated people who know more than me and will think the whole thing is garbage. Oh, and also I had to provide a pre-recording which meant that if any little thing went wrong I had the option to record it again—a terrible system for perfectionists.

Anyway.

The whole thing ended up being way more work and stress than I expected, and I’m not even sure the final product is any better than the original version. If anything it’s more wishy-washy. At least past me had conviction.

All that said, I’m looking forward to giving the talk, hopefully getting some positive reception, and then having the thing done.

Takeaway: think hard before trying to recycle conference talks in the future.

Birthdays as an opportunity to check in with yourself

I turned 39 last month. It’s older than I feel, but it is what it is, and I’m not complaining.

I took the occasion to do a mini-retro on my life, which you can read below if you want.

I’m not sure if it comes off worse than I feel, but mostly it made me grateful. On every major axis—career, health, stability, family—things are either going well or going as well can be expected given the circumstances.1

The lacking list is mostly “nice to haves” or “even betters” that I can think about and hopefully make progress on. Or not. Things are good!

Much like these retros, I think it’ll be nice to have these write-ups as something to look back on years from now. Little time machines into my past life to help see how I’ve changed and how much progress I’ve made.

This Month’s Goals

This month I’ve decided to get back to my roots:

  1. Code
  2. Ship
  3. Have fun

I figure I’ve invested hundreds of hours over the last 4 years to put myself in a position to do whatever I feel like. And yet I rarely capitalize on that—and instead keep chasing the next roadmap item, the next marketing win, etc.

So this month I’m just going to try building things that tickle me.

I expect many of these will still be strategically-aligned with my products, though hopefully some won’t. The profit/time visualizations above are the first example of me trying this. I spent two hours on them and I have no regrets.2

I’ll also try to post much more frequent updates on my Twitter. I’ve been a little down on “engagement Twitter” lately, but that doesn’t mean I can’t use it how I want. Hopefully I can stick to it, and hopefully it’s fun—for me and for others.

See you next month.


  1. It turns out that tiny children are very tiring and put substantial restrictions on your freedom. Pandemics too. Who knew? 

  2. Apart from maybe admitting they took that long. I blame confusing chart library documentation and prior technical debt.