Year in Review (2024)
The last year-in-review I did was in 2022, and as a result, I have a number of things to catch up on.
2023
First, what happened in 2023? In retrospect, it all feels like a blur. For the first time in three years, I was no longer on the Board of the Django Software Foundation. I’m quite proud of our work on the Board during this time but serving required a lot of time: multiple hours per week, checking email daily, and so on. Together with the President, Anna Makarudze, we invested a lot into keeping Django functioning during this time.
I attended DjangoCon US in Durham, NC, and DjangoCon Europe in Edinburgh, Scotland, though for the first time, I didn’t give a speech at either. It was a bit of a relief to attend, learn, and meet people without the additional weight of giving a presentation hanging over my head. I love Edinburgh and Scotland in general. I met my wife while studying abroad at the University of St. Andrews and have been back more than a few times since. In the photo below, I’m speaking with Çağıl Uluşahin Sönmez and Adam Johnson to give just one example.
For lodging, I spit a hostel room containing four bunk beds with Carlton Gibson, Paolo Melchiorre, and Mariusz Felisiak. That’s two Django Fellows, a Django core contributor, and me in a tiny but cozy space.
Django for Beginners was updated to 4.2, and I spent far too long on it, effectively rewriting a lot of it due to reader feedback and my own thoughts on how better to present Django. It takes almost as much time to completely update a book as it does to write one, albeit it feels far less fulfilling, and there aren’t as many new sales.
The Django Chat podcast continued, as did the weekly Django News Newsletter. I spent most of the fall working on LearnDjango.com, trying in earnest to turn it into a full-fledged one-stop shop for my tutorials and courses.
2024
Let’s look at 2024 now in a bit more detail. My father became quite sick and passed away in April, which is probably the main thing I take away from this year. Being self-employed I spent a lot of time up in Vermont with him and my Mom at the end, though still caring for my three young kids and trying to run a business several hours away. After death, there is the combination of a whole host of logistics to sort out (legal, financial, funerals, family members), and then about six months later, the grief really starts to sink in and makes me fall apart at random times. So there’s that.
1. LearnDjango.com
The main professional focus of the year was finally launching LearnDjango.com. At the end of last year, I commissioned work from YupGup, which resulted in a polished major upgrade to the website’s design. What remained was adding all the functionality to support my books, such as online courses, user accounts, permissions, and payments. Easy, right?
Well, it took a while. When you are juggling money and permissions, it is important to get things right, and I over-optimized on this front, trying to make sure all my code was as elegant, performant, and secure as possible. In the end, I did get it all done in November in time for a Black Friday sale. I redirected all web traffic from the three standalone book websites–djangoforbeginners.com, djangoforapis.com, and djangoforprofessionals.com–to LearnDjango.com and now anyone can read the free chapters there. I also spent a lot longer than I expected making sure the user authentication worked correctly and was synced up to user permissions and payments.
To celebrate, I had a relatively brief Black Friday sale for all three courses and offered to provide website access to previous customers from Gumroad. This last part is still manual: I have to look up sales on Gumroad, check that a user exists on LearnDjango.com, and then add access for each course within the admin. I could make this more streamlined and might in the future, but I also took this as a chance to interact with past customers. Sometimes it’s worth stepping back and manually doing things rather than automating all the things.
At the moment, the Black Friday sale has just ended, and I’m still finishing up porting over existing customers, so I’m more fatigued than overjoyed. But I should be celebrating a bit more since this whole endeavor was many years in the making and has finally come to pass. I think I’m still slightly anxious that something will go wrong, and I haven’t fully settled into this huge weight being lifted after years of thought and work.
Going forward, course updates and future courses will be waaaay easier to manage. Also, I’m just interacting with users via email and processing payments with Stripe. No more intermediaries getting in between all that.
2. E-Commerce Course
I have 2/3 written of a future e-commerce course containing all I’ve learned on the topic while building out LearnDjango. For now, the image above links to the updated LearnDjango tutorial on Stripe and Django to get you started. There is a lot involved with a real site like this, and there are so many toggles related to payments, either single payments, multiple payments, or subscriptions. I think diving into forms and showing how an action can trigger another action, such as a change in user permission, is a key part too and I’m still going back and forth on the best start to finish path to cover it all. I plan to launch this course in 2025, my first new course in several years. Stay tuned on this front!
3. Book Updates
In the late spring, I realized that finishing LearnDjango.com was taking forever, and I could no longer hold off on a 5.0 update for the Beginners book. For the first time ever, I commissioned a professional book cover, which I’m very proud of. However, just like the redesign of LearnDjango.com, this required a significant financial expenditure on my part.
In any event, the new book launched over the summer. I continue to sell it on Amazon and in e-book form, though, in 2025, I will be transitioning all my titles to either paperback on Amazon or online only via LearnDjango.com. There are several reasons for this:
- easier to update and maintain
- Gumroad is increasingly squeezing fees and getting worse overall for content creators
- piracy is a huge issue and continues to be, especially for PDFs
The biggest reason is my sanity. It is a lot of effort to create physical and e-book versions of not one but three different books and then sell them on multiple different sites (Amazon, Gumroad, Leanpub, Google, Kobo). It’s extremely time-consuming and ultimately doesn’t always result in tons of sales. Moving to an online store is easier for me, more convenient for readers, and should free up a lot of my time.
It’s also worth noting that Amazon continues to worsen for self-published authors. When I first published in 2018, ranking highly in organic search without needing any ads was possible. In 2020, ads became a bigger thing but were not too expensive, at 10-20 cents per click. These days, Amazon looks like Google, and it is impossible to find organic content. Search terms related to a Django book in the U.S. are $1.50 and up per click. Consider that Amazon already takes 50% of any paperback sales and 65% of all e-book sales.
If you go the traditional book publishing route, advances for technical books are essentially nonexistent, and you are looking at way lower royalty rates. On the other hand, you get some help producing the book, designing it, finding a technical reviewer (if you’re into that sort of thing), and so on. My glib answer to anyone asking me for advice around publishing is that you should assess whether you want to publish a book (most people) or try to make some money off it (possible but much more difficult). If the former, go with a traditional publisher despite what I’ve just said here. You can email me directly for more specifics on my thoughts on which technical book publishers are worth your time these days.
But overall it feels increasingly difficult to publish a book and make money from it directly, rather than treat Amazon as yet another marketing channel where you aim to break even and profit elsewhere.
4. Tutorials/Writing
I felt like Cookie Monster here when it came to writing new things and actually putting stuff out into the world. It wasn’t a total waste of a year on this front but lots of effort went into the aforementioned E-Commerce course rather than new material. Highlights include new tutorials on the following:
- Django UserProfile Model
- Django Tailwind
- Django Redirects App Tutorial
- Django-allauth: Site Matching Query Does Not Exist
- A Django Blog in 60 Seconds
I also updated my 60 existing tutorials to Django 5.0+, which took an inordinate amount of time but falls into the “hidden work” category when looking back on the year.
5. Django Chat Podcast
Carlton and I have been doing Django Chat since 2019 and are now on episode 171, with several more recorded and not yet released. We’ve had a few sponsors this year and reach several thousand highly-engaged listeners. It seems that is the market for a Django podcast; we are very slowly increasing in traffic but are nowhere near the numbers of a Python or JavaScript focused show. I suspect Django is just too nichey. We aren’t on YouTube with videos, and perhaps we don’t spend enough time marketing the show instead of producing it and carrying on with our other work.
I like doing the show and have no plans to stop it, but we need to find a way to get more sponsors or market our own products better. It takes a full day’s work, all in, to produce an episode, and requires money for all the hardware and software that requires. If someone wants to sponsor the podcast for a season or has ideas on this front, let us know!
Oh, and I belatedly discovered that YouTube will now convert a podcast’s RSS feed into audio videos, which I did manually for the first 60+ episodes but then stopped because it was so much work and we didn’t have many listens. Well, now it is automated and so if you want to consume the podcast via YouTube the channel is @djangochat.
I was a guest on Brian Okken’s Python People podcast in January and on The Python Show in June. It’s nice to sit back and let others guide the conversations in this format. It is also good to poke my head outside of the Django bubble and reorient around what parts of Django are confusing to even very experienced Python developers.
6. Django News Newsletter
Jeff Triplett and I have been doing Django News since 2019 as well and have not missed a week during that time. Monetizing a newsletter is much easier than a podcast, and we’ve had sponsors for several years. It still nets out to a loss of money for Jeff and me if you put any value on our time, but it requires a lot less work to produce than a podcast. No immediate plans to change anything here but finding and maintaining sponsors requires more time than we’ve given it so far.
7. DjangoCon US Talk
Earlier in the year, the Django Boston Meetup reconvened for the first time since Covid, and they asked me to be the initial speaker. Django’s user model has been on my mind lately, largely since I’ve been using custom user models in my work, whereas Carlton and others are quite happy with User Profile. So, I gave a talk diving into all this, which I wrote about here. There were some good questions afterward, and this led to my DjangoCon US talk, which I will link to when it is publicly available.
I wrote up a recap with pictures of this year’s event, which was a fun way to remember all the things that occurred. Also, my talk helped further some long-running conversations around user models and led to this ticket for me to add a User Profile how-to to the Django docs.
Attending these conferences always involves an investment of time and money, but it is invariably worth it in retrospect, not least because it fires up the community to continue pushing until the next in-person event.
8. YouTube
So, I know everyone is on YouTube, and no one reads books or written tutorials anymore. (Insert a huge heavy sigh on my part here.) I created a YouTube short on A Django Blog in 60 Seconds highlighting Carlton’s neapolitan package as part of a dedicated LearnDjango YouTube account, which you can subscribe to and comment on.
Future videos are indeed coming. I will admit I’ve spent far too much time obsessing over the talking head part of it (lighting, cameras, background) rather than just focusing on the code and doing a bunch to get better at it. I should be out of the analysis paralysis phase by the end of the year and will likely start by doing videos of my current tutorials. And from there, we shall see.
7. OpenSource
My two primary open source packages are awesome-django, now at almost 10k stars and which I’ve run alongside Jeff Triplett for several years now, as well as Lithium (formerly DjangoX, now at 2.2k stars) my Django starter project that I’ve been flirting with since forever turning into a premium version with deployment, payments and all the rest. I’ve had more than a few discussions with Jeff about making this happen, but that remains firmly in the 2025 bucket if it comes to pass.
8. Recap
All in all, this year feels a lot more productive than 2023. I still fight the feeling that much of my time is spent on invisible things such as updating content and responding to emails. The former should be a little easier to manage now that LearnDjango is in better shape, and the latter is necessary to keep me in touch with everyone, though I don’t need to be so fastidious about responding promptly most of the time.
What’s Ahead in 2025
The first order of business is to take a little time off over the holidays. I’m historically bad at this, but being self-employed makes it worse as the computer and an endless list of to-dos are right there. I shall resolve to stay strong.
The immediate action items are as follows:
- Update Django for APIs
- Update Django for Professionals
- Launch the Django E-Commerce course
I intermittently make progress on a long-delayed Python book, which, at this rate, might be on my gravestone as “He lived a long life but never finished that Python book he was always going on about.” I’d love for this to be the year it happens, but I’m also realistic that it would probably require a year’s worth of effort. It can be hard to sort out the correct prioritization of products.
Then there is video. What would my career be like if I’d just done videos for the last 6 years instead of all the other things? It’s hard to say. There are several creators out there who do exceptional Django work, which makes me wonder if there’s any room there at all. And there are also some older and sometimes less polished videos out there with a large following that definitely could be updated. So we’ll see. Doing a video course for Beginners is a no-brainer, as is doing videos of my 60+ existing tutorials. It just requires time and energy, like everything else.
One thing I’ve learned is that juggling so many projects requires focus. I do best when I have one main task to accomplish each day and, ideally, a major overriding project over the months, such as LearnDjango, has been for me over the past year plus. There are still endless updates to make to the site, which I’m excited about since it can be my perfect playground of code, but its major structure is sound at the moment.
This might not have been the most uplifting of year-end recaps to read, but some years are like that, and I hope it gives a sense of what has been on my mind and in my work calendar this past year.