I've always been interested in building games for voice, as voice is such a different medium than the visual ones we are bombarded with throughout the rest of our day. Voice games are a perfect time to sit back, use your imagination, and really immerse yourself in something, similar to reading a book. It activates your brain in ways you don't get from your phone, your TV, your consoles, or your computer.
I've built games for Alexa in the past, but for this competition I wanted to focus on something specific, and that was retention. Generally most voice games don'y have great retention - you play it once, finish the content within a week or so, and you're over it. While that can provide for an engaging experience, it's not always the best path forward for something like ISP. To make some income, you really want people coming back time and time again.
Despite the rise of technology in our day to day, and the decline of traditional newspapers, there is still a massive community of crossworld puzzlers around the globe. People still keep their subscriptions solely for the daily crossword. Crossword puzzles and their fun clues are an amazing brainteaser, forcing you to think deeply about words and their meanings, learning and having fun at the same time.
Voice seemed like the perfect medium to translate this sort of experience. Voice games are especially great for those "in-between times". It's something you can do when you wake up, when you are doing the dishes, doing the laundry, driving etc. You may be doing something mindless with your hands, but still want to engage with your brain. These were the times of day I wanted to target.
With an idea in mind, I set to work!
What it does
Puzzle of the Day is a daily crossword puzzle style game. The puzzles are built from the ground up for Alexa, and are designed as quick 5-10 minute daily experiences.
Each puzzle consists of five words, and a theme.It uses clues similar to those you may find in a crossword puzzle, but removes the crossing component from the game. Instead, solving words give you free 'letter reveals' which act in the same way, but you can be strategic about when to use them. If you are stumped on a hard word, you can pass and rack up some letter reveals to help you with that one later.
Once the user guesses all five words, they can wager some points on the theme. Points are earned from solving words, having remaining letter reveals, as well as time bonus for finishing under 5, 10 and 15 minutes. You only get one guess for the theme, but guessing correctly with a high wager could let you double your points.
Once solving each daily puzzle, you can see how your score compared to others around the world with an in game leaderboard, giving you your percentile and place for time and points for each day. Users who are more interested in the stats can link their accounts and access the online leaderboards that I built for the game. These are available at https://www.stokedskills.com/puzzleoftheday/
You can also set up the email service to get a daily email at the end of the day, so you can see how you compared against all the users of the day (because when you play, you can only get stats for people who played thus far)
How I built it
There are a number of components to this skill:
The skill code itself: I built this skill using the Jovo framework. It is developed in Node.js using typescript, and data for each user is being persisted to the skill in DynamoDb. The skill supports the APL interface and has full screen APL support across for all devices, throughout the whole game.
The Leaderboards: The leaderboard data can be accessed within the skill, from the website, or from the email service. Leaderboard data is updated whenever a user finishes a puzzle, and is stored in and AWS RDS MySql instance.
The Email Service: To send emails to users, there is a recurring job each day. Once a day is completed and we have everyone's scores, we can publish that days results. Using an AWS lambda running on a cron schedule daily, we load up all the scores from the database for the previous day for users that have requested emails. For those users, we calculate their individual stats for percentile and place in time and points and deliver it as an email using Twilio's SendGrid. This system was an integral part of the design as I really wanted to focus on user retention to drive adoption of the ISP.
The ISP: For the In Skill Purchase component of the skill, I decided to go with subscriptions. Since I was focused on retention and daily usage, I figured that a recurring model would be the best approach for this skill. I've decided to brand the ISP as the puzzle league, and by subscribing users get extra benefits like more games, and the ability to reveal extra letters. The free component to the game is substantial, but by paying a small monthly fee, those dedicated users can get some extra enjoyment and fun.
Challenges I ran into
Because I wanted to build a game of high quality, I included alot of features which increased the scope. Besides the skill itself, I needed to build out the website, the database system for the in-skill leaderboards, and email system, and a content management framework.
While building the skill itself, and all the other moving parts were quite a challenge and took lots of iteration to get right, I think the content management aspect was the most interesting challenge I had to face so I wanted to focus on that.
Building a daily recurring game means more content every day. To make this word right and with accurate word recognition, I needed to include all of the solutions to the puzzles, including the themes, into the voice model. This means re-certifying with every new puzzle that is added. I could have taken a more risky approach and used an 'open' slot with SearchQuery, but I really wanted the accuracy to be top notch so I took the more involved approach.
To get all the data into the skill, I needed a great way to manage the content. Instead of managing the puzzle content in code, I decided it would be way easier to use spreadsheets. In the spreadsheet I can fill in the solutions, the clues, and the themes.
From there, I needed to get it into the slots of the skill, and access it from within my skill code. To do so, I built a number of deployment scripts. These scripts are used to do a number of things:
- Import the spreadsheet into code and convert it into JSON, so the skill code can use it to provide the right puzzles
- Automatically fill in dates and data for all the new puzzles that are added
- Run some verification on the generated JSON file to make sure there are no duplicate dates, puzzleIds, etc
- Take all the words I need from the JSON file in the voice model, (clue answers and theme names) and open up the voice model json file, update the slot values, and save it back to disk so that I could use that to upload to the Alexa service.
- Upload all the puzzle data into MySql so the website has access to the correct puzzle data
These scripts allow me to do all the data management I need in only a minute or so, saving me alot of time and potential errors in the future. With this system, I plan to create skill content every 2-3 months, and then update the skill with that data, giving me a nice worry-free window in case things are slow with certification. By automating the process, I can make all those above updates that are pretty far reaching into all of the infrastructure and code of the entire system, without touching the code myself. This really limits the vectors for failure and allows me to spend more of my time focusing on how to improve the game for customers.
Accomplishments that I'm proud of
With all the moving parts, this was probably the most complicated and in depth skill I've built. It's the first one I've built using Subscriptions as an ISP. After spending alot of time on the design, and considering cutting alot of the scope, I'm proud that I completed everything I set out to do, and that I designed it in an efficient and scalable way that requires little maintenance. I'm excited to see how it performs now that its out there in the wild!
What I learned
Skill development is an amazing learning process, and I learned a ton with this project. While I had experience with some of these technologies before, I took steps to learn and include more technologies whenever I got the chance. For example, as part of this project I learned Typescript and built the entire skill using it. Being my first time using Typescript, it took at bit of studying up, but I think it paid off in the end and my skill is far more maintainable that it would have been without it.
I also learned the importance of user testing. As part of the process, I recruited people that I knew to act as beta testers and play through the game for a few weeks before the release. This really allowed me to tweak the difficulty and gameplay and find a level where I think people will gain the most possible enjoyment. As I went through a couple iterations of this I found that each and every piece of feedback I acted on had an immediate effect on the next group of people I had try the game. It's definitely a process that I will continue doing on future projects.
What's next for Puzzle of the Day
Now that I have everything set up and rolling, the next step is to iterate and improve the experience. Nothing is ever quite perfect on the first try, and that is why I set up a feedback system within the skill. Each day, users can rate the quality of the puzzle. This is stored into my database and I can use it to help me understand what is working and what isn't as I build more puzzles for the future.
In addition, I want to iterate on the ISP. I want to find more ways to add value to subscribers with the potential for weekly challenge puzzles, or monthly competitions. I'd love to build out an A/B testing framework for this game so I can truly identify what is working and make smart analytical decisions about where to invest my time next.