DEV Community

Cover image for Finishing What I Started: Building TaskStack version:2
sonu suresh
sonu suresh

Posted on

Finishing What I Started: Building TaskStack version:2

GitHub “Finish-Up-A-Thon” Challenge Submission

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

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/google kicks off the request
  • /auth/google/callback exchanges the code for tokens
  • /api/auth/me exposes the current session as a JSON endpoint
  • A googleProfile carries 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

Before : Pin login

After: Login with google

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

Before: AI just gave suggestions

After: AI generates dynamic ui

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.

User Persona

Coaching reviews

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.

links have separate categories

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 +XP number 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

XP Feedback

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").

Levels

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 XP on completion (not just on start) via a completed: true flag.
  • 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.

Pomodoro stats

  • Skill tracker — optimistic updates, real-time XP feedback on every click, an inline Session: N counter, 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 gamification types, lastSetupRole for seamless redirect, confirmState for global confirmations, and a creativeRefreshTrigger that 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 into gamification-config.ts so 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)