<?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: romina </title>
    <description>The latest articles on DEV Community by romina  (@romina__13ee07c77e).</description>
    <link>https://dev.to/romina__13ee07c77e</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%2F3958636%2Ff486277c-e220-418f-8d05-b3c0edb781ba.png</url>
      <title>DEV Community: romina </title>
      <link>https://dev.to/romina__13ee07c77e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/romina__13ee07c77e"/>
    <language>en</language>
    <item>
      <title>I Built an AI Job Hunting Platform for Sweden in 2 Weeks — Here's What I Learned</title>
      <dc:creator>romina </dc:creator>
      <pubDate>Fri, 29 May 2026 14:34:41 +0000</pubDate>
      <link>https://dev.to/romina__13ee07c77e/i-built-an-ai-job-hunting-platform-for-sweden-in-2-weeks-heres-what-i-learned-4fk2</link>
      <guid>https://dev.to/romina__13ee07c77e/i-built-an-ai-job-hunting-platform-for-sweden-in-2-weeks-heres-what-i-learned-4fk2</guid>
      <description>&lt;p&gt;When a friend told me she'd been job hunting in Sweden for six months without a single interview callback, I assumed it was a skills problem. It wasn't.&lt;/p&gt;

&lt;p&gt;She had ten years of experience, a master's degree, and fluent English. The problem was simpler — and more frustrating: every Swedish job application expected a CV written in professional Swedish, and hers read like it had been translated from English. Because it had been.&lt;/p&gt;

&lt;p&gt;I started asking around. Same pattern everywhere. Qualified people, locked out not because of what they knew, but because of a language and format barrier that native speakers never have to think about.&lt;/p&gt;

&lt;p&gt;Two weeks later, I shipped &lt;strong&gt;JobPilot AI&lt;/strong&gt; — a free platform that helps job seekers in Sweden find opportunities and generate professional Swedish CVs using AI.&lt;/p&gt;

&lt;p&gt;Here's exactly what I built, how I built it, and what I'd do differently.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: Why Sweden's Job Market Is Hard for Immigrants
&lt;/h2&gt;

&lt;p&gt;Sweden has over 500,000 foreign-born workers, and immigration continues to grow. But landing a job here as an international is genuinely hard — and not for the reasons you might expect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The job board fragmentation problem.&lt;/strong&gt; Swedish jobs are scattered across Arbetsförmedlingen (the national employment agency), LinkedIn, private job boards, company sites, and regional platforms. There's no single place to search across all of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Swedish CV problem.&lt;/strong&gt; Swedish CVs follow conventions that are notably different from English-language CVs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Typically one page max (sometimes two for senior roles)&lt;/li&gt;
&lt;li&gt;Formal, concise language — no personal flair or storytelling&lt;/li&gt;
&lt;li&gt;Photo is commonly expected and normal&lt;/li&gt;
&lt;li&gt;Personal number (personnummer) sometimes included&lt;/li&gt;
&lt;li&gt;Specific section naming and ordering conventions&lt;/li&gt;
&lt;li&gt;The tone is distinctly different from American or British CVs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're not a native speaker, you probably don't know these conventions. And if you write your CV like an English CV, Swedish hiring managers immediately notice.&lt;/p&gt;

&lt;p&gt;This is the gap I wanted to fill.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built: Feature Overview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;JobPilot AI&lt;/strong&gt; is a web app with five core features:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Job Search (49,000+ listings)
&lt;/h3&gt;

&lt;p&gt;Aggregated from multiple Swedish sources including Arbetsförmedlingen. Users can filter by location, job type, and date. No login required to search.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AI-Generated Swedish CVs
&lt;/h3&gt;

&lt;p&gt;This is the core feature. The user:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pastes a job description they want to apply for&lt;/li&gt;
&lt;li&gt;Fills in their work history and skills&lt;/li&gt;
&lt;li&gt;Clicks generate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AI reads the job description, identifies the key requirements and language, then writes a full Swedish-language CV tailored to that specific role. It doesn't translate your existing CV — it writes a new one optimized for the job.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cover Letter Generator
&lt;/h3&gt;

&lt;p&gt;Same principle as the CV generator. Takes the job description + user background and produces a personalized Swedish cover letter for that role.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Application Tracker (Kanban Board)
&lt;/h3&gt;

&lt;p&gt;A simple kanban board: Applied → Interview → Offer → Rejected. Keeps everything in one place instead of scattered across browser tabs and spreadsheets.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. AI Job Assistant (Chat)
&lt;/h3&gt;

&lt;p&gt;A chat interface where users can ask questions like "What's a typical salary for a software engineer in Stockholm?" or "What should I include in a Swedish CV for a healthcare role?" Powered by Groq.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend:  Next.js 14 with TypeScript
Backend:   Node.js REST API
Database:  PostgreSQL + Redis
AI:        Groq API (LLaMA models)
Deploy:    Vercel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let me explain the key decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Next.js 14?
&lt;/h3&gt;

&lt;p&gt;App Router was the right choice here. I needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server-side rendering for job listing pages (SEO matters for job search)&lt;/li&gt;
&lt;li&gt;API routes for backend logic without a separate server repo&lt;/li&gt;
&lt;li&gt;React Server Components to reduce client bundle size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The App Router's layout system made it easy to build the authenticated dashboard (tracker, CV generator) with a different shell from the public-facing job search.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Groq over OpenAI?
&lt;/h3&gt;

&lt;p&gt;Speed. CV generation needs to feel fast — if it takes 15 seconds, users think it's broken. Groq's inference speed on LLaMA models is significantly faster than OpenAI's GPT-4o for comparable output quality.&lt;/p&gt;

&lt;p&gt;Cost was also a factor. Since the app is free, I needed the AI layer to be cheap enough to operate sustainably. Groq's pricing at the time of building made this viable.&lt;/p&gt;

&lt;p&gt;The tradeoff: Groq's model selection is narrower than OpenAI's. But for structured text generation (CVs, cover letters), LLaMA performs well.&lt;/p&gt;

&lt;h3&gt;
  
  
  PostgreSQL + Redis
&lt;/h3&gt;

&lt;p&gt;PostgreSQL handles user data, saved jobs, and application tracking. Redis handles job listing cache — Arbetsförmedlingen's API has rate limits, and caching listings means we're not hitting it on every search.&lt;/p&gt;

&lt;h3&gt;
  
  
  TypeScript Throughout
&lt;/h3&gt;

&lt;p&gt;I used TypeScript strictly on both frontend and backend. For a solo 2-week build, this felt like overhead at times — but catching type errors early saved me from subtle bugs in the AI response parsing, where the shape of what comes back from the API can vary.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hard Part: Prompt Engineering for Swedish CVs
&lt;/h2&gt;

&lt;p&gt;This took longer than any other part of the build. Getting AI to write a CV is easy. Getting AI to write a CV that sounds like a native Swedish professional wrote it is a different problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  What didn't work
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Naive prompting:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Write a CV in Swedish for this person applying for this job."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output was grammatically correct Swedish but felt like a translation. Swedish HR managers would immediately notice it wasn't native.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Over-specified prompting:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Write a formal Swedish CV. Use Swedish CV conventions. 
One page. Professional tone..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better, but still generic. The output didn't reflect the specific language and terminology of the job description.&lt;/p&gt;

&lt;h3&gt;
  
  
  What worked
&lt;/h3&gt;

&lt;p&gt;The breakthrough was making the prompt &lt;strong&gt;bidirectional&lt;/strong&gt; — not just describing the person, but mirroring the language of the job posting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Analyze the job description and identify:
1. The key skills and qualifications required
2. The specific Swedish terminology used in this industry
3. The formality level of the posting

Then write a CV that uses the same terminology, addresses the key 
requirements explicitly, and matches the formality level.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This produced CVs that felt like they were written for that specific job, not just a generic Swedish CV with the candidate's details filled in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing quality without being a native speaker
&lt;/h3&gt;

&lt;p&gt;I'm not a native Swedish speaker, which made quality testing hard. My approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Used AI translation tools to back-translate the output and check for awkward phrasing&lt;/li&gt;
&lt;li&gt;Ran outputs through Swedish grammar checkers&lt;/li&gt;
&lt;li&gt;Asked Swedish-speaking friends to review several examples&lt;/li&gt;
&lt;li&gt;Tested with LinkedIn job descriptions to compare output against real Swedish CVs on the platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not perfect, which is why I'm actively seeking feedback from native Swedish speakers. If you're Swedish and want to test it, I'd genuinely value your input.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;Here's roughly how the pieces fit together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dot"&gt;&lt;code&gt;&lt;span class="nv"&gt;User&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Next&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;js&lt;/span&gt; &lt;span class="nv"&gt;Frontend&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;
        &lt;span class="err"&gt;│&lt;/span&gt;
        &lt;span class="err"&gt;▼&lt;/span&gt;
   &lt;span class="nv"&gt;Next&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;js&lt;/span&gt; &lt;span class="nv"&gt;API&lt;/span&gt; &lt;span class="nv"&gt;Routes&lt;/span&gt;
        &lt;span class="err"&gt;│&lt;/span&gt;
        &lt;span class="err"&gt;├──►&lt;/span&gt; &lt;span class="nv"&gt;PostgreSQL&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;user&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;saved&lt;/span&gt; &lt;span class="nv"&gt;jobs&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;applications&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;
        &lt;span class="err"&gt;│&lt;/span&gt;
        &lt;span class="err"&gt;├──►&lt;/span&gt; &lt;span class="nv"&gt;Redis&lt;/span&gt; &lt;span class="nv"&gt;Cache&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;job&lt;/span&gt; &lt;span class="nv"&gt;listings&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;TTL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;hour&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;
        &lt;span class="err"&gt;│&lt;/span&gt;
        &lt;span class="err"&gt;└──►&lt;/span&gt; &lt;span class="nv"&gt;Groq&lt;/span&gt; &lt;span class="nv"&gt;API&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;CV&lt;/span&gt; &lt;span class="nv"&gt;generation&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;cover&lt;/span&gt; &lt;span class="nv"&gt;letters&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;chat&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;
                &lt;span class="err"&gt;│&lt;/span&gt;
                &lt;span class="err"&gt;└──►&lt;/span&gt; &lt;span class="nv"&gt;LLaMA&lt;/span&gt; &lt;span class="mf"&gt;3.1&lt;/span&gt; &lt;span class="nv"&gt;model&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Job data flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dot"&gt;&lt;code&gt;&lt;span class="nv"&gt;Arbetsf&lt;/span&gt;&lt;span class="err"&gt;ö&lt;/span&gt;&lt;span class="nv"&gt;rmedlingen&lt;/span&gt; &lt;span class="nv"&gt;API&lt;/span&gt;
        &lt;span class="err"&gt;│&lt;/span&gt;
        &lt;span class="err"&gt;▼&lt;/span&gt;
   &lt;span class="nv"&gt;Background&lt;/span&gt; &lt;span class="nv"&gt;sync&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="k"&gt;Node&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;js&lt;/span&gt; &lt;span class="nv"&gt;cron&lt;/span&gt; &lt;span class="nv"&gt;job&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;
        &lt;span class="err"&gt;│&lt;/span&gt;
        &lt;span class="err"&gt;▼&lt;/span&gt;
   &lt;span class="nv"&gt;PostgreSQL&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;job&lt;/span&gt; &lt;span class="nv"&gt;listings&lt;/span&gt; &lt;span class="nv"&gt;table&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;
        &lt;span class="err"&gt;│&lt;/span&gt;
        &lt;span class="err"&gt;▼&lt;/span&gt;
   &lt;span class="nv"&gt;Redis&lt;/span&gt; &lt;span class="nv"&gt;Cache&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;indexed&lt;/span&gt; &lt;span class="nv"&gt;by&lt;/span&gt; &lt;span class="nv"&gt;search&lt;/span&gt; &lt;span class="nv"&gt;terms&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;
        &lt;span class="err"&gt;│&lt;/span&gt;
        &lt;span class="err"&gt;▼&lt;/span&gt;
   &lt;span class="nv"&gt;User&lt;/span&gt; &lt;span class="nv"&gt;search&lt;/span&gt; &lt;span class="nv"&gt;query&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nv"&gt;Cache&lt;/span&gt; &lt;span class="nv"&gt;hit&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nv"&gt;Response&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Get a custom domain on day one
&lt;/h3&gt;

&lt;p&gt;I deployed to Vercel's default subdomain. This turned out to be a problem because BetaList, one of the main startup discovery platforms I wanted to submit to, explicitly rejects submissions from free hosting subdomains. A $12/year domain would have kept that option open.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; If you're building to launch publicly, register a domain before you write a line of code.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Build the onboarding flow last, not first
&lt;/h3&gt;

&lt;p&gt;I spent time on the profile creation flow before I had validated that people actually wanted to use the CV generator. I should have let users paste their experience inline the first time they try CV generation — only add a proper profile system once I know people are coming back.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Add an output review step
&lt;/h3&gt;

&lt;p&gt;Currently, the AI generates the CV and shows it immediately. There's no "here are three variations, pick the best one" step. Multiple generations would dramatically improve perceived quality and give users a sense of control over the output.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. More time on native-language testing
&lt;/h3&gt;

&lt;p&gt;My prompt engineering for Swedish was done mostly in isolation. I should have found 3–5 Swedish-speaking beta testers before launch and iterated with them. The feedback loop would have been tighter.&lt;/p&gt;




&lt;h2&gt;
  
  
  Current Status and What's Next
&lt;/h2&gt;

&lt;p&gt;The app is live and free: &lt;a href="https://jobpilot-web-one.vercel.app" rel="noopener noreferrer"&gt;https://jobpilot-web-one.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No login required to search jobs. CV generation and the tracker require a free account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'm working on next:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom domain (to unblock BetaList and Product Hunt submissions)&lt;/li&gt;
&lt;li&gt;Multiple CV variations per generation&lt;/li&gt;
&lt;li&gt;Support for LinkedIn profile import instead of manual entry&lt;/li&gt;
&lt;li&gt;Better onboarding for non-English speakers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Longer term ideas (if there's user demand):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interview preparation feature (common Swedish interview questions by role)&lt;/li&gt;
&lt;li&gt;Salary benchmarking for Swedish roles&lt;/li&gt;
&lt;li&gt;Application email drafts&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It / Feedback Wanted
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://jobpilot-web-one.vercel.app" rel="noopener noreferrer"&gt;https://jobpilot-web-one.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd especially love to hear from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Swedish speakers&lt;/strong&gt; — does the generated Swedish read naturally, or does it feel off?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone who has job hunted in Sweden&lt;/strong&gt; — what's missing that would have helped you?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other developers&lt;/strong&gt; — any thoughts on the architecture choices, especially the Groq tradeoff?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment below or try the tool and let me know what you think. All feedback is genuinely welcome — this is a real problem for a lot of people and I want to get the solution right.&lt;/p&gt;

&lt;p&gt;Thanks for reading 🙏&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>nextjs</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
