TL;DR: Here is the more visual story of the proposal app I built.
In late 2019 I knew I wanted to propose to my then-girlfriend (spoilers, now fiancée), Jenny, but I had two problems:
- I wanted to have a unique proposal
- I wanted to delay a little bit.
Delaying a bit sounds bad, but hear me out. Proposing is a scary, huge life decision. Having the plan in place for a few months allowed it to become something that I knew I was going to do and how I was going to do it without actually needing to change the plan itself.
Designing the App
I pretty quickly came to the idea of building an app for the proposal. It’s the skillset I have, so seemed like the obvious choice. Jenny was visiting her family for Christmas, so I had a couple of weeks to plan and program the app.
I initially wrote the app in native Android, it was a neat excuse to try out new libraries, and now that I’m an engineering manager I don’t get to code much. A couple of months in we had friends and family wanting to follow along with the progress that I rewrote the app in Flutter so it would be cross-app compatible. Both versions use a Firebase backend.
Jenny is a gamer, so I went with the theme of gamifying things she wanted to do. The app was pretty simple we had the following 10 categories:
Note the “category locked” section unlocks once she completed the other categories.
Each category would have a series of challenges that would unlock one at a time.
The challenges were intended to be things she wanted to do and ideally would build fun memories together. Some example challenges:
- Beat Mario Karts harder set of races
- Go skydiving
- Draw every day for 30 days
- Try 5 new Boba Tea shops
Once she completed a challenge she would upload the images, I would give her the code for the challenge and it would unlock the next challenge in the category. When she completed all the challenges in a category I’d give her a prize relevant to the category. For example, when she completed all the ski challenges the prize was a professional massage after a ski day.
At this point, the app was nearly ready to go, but I came to one possible problem… What if this is a terrible idea? My vision of adding gamification to things Jenny always wanted to do sounded completely great to me. I also realized she could get the app and see I have given her a chore list with an allowance in the form of prizes. I decided to spoil the surprise a bit and ask Jenny if it was a good idea. She assured me it was not a terrible idea, and even sounded very exciting, so I was good to go.
How Was the App
So I gave Jenny the app as an Anniversary/Christmas present, keep in mind she didn’t know it had a proposal piece to it at this point. She immediately started changing her weekend plans to be more about accomplishing challenges and was really enjoying completing every challenge.
I was honestly surprised how well the app worked for motivation. Some challenges like trying new ice cream places didn’t need too much extra motivation. There were others though like building a VR game or drawing more. These are things she had been wanting to do forever but hadn’t been able to find the motivation. When the challenge came up though I could be sure she would work on it right away and she was really enjoying completing those tasks she had been meaning to try.
As goes with any 2020 story, everything was going great and then there was a global pandemic. Suddenly fun day trips like visit a theme park became much less viable. I worked with her to fairly rework some challenges others we put on hold, but the pandemic definitely resulted in a huge momentum stop on the challenges.
I started to get nervous the momentum on the challenges was dropping to an all-time low. The fatal flaw of proposing once she finishes all the challenges is that if she doesn’t finish the challenges my plan just won’t work. Luckily video games have already solved this problem… so I added a streak counter:
The streak counter worked shockingly well. It was at this point I was wondering if I had unlocked an untapped secret to productivity, but I kept my sights set on the proposal.
I told a few people the plan was the app would end in a proposal, but not that many. It is definitely something I wanted to share, but that I felt would be easy to leak. Some friends had finely tuned instinct. Suggesting the idea to us “you should make it so you propose at the end” and similar suggestions. I acted dumb towards these suggestions, and somehow Jenny never caught on. There were some close calls along the way because of these perceptive friends.
The parents wanted to follow along more. So I added notifications and made the app have a “parents” version. Parents that were following along could see our pictures, progress and would get a notification every time a challenge was completed.
Custom writing the app allowed me to include quite a few little Easter eggs. I’ll edit this when I can share all of them. Some of the fun ones were:
- Custom animations when a challenge was completed.
- The “possessor of limitless talents” category that focuses on building skills she had been wanting to learn changed from having my face as the icon to hers after she completed the challenges.
- There were a few animations around streaks and challenge completions that were neat.
In August 2020, it became obvious that she would get to the challenge that the entire app was built for…
Life had varied a little bit since I had initially planned the proposal and wrote the challenge. Still, the pieces were there. So we got to the point where she only had one challenge “Get a Surprise”. I contacted a photographer, we agreed on a plan where he would make an X and O in the sand for where to stand.
Jenny was excited to look for the X and O and was expecting some sort of scavenger hunt as the prize. Even to that moment, she was not expecting a proposal…
Luckily she said “yes!”.
One Last Challenge Left
The app actually has one last challenge left…
The pandemic is making that one tricky too, but we are working on it.
At the end of the day, I couldn’t be happier with how this worked out. We built a lot of great memories together. Beating the categories was incredibly satisfying and luckily the challenges were fun.
I’ve even considered stealing an idea from video games and making a hard mode, where we do each challenge again, but in a more difficult version. I worry that may be milking the idea too far, but that’s mostly to say we enjoyed it so much that I miss having more challenges.
From a pure software perspective, I enjoyed the chance to work in new code. Flutter was a really fun framework to use and felt like the right tool for the problem. As is my nature I built the app with scaling in mind although I had no intention of anyone but us using it. If you would be interested in using the app for a proposal or something similar, let me know and I can look into making it more available.
At the end of the day… it feels weird to write this whole thing without directly including any thoughts from Jenny. So this last section is Jenny’s thoughts…
This was one of the most fun experiences I had. I’m a sucker for gamification of anything, so having an app that essentially gamified my life was amazing!
The experience of going through all these challenges and the resulting rewards were great enough already, but what it led to was the greatest thing I could’ve imagined!
I feel like an idiot for not realizing that it was leading up to a proposal. From friends explicitly guessing the purpose of the app to parents suddenly caring about when I will finish playing Half-Life: Alyx, I felt like all the clues were there. I was so immersed in the goals of each challenge to really think about what the end game could be.
The challenges added much excitement and real-life “achievements” to my life, which really helped in 2020. Ryan is always looking to build cool things (and I would definitely check out some of the other cool gadgets we built), and this was the perfect and most Ryan way I could’ve been proposed to!
To be fair, I still have one challenge to go, so technically I haven’t seen the end yet. But I’m super looking forward to it, and many more Ryan schemes in the future! :)