Android · Case Study

Brainbolt

Brainbolt is a timed mental arithmetic trainer for Android. Twelve operation families, six answer modes and thirty levels each, with every question generated on the device so it works with no account and no connection. Not yet released, so the Play Store link goes live at publication.

Role
Android Developer
Timeline
In development, not yet released
Client
Orange Draft
Stack
Android, Java, In Development

01 Overview

Brainbolt is a drill app rather than a course. You pick a topic, a question appears, and a clock runs. Twelve operation families from addition through cube roots, six modes including a keypad entry mode, a solve-for-the-missing-operator mode and a two-player duel on one device, thirty levels in each. Every question is generated on the device inside difficulty bands keyed to the level, so the bundled database holds progress and reminders and no question content at all. There is no backend, no account and no analytics, and the app plays identically with the network off. The work here was not writing it from scratch. The codebase was bought as a template and then taken apart, and most of what follows is what that inspection turned up.

02 The Challenge

An inherited codebase that appears finished is harder than an empty one, because the defects that survive to release are precisely the ones normal use does not reveal. This one ran, looked complete, and had a product document describing behaviour it did not have. Nothing was crashing, so nothing pointed at the problems. They had to be found by reading the code against what it claimed to do, and several of them turned out to undermine the point of the app: a scoring tier that could never be awarded, a question format that could be answered without doing any arithmetic, and an on-screen indicator that occupied no space. On top of that the app carried an inherited identity, from its application id to the privacy policy URL, which pointed at the template author.

03 The Solution

  1. 01Found that the top scoring band was unreachable. The bands were absolute values written for a thirty second clock while the timer was set to twenty five, and the countdown's first tick always reports slightly under the full duration, so the fastest tier never once evaluated true. Four hundred was the real maximum while the product document promised five hundred. Rewrote the bands as fractions of the timer so they stay correct if it is ever retuned.
  2. 02Found that multiple choice was solvable without arithmetic. The three wrong answers were the correct one plus ten, minus ten and plus twenty, which makes the answer permanently the second smallest of the four, and the smallest whenever the negative option fell below zero. Replaced them with distractors drawn from both directions and scaled to the size of the answer, with the split randomised so the answer's position carries no information, and shaped to look like real slips rather than fixed offsets.
  3. 03Found the lives indicator measured zero height. Four separate copies of the same loop set each heart as a background image on a view with no intrinsic size, so players never saw how many lives they had until a dialog told them they had none left. Replaced all four with one implementation at an explicit size.
  4. 04Closed the app's surface: fifteen of sixteen activities were exported with no intent filter and no permission, so any installed app could launch them directly, including straight into the results screen which reads round state that would not exist yet. Kept the verification tooling working by re-exporting them for debug builds only.
  5. 05Added a time warning to the three modes that lacked one. Only one of the four timed modes changed colour as the clock ran down; the others ran the same twenty five seconds with no signal at all.
  6. 06Documented a migration trap rather than leaving it to be discovered later. The database version has never moved and there is no upgrade path, so the first schema change either throws or, using the library's only escape hatch, overwrites the player's database and destroys all progress. The finding is that this is not an absent migration, it is a data loss waiting on the next release.
  7. 07Separated ad configuration by build type so a development device physically cannot register a real impression and a release build cannot serve a test one, then made the release build refuse to assemble while the ad identifiers are still placeholders, because the alternative failure is silent: the app ships, serves nothing, and the first symptom is an empty earnings report.
  8. 08Paced the interstitials, which previously showed whenever one happened to be loaded, so three short failed rounds meant three full screen ads in a few minutes. Now ninety seconds minimum between them, four per session, and none until the third round.

04 Key Features

  • Twelve operation families, addition through cube roots
  • Six modes including keypad entry, true or false and find the operator
  • Two-player duel on a single device, split screen
  • Questions generated on device inside per-level difficulty bands
  • Thirty levels per topic with stars, lives and speed-banded scoring
  • Per-question review showing your answer against the correct one
  • Daily practice reminders that survive a reboot
  • Dark mode, seven accent colours, and ten translated locales alongside English

05 Outcomes

5
Shipped-behaviour defects found and fixed
15 of 16
Activities closed to other apps
12 x 6 x 30
Topics, modes and levels, all generated
Offline
No backend, no account, no network needed
Next projectJournita AI
(06)ContactLet’s Talk

Available for select projects

Have something
worth building?

Or send a message
Response

Usually within 24 hours.

Based in

Lagos, Nigeria. Working worldwide.