<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: divinefavour1234567</title>
    <description>The latest articles on DEV Community by divinefavour1234567 (@divinefavour1234567).</description>
    <link>https://dev.to/divinefavour1234567</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3994360%2F615f9f21-7e2f-4227-87de-172c14236bf1.png</url>
      <title>DEV Community: divinefavour1234567</title>
      <link>https://dev.to/divinefavour1234567</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/divinefavour1234567"/>
    <language>en</language>
    <item>
      <title>How We Built an AI-Powered Career RPG Quest for the YouthCodeX Hackathon 🚀🎮</title>
      <dc:creator>divinefavour1234567</dc:creator>
      <pubDate>Tue, 23 Jun 2026 13:23:25 +0000</pubDate>
      <link>https://dev.to/divinefavour1234567/how-we-built-an-ai-powered-career-rpg-quest-for-the-youthcodex-hackathon-bk7</link>
      <guid>https://dev.to/divinefavour1234567/how-we-built-an-ai-powered-career-rpg-quest-for-the-youthcodex-hackathon-bk7</guid>
      <description>&lt;p&gt;Hey DEV community! 👋&lt;/p&gt;

&lt;p&gt;For the YouthCodeX AI Hackathon, my partner and I wanted to build something that solves a massive problem for teenagers: career decision paralysis and job hunt readiness.&lt;/p&gt;

&lt;p&gt;Most career advisors are static lists of links. We wanted to build something that feels alive—so we built PathFinder AI: a gamified, level-locked career RPG simulator featuring Web Audio synth effects, Apple Siri-style voice visualizers, side-by-side ATS resume diffs, and boss-fight salary negotiations.&lt;/p&gt;

&lt;p&gt;Here is how we built it, the tech stack, and what we learned.&lt;/p&gt;

&lt;p&gt;💡 The Core Experience: From "Intern" to "Executive Partner"&lt;br&gt;
To make career guidance engaging, we gamified the entire flow. Users earn EXP by:&lt;/p&gt;

&lt;p&gt;Completing milestones on their career trees.&lt;br&gt;
Solving quick-fire coding riddles on the Dashboard.&lt;br&gt;
Conducting mock voice interviews.&lt;br&gt;
Surviving Day-in-the-Life RPG scenarios.&lt;br&gt;
As they climb ranks, features unlock progressively:&lt;/p&gt;

&lt;p&gt;Level 1: Dashboard &amp;amp; AI Voice Interviews&lt;br&gt;
Level 2: Nigeria Cost-of-Living Rent Calculator &amp;amp; Resume ATS Critique&lt;br&gt;
Level 3: Salary Negotiator Sandbox (Scrooge &amp;amp; Victoria Boss fights)&lt;br&gt;
Level 4: 3D Holographic Skills Radar Map &amp;amp; Career Explorer&lt;br&gt;
Level 5: Day-in-the-Life text RPG Simulator&lt;br&gt;
Level 6: Hard-mode Mentor Marketplace&lt;br&gt;
When a user levels up, a full-screen Level Up Celebration Modal triggers, throwing a physical particle explosion across their screen accompanied by a synthesizer major sweep chord!&lt;/p&gt;

&lt;p&gt;🛠️ Key Features &amp;amp; Tech Stack&lt;br&gt;
Our stack is lightweight and zero-dependency to optimize load speed and responsiveness:&lt;/p&gt;

&lt;p&gt;Frontend: React (Vite) + Context API&lt;br&gt;
AI Integration: Direct client-side SDK integration with the Google Gemini API (@google/generative-ai) with high-fidelity local mock fallbacks for demo modes.&lt;br&gt;
Styling: Vanilla CSS establishing a sleek, glassmorphic dark-neon design system.&lt;br&gt;
Visualizations: Zero-dependency HTML5 Canvas rendering for 3D projections and physics.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Zero-Dependency 3D Vector Math on Canvas 🌐
Instead of importing heavy WebGL packages, we wrote custom 3D rotation projection matrices directly onto HTML5 2D contexts:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Interactive 3D Skill Radar: Concentric spider-web polygons showing core capabilities vs gaps. Includes parallax mouse-tilt and floating course tags connect via dashed trails.&lt;br&gt;
Cinematic Laboratory Space: Silhouetted teenagers pointing at floating holograms (code blocks, AI coaches, resume scorecards) with a slow panning matrix.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apple Siri-Style Bezier Waveform 🎙️
During mock interviews, a canvas plots multiple overlapping translucent Bezier curves with varying amplitudes and phases. When the Web Speech API reads questions aloud, the wave height dynamically pulses, and flatlines once silent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;// Siri-style waveform envelope generator preview&lt;br&gt;
const drawWave = (ctx, width, height, time, speed, amplitude, offset) =&amp;gt; {&lt;br&gt;
  ctx.beginPath();&lt;br&gt;
  for (let x = 0; x &amp;lt; width; x++) {&lt;br&gt;
    const scale = Math.sin((x / width) * Math.PI); // Clamp wave edges&lt;br&gt;
    const y = Math.sin(x * 0.02 + time * speed + offset) * amplitude * scale + height / 2;&lt;br&gt;
    if (x === 0) ctx.moveTo(x, y);&lt;br&gt;
    else ctx.lineTo(x, y);&lt;br&gt;
  }&lt;br&gt;
  ctx.stroke();&lt;br&gt;
};&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Web Audio Synth Soundscapes 🔊&lt;br&gt;
To maintain a high-fidelity retro-modern aesthetic, we bypassed heavy audio assets and synthesized game cues locally using the Web Audio API:&lt;br&gt;
// Lightweight major arpeggio sweep chord on level up&lt;br&gt;
export const playLevelUpSound = () =&amp;gt; {&lt;br&gt;
const ctx = new AudioContext();&lt;br&gt;
const now = ctx.currentTime;&lt;br&gt;
const notes = [261.63, 329.63, 392.00, 523.25, 659.25, 1046.50]; // C4 -&amp;gt; C6 sweep&lt;br&gt;
notes.forEach((freq, idx) =&amp;gt; {&lt;br&gt;
const osc = ctx.createOscillator();&lt;br&gt;
const gain = ctx.createGain();&lt;br&gt;
osc.type = "triangle";&lt;br&gt;
osc.frequency.setValueAtTime(freq, now + idx * 0.06);&lt;br&gt;
gain.gain.setValueAtTime(0.06, now + idx * 0.06);&lt;br&gt;
gain.gain.exponentialRampToValueAtTime(0.001, now + idx * 0.06 + 0.3);&lt;br&gt;
osc.connect(gain);&lt;br&gt;
gain.connect(ctx.destination);&lt;br&gt;
osc.start(now + idx * 0.06);&lt;br&gt;
osc.stop(now + idx * 0.06 + 0.35);&lt;br&gt;
});&lt;br&gt;
};&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interactive Salary Negotiator Boss Fight 💼&lt;br&gt;
Instead of a simple salary slider, users go head-to-head with strict virtual hiring managers (Alex the HR Intern, Scrooge the Finance Lead, Victoria the VP, and Karen the CFO Boss).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Gemini API acts as the strict boss analyzing counter-offers.&lt;br&gt;
Ultimate Stress HUD: Users must justify counter-proposals with career keywords (e.g. React, PyTorch). Begging or excessive rates deplete the boss's patience gauge and trigger biometric alarm sound pulses, culminating in a rescinded offer if it hits zero!&lt;/p&gt;

&lt;p&gt;💡 What We Learned&lt;br&gt;
AI Prompts need strict structures: To feed charts, progress bars, and scorecards in real-time, we configured Gemini to return structured JSON. Cleaning Markdown blocks (&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
json wrapper overrides) using clean RegExp regex replacements was critical to preventing client-side JSON.parse() parser crashes.
Web Audio is a superpower: You don't need megabytes of .wav assets to make an application sound immersive. A few lines of Oscillator nodes can trigger blips, clicks, and chords at near-zero latency.
Visual Diffs aid comprehension: When correcting a resume, users hate raw suggestions. Highlighting deletions in red strikethrough and insertions in green is intuitive and familiar to developers.

🔮 What's Next?
We plan to integrate a persistent database to sync profiles across devices, add more RPG scenarios, and expand our local cost-of-living calculations database to index rent indexes across more African tech hubs.

Check out our project and let us know what you think! We’d love to hear your feedback on the gamification setup or the canvas animations.

Leave a ⭐ if you liked the idea! Happy hacking!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>ai</category>
      <category>react</category>
    </item>
    <item>
      <title>Title: How I Built ZenPlan: A Premium AI Habit Tracker with Next.js, Vercel OIDC, and Amazon DynamoDB</title>
      <dc:creator>divinefavour1234567</dc:creator>
      <pubDate>Sat, 20 Jun 2026 16:32:29 +0000</pubDate>
      <link>https://dev.to/divinefavour1234567/title-how-i-built-zenplan-a-premium-ai-habit-tracker-with-nextjs-vercel-oidc-and-amazon-314l</link>
      <guid>https://dev.to/divinefavour1234567/title-how-i-built-zenplan-a-premium-ai-habit-tracker-with-nextjs-vercel-oidc-and-amazon-314l</guid>
      <description>&lt;p&gt;I built this for the Hack the Zero Stack with Vercel v0 and AWS Databases Hackathon.&lt;br&gt;
Here's the thing—building a habit tracker sounds easy until you actually start building it. Check off a box, increment a counter, save it. Done, right? Wrong. If you want it to feel premium, look polished, and actually work without lag or weird edge-caching bugs, it gets complicated fast.&lt;br&gt;
So I decided to build ZenPlan—a dark, glassmorphic habit tracker and routine planner that actually feels like a real app. I deployed it serverless on Vercel, hooked it up to Amazon DynamoDB, and ran into some genuinely interesting engineering problems. Let me walk you through how I built it.&lt;br&gt;
What's ZenPlan Actually Do?&lt;br&gt;
I didn't want just another boring checklist. The whole point was to make it feel alive and interactive.&lt;br&gt;
When you check off a habit, it triggers this CSS particle animation that actually feels good. I also built an AI Coach you can chat with—like, actually useful. If the coach suggests something (morning meditation, whatever), it renders an "Add to Dashboard" button right in the chat and writes it straight to your database. No copy-paste, no manual entry.&lt;br&gt;
On top of that, there's an analytics section showing your streaks, a checkout modal where you can simulate upgrading to Pro, and even an interactive architecture diagram showing how data actually flows through the system in real-time.&lt;br&gt;
For the tech stack, I went with Next.js 16 (App Router), Tailwind CSS, and Framer Motion on the frontend, backed by Amazon DynamoDB.&lt;br&gt;
The Security Thing: Vercel OIDC + AWS IAM&lt;br&gt;
Technical Deep Dive 2: Tackling Edge Caching &amp;amp; State Persistence&lt;br&gt;
During deployment on Vercel, I noticed that upgrading or cancelling a subscription plan would occasionally show outdated badges on the navbar due to Edge caching. I'd click upgrade, Vercel would execute it successfully, but the UI badge wouldn't update until a hard browser refresh.&lt;/p&gt;

&lt;p&gt;To fix this, we forced dynamic routing on the API and injected explicit Cache-Control header directives into src/app/api/profile/route.ts:     import { NextResponse } from 'next/server';&lt;br&gt;
import { db, isDynamoConfigured } from '@/lib/db';&lt;/p&gt;

&lt;p&gt;export const dynamic = 'force-dynamic';&lt;/p&gt;

&lt;p&gt;export async function GET() {&lt;br&gt;
  try {&lt;br&gt;
    const profile = await db.getProfile();&lt;br&gt;
    return NextResponse.json({&lt;br&gt;
      ...profile,&lt;br&gt;
      dbMode: isDynamoConfigured ? 'Amazon DynamoDB' : 'Local File Simulator',&lt;br&gt;
    }, {&lt;br&gt;
      headers: {&lt;br&gt;
        'Cache-Control': 'no-store, max-age=0, must-revalidate',&lt;br&gt;
      },&lt;br&gt;
    });&lt;br&gt;
  } catch (error) {&lt;br&gt;
    console.error('API GET profile error:', error);&lt;br&gt;
    return NextResponse.json({ error: 'Failed to fetch profile' }, { status: 500 });&lt;br&gt;
  }&lt;br&gt;
}                                                                                            Alongside this server-side configuration, client-side fetches were updated with cache-busting search parameters:                                                     const response = await fetch(&lt;code&gt;/api/profile?t=${Date.now()}&lt;/code&gt;, {&lt;br&gt;
  cache: 'no-store'&lt;br&gt;
});                                                                             This double-layered solution ensures state modifications (e.g., ticking off a habit or upgrading a subscription) reflect instantly without reloading or facing stale client mismatches.&lt;/p&gt;

&lt;p&gt;Technical Deep Dive 3: Single-Table DynamoDB Mode&lt;br&gt;
For maximum performance and cost optimization, we structured profiles and habits in a single DynamoDB table. When DYNAMODB_TABLE_NAME is configured, the application appends partition keys (PK) and sort keys (SK):&lt;/p&gt;

&lt;p&gt;Profile Key: PK: PROFILE#default-user | SK: PROFILE&lt;br&gt;
Habit Key: PK: HABIT# | SK: HABIT&lt;br&gt;
Doing index scans on these partition and sort keys allowed us to fetch all dashboard dependencies in index scans, resulting in blazing fast loads.&lt;/p&gt;

&lt;p&gt;What I Learned&lt;br&gt;
OIDC is the Future: Passwordless integrations make serverless deploys safer and easier to maintain.&lt;br&gt;
Edge Cache Busting: When compiling React Server Components and Edge Route handlers, you must be extremely explicit about cache control header policies to keep client views synchronized.                                                                                                                                                                                    Links&lt;br&gt;
Live Demo: &lt;a href="https://zenplan-six.vercel.app" rel="noopener noreferrer"&gt;https://zenplan-six.vercel.app&lt;/a&gt;&lt;br&gt;
GitHub Repository: &lt;a href="https://github.com/divinefavour1234567/zenplan" rel="noopener noreferrer"&gt;https://github.com/divinefavour1234567/zenplan&lt;/a&gt;&lt;br&gt;
Thank you to Vercel and AWS for hosting this amazing Hackathon! If you liked ZenPlan, please drop a star on the repo!&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>aws</category>
      <category>dynamodb</category>
      <category>vercel</category>
    </item>
  </channel>
</rss>
