Inspiration
Devpost: Project Story (all three ThunderHacks projects) This version covers all three projects: Mint Rush (Canadian Bank Note), AML Sentinel (OLG) and Perennial (Algoma Game Jam). If you only want the Mint Rush story, it's saved separately as devpost-story-mint-rush.md.
Paste everything between the two lines into About the project. The tags for Built with are at the bottom.
Inspiration ThunderHacks 2026 had three challenges that caught our eye, and we couldn't pick just one, so we built all three:
Canadian Bank Note asked for a casino-style crash game. We built Mint Rush. OLG asked how to catch money laundering across its casinos, lottery and OLG.ca. We built AML Sentinel. The Algoma Game Jam asked for a game about the Four Seasons. We built Perennial. On paper they have nothing in common: a gambling game, a compliance tool and a cozy survival game. But the more we worked on them, the more they turned out to be about the same thing: trust, and the choices people make with money and time.
Mint Rush and AML Sentinel are two sides of one coin. One is a casino game built so players can trust the house. The other is a tool that lets the house trust its players, by finding the few who use gambling to turn dirty money clean. Perennial is about a different currency: one tree you can spend as shade in summer, food in fall or firewood in winter, but never all three.
All three are rooted in Ontario and Canada: Canadian money and Golden Loonies, OLG and FINTRAC rules, and a Northern Ontario year from spring rain to winter dark.
What we built πͺ Mint Rush: a provably fair crash game (Canadian Bank Note) Play it Β· Code
A crash game themed on Canadian bank notes. Instead of a line graph, three paper sky lanterns rise with the multiplier painted on the biggest one. They glow brighter gold as it climbs, flash green when you cash out and turn red and drop when it crashes. After you cash out, the round plays on to its real crash point, while a Live bets table of simulated players cashes out around you.
Bank notes have security features so you can check they're real, and Mint Rush works the same way. Before you bet, you see a hash of the server's seed. After the round, one click recomputes the crash point in your own browser. It also has Golden Loonie bonus rounds, five wallets (CAD, USD, GBP, BTC, ETH), autobet, deposits, English and French, and a phone layout.
π AML Sentinel: anti-money-laundering monitoring (OLG) Live dashboard Β· Code
A security-operations-style dashboard for OLG investigators. It watches every player's transactions across OLG.ca, land-based casinos and lottery retail, and for each suspicious person it shows what an investigator needs next: who, how much, when, and exactly why.
It combines 13 typology rules for known laundering methods (structuring just under the $10,000 FINTRAC threshold, chip walking, hedged betting, mule rings on shared devices, ticket discounting and more) with an Isolation Forest that flags unusual profiles and explains which features stood out. Each case gets a risk score and a route: escalate to AML, refer to PlaySmart for gambling harm, enhanced monitoring, or a mandatory LCTR/CDR filing. Investigators get a case file, a timeline, network views of shared devices, a live replay feed and an editable draft STR (suspicious transaction report).
π³ Perennial: a Four Seasons survival game (Algoma Game Jam) Play it Β· Code
One tree is shade in summer, food in fall and fire in winter. You plant seeds in spring, water sprouts through a scorching summer, harvest fruit and wood in the fall wind, and keep the hearth burning through a dark winter full of wolves. Every winter you face the same choice: chop a tree for firewood tonight, and lose its shade, fruit and seeds forever.
Each season changes the rules, and the changes between seasons are gameplay too: sprouts become trees, fruit rots, and the pond's ice cracks under you in spring. There's a stray dog to adopt (if you can spare 4 wood for its house), a porch cat, a crow and a rabbit that remember how you treated them, and a sun jar that lets you bottle summer and open it in winter.
How we built it Mint Rush A TypeScript monorepo in three parts:
packages/engine holds pure game rules and the provably fair RNG, with no I/O. The server and the in-browser verifier run the same code. apps/server is a Fastify API on Node 22 with SQLite. The server owns every balance and the clock and keeps a full ledger. Rounds stream live over server-sent events. apps/web is React and Vite, with the lanterns drawn on HTML canvas and sound from the Web Audio API. Every rule lives in one game.config.json: house edge, max multiplier, curve speed, limits, currencies, bonus rounds and simulated players. A browser-only build is published to GitHub Pages by GitHub Actions.
The crash point is derived from the committed seed:
h
HMAC-SHA256 ( serverSeed , clientSeed : nonce ) h=HMAC-SHA256(serverSeed, clientSeed:nonce) The first 52 bits of ( h ) give a uniform ( r \in [0,1) ), which maps to a crash point with house edge ( e = 0.01 ), capped at ( 1000\times ):
crash
min β‘ ββ£ ( 1000 ,
max β‘ ββ£ ( 1 ,
β 100 β ( 1 β e ) 1 β r β 100 ) ) P ( crash β₯ t
)
0.99
t
crash=min
β
1000, max
β
1,
100
β
1βr
100(1βe)
β
β
β
β
β P(crashβ₯t)= t 0.99 β
So cashing out at any target ( t ) returns ( t \cdot \frac{0.99}{t} = 99% ) on average. Every strategy is equally fair.
AML Sentinel Python with pandas and NumPy for the rules engine, scikit-learn for the Isolation Forest, and Streamlit with Plotly for the dashboard, deployed on Streamlit Community Cloud.
Since real OLG data is private, we wrote a generator that simulates a month of OLG activity: 5,000 normal players with about 88,000 transactions, and hidden among them 65 launderers across 7 typologies and 10 problem gamblers. The engine never sees those labels, so the generator doubles as a test.
A person's alerts roll up into one case with a "noisy-OR" risk score. The strongest alert counts fully and each extra alert closes part of the remaining gap to 100 with less weight, so many weak alerts can't outrank one strong, specific one:
risk
min β‘ ββ£ ( 99 ,
100 ( 1 β β i ( 1 β w i s i 100 ) ) ) ,
w
( 1 ,
0.35 ,
0.2 ,
0.1 ,
0.1 ,
β¦ β ) risk=min(99, 100(1β i β β (1βw i β
100 s i β
β ))),w=(1, 0.35, 0.2, 0.1, 0.1, β¦) where ( s_i ) are the alert severities from strongest to weakest.
Perennial One HTML file with no engine, no framework and no asset files. Every shape is drawn in code on HTML5 canvas in a flat "paper diorama" style, and each season cross-fades to its own palette. All the music and sound is synthesized live with the Web Audio API: plucked pentatonic for spring, lydian pads for summer, dorian reeds for fall, sparse minor bells for winter, plus rain, cicadas, wind, fire crackle and wolf howls. We playtested it with Playwright and headless Chromium, including a bot that played 9 full games.
Challenges we ran into Never charging anyone twice (Mint Rush). A double-click or a dropped connection mid-bet can't be allowed to cost money. Every bet, cash-out and deposit carries an idempotency key, each money move runs inside a database transaction, and amounts are integers in each currency's smallest unit, down to 8-decimal Bitcoin. The server also uses its own clock for cash-outs, so the browser can't lie about timing. Clarity over cleverness (Mint Rush). Our first version stamped crashes Counterfeit and drew an engraved curve on cream paper. It looked great but read slowly. Playtesting pushed us to a dark layout, plain Crashed and Cashed out stamps, and finally to dropping the graph entirely for the lanterns. Testing without real data (AML Sentinel). You can't measure a detector you can't check. Planting known launderers in realistic synthetic data let us measure it honestly. Not flagging the high rollers (AML Sentinel). Big, legitimate players naturally trip the $10,000 reporting rules. We separated mandatory LCTR/CDR filings from actual laundering evidence, so a whale gets a report, not an investigation. We also send loss-chasing to PlaySmart rather than AML, because it's a sign of harm, not crime. Teaching without words (Perennial). The first year is the tutorial, with zero instruction text: keycaps, picture bubbles, arrows and two-picture rule banners for each season. Making seasons change the rules, not just the colours (Perennial). Each season needed its own resource, job and danger, and the transitions had to matter too. Phones and accessibility everywhere. Mint Rush moved its Bet button under the lanterns so players don't have to scroll. Perennial has touch, gamepad, remappable keys, a colour-blind palette and three difficulties. Both respect reduced motion. Accomplishments that we're proud of Three working, playable projects, each with a public link anyone can open. Mint Rush: trust you can check yourself, and a backend built as if real money were on the line, with 64 automated tests run against both an in-memory and a SQLite store. AML Sentinel: analysed 88,424 transactions for 5,000 players in about 5 seconds, escalated all 65 planted launderers (100% recall), and 98% of escalations were real launderers. The one miss was a problem gambler whose deposits also looked like structuring. Perennial: a complete game in one file with zero third-party assets. Every pixel and every note was made during the jam. What we learned Trust has to be designed in. Commit-reveal fairness, idempotent money moves and explainable alerts all come from the same idea: show your work so someone else can check it. Explain every decision. A crash point you can verify, an alert that says exactly which rule fired and on how much money, and a game that teaches with pictures all beat a black box. Simulate to prove it. RTP simulations, planted launderers and a bot that plays the game turned "we think it works" into numbers. Show, then build. Drawing a mockup before each big change saved us from building the wrong thing more than once. Colour carries meaning. Gold, green and red in Mint Rush, a palette per season in Perennial, and risk tiers in Sentinel all tell people what's happening before they read a word. What's next Mint Rush: a real shared multiplayer round, sign-in and a leaderboard, and more lantern themes for holidays like Canada Day. AML Sentinel: streaming ingestion of live transactions, investigator feedback to tune the thresholds, and a FINTRAC-ready STR export. Perennial: more biomes, more animals that remember you, and a co-op mode for two players sharing one fire. Elevator pitch (200 characters max) Mint Rush only (150 characters):
A provably fair crash game themed on Canadian money: paper sky lanterns rise with the multiplier, and every round can be verified in your own browser. All three projects (181 characters):
Three projects, one idea, trust you can check: a provably fair crash game, an AML tool that flags money laundering at OLG, and a seasons game where one tree is shade, food or fire. What it does (short version) For a separate "What it does" field, paste this:
Three ThunderHacks projects, one idea: trust you can check. πͺ Mint Rush (Canadian Bank Note): a provably fair crash game themed on Canadian money. Three paper sky lanterns rise and glow gold as the multiplier climbs, turn green when you cash out and red when it crashes. Every round can be verified in your own browser. It has Golden Loonie bonus rounds, five wallets (CAD, USD, GBP, BTC, ETH), autobet, a live table, English and French, and it works on a phone. π AML Sentinel (OLG): a dashboard that watches player transactions across OLG.ca, casinos and lottery retail, and flags people who look like they're laundering money. For each case it shows who, how much, when and exactly why, using 13 laundering rules plus machine-learning anomaly detection, then routes it to AML, PlaySmart or a mandatory FINTRAC report. π³ Perennial (Algoma Game Jam): a Four Seasons survival game where one tree is shade in summer, food in fall and firewood in winter. Every season changes the rules, and every winter you choose whether to burn your future to survive tonight.
What it does
How we built it
Challenges we ran into
Accomplishments that we're proud of
What we learned
What's next for OLG Thunderhacks
Built With
- css
- fastify
- github
- github-actions
- html5
- javascript
- node.js
- numpy
- pandas
- playwright
- plotly
- pytest
- python
- react
- scikit-learn
- server-sent-events
- sqlite
- streamlit
- typescript
- vite
- vitest
- web-audio-api
- web-crypto-api
- zod
Log in or sign up for Devpost to join the conversation.