<?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: MADAN DHOUNDIYAL</title>
    <description>The latest articles on DEV Community by MADAN DHOUNDIYAL (@mohan_dhoundiyal).</description>
    <link>https://dev.to/mohan_dhoundiyal</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%2F4169558%2Fd4346f9b-e540-438c-ae2b-a575474b10f4.png</url>
      <title>DEV Community: MADAN DHOUNDIYAL</title>
      <link>https://dev.to/mohan_dhoundiyal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohan_dhoundiyal"/>
    <language>en</language>
    <item>
      <title>My Stack for ResumeOrbitz: React, Supabase, Netlify, and Why</title>
      <dc:creator>MADAN DHOUNDIYAL</dc:creator>
      <pubDate>Sun, 18 Oct 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/mohan_dhoundiyal/my-stack-for-resumeorbitz-react-supabase-netlify-and-why-1918</link>
      <guid>https://dev.to/mohan_dhoundiyal/my-stack-for-resumeorbitz-react-supabase-netlify-and-why-1918</guid>
      <description>&lt;p&gt;One person, zero servers to babysit.&lt;/p&gt;

&lt;p&gt;This is every tool behind ResumeOrbitz, a free AI resume builder, and the one choice I'd change if I started today.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;New here? Start with the backstory: &lt;a href="https://dev.to/mohan_dhoundiyal/how-i-built-an-ai-resume-builder-as-a-solo-founder-in-india-gaj"&gt;How I Built an AI Resume Builder as a Solo Founder in India&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The constraint decided everything
&lt;/h2&gt;

&lt;p&gt;I'm the only engineer, designer and marketer. So every tool had to pass three tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ship fast:&lt;/strong&gt; a stable version in weeks, not months&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low budget:&lt;/strong&gt; free tiers first, paid only when it saves real time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No ops:&lt;/strong&gt; if it needs a server I have to patch, it's out&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every choice below falls out of those three rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;th&gt;Cost / month&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;React + TypeScript + Vite&lt;/td&gt;
&lt;td&gt;Stateful editor, fast builds&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;td&gt;Tailwind CSS&lt;/td&gt;
&lt;td&gt;Styles live next to each template&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth + database&lt;/td&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;td&gt;Postgres, auth and row-level security in one&lt;/td&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Netlify&lt;/td&gt;
&lt;td&gt;Push to deploy, no servers&lt;/td&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analytics + SEO&lt;/td&gt;
&lt;td&gt;GA4, Search Console, JSON-LD, llms.txt&lt;/td&gt;
&lt;td&gt;Free and good enough&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Groq API&lt;/td&gt;
&lt;td&gt;Fast responses, free tier&lt;/td&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pair programmer&lt;/td&gt;
&lt;td&gt;Claude Pro&lt;/td&gt;
&lt;td&gt;One assistant that holds the whole problem&lt;/td&gt;
&lt;td&gt;Pro plan (building only)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Frontend: React + TypeScript + Vite
&lt;/h2&gt;

&lt;p&gt;A resume editor is a stateful UI. You type on the left and the preview updates on the right. React's component model fits that well, and its ecosystem meant I never had to build a basic widget myself.&lt;/p&gt;

&lt;p&gt;TypeScript earns its place because a resume is a deeply nested object: sections, then entries, then bullets. Rename one field and the compiler shows every place that breaks, before a user finds it.&lt;/p&gt;

&lt;p&gt;Vite keeps the loop short: the dev server starts in seconds, and hot reload shows a template change the moment I save.&lt;/p&gt;

&lt;h2&gt;
  
  
  Styling: Tailwind CSS
&lt;/h2&gt;

&lt;p&gt;With 150+ templates, CSS can turn into a mess fast. Utility classes keep each template's styles next to its markup, so changing one template doesn't quietly break another.&lt;/p&gt;

&lt;p&gt;Tailwind also strips unused classes at build time, so 150+ templates don't mean a huge CSS file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backend: Supabase for auth, data and storage
&lt;/h2&gt;

&lt;p&gt;Supabase gave me Postgres, auth and row-level security without writing a backend. Saving a resume is one call from the frontend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;resumes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upsert&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;resume&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;resume&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The part that makes this safe is a row-level security policy, so a user can only ever touch their own resumes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="nv"&gt;"Users manage their own resumes"&lt;/span&gt;
&lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;resumes&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;all&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With that policy in place, even a bug in the frontend can't hand one user another user's resume.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hosting: Netlify
&lt;/h2&gt;

&lt;p&gt;Git push, and it's live. Every branch gets a preview URL, which is handy for testing a template before it ships.&lt;/p&gt;

&lt;p&gt;The one file every single-page app on Netlify needs is &lt;code&gt;public/_redirects&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/*    /index.html   200

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without it, refreshing any page other than the home page returns a 404.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO in a single-page app
&lt;/h2&gt;

&lt;p&gt;Google Analytics only counts the first page load in an SPA. This small hook records every route change as a page view:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useLocation&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;usePageTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useLocation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;?.(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;event&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;page_view&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;page_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;page_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On top of that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;JsonLd.tsx&lt;/code&gt; component, wired into &lt;code&gt;App.tsx&lt;/code&gt;, adds JSON-LD schema (including FAQPage) to each page&lt;/li&gt;
&lt;li&gt;Open Graph tags, so shared links show a proper preview&lt;/li&gt;
&lt;li&gt;An &lt;code&gt;llms.txt&lt;/code&gt; file that tells AI assistants what the site does&lt;/li&gt;
&lt;li&gt;Google Search Console from early on&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI: Groq
&lt;/h2&gt;

&lt;p&gt;Groq runs the AI behind ATS scoring, keyword gap analysis and cover letters. I picked it for two reasons: responses come back fast enough to feel instant inside the editor, and its free tier covers what a solo product needs right now.&lt;/p&gt;

&lt;p&gt;The trade-off is rate limits on the free tier. That's a good problem to have, and one I'll solve when usage forces it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd change
&lt;/h2&gt;

&lt;p&gt;I'd start with pre-rendering or SSR. A single-page app hands search engines an almost empty HTML shell until JavaScript runs. For a product that lives on organic search, every SEO fix since (JSON-LD, the page-view hook, llms.txt) has partly been a workaround for that one early choice.&lt;/p&gt;

&lt;p&gt;If I started today, landing pages would ship real HTML from day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs per month
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;₹0 to run.&lt;/strong&gt; Supabase, Netlify, Groq, GA4 and Search Console are all on free tiers. The only paid tool is my Claude Pro subscription, and that's for building, not running.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;What's your stack for solo projects, and what would you swap? I read every comment.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I'm the founder of &lt;a href="https://resumeorbitz.com/" rel="noopener noreferrer"&gt;ResumeOrbitz&lt;/a&gt;, the tool this post is about.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>buildinpublic</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>How I Built an AI Resume Builder as a Solo Founder in India</title>
      <dc:creator>MADAN DHOUNDIYAL</dc:creator>
      <pubDate>Tue, 13 Oct 2026 12:54:22 +0000</pubDate>
      <link>https://dev.to/mohan_dhoundiyal/how-i-built-an-ai-resume-builder-as-a-solo-founder-in-india-gaj</link>
      <guid>https://dev.to/mohan_dhoundiyal/how-i-built-an-ai-resume-builder-as-a-solo-founder-in-india-gaj</guid>
      <description>&lt;p&gt;Most resume builders let you write for free, then ask you to pay when you hit Download.&lt;/p&gt;

&lt;p&gt;I built one that doesn't. I did it alone, from India, and the first stable version took 15 days.&lt;/p&gt;

&lt;p&gt;This is the story of how ResumeOrbitz came together: why I built it, the hardest parts, and what I'd tell anyone starting something similar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;It started with my own job switch.&lt;/p&gt;

&lt;p&gt;I was updating my resume, and every time I made changes, the platform asked me to pay before I could download it. The free ones weren't much better. Either the useful features were missing, or the good templates were locked behind "premium".&lt;/p&gt;

&lt;p&gt;That's when it hit me: if I'm facing this, thousands of other job seekers are too.&lt;/p&gt;

&lt;p&gt;So I decided to build an AI-driven resume app that would be completely free. Not a free trial, and not "free with a paywall at the end". Just free.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ResumeOrbitz does
&lt;/h2&gt;

&lt;p&gt;I'll keep this short, because this isn't a sales post.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ATS score:&lt;/strong&gt; checks how well your resume will survive an applicant tracking system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyword gap analysis:&lt;/strong&gt; compares your resume with a job description and shows what's missing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;150+ templates&lt;/strong&gt;, with both Indian and US formats, and none locked as "premium"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cover letter generation&lt;/strong&gt; from the same profile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; no paywall at download time&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The stack, in one paragraph
&lt;/h2&gt;

&lt;p&gt;The frontend is React with TypeScript, built with Vite and styled with Tailwind. Supabase handles auth and the database, and Netlify hosts it. AI features run on LLM APIs. There are no servers for me to babysit, which matters a lot when you're the only engineer, designer and marketer.&lt;/p&gt;

&lt;p&gt;I'll break down every layer in my next post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard part #1: Building a full product with no team
&lt;/h2&gt;

&lt;p&gt;I'm a software engineer, so I knew how to start and roughly how the pieces should fit together. But knowing how to start is very different from building an entire custom app alone.&lt;/p&gt;

&lt;p&gt;Three problems hit me right away:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No team.&lt;/strong&gt; There was nobody to own the frontend, the backend or the architecture. Every decision, and every bug, was mine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too many layers at once.&lt;/strong&gt; UI, database, auth, AI features, hosting and SEO all had to work together, and I had to switch between them constantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free AI tools kept running out.&lt;/strong&gt; I started by juggling free sessions on different AI models. Each one had usage limits, so I'd lose context in the middle of a problem and have to start over somewhere else.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fix: I stopped juggling and moved everything to one paid tool, Claude Pro. It became my pair programmer, architect and debugger in one place. Having one consistent assistant that could hold the whole problem made a big difference to how fast I could move.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson:&lt;/strong&gt; when you're solo, your tools are your team. Paying for one good tool cost far less than the time I was losing by switching between free ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard part #2: Deciding what an "ATS score" means
&lt;/h2&gt;

&lt;p&gt;There's no official ATS standard. Every company uses different software, and none of them publish how they rank resumes. So any ATS score is an estimate, and I wanted mine to be an honest one.&lt;/p&gt;

&lt;p&gt;So I built the checker around the job description. You paste in the JD from Naukri, LinkedIn or any portal, and the AI scans your resume against it for the things that reliably cause trouble:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keyword match:&lt;/strong&gt; does your resume use the exact words the JD uses? "NodeJS" and "Node.js" aren't the same to an ATS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing skills:&lt;/strong&gt; which key skills from the JD aren't on your resume at all&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formatting traps:&lt;/strong&gt; tables, columns, images and other elements that scramble ATS parsing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The score matters less than what you do with it. A number alone doesn't help anyone. So after the score, there's a one-click AI fix that rewrites or strengthens sections to close the gaps. Then you check again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard part #3: SEO for a single-page app
&lt;/h2&gt;

&lt;p&gt;This one surprised me. I built ResumeOrbitz as a single-page app, which is great for users but harder for search engines.&lt;/p&gt;

&lt;p&gt;Three things made the biggest difference:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tracking route changes.&lt;/strong&gt; Google Analytics only counts the first page load in an SPA by default. I added a small custom hook so every route change is recorded as a page view.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured data.&lt;/strong&gt; A small component adds JSON-LD schema (including FAQ schema) to each page, so search engines understand what the page is about.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An llms.txt file.&lt;/strong&gt; This is a newer idea: a plain-text file that tells AI assistants what the site is. More people now ask AI assistants for tool recommendations, so it felt worth the 20 minutes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I also set up Google Search Console early. If I started again, I'd do all of this before launch, not after.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rename: ResumeForge to ResumeOrbitz
&lt;/h2&gt;

&lt;p&gt;The product started life as ResumeForge. Then I found out the name and the domain were already taken.&lt;/p&gt;

&lt;p&gt;Renaming mid-build was annoying: new domain, new logo, new repo name, and every reference in the codebase. But it was much cheaper to do it then than after launch, and I ended up liking ResumeOrbitz more anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; check the domain, the social handles and a quick trademark search before you design a logo.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solo founder timeline
&lt;/h2&gt;

&lt;p&gt;Here's how it actually went:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;15 days&lt;/strong&gt; to build the first stable version&lt;/li&gt;
&lt;li&gt;Then small enhancements, one at a time, based on what I noticed and what users needed&lt;/li&gt;
&lt;li&gt;Now, &lt;strong&gt;99% of my time&lt;/strong&gt; goes into marketing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is the one nobody warned me about. Building turned out to be the easier half. Getting the product in front of the people who need it is the real work.&lt;/p&gt;

&lt;p&gt;What I'd tell someone starting out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick managed tools.&lt;/strong&gt; Every hour spent on infrastructure is an hour not spent on users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship before it feels ready.&lt;/strong&gt; My first stable version took 15 days, not 6 months, and that was the right call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan marketing from day one.&lt;/strong&gt; You'll spend far more time on it than you expect.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where it stands now
&lt;/h2&gt;

&lt;p&gt;ResumeOrbitz is live and completely free. I've paused big new features, and almost all my time goes into reaching job seekers who need it. This blog is part of that.&lt;/p&gt;

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

&lt;p&gt;Next I'm writing up the full stack: every tool, why I picked it, and what I'd change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A question for you:&lt;/strong&gt; what would you want from a free resume tool that the current ones don't give you? I'll read every answer.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I'm the founder of &lt;a href="https://resumeorbitz.com" rel="noopener noreferrer"&gt;ResumeOrbitz&lt;/a&gt;, the tool this post is about.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>jobs</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
