This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle

My contract ended on Wednesday. By then I had tailored 83 CVs by hand this autumn: one per job, each one rewritten to the job ad's own words, each one checked so it didn't claim anything I couldn't defend in an interview. Most early-career people I know are doing the same thing, alone, at night.

There are AI tools for this. The best known charge per application: reviews put AI Apply's auto-apply credits at about 32 cents to a dollar each, on top of a monthly plan. When you're applying to 500 jobs, that's a few hundred euro you don't have, spent on applications that a model wrote and you never read.

So I built Deis. It's Irish for opportunity, and it's said "desh".

TL;DR. Deis is a swipe-to-apply job app for early-career people in Ireland. It shows you jobs filtered for your level, your languages and your right to work. Swipe right and open-weight Gemma 4 writes a CV, a cover letter and form answers tailored to the job. Every line on that CV points to a fact you confirmed, and code removes anything Gemma can't back up. It runs on your own model: on your laptop through Ollama (with the Wi-Fi off, if you like), on your free Google AI Studio key, or on a server you rent. An application costs about €0. The app is €9.99 once, and the code is open source.

Swiping through real Irish jobs in Deis

What I Built

  1. A 90-second check-in. Where in Ireland you'd work, how far along you are, whether you can work here now (EU, Stamp 4, Stamp 1G or needing a permit), the kinds of work you want, and any languages besides English.
  2. A profile of small, true facts. Upload your CV and Gemma splits it into facts you tick off one by one. LinkedIn won't let apps read your profile, but it will give you your own data: Deis turns LinkedIn's data export into facts without any AI at all.
  3. A deck of real Irish jobs. About 300 live early-career jobs at a time, 70 to 100 in a typical deck once your filters run. Deis reads 55 employers' public job boards and shared Google Jobs searches. Then code, not the model, hides what you can't or won't take: roles asking for 3+ years, roles that need German or Turkish, postings that rule out your visa. Every card quotes the posting's own words: "asks for 2+ years of B2B sales experience", "unable to offer visa sponsorship".
  4. Swipe right, two ways. Quick builds the kit (fit check, CV, letter, draft answers) in the background while you keep swiping. Careful shows you the fit first and asks about your gaps: "The role asks for SQL. Where have you used it?" Your answer becomes a proposed fact, you approve it, and every application after that is stronger.
  5. Paste a job you found elsewhere. It goes through the same code as the boards and lands on top of the deck, offline too.
  6. You apply. Download the CV as Word or PDF, copy the answers, open the posting. Deis never applies for you. Auto-apply tools hit account walls and CAPTCHAs, break LinkedIn's terms, and send the same weak application to 500 places. In a hiring market as small as Ireland's, that follows you around.

The finished kit: the tailored CV next to the fit check

Why not just paste it into ChatGPT? You can, and for one application it's fine. For forty it isn't. You paste your CV again every time, the chat forgets which facts you confirmed, and nothing stops it writing "3 years of experience" or "no sponsorship needed" in a confident voice you'll sign. It doesn't know which Irish jobs you can't get, so you find out after the letter is written. Deis keeps your facts in one place, hides those jobs before you see them, checks every line against what you said, and shows you what it removed. And it runs on a model you can keep on your own laptop, so your CV isn't training anybody's next model.

Who pays? Graduates and early-career people in Ireland who are applying to dozens of jobs, and especially international master's graduates on Stamp 1G. Many postings quietly rule them out, and finding that out after writing a cover letter hurts. €9.99 once is less than one month of the subscription tools, and about the price of a takeaway. The first person to really use it paid for it on the call, and the second sale came from someone I've never met. Both stories are below.

Demo

Try it: deiscareers.tech. Choose Try as Aoife or Try as Rahul: two fictional graduates, applying for real Irish jobs. The web demo takes no real CV. Your own CV is read in the desktop app, on your computer, so the hosted demo never receives it.

Desktop app: macOS, Windows and Linux installers, with a 14-day free trial, then €9.99 once. Buy a key here. Until the end of October, the code hacktoberfest2026 takes 80% off and is applied for you at checkout, so it's €2. The app isn't signed by Apple yet, so macOS asks you to open it once from Privacy & Security. The download page shows the steps. On a phone, the free Android app and iPhone home screen app run the same demo as the website. Questions, or a key that won't work? Email hello@deiscareers.tech.

Code

GitHub logo MuhammadMurtuzaHussain / deis

Swipe-to-apply job app for early-career people in Ireland. Open-weight Gemma tailors your CV and cover letter to each job, and every line traces back to something you told it.

Deis: jobs you can actually get. Watch the one-minute film.

Jobs you can actually get. A swipe-to-apply job app for early-career people in Ireland, where open-weight Gemma 4 tailors your CV and code removes anything it can't back up

Try the web demo · Watch the film (1 min) · DEV post · Download · hello@deiscareers.tech · Built for the DEV Hacktoberfest Open-Source AI Challenge, Week 2: Side Hustle

Download for macOS, Apple silicon Download for macOS, Intel Download for Windows Download for Linux Download the Android demo
Buy a licence key, 9.99 euro once

Swiping through real Irish jobs: every card is a job you can actually get

Deis (said "desh") is Irish for opportunity.

Why

I tailored 83 CVs by hand this autumn: one per job, each rewritten to the job ad's own words and checked so it didn't claim anything I couldn't defend in an interview. Most early-career people I know do the same thing, alone, at night. The AI tools that do it for you charge per application and write things you'd never sign: "3 years of experience", "no sponsorship needed".

Deis keeps your facts in one place, hides the Irish jobs you can't get before…




How I Built It

Gemma judges, code guarantees

A tailored CV that invents a certificate, or a total years of experience, can cost someone the job. So Gemma decides what to say, and code decides what stays.

  • Every CV line has to cite the facts it came from. Code drops lines with no real facts behind them, and checks each sentence: any number, tool or certificate it mentions has to be in the cited facts.
  • Code never lets a model state a total years of experience, write "currently studying" about a finished degree, or say anything about visas, stamps or sponsorship. That last rule came from testing: Gemma 4 26B wrote that my Stamp 1G persona was "eligible to work in Ireland without sponsorship".
  • Employers, job titles, dates and education are copied from your facts, never rewritten.
  • Job postings are data, not instructions. Hidden text and sentences addressed to AI tools are stripped before Gemma reads a posting and shown to you on the card. Real postings already contain them.
  • Everything the guard removed is on the kit's Checks tab, and one switch shows the source facts under every CV line.

Gemma writes the kit; every line links back to a fact you gave

I measured it. On eight kits written by Gemma 4 E4B on my MacBook (fit check, CV, letter and answers):

Run Sentences kept Removed by the guard Untraceable claims left
First run (13 Oct) 210 56 0
After fixing what the first run showed (13 Oct) 261 11 (4%) 0
Current guard, CV, letter and answers all checked (16 Oct) 196 11 (5.3%) 0

I read every removal of the last run by hand. About half were real: a test persona's finished MSc written as "current", a company's own pitch copied into a letter, an empty heading. The other half were true lines the guard was too strict about. I'd rather it erred that way. A full kit takes about 46 seconds on the laptop (median of 8).

What it can't prove, it cuts

The Checks tab: what the guard removed from a real kit, and why

The first run taught me something about small models: Gemma never invented a fact id. Instead it cited facts by quoting them or by their label, and my guard threw those good lines away. Now quotes and labels are matched back to the facts they name. What's left for the guard to remove are real over-claims: tools I never used, "currently" studying a degree I'd finished, a number from nowhere.

The deck is code, not AI

I hand-labelled 81 real Irish postings as show, stretch or hide and tuned the filter on them (86% before, 100% after). Then I labelled 52 postings it had never seen, without looking at what it decided: 51 of 52 right on the first run. The one miss hid a Trainee Accountant job because "complete the ACA qualification over a period of 3 to 4 years" looked like an experience requirement. A graduate or trainee title now needs a line that really says "experience" before Deis hides it. The details are in eval/RESULTS.md.

Gemma never reads a job you won't see, which is what keeps it cheap.

Your model

Every AI call goes through a per-request chain of models built with Mastra: one agent per job (card, fit, CV, letter, answers, coach), and the kit is a Mastra workflow that writes the CV, letter and answers in parallel. The chain is whatever the user chose (Ollama, an AI Studio key, any OpenAI-compatible server), with fallbacks.

That turned out to matter on day two. Google AI Studio's Gemma 4 returned errors for hours, and some requests hung for over 90 seconds. The hosted demo now gives cloud calls a deadline and probes AI Studio, and while it's failing it asks a second Gemma host first: Gemma 4 26B on OpenRouter.

It also matters when there's no network. With Gemma on your laptop, File > Work offline turns on an egress guard that refuses every connection that isn't to your own computer. The deck shows the jobs it saved, you can paste a job, and the kit still builds. I tried it with the Wi-Fi off: a pasted job still built a full kit on Gemma on the laptop. The guard has its own tests in tests/offline.test.ts.

It runs on your laptop

The bug I shipped and fixed

The hosted demo counted all of a person's AI calls against one limit. Browsing cards used it up, so after about 20 calls in an hour your next kit was told to come back later. Worse, the counter trusted the first address in a header the client controls, so changing that header reset it. Now each step has its own allowance per person, a person has a total across all steps, and the whole demo has an hourly budget. The address comes from Cloudflare's own header and is validated before it's counted.

The rest

  • Jobs: SerpApi Google Jobs, one shared search per role family for all of Ireland, refreshed about once a week, so one search serves every user. (The Google Jobs engine rejects gl=ie; the location alone works.) Plus 55 employers' public boards on Greenhouse, Ashby, Lever and SmartRecruiters, refreshed every six hours.
  • Desktop: Electron around the same Next.js server, running on 127.0.0.1 behind a host check, at a stable deis://app origin so your profile survives restarts. Installers for all three systems come from GitHub Actions.
  • Tracing: Sentry agent tracing: a span per workflow step and per Gemma call with tokens, and an issue for every guard rule that fires, tagged with the model. Never a CV, a prompt or a key.
  • Hosting: Render web service and Key Value in Frankfurt for the demo, the shared job feed and the demo key's rate limits.
  • Design: Bricolage Grotesque for the big type, Geist for everything else, light and dark. Swipe, buttons or arrow keys. One accent, a lime highlighter, which only ever means go or proven: select a fact and it draws behind every CV line that cites it, and when a kit finishes the CV writes itself line by line while the sentences the guard removed flash past struck through. All of it stops under reduced motion.

Sentry: one kit on a real visitor's session, the CV, letter and answers in parallel on Gemma 4 26B with one call on the second host; and one issue per guard rule

Render: the deis web service on Starter, deploying main to deiscareers.tech after CI passes

Select a fact and the highlighter follows it into every CV line that cites it

Why Does Open Innovation Matter?

Because the business only works if the model is free to run. Here is one application, measured:

Per application 500 applications
Pay-per-application auto-apply (AI Apply credit packs, 2026 reviews) about $0.32 to $1.00, plus a monthly plan about $160 to $500
Deis with Gemma 4 E4B on your laptop €0 (about 46 seconds) €0
Deis with your free Google AI Studio key €0 €0
Deis on a paid Gemma 4 host (reseller price) about $0.0013 about $0.65

With a closed API, I'd either have to charge a subscription to cover tokens or ration your applications. With open weights I can sell the app once and get out of the way.

And the €9.99 has to pay for something. The hosted demo and the shared job feed run on Render: a Starter web service ($7 a month) and Key Value ($10 a month). That's about two sales a month to break even. The tokens cost nothing extra because each person brings their own model.

Because a CV is private. On the desktop app your profile, your applications and, with Ollama, the model all stay on your computer. There's no Deis account and no server copy of your CV.

Because nobody can take it away. When AI Studio went down, Deis switched host. If I disappear, the code is AGPL: build it yourself, free, forever. The €9.99 pays for the signed app, updates and the daily Irish job feed, not for permission.

Where a closed model would be better: the writing. A frontier model would write livelier CVs and need fewer rewrites. It would still need the same guard, because the guard is what stops a confident model from inventing a sponsorship claim. Open weights cost you a 6.6 GB download and a laptop that can run it. I think that's a fair trade for something that handles your CV, but you should weigh it yourself.

My First User

I shared Deis while it was still a prototype: on LinkedIn, on Instagram, in my class's WhatsApp groups and in a group of builders who ship things. Eight people were on a waitlist by the time it was polished, and when deiscareers.tech went live this week I sent it to all of them, with a few reels and posts.

Where I shared it: the LinkedIn launch post, an Instagram reel and the first story, from 13 October

Plenty of people replied. Almost nobody downloaded it. I had pictured them running Gemma on their own laptops; instead everyone tried the web demo on the shared AI Studio key, it hit its rate limit, and Sentry showed me exactly where. So I changed the shape of the product: the web is now a demo with two sample graduates, and your own CV only goes into the desktop app, which has a 14-day free trial.

My Agent Session & How I Built It With Claude Code

I built Deis in a week, from 13 to 18 October, across 18 sessions with Claude Code. I made the decisions: the idea, what to cut, what my first user needed, when the UI wasn't good enough. Claude Code wrote most of the code, ran the tests and evals, and checked its own work against the live demo.

The session below is the short version: 24 messages, one per turning point, in my words and its answers. A few moments worth looking for:

  • The first message is my unedited brain dump: "something like AI Apply, in a Tinder format where you swipe". The core rule, Gemma judges, code guarantees, came out of the first day.
  • AI Studio going down on day two, and how the demo got deadlines, a health probe and a second Gemma host.
  • "I hate the UI and UX", and the Highlighter design that came out of it.
  • My first user's feedback turning into code the same day: career stages up to 7+ years, tax and accounting roles, and job postings that keep their bullet points.
  • A re-review that caught three bugs before users did, including a checkout link that sent buyers to the server's internal address.

By the end of the week: 89 commits, 364 tests, installers for three systems, and two sales.

Building Deis with Claude Code: a week from a Tinder-for-jobs brain dump to two paid sales
You

Look into the Week 2 challenge brief, then get back to me when you've understood what needs to be done. I have an idea similar to AI Apply but in an open-source way: an agentic workflow, free of cost, cost-efficient as much as we can. Here's my unedited brain dump: something like AI Apply, in a Tinder format where you swipe.

Agent

Day 1 (13 Oct): the core idea became 'Gemma judges, code guarantees'. Code decides which Irish jobs you see (seniority, right to work, languages). Gemma writes the CV, and a guard drops any line that doesn't cite a confirmed fact.

▸ git commit Start Deis: job filters, fact ledger and CV guard
Start Deis: job filters, fact ledger and CV guard
First commit; then 'Right to work is code's job; guard tolerates real model output' and a guard eval runner
You

DigitalOcean is taking time to sort a payment issue, so let's keep moving with Google AI Studio meanwhile. Sentry DSN made with a new project.

Agent

AI Studio's Gemma 4 returned 500s for hours and some calls hung past 90 seconds. So every cloud call got a deadline, the demo got a health probe, and a second Gemma host became the fallback. Sentry got one issue per guard rule, by name only: never a CV, a prompt or a key.

You

Keys are in on Render, test the live demo. And prep it for OpenRouter: the CV output does not give a good CV and no career objective.

Agent

Gemma 4 26B on OpenRouter is now the demo's second host. The CV follows the layout of the author's own hand-tailored CVs: a professional summary ending in a career objective, labelled competencies, and 3 to 5 bullets per main job.

You

Let's finalise the infrastructure and output quality, and make a fully offline running mode for the app. Also audit the app and tell me how we're doing.

Agent

Ran a seven-part audit (infrastructure, output quality, offline, UI, security, code health, launch). Fixed the top of it: per-route and demo-wide rate limits keyed on Cloudflare's header, a feed that never wipes the deck on a failed refresh, and an offline mode with an egress guard on every socket plus paste-a-job.

▸ Bash pnpm test && pnpm lint && tsc
$ pnpm test && pnpm lint && tsc
75 tests at the audit; tests, lint and types now run in CI on every push
You

I hate the UI and UX. We don't just need a modern UI with colours and fonts, we need an actual overhaul with magic: more dynamic, more animations, it should feel crazy premium.

Agent

The 'Highlighter' design: one lime accent that only means go or proven. A physical swipe deck with fly-to-tab, and a kit that writes itself line by line while removed sentences flash past struck through. Select a fact and the highlighter draws to every CV line that cites it. All of it stops under reduced motion.

You

How will people download it? We also need an update mechanism, and people should be able to set their own SerpApi key, because mine will run out soon.

Agent

Desktop installers for macOS, Windows and Linux built and smoke-tested in GitHub Actions, published on each v* tag. deiscareers.tech is the home. Windows and Linux update themselves; the Mac points to the download page. SerpApi can use your own key.

▸ git tag v0.1.1 ... v0.1.5
v0.1.1 ... v0.1.5
Five releases on 16 Oct, including the Android APK and 'Gemma on your computer in one click'
You

I just connected Entire to the CLI. And for Sentry: are we using it well? It has logged 12 issues but I can't recall the last time one was picked up. How are we using Mastra?

Agent

Sentry now separates the demo, desktop and development environments, with the task in guard issue titles and alerts for model errors. Mastra traces go to Mastra Platform with prompts and outputs stripped, and pure-code scorers grade every hosted kit.

You

Make it clear in the app that they should use local models for the best results, maybe a one-click installation.

Agent

The desktop app links Ollama's installer for your OS, checks every 4 seconds until it's running, then downloads Gemma in one click with live progress. The web demo says so on the hero and in its rate-limit messages.

You

We need a feature for people with 5 to 7 years of experience, and more career fields: it's all tech right now. Add tax, accounting, management, with a search. Address everything from studying to 7+ years.

Agent

This came from the first real user: an MBA student with ten years in tax. The check-in now goes from studying to 7+ years, with 25 kinds of work and a search.

▸ git commit Stages from studying to 7 or more years; Kinds of work: tax, accounting, mana...
Stages from studying to 7 or more years; Kinds of work: tax, accounting, management and more, with search
17 Oct
You

Where are we standing, what's left, how do we bring it to a close? Maybe we don't allow people to put their profile in on the web demo, only in the app. Let's focus on quality.

Agent

The web demo now runs two fictional graduates only, and the server refuses a real CV, so no CV reaches the hosted model. A re-review caught three bugs before users did: a checkout redirect to the proxy's internal address, a page that broke the build, and wrong copy for returning visitors. CI's checksPass meant the broken build never deployed.

You

My first user said when they expand a job description, the bullet points from the actual JD became paragraphs. Not easy to read.

Agent

Google Jobs postings (44% of the deck) arrive with list items as bare lines. A new parser rebuilds headings, paragraphs and lists, and rejoins sentences split around bold words. Measured on all 340 live postings: Google Jobs postings with real lists went from 4 of 151 to 123.

You

Just got a new purchase from someone I have no idea who it is. I think the product is finding its market through word of mouth! Also add the support email [REDACTED] to the website.

Agent

Two sales on Polar: the first user bought it on the call, and the second came from a stranger. The October code is applied at checkout, and the support inbox is on the site and in the desktop licence screen. 89 commits and 364 tests by the end of the week.

My first real user wasn't who I built it for. I expected a recent tech graduate. A friend forwarded Deis to her MBA class, and the person who got on a call with me was one of her classmates: an international student with ten years of experience, looking for tax and accountancy roles. Deis only really knew early-career tech jobs. So that week it grew career stages from 3 to 5 years up to 7 or more, and kinds of work beyond tech, from tax and accounting to management, with a search so anyone can find their own field.

The check-in my first user needed: career stages up to 7 or more years, and tax, accounting and finance

What they told me:

  • They read the job description before they swipe. I'd assumed people glance at a card and swipe. They opened every posting, and the posting's own bullet points had turned into a wall of paragraphs. The full posting now keeps its lists and headings.
  • They said the price was too low, and then they bought it. An MBA student telling me to charge more was not what I expected. What sold them was swiping and getting a CV, a cover letter and form answers where every line is backed by something they said. They bought it on the call with the October code: Deis's first sale.
  • Ollama needed a human the first time. Their first question was "why am I installing Ollama?" Once I explained that it runs the AI on their own laptop, they switched to it and kept going.
  • They liked that Deis never applies for them. They're graduating this month, and every time they open the app there are about 250 jobs that fit, instead of a blank scroll through LinkedIn or Indeed.

The posting they were reading, before and after their feedback:

The same posting before and after their feedback: the lists are lists again

And the sales. The first came on that call. The second came in on the day I wrote this post, from someone I've never met: nobody I know, nobody I sent it to. Deis is starting to travel by word of mouth.

The first sale after the call on WhatsApp, and Polar showing two sales

People outside Ireland wrote back too. A friend in Germany asked for a German version, a friend in Australia sent a voice note about the swipe, and a friend in India wants it for remote roles in Ireland, which the check-in's remote and right-to-work questions already cover. Still, I'm keeping Deis to Ireland for now, on purpose. It's the job market I know from the inside, and every country does this differently: CV styles, languages, what employers expect to see. Other countries can come later. For now I'd rather build something that really helps people in Ireland than something for everyone that helps no one.

Replies: a friend sharing it with her MBA cohort, and friends in Australia, India and Germany (names and faces blurred)

I also showed it to people at a networking event recently. The question I heard most was why I'd open-source it and charge so little. My answer: €9.99 pays for the server and the job feed, and the code stays open because a tool for people looking for work shouldn't be something anyone can take away from them.

Prize Categories

  • Best Use of Gemma: Gemma 4 E4B on the laptop and Gemma 4 26B/31B in the cloud do every AI job in the app, measured and guarded.
  • Best Use of Render: the hosted demo and the shared Irish job feed, with Key Value for the cache and rate limits.
  • Best Use of SerpApi: Google Jobs as a shared, cached feed for early-career roles across Ireland.
  • Best Use of Sentry Agent Tracing: traces of every workflow step and Gemma call, and one issue per guard rule, tagged by model.
  • Best Use of Mastra: per-request model chains with fallbacks, one agent per task, and a parallel kit workflow.
  • Best Use of a .tech Domain: deiscareers.tech is Deis's home: the web demo, the download page, checkout, and the shared job feed the desktop app reads.

I drafted this post with Claude Code and edited it myself. The code, the tests and the evals in the repo are the same ones I ran for the numbers above.