<?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>Forem: Vishal Narayan</title>
    <description>The latest articles on Forem by Vishal Narayan (@vishal_narayan_75221d21cc).</description>
    <link>https://forem.com/vishal_narayan_75221d21cc</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3388391%2Fe70bdc10-d828-40c2-8ab7-50c09487309d.png</url>
      <title>Forem: Vishal Narayan</title>
      <link>https://forem.com/vishal_narayan_75221d21cc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/vishal_narayan_75221d21cc"/>
    <language>en</language>
    <item>
      <title>I Kept Quitting Habit Apps — So I Built One That Punishes Me If I Do.</title>
      <dc:creator>Vishal Narayan</dc:creator>
      <pubDate>Thu, 09 Apr 2026 13:27:39 +0000</pubDate>
      <link>https://forem.com/vishal_narayan_75221d21cc/i-kept-quitting-habit-apps-so-i-built-one-that-punishes-me-if-i-do-35am</link>
      <guid>https://forem.com/vishal_narayan_75221d21cc/i-kept-quitting-habit-apps-so-i-built-one-that-punishes-me-if-i-do-35am</guid>
      <description>&lt;p&gt;Most habit apps failed me.&lt;/p&gt;

&lt;p&gt;Not because they were bad… but because I was inconsistent.&lt;/p&gt;

&lt;p&gt;I’d start strong, track everything perfectly for a few days, then miss one day — and that was enough to spiral into quitting entirely.&lt;/p&gt;

&lt;p&gt;No real consequences. No accountability. Just another broken streak.&lt;/p&gt;

&lt;p&gt;So I decided to experiment with a different idea:&lt;/p&gt;

&lt;p&gt;What if failing had a cost?&lt;/p&gt;

&lt;p&gt;💡 The Core Idea&lt;/p&gt;

&lt;p&gt;Instead of just tracking habits, I built something that adds commitment.&lt;/p&gt;

&lt;p&gt;The app is called Covenant.&lt;/p&gt;

&lt;p&gt;Here’s how it works:&lt;/p&gt;

&lt;p&gt;You stake credits before starting a habit&lt;br&gt;
You complete your task (gym, coding, reading, etc.)&lt;br&gt;
You submit proof (AI-verified photo or synced health/app data)&lt;br&gt;
If you succeed → you get your credits back&lt;br&gt;
If you fail → they’re burned&lt;/p&gt;

&lt;p&gt;No second chances. No “I’ll make it up tomorrow”.&lt;/p&gt;

&lt;p&gt;🧠 Why This Approach?&lt;/p&gt;

&lt;p&gt;Most habit systems rely on motivation.&lt;/p&gt;

&lt;p&gt;But motivation is unreliable.&lt;/p&gt;

&lt;p&gt;I wanted to explore three things instead:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Skin in the Game&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When there’s something at risk, your behavior changes. Even a small stake creates pressure to follow through.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accountability&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Doing things alone is easy to abandon. Adding squad-based visibility makes inconsistency visible.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Friction Against Cheating&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most apps trust self-reporting. I didn’t.&lt;/p&gt;

&lt;p&gt;So I added:&lt;/p&gt;

&lt;p&gt;AI-based photo verification&lt;br&gt;
Health data syncing&lt;br&gt;
App usage tracking&lt;/p&gt;

&lt;p&gt;The goal was to reduce “fake progress” without making the experience painful.&lt;/p&gt;

&lt;p&gt;⚙️ How I Built It&lt;br&gt;
Frontend: React Native (Expo)&lt;br&gt;
Backend: Supabase (Auth, Postgres, Realtime)&lt;br&gt;
AI Verification: Groq (Llama Vision) + Gemini&lt;br&gt;
Styling: NativeWind&lt;/p&gt;

&lt;p&gt;One of the hardest parts wasn’t building features — it was balancing strictness vs usability.&lt;/p&gt;

&lt;p&gt;Too strict → people quit&lt;br&gt;
Too loose → system becomes meaningless&lt;/p&gt;

&lt;p&gt;⚠️ Challenges I Ran Into&lt;br&gt;
Designing a system that feels fair even when users fail&lt;br&gt;
Preventing obvious ways to game verification&lt;br&gt;
Avoiding “gambling” mechanics while still having stakes&lt;br&gt;
Keeping onboarding simple despite a complex idea&lt;br&gt;
🚀 What I Learned&lt;br&gt;
People don’t need better reminders — they need better systems&lt;br&gt;
Social pressure is underrated in habit building&lt;br&gt;
Adding consequences changes behavior more than adding rewards&lt;br&gt;
📱 If You Want to Try It&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.keepcovenant.app" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.keepcovenant.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🤔 Open Questions&lt;/p&gt;

&lt;p&gt;I’m still figuring a lot of this out:&lt;/p&gt;

&lt;p&gt;Does this build long-term discipline or just short-term compliance?&lt;br&gt;
Is losing your stake motivating… or discouraging?&lt;br&gt;
How much verification is too much?&lt;/p&gt;

&lt;p&gt;Would love to hear your thoughts — especially if you’ve tried building or using habit systems before.&lt;/p&gt;

</description>
      <category>devchallenge</category>
    </item>
    <item>
      <title>I Kept Quitting Habit Apps — So I Built One That Punishes Me If I Do</title>
      <dc:creator>Vishal Narayan</dc:creator>
      <pubDate>Thu, 09 Apr 2026 13:26:39 +0000</pubDate>
      <link>https://forem.com/vishal_narayan_75221d21cc/i-kept-quitting-habit-apps-so-i-built-one-that-punishes-me-if-i-do-40he</link>
      <guid>https://forem.com/vishal_narayan_75221d21cc/i-kept-quitting-habit-apps-so-i-built-one-that-punishes-me-if-i-do-40he</guid>
      <description>&lt;p&gt;Most habit apps failed me.&lt;/p&gt;

&lt;p&gt;Not because they were bad… but because I was inconsistent.&lt;/p&gt;

&lt;p&gt;I’d start strong, track everything perfectly for a few days, then miss one day — and that was enough to spiral into quitting entirely.&lt;/p&gt;

&lt;p&gt;No real consequences. No accountability. Just another broken streak.&lt;/p&gt;

&lt;p&gt;So I decided to experiment with a different idea:&lt;/p&gt;

&lt;p&gt;What if failing had a cost?&lt;/p&gt;

&lt;p&gt;💡 The Core Idea&lt;/p&gt;

&lt;p&gt;Instead of just tracking habits, I built something that adds commitment.&lt;/p&gt;

&lt;p&gt;The app is called Covenant.&lt;/p&gt;

&lt;p&gt;Here’s how it works:&lt;/p&gt;

&lt;p&gt;You stake credits before starting a habit&lt;br&gt;
You complete your task (gym, coding, reading, etc.)&lt;br&gt;
You submit proof (AI-verified photo or synced health/app data)&lt;br&gt;
If you succeed → you get your credits back&lt;br&gt;
If you fail → they’re burned&lt;/p&gt;

&lt;p&gt;No second chances. No “I’ll make it up tomorrow”.&lt;/p&gt;

&lt;p&gt;🧠 Why This Approach?&lt;/p&gt;

&lt;p&gt;Most habit systems rely on motivation.&lt;/p&gt;

&lt;p&gt;But motivation is unreliable.&lt;/p&gt;

&lt;p&gt;I wanted to explore three things instead:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Skin in the Game&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When there’s something at risk, your behavior changes. Even a small stake creates pressure to follow through.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accountability&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Doing things alone is easy to abandon. Adding squad-based visibility makes inconsistency visible.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Friction Against Cheating&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most apps trust self-reporting. I didn’t.&lt;/p&gt;

&lt;p&gt;So I added:&lt;/p&gt;

&lt;p&gt;AI-based photo verification&lt;br&gt;
Health data syncing&lt;br&gt;
App usage tracking&lt;/p&gt;

&lt;p&gt;The goal was to reduce “fake progress” without making the experience painful.&lt;/p&gt;

&lt;p&gt;⚙️ How I Built It&lt;br&gt;
Frontend: React Native (Expo)&lt;br&gt;
Backend: Supabase (Auth, Postgres, Realtime)&lt;br&gt;
AI Verification: Groq (Llama Vision) + Gemini&lt;br&gt;
Styling: NativeWind&lt;/p&gt;

&lt;p&gt;One of the hardest parts wasn’t building features — it was balancing strictness vs usability.&lt;/p&gt;

&lt;p&gt;Too strict → people quit&lt;br&gt;
Too loose → system becomes meaningless&lt;/p&gt;

&lt;p&gt;⚠️ Challenges I Ran Into&lt;br&gt;
Designing a system that feels fair even when users fail&lt;br&gt;
Preventing obvious ways to game verification&lt;br&gt;
Avoiding “gambling” mechanics while still having stakes&lt;br&gt;
Keeping onboarding simple despite a complex idea&lt;br&gt;
🚀 What I Learned&lt;br&gt;
People don’t need better reminders — they need better systems&lt;br&gt;
Social pressure is underrated in habit building&lt;br&gt;
Adding consequences changes behavior more than adding rewards&lt;br&gt;
📱 If You Want to Try It&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.keepcovenant.app" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.keepcovenant.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
    <item>
      <title>✨ Just shipped a fun project – PopChoice, an AI-powered movie recommendation system 🎥</title>
      <dc:creator>Vishal Narayan</dc:creator>
      <pubDate>Tue, 02 Sep 2025 11:47:51 +0000</pubDate>
      <link>https://forem.com/vishal_narayan_75221d21cc/just-shipped-a-fun-project-popchoice-an-ai-powered-movie-recommendation-system-5mi</link>
      <guid>https://forem.com/vishal_narayan_75221d21cc/just-shipped-a-fun-project-popchoice-an-ai-powered-movie-recommendation-system-5mi</guid>
      <description>&lt;p&gt;I just finished building a project called PopChoice 🎬 – it’s an AI-powered movie recommendation app that suggests films based on your preferences.&lt;/p&gt;

&lt;p&gt;🔧 Tech highlights:&lt;/p&gt;

&lt;p&gt;Nomic embeddings + Supabase vector DB for semantic search&lt;/p&gt;

&lt;p&gt;LLM-driven recommendations via Groq&lt;/p&gt;

&lt;p&gt;Enriched with OMDb API posters &amp;amp; metadata&lt;/p&gt;

&lt;p&gt;Frontend: React + Vite with a modern glassmorphic UI&lt;/p&gt;

&lt;p&gt;👉 Try it live: pppppop-choice-app.netlify.app&lt;/p&gt;

&lt;p&gt;👉 Code: GitHub Repo&lt;/p&gt;

&lt;p&gt;Would love your feedback on:&lt;/p&gt;

&lt;p&gt;UX / UI polish&lt;/p&gt;

&lt;p&gt;Recommendation quality&lt;/p&gt;

&lt;p&gt;Features you think would make it better&lt;/p&gt;

&lt;p&gt;Thanks in advance!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Personal Dashboard — new-tab extension with dynamic backgrounds, weather, quick links &amp; daily facts</title>
      <dc:creator>Vishal Narayan</dc:creator>
      <pubDate>Sun, 31 Aug 2025 13:15:13 +0000</pubDate>
      <link>https://forem.com/vishal_narayan_75221d21cc/personal-dashboard-new-tab-extension-with-dynamic-backgrounds-weather-quick-links-daily-facts-4ga</link>
      <guid>https://forem.com/vishal_narayan_75221d21cc/personal-dashboard-new-tab-extension-with-dynamic-backgrounds-weather-quick-links-daily-facts-4ga</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fga8ucbsnql4v1ihch10k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fga8ucbsnql4v1ihch10k.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;br&gt;
I built a new-tab browser extension called Personal Dashboard that replaces your new tab with a customizable dashboard: dynamic Unsplash backgrounds (category selection + smart text-color), real-time time/date with personalized greetings, location-based weather, customizable quick links with favicon support, and daily advice + interesting facts. &lt;/p&gt;

&lt;p&gt;Install as an unpacked extension in Chrome/Edge/Brave (or load temporary in Firefox). API keys are required — .env.example and setup steps are in the repo. &lt;/p&gt;

&lt;p&gt;Uses Unsplash, OpenWeatherMap, AdviceSlip and API-Ninjas for content; preferences are stored in localStorage. &lt;/p&gt;

&lt;p&gt;Built with vanilla JavaScript (ES6 modules), CSS Grid/Flexbox and glassmorphism UI. MIT licensed — feedback and PRs welcome. &lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/vishalnarayan2809/personal-dashboard" rel="noopener noreferrer"&gt;https://github.com/vishalnarayan2809/personal-dashboard&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>frontend</category>
    </item>
    <item>
      <title>🤖 I built a Chrome extension that makes my resume less embarrassing using AI (and it actually works?)</title>
      <dc:creator>Vishal Narayan</dc:creator>
      <pubDate>Thu, 14 Aug 2025 17:05:32 +0000</pubDate>
      <link>https://forem.com/vishal_narayan_75221d21cc/i-built-a-chrome-extension-that-makes-my-resume-less-embarrassing-using-ai-and-it-actually-30e2</link>
      <guid>https://forem.com/vishal_narayan_75221d21cc/i-built-a-chrome-extension-that-makes-my-resume-less-embarrassing-using-ai-and-it-actually-30e2</guid>
      <description>&lt;p&gt;So I was tired of copy-pasting the same generic resume for every job and getting crickets back. Like, why would a startup care that I'm "proficient in Microsoft Office" when they're looking for someone who can "move fast and break things"? &lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;AI Presume&lt;/strong&gt; - a Chrome extension that takes your boring resume and job description, throws them at Groq's Llama model, and spits out a tailored resume that actually makes sense for the role.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The weird part?&lt;/strong&gt; It works entirely in your browser. No sketchy servers, no "we'll store your data safely" promises. Your resume stays on your machine while the AI does its magic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Even weirder:&lt;/strong&gt; It exports to PDF with actual selectable text and clickable links. I know, revolutionary stuff in 2025.&lt;/p&gt;

&lt;p&gt;Built it because I was procrastinating on actual job applications, but now I'm actually using it for... actual job applications. The irony is not lost on me.&lt;/p&gt;

&lt;p&gt;Some features that make me unreasonably proud:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeps your formatting intact (finally, an AI that respects my carefully crafted margins)&lt;/li&gt;
&lt;li&gt;One-page limit with auto-compression (because nobody reads page 2 anyway)&lt;/li&gt;
&lt;li&gt;Works on all the Chromium browsers your company forces you to use&lt;/li&gt;
&lt;li&gt;Privacy-first (your embarrassing employment gaps stay between you and the AI)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fair warning: It's Manifest V3, so Firefox users get the "it might work, it might not" experience. Chrome users get the full treatment.&lt;/p&gt;

&lt;p&gt;Check it out if you're also tired of explaining why your 2019 "WordPress blog maintenance" experience makes you qualified for a Senior DevOps role: &lt;a href="https://github.com/vishalnarayan2809/AI-Resume-extension" rel="noopener noreferrer"&gt;https://github.com/vishalnarayan2809/AI-Resume-extension&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S. - Yes, I used this extension to tailor my resume for posting about this extension. Meta level: achieved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Made a thing that makes job hunting slightly less soul-crushing. It's free, it's local, and it might help you get past those ATS robots that definitely judge your Times New&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>career</category>
    </item>
    <item>
      <title>I proved ChatGPT wrong for the first time!</title>
      <dc:creator>Vishal Narayan</dc:creator>
      <pubDate>Sat, 26 Jul 2025 05:40:52 +0000</pubDate>
      <link>https://forem.com/vishal_narayan_75221d21cc/i-proved-chatgpt-wrong-for-the-first-time-4i54</link>
      <guid>https://forem.com/vishal_narayan_75221d21cc/i-proved-chatgpt-wrong-for-the-first-time-4i54</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo8ifjl9wauaxlh5s4d8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo8ifjl9wauaxlh5s4d8n.png" alt=" " width="783" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqcbs10kvog1kw5ljkp47.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqcbs10kvog1kw5ljkp47.png" alt=" " width="530" height="798"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foroxkf9g7a9yqr7ah5jz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foroxkf9g7a9yqr7ah5jz.png" alt=" " width="778" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpimcgdodsd2vlv4clrzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpimcgdodsd2vlv4clrzi.png" alt=" " width="679" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>html</category>
    </item>
  </channel>
</rss>
