Back to all writing

Building My First Flutter App: The Kancil Story

Building My First Flutter App: The Kancil Story

From Watching Clash of Champions to the Play Store: Building Kancil

I never set out to build a game. It all started with something far more ordinary: sitting on the couch, remote in hand, watching Clash of Champions, an Indonesian brain-competition show from Ruangguru.

If you have never seen it, here is the short version. A group of high-achieving young people compete in a series of mental challenges. Fast, tense, and genuinely fun to watch. But what stuck in my head after the episode ended was not who won. It was a question that kept nagging at me:

Why does something this fun feel like it "belongs" only to geniuses?

Look closely and the challenges on screen are actually simple at their core. Calculate quickly. Remember a pattern. Recognize something before anyone else does. Not advanced calculus, but basic skills that, packaged the right way, should be enjoyable for anyone. A grade-schooler. An older adult. My uncle who is hopeless with technology. Even me, someone who had not "exercised" his brain on small but demanding things for a long time.

From that point a hypothesis formed, one I wanted to test. And because I work in IT, I tested it the way I know best: by building it. I named the app Kancil.

The hypothesis: start with the most basic

The first temptation when building an educational game is to go straight for the impressive stuff. Hard levels, complex mechanics, a pile of features. I deliberately held back.

The question I actually wanted to answer was far more humble:

Are the most basic games already fun enough to be enjoyed across ages?

Notice the difference. Not "can I build the hardest game", but "does even the simplest one already feel enjoyable and worth replaying". The logic is this: if the foundation itself is not enjoyable, adding complexity only stacks problems on top of problems. I wanted to know whether the floor was solid before worrying about how tall the building could be.

So I made a list of the most basic skills that kept coming to mind while watching the show, then turned each into a game: quick arithmetic, recognizing number patterns, vocabulary, short-term memory, general knowledge, and spatial perception. Basic on purpose. Light on purpose. Because what I was testing was not how impressive the games were, but whether the core idea could stand on its own.

Why the name Kancil

In our folklore, the kancil (mouse-deer) is neither the biggest nor the strongest animal. It wins through wit. To me that felt right. The message I wanted to carry was not "be the smartest", but "a sharp mind can come from anywhere, from anyone".

The tagline was born from that: "Sharp minds. One world." The "One world" part is not just a sweet decoration, and I will get to how it became real through the global leaderboard.

Before going further, let me be honest up front: this is my first Flutter app. Building a real mobile app, all the way to a Play Store release, complete with a global leaderboard and many languages, was genuinely new territory for me. So treat this piece as notes from someone learning while building, not a sermon from an expert.

Technology choices: boring on purpose

Kancil was built solo. That means every technical decision had a direct cost to the only resource I had: my time. So what I looked for was not the most cutting-edge option, but the one that saved the most effort without sacrificing quality.

The choice landed on Flutter and Firebase. Flutter gave me a single codebase for two platforms at once, plus full control over the animations this game leans on heavily. Firebase handled the backend without me having to keep a server alive at three in the morning.

The one takeaway I want to share is a little counterintuitive: for a first app, boring is a feature. Pick mature, well-documented technology, then save your creative energy for the product rather than for fighting your tooling. I still tripped over a few classic Flutter version issues early on, but almost all of them resolved the moment I realized that "the combination of versions that works" is itself an asset worth protecting.

My favorite part: one engine for many games

This is the architectural decision I am proudest of, and the idea behind it is simple.

If you look closely, most of the games in Kancil share an identical rhythm: show a question, take an answer, give feedback, tally the score, then move to the next level. Math, flags, words, number sequences, they are all essentially quizzes.

If I wrote that logic over and over in each game, I would basically be signing up for bugs multiplied by the number of games. So I built one shared quiz engine. The result: to add a new quiz game, I only need to define what makes it unique, such as how it generates a flag question. Everything else, from the display to the animations, the scoring, and the level transitions, is already handled by the engine for free. Games whose interaction really is different, like Memory or Word Search, simply bring their own screen.

This principle actually has a name in programming: DRY, Don't Repeat Yourself. Each piece of logic should ideally live in a single place, not be copied all over.

What repeats, turn into one machine. What is unique, give it its own place.

The benefit is not just cleaner code. A fix in one spot immediately repairs every quiz game at once, the feel of play stays consistent, and when building a new game I only have to think about one thing: what makes it unique.

"One world": the global leaderboard and many languages

The "One world" part of the tagline rests on two things.

First, the global leaderboard. It is simple in technical terms, but the psychological effect is large: a child in a small town can sit on the same list as someone on another continent. The most interesting decision here was not about the database, but about identity. A leaderboard needs identity, and the most common approach is to ask people to sign up first. Unfortunately, that is one of the biggest points where people bail. The solution was anonymous authentication: the moment you first open the app, you already have a stable identity behind the scenes without filling in anything. This is a concrete example of a principle I hold to, that the best technology is often the kind you never see.

Second, many languages. Kancil supports 10 interface languages. For a solo app that sounds excessive, but if your tagline reads "One world", you cannot exactly stop at English. The principle here: if something is going to be done many times, make it cheap from the start. What I did not see coming was a problem with the letters themselves: my main font turned out to have no glyphs for some non-Latin scripts, so for those scripts the app had to fall back to the device's built-in font. A pleasant lesson in humility: it turns out "looks good in English" is a very low bar.

One more honest note: some of the translations were assisted by AI, and ideally still need a native-speaker review before they are truly polished. Part of building honestly is admitting what is not yet perfect.

Closing

Kancil is now live, complete with a set of basic games, a global leaderboard, and support for many languages. But to me, its status is still "an ongoing experiment". The original hypothesis, whether people across ages are comfortable starting with basic games first, has not truly finished being tested. Everyone who tries it is one more data point.

If there is one thing I am taking away from this journey, it is this: even a small app is allowed to have big ambitions about respect, quality, and reach. The size of the team does not determine the size of the care.

If you are curious, give it a try. See whether your brain, at any age, still enjoys being challenged by small things. It turns out mine does, at least, and that alone has become a pleasant early answer.

Sharp minds. One world.

Try Kancil on the Play Store: https://play.google.com/store/apps/details?id=id.harislabs.kancil