Idle Calculator
An idle game where progression is gated on demonstrated mental arithmetic, not just on waiting.
Status: Deployed to a dev environment, public release pending
Built with
- Flutter
- Dart
- BLoC
- C# / .NET 8
- DynamoDB
- AWS CDK
- Next.js
Most idle games gate progress on time. Idle Calculator gates it on skill: your calculators tick along on their own, but surging them forward means doing the arithmetic yourself. Eighteen calculators, five Acts, ninety technique cards, on phone, tablet and web from one codebase.
The design problem
An idle game that demands real effort has to stay fair in two directions at once: the idle loop cannot make the active loop pointless, and the active loop cannot become mandatory grinding. Five Acts introduce percentages and averages, then fractions and ratios, then order of operations, powers, roots and logarithms. Each one needs its own answer-entry design and its own balance pass against the economy.
The look follows the subject: a dark scientific instrument, near-black with tabular monospace figures, colour reserved for circuit identity.
Simulator before UI
The game engine is a pure-Dart package with no Flutter dependency, which made it possible to simulate the whole economy before a single screen existed. That ordering paid for itself: the simulator surfaced five real defects and two invariants that turned out to be wrong, all before any of it was wired to a widget.
One verify.sh runs the analyzer, the formatter, roughly 570 tests and an economy report, so "does this balance change break anything" is one command rather than a judgement call.
Architecture
A feature-first Flutter app over thirteen Dart packages, splitting the game domain, engine, repository, problem generator, save storage, telemetry, cloud sync and UI kit apart from each other. BLoC for state, with async kept at the edges.
The backend is a C# Minimal API on Lambda (.NET 8) with DynamoDB, deployed to a dev environment with CDK. Identity is anonymous by default, with optional email accounts over Cognito for cross-device progress: requests stay SigV4-signed either way, so signing in changes who the identity is rather than how the request is authorised.
The marketing site is a Next.js static export with the Flutter web build embedded at /play, on a private S3 bucket behind CloudFront.
What is left, and what it is waiting on
Phases 0 through 10 are built as far as they can be built from the keyboard, and the dev environment is deployed. What remains is blocked on things code cannot supply: ad keys, five sound files, a store listing, a domain in front of the dev URL. A launch-prep document in the repo sorts every remaining item into "buildable" or "needs something from outside".