Dunbit — Hatch Your Way Out of Procrastination

💡 Inspiration

This project started, appropriately, with me not doing something I was supposed to be doing.

I've always been a world-class procrastinator. Not the "I'll do it tomorrow" kind, but the "I'll reorganize my entire desktop and alphabetize my spice rack before touching that one task" kind. At some point I realized two things were missing from every to-do app I'd ever abandoned:

  1. Nobody was holding me accountable. A checkbox doesn't care if you ignore it. A friend does.
  2. There was no reward. Finishing a task felt exactly the same as not finishing it, which is a terrible incentive structure if you think about it.

So I asked myself: what if crossing off a task actually gave me something? And what if a real human knew whether I did it or not? That's the whole thesis of Dunbit. You finish your daily tasks, you hatch a collectible creature (a "Dunbit"), and you can rope in an accountability partner who gets notified when you follow through. It's basically a Tamagotchi that judges you, in the best way.

🎯 What It Does

Dunbit turns your daily to-do list into a game:

  • Complete tasks to earn a daily hatch — one creature per calendar day, enforced server-side so you can't cheese it.
  • Collect Dunbits across a rarity spectrum, from Common all the way up to Legendary.
  • Keep a streak going with a login flame and XP, which quietly nudges your luck.
  • Add an accountability partner who opts in and gets a heads-up when you actually do the thing.
  • Share your collection through an auto-generated public web page — no account or username required.

🛠️ How I Built It

Dunbit is split into two TypeScript projects with a clear rule: the backend is king. The app is a pure rendering layer with essentially zero business logic in the bundle. Every game value, rarity table, and piece of content lives on the server, so I can add new creatures or tune odds without shipping an app update.

The stack:

  • Frontend: React Native + Expo (managed workflow), with a home screen widget via an Expo config plugin.
  • Backend: AWS Lambda + CDK (Node 20, ESM, esbuild), fronted by API Gateway, with assets served through S3 + CloudFront.
  • Database: MongoDB Atlas — new Dunbits and entire seasons are just document inserts, no code changes.
  • Auth: Device-ID only. No sign-up wall, because nothing kills momentum like a login screen.
  • Scheduling: EventBridge crons handle timezone-aware midnight resets, so your "day" ends at your midnight, not a server's.

The fun part is the rarity engine. Each hatch draws from a weighted distribution, and a few invisible factors nudge the odds — your streak, whether you've got an accountability partner, and a hidden pity system so you're never stuck in bad-luck purgatory. Roughly, the probability of hatching a creature of tier $t$ looks like:

$$ P(t) = \frac{w_t \cdot \left(1 + b_{\text{streak}} + b_{\text{partner}}\right)}{\sum_{i} w_i \cdot \left(1 + b_{\text{streak}} + b_{\text{partner}}\right)} $$

where $w_t$ is the base weight of the tier and the $b$ terms are small, quietly-applied boosts. Two design rules keep it feeling fair: the rarity floor is always at least Common (a hatch never produces nothing), and Legendaries never duplicate — if you already own them all, the roll gracefully falls back to a lower tier.

🧠 What I Learned

  • Server-authoritative design pays off. Putting all the logic and content behind the API meant balancing the game was a config change, not a release cycle. Worth every bit of upfront discipline.
  • Timezones are a personal attack. "Reset at midnight" sounds trivial until you realize midnight is a moving target across a planet. Cron-driven, per-user resets were the only sane answer.
  • Invisible mechanics feel better than visible ones. Players enjoy good luck far more when they don't know it was engineered. The pity system works best precisely because nobody sees it.
  • Motivation is a systems problem, not a willpower problem. Reward + accountability did more for my own procrastination than any amount of self-lecturing ever did.

🐉 Challenges I Faced

The single hardest part had nothing to do with servers or Lambdas — it was the art. I needed a whole roster of creatures that (a) looked like they belonged to the same universe and (b) didn't accidentally borrow someone else's copyrighted universe. Generating creatures that were stylistically consistent and legally original turned out to be a real grind. Early batches gave me creatures that looked like they came from five different games having an argument. Getting a cohesive, original visual identity — bubbly shapes, electric purple, a family resemblance across all of them — took far more iteration than I'd like to admit.

Other honorable-mention headaches:

  • Making sure "one hatch per day" couldn't be gamed by clock-fiddling, which pushed all the day-boundary logic firmly server-side.
  • Keeping the app dumb on purpose. Every time I was tempted to sneak a little logic into the client "just this once," I had to talk myself back out of it.

🚀 What's Next

More seasons, more Dunbits (the schema already supports unlimited expansion), richer accountability features, and full internationalization — the whole thing is built i18n-ready, so it's English today and hopefully many more languages soon.

Beat procrastination, one Dunbit at a time. 🥚

Share this project:

Updates

Submission history