<?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: Abdul Moiz</title>
    <description>The latest articles on DEV Community by Abdul Moiz (@abdul_moiz_121).</description>
    <link>https://dev.to/abdul_moiz_121</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%2F4026483%2F8b252721-e15d-4ec3-b66a-a082cddc2352.jpg</url>
      <title>DEV Community: Abdul Moiz</title>
      <link>https://dev.to/abdul_moiz_121</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdul_moiz_121"/>
    <language>en</language>
    <item>
      <title>How I Built an AI Resume Checker with React Native + Gemini + Supabase (in Under a Month, at $0/mo)</title>
      <dc:creator>Abdul Moiz</dc:creator>
      <pubDate>Thu, 16 Jul 2026 22:28:57 +0000</pubDate>
      <link>https://dev.to/abdul_moiz_121/how-i-built-an-ai-resume-checker-with-react-native-gemini-supabase-in-under-a-month-at-0mo-1m87</link>
      <guid>https://dev.to/abdul_moiz_121/how-i-built-an-ai-resume-checker-with-react-native-gemini-supabase-in-under-a-month-at-0mo-1m87</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffi9v22o7pcj90fisu4i5.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffi9v22o7pcj90fisu4i5.jpg" alt=" " width="800" height="533"&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@chrisjoelcampbell?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Christopher Campbell&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/shallow-focus-photography-of-woman-outdoor-during-day-rDEOVtE7vOs?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three weeks ago I shipped an AI resume checker app to Google Play. Solo dev, weekend evenings, zero infrastructure cost. Here's the full technical breakdown of what I built, why I made the calls I did, and what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I was solving
&lt;/h2&gt;

&lt;p&gt;Roughly 75% of resumes get filtered out by ATS software before a human ever sees them. Every paid tool that helps with this (Jobscan, Resume Worded, Enhancv) costs $30-50/month — absurd when your target user is currently unemployed.&lt;/p&gt;

&lt;p&gt;I wanted to build a mobile-first, free alternative. Ad-supported. No paywall. Ship it in weeks, not months.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React Native 0.76.9&lt;/strong&gt; (bare CLI, not Expo — I wanted native module control)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; — Postgres + Auth + Edge Functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini API&lt;/strong&gt; — for AI analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AdMob&lt;/strong&gt; — rewarded ads for monetization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zustand&lt;/strong&gt; — client state&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TanStack Query&lt;/strong&gt; — server state (though most of the app uses Zustand directly)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total monthly cost: ~$0. Supabase free tier covers it. Gemini free tier covered launch. AdMob pays out instead of costing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;p&gt;Three Edge Functions on Supabase do all the AI work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;analyze-resume&lt;/code&gt; — takes a base64 PDF, sends to Gemini, returns structured JSON (overall score, per-section scores, ranked improvements)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ats-match&lt;/code&gt; — takes a resume + a job description, returns match % + keyword breakdown&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unlock-with-ad&lt;/code&gt; — verifies AdMob rewarded-ad completion, increments user's quota&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Client-side flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User uploads PDF/Word/photo via &lt;code&gt;react-native-document-picker&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Reads as base64 via &lt;code&gt;react-native-blob-util&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sends to Edge Function&lt;/li&gt;
&lt;li&gt;Gets back structured analysis&lt;/li&gt;
&lt;li&gt;Renders in a native results screen with animated score ring (SVG + Reanimated)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything's typed with TypeScript strict. Zod validates responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Supabase Edge Functions instead of a backend
&lt;/h2&gt;

&lt;p&gt;I considered spinning up a small Node backend on Fly.io. Killed the idea for three reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt; — Edge Functions on Supabase are free up to 500K invocations/month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth is baked in&lt;/strong&gt; — I get JWT verification for free&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No infrastructure to babysit&lt;/strong&gt; — one less thing to fail at 2 AM&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each Edge Function is ~150 lines. If I outgrow Supabase, I can port these to any serverless runtime in an afternoon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Gemini over OpenAI
&lt;/h2&gt;

&lt;p&gt;Practical reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free tier is more generous (2M tokens/day at launch vs. OpenAI's paid-only structure)&lt;/li&gt;
&lt;li&gt;Gemini Pro handles PDFs natively — I can send raw resume bytes&lt;/li&gt;
&lt;li&gt;Response quality on structured JSON output is comparable to GPT-4 for this specific task&lt;/li&gt;
&lt;li&gt;I can switch models later by changing ~20 lines of code&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Monetization: rewarded ads (for now)
&lt;/h2&gt;

&lt;p&gt;Users get 5 free analyses. Then a rewarded AdMob unlock grants +2 more.&lt;/p&gt;

&lt;p&gt;The reasoning: job seekers CAN'T afford $30/month. But they can watch a 30-second ad. It filters for high-intent users and pays a predictable eCPM.&lt;/p&gt;

&lt;p&gt;Long-term I'll add a subscription tier for power users. At launch, ad-only is right for this audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Play Store launch reality check
&lt;/h2&gt;

&lt;p&gt;10+ installs in the first few days. Not viral. This is what most solo launches look like.&lt;/p&gt;

&lt;p&gt;Everything I've been doing since — ASO optimization, Reddit posts, LinkedIn, TikTok — is downstream of understanding this: &lt;strong&gt;the app being good is table stakes. Distribution is the actual work.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons for other solo devs
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Free tiers are your co-founder.&lt;/strong&gt; Supabase + Gemini + AdMob + Play Store = a $0/mo stack that scales to tens of thousands of users before you need to pay anyone anything.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ship in 3 weeks or don't ship.&lt;/strong&gt; The temptation to polish forever kills solo projects. My first version had visible bugs. I shipped anyway. Now I fix them based on which ones users actually hit — much more efficient signal than trying to predict problems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;State management should be boring.&lt;/strong&gt; Zustand + TanStack Query covers 95% of what most apps need. Skip Redux, skip context gymnastics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Play Store honeymoon is real.&lt;/strong&gt; Google's algorithm gives new apps a 30-day boost. Every hour of launch-window ASO work is worth 10 hours of month-3 ASO work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't invent a backend if a BaaS covers you.&lt;/strong&gt; I saved an entire month by not writing auth code.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Cover letter generation. LinkedIn profile analysis. Localizations (Hindi, Portuguese-BR, Spanish LatAm shipping this week). A premium tier that removes ads and adds PDF report export.&lt;/p&gt;

&lt;p&gt;If you want to see the app or check your own resume, it's on Google Play — search "Crux" or use this link: &lt;a href="https://play.google.com/store/apps/details?id=com.crux.ai.resume" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.crux.ai.resume&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to build something similar and have questions about the stack, drop them in the comments. Happy to help.&lt;/p&gt;

&lt;p&gt;Follow if you want more posts like this — I'm going to keep sharing what I learn as this grows.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>supabase</category>
      <category>gemini</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
