This is a submission for the GitHub Finish-Up-A-Thon Challenge
What I Built
TaskStack is an AI-driven "Slow Productivity OS" I originally built as a hobby project — a Next.js 15 + Tambo AI app that gives you a personalized workspace for skill mastery, deep work, and energy-aware scheduling.
It has features like Challenge creation, Pomodoro timer, a habit tracker, a creative toolkit, and a chat side panel that could call server-side tools to render generative UI.
If you've ever felt like your productivity app was judging you, TaskStack takes the opposite stance: it celebrates you. Every check-off, focus session, and standup log earns you XP. After 2–3 tasks it nudges you with a small banner. After 5, you get a bigger one. After 10, the OS throws a tiny party. It's gamification without the grind, meant to make the climb feel good, not to addict you to the climb.
Demo
- Live app: taskstack-psi.vercel.app
- Source: https://github.com/tambo-h/crowdlens
- Try the Level Journey nav item, then check off a few skills in Skills Track to see the realtime XP, level-up animations, and encouragement banners in action.
The Comeback Story
When I forked the comparison, main was a perfectly respectable Next.js 15 productivity app. It had:
- A multi-view dashboard (Pomodoro, Skills, Links, Inspiration, Rules, Journal, Snippets, Standup, Energy, Weekly Review)
- A Tambo AI side panel with 11 generative components and 25 tools
- PIN-based authentication
- Upstash Redis for multi-user state
- OpenRouter integration for AI workspace setup
- An AI expansion feature that broke skill challenges into step-by-step plans
- A "Recovery Mode" that auto-switched the UI to dark when energy was low
It also had a lot of "I'll get to it" debt. Here's the before-and-after:
New Features Shipped
1. Real authentication — Google OAuth end to end
The PIN system was cute but it wasn't a real account model. I added a full OAuth 2.0 flow:
-
/api/auth/googlekicks off the request -
/auth/google/callbackexchanges the code for tokens -
/api/auth/meexposes the current session as a JSON endpoint - A
googleProfilecarries the user's name, email, and avatar into the productivity context - The profile menu, onboarding, and dashboard all learned to read both PIN and Google sessions
A user can now sign in with Google and have their workspace, level, streak, and unlocks survive across devices. It feels like a real product now.
2. AI-generated deadlines — at three levels
Before, the AI gave you challenges but not timelines. Now generatePersonalizedData() and generateChallengeDetails() accept a currentDate and emit:
- A per-step deadline for every sub-task
- A per-challenge deadline for every skill
- A track-level deadline for the whole role
The UI shows them with color-coded status (🔴 overdue / 🟡 due soon / 🟢 on track), and the expansion modal even passes the challenge deadline down so step deadlines stay anchored to the parent timeline. It's a small thing that turns "I'll do this someday" into "I have until Friday."
3. AI coaching reviews — per role
The AI can now generate a coach review of any role's progress: which challenges are slipping, which steps are blocked, and what to focus on next week. Reviews are cached per user per role in localStorage and re-fetched on demand.
4. Project-based link management
Links now have a role (project) field. The Link Card view groups them by project, filters by project, and the AI workspace setup tags every resource it curates with the right project. Saving a link awards XP; viewing a project's resources feels like flipping through a curated reading list.
5. Gamification system — XP, levels, achievements, streaks
This is the biggest single addition. The new gamification-service + gamification-config track:
- 13 funny levels (Sleepy Intern → Productivity Master) at thresholds from 0 to 15,000 XP
- 10 achievements (First Blood, 3-Day Streak, Pomodoro Apprentice, Polymath, etc.) with bonus XP for unlocking
- A streak counter with a ×1.5 XP multiplier for 3+ day streaks
- A daily-first-action bonus (×1.25)
- XP awarded for every meaningful action: completing a step, finishing a challenge, finishing a Pomodoro, logging a standup, saving a snippet, etc.
The XP amounts are tuned: 5 for a step, 50 for a full challenge, 75 for setting up a new track. Big actions feel big, small actions still feel like something.
6. Nudges — 40+ encouragement messages
A dedicated nudges-config.ts with eight categories:
- 12 generic ambient affirmations (weighted-random — "Done. Onward.", "Brain says thanks.", "Buzzing along nicely.")
- 14 milestone messages at exact task counts (2, 3, 5, 10, 15, 20, 25, 30…) with escalating visual variants
- 6 combo messages for "3 in 5 minutes", "5 in 15 minutes", etc.
- 2 speed messages ("3 in a minute — are you a wizard?")
- 6 streak messages for 2, 3, 5, 7, 14, 30 day streaks
- 3 variety messages for mixing multiple roles in a session
- 4 comeback messages for 4h, 12h, 24h, 72h gaps
- 4 level-up flavor messages
A nudge-manager tracks session state in localStorage and decides which one fires when, with de-duplication so you never see the same generic twice in a row.
7. Realtime XP feedback
When you check off a skill, three things happen in under 200 ms:
- A
+XPnumber flies up from the exact click point - A small XP toast appears in the bottom-right
- A new "Session: N" counter pulses in the Skill Track header
After 2–3 tasks, a top-center slide-in banner fires ("Three in a row. You're on a roll."). After 5, a bigger one. After 10, the celebration variant with the party-popper icon.
8. The "Level Journey" — visualizing all 13 levels
The dashboard's single progress bar is gone. In its place: a dedicated Level Journey view (also linked from the dashboard badge with a "View full journey" CTA) that shows all 13 levels as a vertical "Climb" timeline. Each level has five visual states (completed, current, next, near, far), animated connector lines, a pulsing border on the current level, a flag on the final summit, and per-level XP callouts ("3,200 XP to climb", "850 XP away").
The hero section puts the user's current emoji + title + blurb front and center with a fat "X XP to go" callout to the next level.
Existing Features That Got Better
The diff is +4,318 / −325 lines, but a lot of that was genuinely hardening, not new surface area:
-
Pomodoro timer — a 642-line rewrite that adds a tabbed UI (Timer / Stats / Settings), ticking-sound support, auto-start options, project tagging, and proper persistence to a session history in
localStorage. The timer now awards+25 XPon completion (not just on start) via acompleted: trueflag. - Productivity dashboard — the Level Badge now lives in the header with realtime progress, a streak indicator, and a "View full journey" CTA. The daily wisdom and weekend reflection copy is preserved.
-
Skill tracker — optimistic updates, real-time XP feedback on every click, an inline
Session: Ncounter, deadline badges with color-coded status, edit/delete confirmations, and an "Add" step UI that validates against empty titles. -
Message input — supports
text-style formatting shortcuts, a "nudge" button to ping the AI, and clearer streaming states. - App onboarding — guided multi-step flow that captures a persona (age, role, interests, city) and seeds a starter workspace. The onboarding was rewritten to integrate with the new Google sign-in.
-
Productivity context — 177 lines added: new
gamificationtypes,lastSetupRolefor seamless redirect,confirmStatefor global confirmations, and acreativeRefreshTriggerthat fans out to the dashboard, gamification panel, and skill tracker in lockstep. - Link card — project grouping, role-based filtering, and XP-on-save.
Quiet but important under-the-hood work
- Server actions now return rich XP data so the client can show feedback without a second round trip
- The achievement checker became async and returns newly-unlocked achievements so the UI can show them
- Redis keys are namespaced per user (
xp:${userId},streak:${userId},active_roles:${userId}) so a guest PIN and a Google account can't collide - Localhost OAuth redirect URIs and the Vercel production callback URL are both registered
- All Redis server actions got
"use server"discipline; pure helpers moved intogamification-config.tsso the client can import them safely - The "use server" build error I hit (exporting pure helpers from a server file) was fixed by splitting config from service
- Build is clean:
✓ Compiled successfully, all 11 routes pre-rendered, no type errors
My Experience with GitHub Copilot
For this project, I used GitHub Copilot as my coding partner.
One of the most useful things I did was ask Copilot to analyze my entire project and suggest improvements that could be completed in a short amount of time. Instead of focusing only on new features, it helped identify areas where the app could be improved, cleaned up, and made more polished.
Copilot helped me find opportunities to improve the user experience, simplify code, organize components better, and make the application feel more complete. It was especially useful for spotting areas that I had overlooked after working on the project for a long time.
Some of the areas where it helped the most were:
Finding parts of the code that could be simplified or reused.
Suggesting improvements to the component structure.
Identifying potential issues before they became problems.
Recommending UI and usability improvements.
Helping speed up repetitive development tasks.
Live: taskstack-psi.vercel.app · Source: github.com/tambo-h/crowdlens











Top comments (0)