ICallOn v2 - Daily Challenge
Part 2: Implementing the Daily Challenge game mode
Hi! If you haven't read the first part of this series, where I cover the work that went into improving the design, architecture, and UI/UX of ICallOn, read it below.
ICallOn v2
I released the first iteration of ICallOn in December 2024. It was a throwback to a game I and many others enjoyed playing as kids, and I thought it'd be fun to experience it digitally as a real-time multiplayer game.
In this second (and final) part, I cover the implementation of the new Daily Challenge mode, specifically
how it works
answer validation and caching
scoring and leaderboards
automated daily/weekly summaries
Welcome!
With the architecture in better shape and an improved UI, I added something new: a game mode that would keep players engaged with the app, even if they had no one to play with. In the Daily Challenge mode, every player gets the same letter and categories each day. You have 30 seconds to fill in your answers, which are then validated by an LLM.
LLM Validation
This was the answer to the most important question of the game mode: how would the answers be validated? In normal PvP gameplay, answers are graded by players and disputes are resolved outside the app (players could argue about it on a phone call, for example).
This wouldn’t work for a Daily Challenge mode. And unlike other word games where challenges have specific solutions used to validate players’ submissions, a letter+category combination in ICallOn could have several valid answers.
The solution here was to rely on an LLM. With good prompts, LLMs excel at category validation and I chose Google’s Gemini 2.5 Flash model for this purpose.
There were some cost considerations in this decision. Gemini has a generous free tier, but I eventually hit its daily request limits and upgraded. So far, costs have stayed comfortably low.
To preemptively minimise costs, I added a caching layer that stores validation results in the database.
Since release, I’ve cached 500+ validations and avoided ~200 same-day duplicate LLM calls which saves tokens (and money).
Scoring
Scoring in a PvP ICallOn game is straightforward. You get 10 points for a unique answer, 5 for a duplicate, and 0 for an invalid answer. In the Daily Challenge mode, such a scoring formula would not work because the frequency of duplicates could vary significantly, and the points penalty should be proportional to that variance.
Therefore, the scoring goal (pun intended) was to give unique answers a perfect score (10), and assign a score in the range of 1 to 9 for a duplicate answer such that the higher the frequency of duplicates, the lower your score.
I considered three ways of doing this
Direct Deduction: for every duplicate of your answer, you lose a point. It’s simple, intuitive, and ideal for a small pool of players. If 3 other players submitted the same answer, you each score 7 points (3 points lost).
Proportional Deduction: the deducted points is based on the proportion of players with the same answer as you. It’s less intuitive, but great for mid-sized pool of players. If 3 other players submitted the same answer and there were 16 players in total, you each lose 3/16 * 10 points. And if there were more players in the pool, then the penalty is reduced.
Exponential Deduction: it’s similar to Proportional deduction, except that many duplicates are punished more harshly than fewer duplicates using an exponential function.
I settled for Direct Deduction for two reasons. First there aren’t a lot of players, so simple and intuitive rocks. Second, it’s not hard to imagine scenarios with the Proportional and Exponential Deductions where approximations would be required, and perhaps even result in fractional scores. It’d take some explaining for players to understand that their low score is because 65% of the players tendered the same answer they did.
One important detail is that scores are recalculated as new submissions come in. If Taiwo submits the same answer you did later in the day, your points drop accordingly. That means scores (and ranks) can shift throughout the day, and the leaderboard only settles at day’s end.
Leaderboard
Players are ranked on the leaderboard by their points tally. If two players score the same, then the player with the fastest submission edges it. So while each challenge lasts for 30 seconds, players are encouraged to submit quickly.
For ICallOn v2, I added three leaderboards
Daily: shows player rankings on the present day
Weekly: shows player rankings for the present week (Monday - Sunday, UTC)
All Time: shows player rankings since the Daily Challenge started
I did consider a Monthly Leaderboard. Over time, perhaps it’d be more useful than the All Time Leaderboard.
Usernames
Since ICallOn v1, authentication has been via Google and it remains so. Users needed to sign in to create game sessions, but players could join existing sessions anonymously. For the Daily Challenge mode, authentication is required so that scores can be attributed consistently. This can be changed at any time on a new Profile page I added.
Sharing Results
Like other word games with daily challenges, part of the fun is showing off your undeniably good or embarrassingly poor performance. As such, players can share their gameplay results which includes the following
Points per category
Total points
Rank
Time Taken
To prevent spoilers, I don’t include the letter, categories, or answers.
Question Bank
Each daily question includes a letter and four random categories (from a growing list of 11 categories). The questions are seeded in a question bank, and the application serves players the question of the day.
Automated Summaries and Tweets
Since developing ICallOn, I’ve shared updates about the features and rollout on Twitter via @wolemercy. After deploying the daily challenge feature, I figured it’d be great to make commentary on the leaderboard, and highlight any notable rank changes from day to day. It would also be fun to highlight the player of the week, I thought.
Since the Daily Challenge can be taken at any time, and a player’s points and rank can change at any point during the day, it meant the daily leaderboard was only set in stone at midnight. As such, leaderboard analysis could only happen the following day. To make this work, I needed three components: a summary generator, a Twitter posts integration, and a cron job.
Generating Summaries
As with answer validation, I relied on an LLM for summary generation. First, I fetch the leaderboard data (daily or weekly, as the case may be). If it’s the daily leaderboard, I also compute rank changes, which compares each player’s current rank with their rank the day before.
This data is fed into a prompt that I send to an LLM (gemini-2.5-flash). If this fails, it falls back to a hardcoded template summary.
In addition to the text summaries, I also generate a leaderboard image of the top 5 players, and it’s posted alongside the summary.
Twitter Posts
I created a twitter account specifically for ICallOn @icallon_xyz, for tweeting these summaries. To achieve this programmatically, I make two calls to Twitter’s API for each summary tweet. The first call uploads the leaderboard image, while the second posts the tweet.
Cron Jobs
To generate and post tweets on schedule, I rely on Vercel Cron, which fires at 8 AM every day for the daily tweets, and 8AM every Monday for the weekly tweets.
Wrapping Up
ICallOn has seen a lot of changes from v1 to v2, and I’m hard-pressed to see any other major additions I could make. The PvP mode provides an experience that embodies the spirit of the traditional game. And the Daily Challenge mode, which was one thing I’d always wanted to add, provides a way for players to compete with others every day.
One thing I would like to do is make the game snappier. There are certain transitions within the app that could be faster, which would make for a better gaming experience. I would also like to handle certain failure scenarios better, such as an LLM failure during answer validation.
Thank you for following along. Please, check out the game if you haven’t already: www.icallon.xyz. And if you have any feedback, feature requests, or general comments, please tweet me @wolemercy.
Thanks. See you around.
- Wolemercy
P.S Read Part 1 here
ICallOn v2
I released the first iteration of ICallOn in December 2024. It was a throwback to a game I and many others enjoyed playing as kids, and I thought it'd be fun to experience it digitally as a real-time multiplayer game.
Thanks for reading! Hope you hang around for more Software Engineering posts.







