This is Episode 1 in the [Game On] series where I attempt to design, code, and ship one new app every month. This is the tale of the Hacks journey.
Hacks is available for download now on the Apple App Store.
It’s Thursday, May 16th mid-day…
and I’m driving back from an incredibly intense but productive therapy session (aka my haircut appointment). In the last hour or so, I confided to my stylist that my morale was at an all-time low. I was getting it from both ends - bombing corporate technical interviews while also struggling to find any traction with my app. Just taking L after capital-L for the last six months. Her response was quite simple:
You’re half-assing it and you’re scared of going all in.
And that was all I could think about on my drive home. She was 100% right but I wasn’t even sure I was capable of still going all-in. What does that even look like for me anymore? I know what it used to look like from my time at GOAT - when our efforts helped take it from $100m to $3 billion. But back then there was no girlfriend. No dog. No life obligations. Just working day & night looking to help add another B to (not my company’s) valuation.
Now I’m exactly one week away from 39. Engaged but unemployed with an app that makes $0.02 cents a day (if I’m lucky). I used to have a fire in my belly. I used to want to take on the world. What in the f@#$ happened to me? How did I get so despondent and more importantly, how did I get so comfy with not giving it my all? I built my career on all heart and middling talent. I forced my way into the sports industry by stubbornly never taking no for an answer until GCAA Hall of Fame coach OD Vincent had to give me a job just to keep me from hounding him. I then bootstrapped my way into the tech industry by teaching myself to code in 2013 and soaked up every bit of knowledge I could from every senior developer I talked to. All heart and middling talent. It’s 2024 and now I was slightly above middling talent and no heart.
I want to find that heart again. I need to find that heart. But I want to do it on my terms. So before I even pull into the garage, I have told myself that I am going to design, code, and ship a new app in the next 14 days.
So game on. It’s a race against the clock.
Back at the apartment…
and I can feel some of that initial fire re-enter my belly now that I’m excited about this challenge. But… what’s the idea? What app are we going to build?
I pull up my coding environment (Xcode) and stare at the “Hello World” staring back at me. I alt+tab over to my design environment (Figma) hoping to magically find some screens already created for me. Nope. Also empty. Alt+tab back to Xcode.
Welp this is off to a great start.
I look left and see my dog Frank peacefully sleeping next to the window.
Maybe I should be like Frank and take a nap and I’ll dream something up?
*looks right to the golf simulator* or I guess I could also hit some golf balls instead of napping?
I need to work at a breakneck pace to make this deadline I’ve set and my first two thoughts are to take a nap or hit golf balls. Oh boy are we in trouble 😅.
Hold on. Let’s take a beat on that.
What if… I made something golf-related?
It’s an area I have deep domain knowledge in, I possess thousands of data points at my disposal thanks to the simulator and I still have plenty of friends in the business that can offer feedback when done. But what do we build for golf that hasn’t already been done? What is a uniquely frustrating situation that does not yet appear to be solved?
Well, I know my swing has changed many times over the years but I, funnily enough, have no singular place to house all that data and am unable to see that evolution. I have some videos saved in one app from a lesson I took 2 years ago, I have other swings on a VHS somewhere but no mental notes attached to it. And I of course have some mental notes scribbled away somewhere in my Apple Notes app (who doesn’t) but no video attached to it.
Yup - this is it. This is what we are going to build!1
Off to the races…
as Day 1 is spent mocking the core screens and user interactions in Figma. The next two days are spent rapidly building out those concepts in Apple’s coding language - SwiftUI. To move faster in the beginning, I use a handful of hard-coded mock data (commonly known as your local environment in development terms - local because there are no external network calls). But this exposes a pretty big hole on Day 4.
I was so focused on the swing view (the 3rd image below) and its corresponding video controls that I completely forgot there was a screen needed to ADD videos to the app!
It’s not a huge ordeal but I do have to stop coding and go back to Figma to think about how I want this implemented. I spend a quick 30 minutes using design elements and fonts I already have in place from the rest of the app and get back to coding. But almost immediately, new holes are exposed in this plan.
Do I want open textfields or a form? A modal sheet that appears from the bottom of the screen or a navigation that pushes a screen forward to the right or a stationary one-view scrollview? Native keyboard or custom keyboard? I go down an experimentation rabbit hole that I am lucky only costs me a day. Lucky because in any normal team/corporate environment, this could easily get drawn out into a week between a game of telephone with the product team, designers, and UX researchers. But we’re on Day 4 of 14 and time is a luxury we do not have. The luxury we do have though, is that we can make decisions like this fast.
So it’s decided. Modals. Custom keyboards. And no scrolling.
At the same time, in the real world outside of my computer monitor, I’ve had my eyes glued to the Golf Channel where the NCAA Women’s D1 Golf Championship is being televised. It is my dear friend Alicia’s first year as the UCLA head coach and they have been killing it. They’ve played 108 holes of competitive golf in 5 days and just made it to the finals!! Incredible. And for the first time in a long time, they’re playing somewhat locally (in Carlsbad, CA). How can I not go and support my friends?? Plus, ya know, I’m working on an app for golfers so it’s a great opportunity to show my friends in the golf community a demo of what I’ve been working on!
The internal demons make their first appearance…
almost immediately as I pull into the golf course parking lot. It’s the final day of the tournament and there are substantially more people here than I imagined. The harsh self-talk comes hard and fast.
This is not the time or place to hawk your goods. Know your role.
All you have is a demo of your swing and your swing sucks.
This app is so simple it’s stupid.
These are the thoughts going through my head when I see my first familiar face - Steve Holmes. Steve is Coach Alicia’s husband and a Top 50 instructor in the state of California. “Uncle Steve”2 asks me what I’ve been working on and I give him some long-winded gibberish answer about coding in general because I’m petrified that he’s going to laugh at my app. He would never by the way - he’s an incredible human and a good friend. But the imposter syndrome is so high right now that if someone asked me how to display “Hello World” in Xcode, I would stare back at you and ask “What is Xcode?”.
And with that, I know that today is going to just be me being a fan without saying one word about my app to anyone. There’s a part of me that is disappointed in myself but that feeling gets buried now because all I have to do today is enjoy the amazing golf being played in front of me.
The day goes on and unfortunately, Stanford’s taken control and looks to be on the brink of winning the national championship. Spoiler alert - they do, but it’s at this moment that I got a pretty fascinating glimpse of a true champion’s mindset. I catch up with Coach Carrie Forsyth (3x NCAA champion. 1 as a player and 2 as a coach) on what appears, by all likelihood, to be the final hole. I have already thrown in the towel with my body language but Coach immediately corrects me and tells me we need some positive thoughts and energy. I look up at her kind of like she’s nuts but she starts running through the scenarios that can still happen. I think she’s joking with me but when I look into her eyes, I see conviction and sincerity. I’m sure Coach is aware of the infinitesimal odds of those scenarios happening but she is not concerned with that at the moment. She is not just spouting off positivity for the sake of “good vibes”. It’s because she believes it and is actively trying to will it to happen.
I don’t know if I’m going to be able to digest that or incorporate that moment into my life somehow but I’m so grateful to have experienced it. I have seen great sporting moments like that on YouTube (like below in tennis) but having that moment face-to-face with a true champion was eye-opening for me.
The halfway mark…
is upon us and it’s finally time to dig into a core functionality I have been dreading - user authentication.
I’m more of a front-end developer so non-visual aspects of software development like authentication have always required more brainpower from me. But that’s the one great thing about this self-imposed deadline - you can only put it off for so long until you have to “hug the cactus” so to speak.
My working plan for new downloaders of the app is to let them use it without signing-in for their first 10 swing uploads. After that point, you would need to create a real user account because it would demonstrate that we’ve created enough value for you to become a real user. This plan was going to complicate the auth flow a little bit but I am a staunch critic of any app (or software really) that immediately ask you to create an account. It’s incredibly annoying and honestly quite lazy. You (the app developer) have literally given me no value yet and your first course of action is to request my data? So that you can send me spam email I never asked for even when I hit that “do not send me marketing emails” checkbox? Seriously gtfoh with that nonsense.
So I spend the early part of the day working through the Supabase documentation (the provider I chose for my backend data services) and am pretty quickly able to implement the anonymous user sign-in. I then test the data flows and make sure swings uploaded by a user are private and only seen by the user. Check. Done. In the bag. Ok great - now let’s tie this anonymous user to a newly created account.
Uh oh. 1 account just became 2 accounts.
*goes back to read more documentation*
Oh got it. Used the wrong workflow.
AuthApiError: 400.
Hmmmmmmmmm …
This trial and error process continues until the end of the day and now I’m in a little bit of a panic. Am I going to spend another day or two trying to really figure this out or am I going to make up a new plan? It’s clearly a solvable problem since Supabase clearly states that this is a feature they provide but do I have the time for it is the real question?
Can’t I just do it in 16 days instead of 14?
Who’s going to know?
That’s a reasonable question because literally no one is going to know if I take two more days but where does it stop? Two more days for user auth, another three for improved video importing, another week to get improve swing data importing and so on and so on. I didn’t want to get stuck in draft mode.
So I devise a new plan that includes the hard-coded data I was using in the first week to build out UI. Instead of throwing it away, I’m repurposing it as an active demo inside the app. In hindsight, this turns out to be an incredible win because without the demo, the app would look empty and useless on download. It’s true power only comes when you’ve got a solid database of your own personal favorite swings uploaded. Now, with the demo, you can see what the app has to offer!
It’s the final countdown…
but it’s also Memorial Day weekend. Earlier in the week, I promised the fiancé that I’d go on a hike (which is a big ask for me because if you can’t tell by my occupational choice - I’m a bit of an indoorsy fella unless it includes golf). I’m exhausted from the 9 day sprint so far but a promise was made and a promise shall be kept.
A 3-hour hike is followed by a 3-hour nap and the day is all but lost. I do what I can before dinner and before I go to bed by solving as many micro-tasks as I can (privacy policy, app description, error handling, etc. These are the tedious “behind-the-scenes” bits of work that need to be installed before an app can even be considered ready for release).
A day may have been lost but I’m honestly not that stressed about it now that we’ve cleared the hurdle that is user authentication. The last core piece that’s left is the CRUD3 work (creating, updating, and deleting of swings). I’ve put this off until the very end as it’s a substantial amount of work but pretty standard work so I know there won’t be any big brain teasers involved - just time and effort.
What is stressing me out though, is the mental exhaustion from the past week and a half. I have not exercised these muscles in years, and the fatigue is affecting my decision-making, code cleanliness, and design choices. My shortcuts are allowing those internal demons to resurface, and they're even meaner when I'm tired.
Did anyone ask for this?
People are going to think this is stupid.
All it does is upload your swings?
People are going to laugh at you.
Who are you to write a golf app? Didn’t you incur a 2-stroke penalty on one of your players because you weren’t paying attention to your surroundings and know the rules of golf?4
You don’t belong in golf.
You should definitely shelve it and spend more time on it.
Finding some last-minute fun…
is the only thing that helps me quiet the demons. It occurs to me that I have not given the app a name yet. Swing Journal is the working title but that’s not so much an app name but an app description. To add to that, I have no app logo either. But because most of the core functionality of the app is complete, this “unknown” provides a much needed bump of enthusiasm and gives me the freedom to spend an extended amount of time playing with icons and color combos.
First up is the logo. I’m clearly looking for something golf related but not cliche. I hit up SVGRepo5 and spend a few hours browsing and experimenting with what they have. When it’s all said and done, one icon in particular stood out because it could not be mistaken for anything else but golf while conveying a playful and unserious tone. Additionally, it inspired the perfect name to go along with it.
Hacks.
It is an appropriate title for this first product as it tells a lot about how this process came about and what the content of this Substack is going to be moving forward.6 This is going to be about making (and failing) at building products - not about leet code. It’s about how to put (and at times - hack) the whole picture together.
What’s Next?
I’ll be heading up to my first in-person WWDC at Apple this weekend.
Researching (and then cranking away) at the next project.
Putting together a [Post Release] piece to jot down some informal thoughts.
Be sure to subscribe if you want to get that and the next episode in your inbox!
[Bonus material] Frank says thank you for reading and hopes you enjoy his exorcism-adjacent body scratches on the golf simulator’s turf.
Don’t ever let your fiancé (girlfriend at the time) tell you that a golf simulator instead of a dining table is a poor usage of living room space. 😅
There’s an incredibly cute story about people yelling Uncle Steve at him when he was competing in the 2023 PGA Championship. Go take a lesson from him and ask him about it!
Acronym for Create, Read, Update, Delete.
This moment from the 2008 Pac-12 Championship still haunts me to this day.
SVGRepo is free and for commercial use which is just an incredible resource for developers like me so an extra thank you to whoever manages that site.
As an aside, Hacks is definitely one of the best shows on TV (sorry, it’s not television, it’s HBO) and a line from Season 3 Episode 8 rang out to me more than ever - “A hack is someone who does the same thing over and over.” We will not be repeating ourselves here but rather building on top of and layering.
Your writing style is like a captivating reality tv show. I absolutely was enthralled. Supporting you and this endeavor 100%!
The way your hairdresser could moonlight as a life coach lol