December 2021 Retro
Uncovering a glimpse of value and shining some light on the struggles that come with indie hacking.
In last month’s retro , I admittedly wrote a very underwhelming recap. I mostly spent my time on self-indulgent admin tasks and I didn’t go into as much detail as I usually do. This might have left some of you thinking “Is that it?”. Sorry about that.
On the flip-side, that previous write-up didn’t take me too long to write and I was happy to get on with my work.
December was a good month for AdSlicer functionality, but pretty stagnant on UI and the accessibility of those features.
Last month’s goals
-
Build out AdSlicer into a useful MVP.
(AdSlicer being a Facebook ads analytics tool)
Final grade: 🚧
Main events
A glimpse of value
I feel like Indiana Jones using an unreliable map based on unreliable sources in search of a hidden treasure, that might not exist.
I’ve heard stories of the problem. I’ve even experienced part of the problem myself. However, there isn’t a clear solution. I wonder around uncovering the edges of the problem space in order to close in on a solution. I’m not too sure how the solution will look, but I know certain properties it should have.
At some point, I uncover enough elements of a solution to see a faint image. I have to squint my eyes a bit, but it’s there. I think I’ve uncovered something valuable.
And slowly but surely I can see an MVP emerge from my mess of code.
— Jason Wallace (@jdeanwallace) December 9, 2021
I just added a quick way to see which parts of your ad can be improved: pic.twitter.com/awehP0UOKc
Conquering the scariest feature
As the name suggests, AdSlicer lets you dissect your Facebook ads to reveal the parts that are working and the parts that need attention. A big part of this is the ability to limit your view by focusing on a specific date range (i.e. monthly performance, special offers, retail holidays, etc.).
Up until this point, I have been querying the Facebook APIs for all ad data each time. This was fine in dev, but I would be rate-limited soon enough.
Querying the Facebook APIs directly gave me perfectly accurate data, but it wasn’t scalable. I needed to recreate the aggregation Facebook was doing, but with my own previously cached data. This would allow me to slice up the ads in any which way I wanted.
At this point, I’ve handled the ad data enough to know what outcome I wanted and how to model it in a database.
I replaced my previous CSV + pandas solution with a relational database and kept the ad data up-to-date by fetching incremental data from the Facebook APIs.
This was a huge undertaking that also forced me to think about how to model my data in the frontend — a symptom of my “client-first architecture” approach.
The meat of this solution was mostly backend code, but I struggled more with structuring my frontend code.
Overall, I’m happy with the outcome (code-wise).
AdSlicer can now limit the ad results to a specific date range. An interesting side-effect is that I can replay the ad results if I slowly extend the date range one day at a time (as shown above).
Repurposing code from a previous project
Back in the day (2020), I built a for-fun project just to see if I could: socialhooks.io
I'm (soft) launching a fun little project I've been working on. I built it just to see if I could. And I did. So here it is 🙌
— Jason Wallace (@jdeanwallace) June 26, 2020
Social Hooks: Integrate with social like you integrate with Slack.
Check it 👉 https://t.co/Mr2HSF9Omi
Things will break, so pls send feedback 🤠
Anyway, I had to figure out how to implement OAuth for Twitter and Google in a client-first architecture. I attempted to use django-allauth and python-social-auth , but at the time it felt too magical to me. I couldn’t figure out how to transfer a successful social-authentication to the frontend. That clearly meant I didn’t understand the auth flow.
I solved the issue by implementing my own solution (yes, very time-consuming), but at least I had a better understanding of OAuth.
Back to the present day, I extended (and improved) my previous social auth code to include a Facebook integration and pulled it into AdSlicer.
I still need to add a few finishing touches to AdSlicer in order to move the Trello card over to the “Done” column. But for the most part, I can log into AdSlicer with Facebook.
Indie hacking for 6 months with $0 revenue
Time flies when you’re having fun, right? Well, I must have been having the time of my fucking life because I can’t believe it’s been 6 months since I left my full-time job at the end of June.
A fellow indie hacker said it took them 6 months to make their first $ online. That seemed like a reasonable timeframe to make money from a software product, perhaps even too long.
Well, here I stand, tail between my legs.
I am humbled by the effort and dedication it takes to will something of value into existence.
The dream of indie hacking and “working on my own thing” is very different to the reality of it.
I see people perpetuating this idea that “quitting your job and working on your own thing” is nirvana. However, that’s just the start of the pain.
Indie hacking is super cool and I never want to go back to being employed, but it would be irresponsible not to highlight some of the difficulties that come with it. Specifically,
-
Sense of self-worth.
While I was employed as a dev, I was evaluated on my ability to produce code. My employer praised me for it and even paid me for it. A good day was when I wrote a lot of code and a bad day was when I hardly wrote any code. Naturally, I ended up connecting my self-worth to my ability to code.
I struggled to come to terms with the fact that my code is probably the least important part of being a successful indie hacker. Those feel-good coding sessions don’t translate well into a profitable software product.
I think the answer isn’t to identify myself as “Jason the Software Developer” or “Jason the Salesman”, but drop the idea of identity altogether. Sure, sometimes I play the role of a software developer, but that’s not all I do and certainly not forever.
I just am.
-
Understanding from friends & family.
I’m still surprised at how little people care about my work situation. Here I am embarking on this incredible journey of self-realization, and all I get asked is “How’s work?” 😅
Jokes aside. A question about my “work” has become more a question about my life.
Not in the sense that “my work is my life”, but rather “my life is my work”.
For the first time as an adult, I have this opportunity to prioritize my life. And yeah, I want to talk about it, and rant about it, and get advice about it from people who can relate.
Having at least one person who can do that, helps.
-
Sense of agency.
No one is checking my work and seeing if I’m doing a good job. No one is going to save my ass if I screw up. I am responsible.
Before, it was clear that when the boss was unhappy with my work, I better get my shit together. A warning shot, at least.
Now, all I get is the eerie silence of time tearing through my bank account.
It’s up to me to figure out the steps and take action.
Time
I took a break from freelancing over the holidays. I seemed to have used some of that extra time to work on AdSlicer, which is up by 36% since last month.
This month’s goals
-
Launch a very bad version of AdSlicer to the public.
When I say “very bad version”, I give myself permission to ship something ugly and imperfect. This doesn’t mean it will be that way forever. It just means I can get something out the door and into reality (where users live). The people that do see the first version and think “lol fuq dat, it doesn’t even do X”, at least I’ll know what to focus on next.
Happy New Year and thanks for making it this far. If you're interested in what happens next, I'll email it to you next month 👇