I gave it my best
Although the above image illustrates how my side projects normally wither and die, this time it was different. Where I normally lose interest and can’t summon any motivation, I really progressed on this one and I kept putting time into it, sharing my progress along the way. My mantra helped me. “Small steps are better than no steps”. Sometimes progress was slow when working on a difficult part. Sometimes I had to scrap code and basically throw away a lot of effort. But I celebrated the little wins. Like when all I manage is just adding a button. It’s not much but it wasn’t there the day before. And the big stumbling blocks where I had to delete a bunch of code, I considered learning moments. Now I know why something doesn’t work and how it should work.
The small wins and my enthusiasm for the idea got me a long way. But despite all that, I’m afraid that I have to inform you that my Who Am I game idea has met an untimely end.
It’s been buried in the graveyard for a while now actually. I don’t remember the exact date but I think somewhere in the autumn of 2020. Cause of death? Lack of budget.
How it happened
My idea for Who Am I was to bring the physical game online. To create a video chat experience where everybody has a piece of paper, a post-it, augmented on their foreheads reading a famous or fictional person. It would leverage WebRTC for the video connection and face tracking and HTML canvas to stick the virtual post-it to the foreheads of people. I’ve described my idea for this at extend in a previous blog post.
I had a lot of fun with getting a video stream to work between two devices with WebRTC and finding the correct face-tracking library that allowed me to draw a yellow square to the top of the users’ faces. The Face Detection API was, and still is, behind a flag on Chrome and even then not stable, so I had to look at a library to help me.
I first started with face-api.js. It’s a library that’s first and foremost a face recognition tool and second a face tracking tool. This meant that it could recognise faces, draw a box around them, but also recognise expressions. It would give a rating of how sure it was that it recognised a particular expression. But for face tracking it was less suitable. It gave coordinates for the box that it drew around the faces but those weren’t updated frequently enough. When drawing a yellow square where the forehead should be, it didn’t update as often as I needed. The result felt sluggish. When I moved my head, the yellow square would lag behind. This was one of those moments where I had to throw out a lot of code. But I had learned from it. I had learned how to use the coordinates to calculate where the forehead should be and I learned how to draw a square at those coordinates and have them update when the API updates the coordinates.
The next library I tried was Facemesh. This one was specifically geared towards face tracking. Based on those coordinates, I was also able to draw a yellow square where the forehead should be. The difference was astounding. The square smoothly followed the face and I could make it resize when the face moved towards the webcam or away from it.
Next up was displaying text on the yellow square. I explored using a handlettering font or letting users “write” themselves by using the drawing option in canvas. The drawing option could easily make it unreadable, so I stuck with a handlettering font.
Then came figuring out how to support more than two streams at the same time and that is where stuff unravelled.
Simply explained, when you’re streaming you’re uploading your own audio and video stream to the other party. You’re also downloading the audio and video stream from the other party. If you’re in a group call with 5 other people, you’re doing this 5 times. 5 separate uploads and 5 separate downloads. Beside the fact that it will become increasingly difficult to handle in the code, the data that the user would be consuming would be astronomical.
To handle this correctly you need a special server in the middle where everybody sends their stream to and where they can download the other streams as an optimised bundle so there’s only one upload and one download.
But these cost money. More money than I’m willing to spend at the moment. I don’t have the means to run a paid server for a hobby project that might take months before it sees the light of day all the while burning money. And even when the project would launch and have frequent users, I didn’t have a revenue plan. No real plans of making money off of it. I foolishly thought most of it would run on the users’ devices as a one on one connection does. And that I would perhaps only have to pay a small fee for hosting. With no personal money to spent on this I was kind of stuck and felt I couldn’t do anything else than drop the project.
And that’s basically how I forfeited on this idea and sent the side project to the graveyard.
As the comic at the top suggests, after an abandoned side project comes the next side project. And for me that’s a Shopify app. I’ve always wanted to work on something for the Shopify environment as there is no shortage of stories from devs who make a decent (second) income off of it. It’s a fast growing market that isn’t saturated yet and still has room for some new good ideas. Making something for their App Store also means it comes with an awesome distribution channel with which you can immediately reach 17 million potential customers.
I think I’ve come up with an awesome idea. I had come across some posts on a Shopify forum where multiple merchants were complaining about a particular issue, a gripe they were having with Shopify. I contacted a merchant that was very vocal on the matter and had collected multiple posts into a single other post. I was able to question him about the problem and eventually came up with a potential solution.
This was November last year. I’m currently halfway through development. In January I started the project. There was a steep learning curve. I’m building it in React and NextJS, which I’ve never used before. I’ve followed a bunch of tutorials and eventually started actual development. There is still a lot I don’t have a good grasp on, like React Hooks. Progress is slow as I’m learning on the go.
Learning on the go is also quite new for me for these type of personal projects. I normally would endlessly prepare by reading and following tutorials, but I figured I would never get around to actually building something if I’d do that. They always say the best way to learn is by doing. And I’m allowing myself to make mistakes. Allowing the code to be imperfect at first. I can always optimise later once I know more and am more capable.
Finding time is the biggest hurdle. I’ve got a full time job and a family. My boys are in the ages of 3 and 5 and still want to play with their dad when he finally has time. So of course that comes first. Instead I spent a few nights a week on it and since a few weeks I have the deal with my wife that I also disappear to my work spot in the attic every Saturday morning. I’m much more productive in the morning than I am in the evening. It has allowed me to progress a lot over the last few weeks.
I’m not telling what I’m working on exactly. Not yet anyway. To tell the truth I’m flabbergasted nobody else has tried to solve this problem yet. And my solution is really simple! So I’m afraid that someone might swoop in and steal my idea. Good chance they’ll have it done in no time. So when I’m close to finishing or have submitted my app, I’ll share.
I actually had the idea of doing something for Shopify for ages, almost 6 years to be exact. And last year I chose working on the Who Am I game over working on Shopify which had a bigger chance of making me money. I chose the game because it sounded like it would be more fun. And it was a lot of fun. There’s a good chance the project will be resurrected in the future. One of the reasons I’m writing this is because I was thinking about the project late last night. I figured that I might not be able to create something for more than two players, but it might still be a fun game one on one. And I could also look into expanding on it with other one on one games. Like battleship, minesweeper or a drawing game. Who knows, maybe having the game work for more than two player is a progressive enhancement that I’ll be capable of doing once the two player game is up and running.