I built an app that forces you to actually live your life
How I turned the “I should go out more” guilt into a gamified IRL quest system with XP, streaks, and a social leaderboard — in one night.
I've been thinking about the Pokémon GO problem for a while.
Not the game itself — the mechanic. The thing that made millions of people physically walk outsidein 2016 wasn't willpower or a New Year's resolution. It was XP. It was a Pidgey behind the coffee shop. It was the fact that your friend already caught 12 of them and you had 4.
The question I kept asking: why don't we apply that to real life?
“Talk to a stranger” is terrifying on its own. Add 150 XP, a difficulty rating, and a leaderboard where your friend Sofia is beating you? Suddenly it's a quest.
That's the core insight behind QuestIQ.
The gap isn't motivation. It's structure, accountability, and competition.
The Problem
Most productivity apps shame you. They show you your unfinished to-do list, your missed workouts, your unfilled habits tracker. The feedback loop is guilt → avoidance → more guilt.
The social skills problem is worse. Nobody has a “talk to people IRL” app because it sounds absurd. But it's real — people, especially post-COVID, are genuinely less practiced at casual social interaction, exploration, trying uncomfortable things.
The Core Mechanic
QuestIQ works like this:
- You get 3 new quests every day across 4 categories: Social, Fitness, Exploration, Creativity
- Each quest has XP (50–250), difficulty (⚡ Easy to ⚡⚡⚡ Hard), and a timer (24h)
- Complete it, claim your XP. Miss it, your streak breaks.
- Your total XP goes on a leaderboard — global and friends-only
The quests are designed to be just uncomfortable enough to matter:
- “Eat at a restaurant alone, no phone, 30 minutes”
- “Start a real conversation with a stranger”
- “Attend a local event you know nothing about”
- “Run a route you've never taken”
The Technical Decisions
I built this with Next.js 15, Tailwind v4, shadcn/ui, and TypeScript. The stack I reach for when I need to ship fast without compromising quality.
The interesting part wasn't the stack — it was the quest engine. I wanted quests that felt hand-crafted, not algorithmic. The solution: a curated bank of 40 quests organized by category and difficulty, rotated daily using a deterministic seed so everyone gets the same 3 quests on the same day (community moment) but the rotation feels fresh.
function getDailyQuests(date: string): Quest[] {
const seed = parseInt(date.replace(/-/g, ''), 10);
const shuffled = seededShuffle(QUEST_BANK, seed);
return [
shuffled.find(q => q.category === 'Social')!,
shuffled.find(q => q.category === 'Fitness')!,
shuffled.filter(q =>
q.category === 'Exploration' ||
q.category === 'Creativity'
)[0]!,
];
}The leaderboard was the other fun piece. For the demo, it's seeded with 5 realistic fake profiles to show what competition looks like at scale. The real version would use a backend — for now, it's client-side with localStorage for personal XP tracking.
What Surprised Me
Two things.
First: the empty state problem. Most apps show a blank screen when there's no data. That's a conversion killer. I spent more time on the empty state than the happy path — pre-seeded demo completions, shimmer cards, copy that invites you in rather than apologizing for being empty.
Second: dark mode makes gamified apps feel serious. The first version I built in light mode looked like a kids' app. Switch to near-black with violet and emerald accents? It looks like something adults want to compete in.
What's Next
The product is a static demo right now — no auth, no real persistence, no real user-to-user leaderboard. The real version needs:
- Auth + profiles — sign in, set username, track real XP over time
- Social graph — add friends, see their completions in real-time
- Push notifications — daily quest drop reminder (the Duolingo owl, but cooler)
- Verification options — GPS check-in for location quests, photo upload for visual ones
But the core loop? It's right. The question is: will people actually do it?
I built it in one night to find out.