This is a submission for the MLH x DEV Writing Challenge
The announcer struggled with the name. Droichead is Irish for "bridge", and it's not an easy word to read out cold. I was standing next to my friend Nithin, telling him the technical track was his. Then they read out mine.
I asked three more times whether they really meant me.
I've never taken a single technical module. I studied business and maths, and my master's is in cybersecurity risk management, which is governance, not code. I'd started LeetCode four days earlier. Everything I know about building software I learned at hackathons, and on Saturday 3 October, at Hacktoberfest Hack Day Dublin x The AI Collective, that classroom gave me a prize: Best Open-Source AI Project.
This post is the build behind it: what Droichead does, how an open-weight model runs it without being allowed to make things up, and what I did while the AI was writing the code.
TL;DR. Droichead is a calm, private career navigator for people whose work is being reshaped by AI, built for Ireland's multilingual workforce. A 90-second check-in gives you roles to grow into, an honest gap analysis, and a dated week-by-week plan that links only to real courses, preferring free and government-funded Irish programmes. It runs entirely on Google's open-weight Gemma 4: in the cloud, or fully offline on a laptop through Ollama. It works in seven languages, with no accounts and no database. I built it solo in one four-hour Claude Code session, and I pitched it with a flip chart.
What I Built
The question on the board
The organisers set out five tracks. With ten minutes left to choose, I was standing in front of the Job Displacement board, and I didn't need to go and interview anyone: my own role ends on 14 October. I was applying for everything, including jobs I'd never trained for, and asking the exact question the track was asking. Is AI going to replace me?
So I wrote a persona. Eva is a software engineer in Dublin. She keeps hearing about a role called Forward Deployed Engineer, a client-facing engineer who applies technology in the field, and wonders whether it's her way forward. She just doesn't know how to get there. Her pain points were mine:
- The job market is tough.
- Certificates are expensive.
- In Ireland, a lot of hiring runs through referrals.
- When you're applying for everything, it's hard to know which role is the right fit.
And in Ireland it's harder if you work in a second language. A big part of the workforce does: large Polish and Ukrainian communities, and the international staff who keep Dublin's tech and finance sectors running. The advice they get is generic, English-only and often fear-based. Meanwhile Ireland funds excellent upskilling through Springboard+, Skillnet Ireland and SOLAS eCollege, but most people never connect those programmes to a concrete next role.
What it does
- A 90-second check-in. Tap-first and skippable: role, industry, experience, the skills you enjoy, how you feel about AI, and the hours you can give each week. You can dictate the answers, or drop in a PDF CV, which is read in your browser and never uploaded.
- Pulse. Real articles from the last seven days (RTÉ, Silicon Republic, the Irish Times, the Guardian, TechCrunch), each with one line on what it means for you, next to live CSO Ireland unemployment figures.
- Roles to grow into. Emerging roles like Forward Deployed Engineer, AI Solutions Engineer or AI-enabled Finance Analyst, ranked by how close they are to what you already do.
- A gap analysis that leads with what you have. Then what's partly there, then what to build, with a time estimate at your hours per week, and a Listen button that reads it aloud.
- Bridge the gap. Pick a goal date and get a phased, week-by-week plan with a portfolio project. Every course comes from a human-checked catalogue.
- My plan. A timeline with a weekly streak, an
.icscalendar export, a printable wall planner with QR codes that open each course from the paper, live job openings with how long ago each was posted, LinkedIn post drafts, local events, and a weekly check-in that re-plans around a bad week without guilt.
All of it works in English, Gaeilge, Polski, Українська, Español, Deutsch and Français: the interface, the AI's answers, read-aloud and dictation.
The idea behind it fits on a napkin, and it's the scroll animation on the landing page. Wanting to switch jobs is a wish. Give it a deadline and it's a goal. Put a plan behind the goal and you have a strategy. Act on it every week and that's success.
Demo
Try it: droichead.onrender.com. It's on Render's free tier, so the first load after a quiet spell takes a little while to wake up. Tap Try a demo for one of two personas: Aoife, a software developer in Dublin (English), or Оксана, an accountant in Cork (Ukrainian). Or do the check-in as yourself.
| Pulse: roles to grow into | News for you, plus live CSO data |
|---|---|
![]() | ![]() |
| Gap analysis | My plan |
|---|---|
![]() | ![]() |
| Printable wall planner | One QR code per course |
|---|---|
![]() | ![]() |
The wall planner is my favourite part. A plan that only lives in a browser tab is easy to close. A plan on your fridge, where you can scan the next course with your phone, is harder to ignore.
MuhammadMurtuzaHussain / Droichead
Droichead is a calm, private career navigator for people whose work is being reshaped by AI. It runs on open-weight Gemma 4 and works in seven languages.
Droichead
Bridge the gap to the job that's coming. Droichead (DRUH-hed) is Irish for "bridge".
Droichead is a calm, private career navigator for people whose work is being reshaped by AI. It runs on open-weight Gemma 4 and works in seven languages. It was built in Dublin in one day for Hack for Humanity (Hacktoberfest Hack Day Dublin x The AI Collective), on the job-displacement track: help people navigate changing roles, skills, opportunities and economic security.
Live demo: https://droichead.onrender.com · Licence: MIT
A wish to switch jobs is a fantasy. Give it a deadline and it becomes a goal. Put a plan behind the goal and you have a strategy. Act on the strategy consistently and that is success.
The problem, locally
AI anxiety is real, and it is not evenly spread. In Ireland, a big share of the workforce works in a second language. That includes large Polish and…
How It Works
Browser: Next.js 16, React 19, Tailwind v4, Motion IndexedDB (Dexie): profile, plans, check-ins pdf.js: CV read in the browser │ profile sent per request, never stored ▼ Stateless route handlers /api/pulse RSS feeds + CSO PxStat ─► Gemma: roles, "what it means for you", economy /api/gap Gemma: have / partly there / to build /api/plan Gemma picks from a 32-item course catalogue ─► code schedules the weeks /api/replan code reschedules ─► Gemma writes one kind sentence and one tiny next step /api/jobs Arbeitnow + Remotive, matched to the target role /api/posts Gemma: LinkedIn drafts │ ▼ Gemma 4: Google AI Studio (26B-A4B) │ Ollama on a laptop (12B) │ any OpenAI-compatible endpoint The model picks, the code owns the facts
Career advice is a bad place for a model to improvise. A made-up course link wastes someone's evening, and a made-up deadline wastes their month. So I split the work the way I'd split it with a colleague I trusted but checked:
| Gemma decides | Code guarantees |
|---|---|
| Which roles fit, and why | Every news item is a real article from a real feed |
| What you already have, what's partly there, what to build | Unemployment figures come straight from the CSO API |
| Phases, tasks and minutes for each task | Every course link is one a human checked, picked by id |
| Which catalogue resource fits each task | The dates: weeks are computed from the goal date and your hours |
| A warm, specific line of encouragement | Re-planning: nothing stays overdue, and each week fits your hours |
The model never writes a URL. It gets a catalogue of 32 resources (Springboard+, Skillnet Ireland, eCollege, Cyber Skills and more), each with an id, and it's told it may only use those ids. Then the server checks anyway. An id Gemma invents simply disappears:
// app/api/plan/route.ts: an id that isn't in the human-checked catalogue is dropped const resourceId = t.resourceId && RESOURCE_BY_ID[t.resourceId] ? t.resourceId : undefined; Every response is validated against a zod schema. If it doesn't validate, Gemma gets the validation error back and one more try:
// lib/llm.ts for (let attempt = 0; attempt < 2; attempt++) { const text = await complete(messages, opts.maxTokens ?? 2000, opts.temperature ?? 0.5, signal); try { return opts.schema.parse(extractJSON(text)); } catch (e) { messages.push({ role: "assistant", content: text }); messages.push({ role: "user", content: `That did not validate (${String(e).slice(0, 400)}). Reply again with ONLY the corrected JSON object.`, }); } } And if the model is unreachable altogether, the demo personas fall back to pre-written content. A live demo in a room with shaky wifi should never dead-end.
The weekly check-in follows the same rule. When you tell it you're "a bit behind" or "way behind", plain code moves the tasks so nothing stays overdue and each week's load fits the hours you say you have. Gemma only writes the encouragement and one tiny next step. Rescheduling has to be right every time. Kindness is where a model earns its place.
There's one more guard in the system prompt: news text and CVs are treated as untrusted data, and the model is told never to follow instructions found inside them. A CV is exactly the kind of document someone could slip a prompt into.
One model family, three places
| Where | Model | Why |
|---|---|---|
| The live demo | gemma-4-26b-a4b-it on Google AI Studio | Fast enough to pitch with |
| A laptop, offline | gemma4:12b on Ollama | Your answers never leave your machine |
| Anywhere else | Any OpenAI-compatible endpoint (DigitalOcean Inference, vLLM, Groq) | Swap providers with environment variables |
I measured both main setups on the day, on the same calls:
| Call | Laptop: Gemma 4 12B on Ollama | Cloud: Gemma 4 26B-A4B on AI Studio |
|---|---|---|
| Gap analysis | ~9 s | ~4 s |
| Roles | ~28 s | ~9 s |
| News commentary | ~21 s | ~8 s |
| 26-week plan | ~42 s | ~23 s |
Two things I learned the hard way, both visible in the agent session below:
- Gemma 4 thinks at length by default, and it can spend the whole budget doing it. My first call to the 26B took 17 seconds and returned no answer at all, just thoughts. Setting
thinkingLeveltominimalthrough Google's native API brought it to about 5 seconds, with valid JSON in Irish. - Gemma on Google's API has no system role. So the system prompt is folded into the first user turn:
// lib/llm.ts: Gemma on Google's API has no system role const [sys, ...rest] = messages; const turns = rest.map((m, i) => ({ role: m.role === "assistant" ? "model" : "user", parts: [{ text: i === 0 ? `${sys.content}\n\n${m.content}` : m.content }], })); // ... generationConfig: { temperature, maxOutputTokens: maxTokens, thinkingConfig: { thinkingLevel: "minimal" } }, A local model also handles one request at a time, and React's dev mode fires effects twice. So identical requests in flight share one generation, and when everyone waiting on a generation has gone away, it's cancelled so it stops blocking the queue.
Private by design
There are no accounts, no database and no tracking. Your profile and plan live in your browser's IndexedDB, with one-tap export and delete. The server routes are stateless: your profile is sent with each request and never stored. Your CV is read on your device with pdf.js. On the laptop setup, nothing leaves your machine at all.
An Agent Skill other agents can reuse
The method itself is packaged as skills/bridge-the-gap/SKILL.md, so any agent can run the same gap analysis and planning without Droichead's UI. Its rules are the app's rules: lead with strengths, prefer free and funded programmes, never invent URLs, treat CVs as data, and never post on the person's behalf.
The build, by commit
Seventeen commits, all on the day (Irish time):
| Time | Commit |
|---|---|
| 11:32 | Initial commit |
| 11:44 | Skeleton: survey, pulse, gap analysis, planner |
| 11:56 | Redesign, real photography, RSS news |
| 12:01 | Six more languages, with a check that every locale has every key |
| 12:03 | The Agent Skill |
| 12:25 | AI moves to open-weight Gemma 4 on Ollama, locally |
| 12:57 | Gemma 4 on Google AI Studio, the scroll-drawn bridge, the wall planner |
| 13:05 | Render Blueprint |
| 13:29 to 13:43 | Social preview, QR codes, streaks, voice, CV upload, live CSO data, live jobs, weekly re-plan |
| 14:35 | README with screenshots |
On Lighthouse it scored 93 for performance, 89 for accessibility, 100 for best practices and 100 for SEO.
Partner Technologies
Gemma 4 (open-weight, from Google)
Gemma does every AI job in the app: roles, news commentary, gap analysis, plans, check-in messages and LinkedIn drafts. Open weights matter for this product in three ways:
- Privacy. A career plan is built from your work history and your worries. On Ollama it never leaves your laptop, and the code to do that is the same code the live demo runs.
- Cost. People looking for their next role are often the people least able to pay for another subscription. A local model costs nothing per plan.
- Control. Because Gemma runs inside my own pipeline, every answer passes through code I wrote before anyone sees it: schemas, the id check, deterministic scheduling. I could also swap sizes and providers and measure the difference, which is how I picked 26B-A4B for the demo.
It handled Ukrainian, Polish and Irish JSON well enough to ship. The one honest caveat: a native speaker hasn't reviewed the Gaeilge yet.
Google AI Studio
I'd used AI Studio for the first time the day before, building Pīzhù for a DEV weekend challenge. That practice run turned out to be the best preparation I could have done, because at noon on hack day I needed a plan B fast. The native API was the key: it's the only route where I could turn Gemma's thinking down to minimal.
Render
The whole deployment is one render.yaml Blueprint: a free Node service in Frankfurt (the closest region to Dublin), built with npm ci && npm run build, a health check on /api/health, and a redeploy on every push to main. Render asks for the AI Studio key when you create the Blueprint, so the key never touches the repo. The one thing to know: the free tier sleeps after about 15 minutes idle, so I opened the site a couple of minutes before my pitch.
DigitalOcean (the plan A that didn't happen)
DigitalOcean was the diamond sponsor, and I wanted to build on it. Joanna, one of the organisers, spent time getting my credits through, but the billing set-up wouldn't accept either of my cards, and without billing I couldn't generate a key for DigitalOcean's Inference. I'm including it because the code still carries it: there's a .do/app.yaml App Platform spec in the repo, and lib/llm.ts talks to any OpenAI-compatible endpoint, with DigitalOcean Inference as the default base URL. Pointing Droichead back at DigitalOcean is a matter of setting a key and a model name.
The detour took less than half an hour, and it made the product better. Discovering that my laptop already had Gemma 4 on Ollama is why "your answers can stay on your computer" is a feature and not a slogan.
Hackathon Experience
Getting there
At 00:33 I was wrapping meal prep for the week. By six I was on a bus from Galway to Dublin. The event had two names, Hacktoberfest Hack Day Dublin x The AI Collective Dublin Chapter on MLH and Hack for Humanity: Dublin on Luma, and I was on Luma's waiting list, so I didn't know where the venue was. I picked a direction and walked for twenty minutes. It was the wrong one. A taxi later I was one of the first people through the door at Dogpatch Labs, and Ashley, one of the organisers, turned my morning from lost to ready within a few minutes of chatting.
Seven tables, all full. Around 45 people in roughly 15 teams, from Ireland, Brazil, Poland, Ukraine, India and elsewhere in Asia. While everyone else talked architecture, I stood in a corner with Avi from Give a Go, who told me I had a voice for radio. It was exactly what I needed to hear.
Twenty minutes with nothing to build
I went outside and recorded a voice note: what the product should do, what the agent workflow should look like, and where AI should earn its place rather than replace a simple calculation. Then I handed it to Claude Code. That voice note is the first message in the session below.
While the first build ran, I had twenty minutes with nothing to do, and that's the part that catches people out. You can't interrupt the build without slowing it down. So I asked a different question: what can Claude not do that I can? The answer was pitching.
There was a flip chart in the corner. I tore off a sheet and split it into four quadrants: Eva and her thought bubble, "Is AI going to replace me?"; FDE, covered with sticky notes I could peel back with the audience; the pain points; and how Droichead answers each one. Then I thought about latency. A model takes several seconds to answer, which is a long time in a three-minute pitch, so I put the project name, a tagline and the tech stack on sticky notes to give the audience something to read while Gemma worked.
An illustration, redrawn from my description. The real one had more marker and fewer straight lines.
Three minutes, one flip chart
Most teams had slick slides. I dragged in a stand with a folded sheet of paper and started talking with my laptop still unplugged: "Hi folks, I'm Muhammad Murtuza from Galway, and Galway people are known to be a bit crazy, so what you're about to hear is a crazy guy's storytelling. Let's meet Eva." By the time I reached her pain points, I'd plugged in and gone live.
For the live demo I picked a volunteer: Nithin, who has years in offensive security and had no idea what I was about to do. I pasted his LinkedIn profile into Droichead. On the venue wifi the model took about twelve seconds, so I walked the room through Eva's plan while it worked, then came back to his result. The role it suggested was one he said he actually wanted: "that's the role I want." A real reaction, live, is hard to fake on a slide.
I ran out of time before the languages, the accessibility work or the live Irish data. I finished on the clock anyway, on the Lighthouse scores and a QR code to the live site.
Waiting to lose
Every other team had a back-and-forth with the three judges. I got one question from one judge: what's the human element? I said Droichead sends you out of the app, to events and to people on LinkedIn, because referrals matter in Ireland. Then I sat down certain I'd lost. I'd given them a person, a feeling and a solution, and in a room full of builders that felt like too little.
It was enough. Droichead won Best Open-Source AI Project. Congratulations to Moldmate by Christopher Svitok and team, who won the non-technical Build Without Code track. The prize was €25 and three sessions with Andrei, a Head of AI, which could not have come at a better moment for someone looking for their next role in AI and security.
What I'll remember
- When the AI is building, ask what only you can do. Claude writes code faster than I ever will. It can't read a room, choose a volunteer, or cover twelve seconds of silence. Those twenty minutes were the most valuable of my day.
- Start with a problem you live. Eva was a version of me, and I think the room could tell.
- Pitch for the room, not the rubric. The flip chart wasn't a gimmick. It was me being myself, and it gave people something to read while the model thought.
- Don't read the judges by the number of questions. I was sure one question meant I'd lost.
The rule that came out of that day, the model picks and the code owns the facts, became how I build. I used it the day before in Pīzhù without a name for it, and again the week after in Return Route.
What It Can't Do Yet
- The Gaeilge needs a native speaker's review. The Irish interface was written with AI help and checked by script, not by a fluent speaker.
- The match percentages are Gemma's estimates. They rank roles sensibly, but they aren't a validated score, and the app shouldn't pretend otherwise.
- The catalogue is 32 hand-picked resources. That's enough to be useful and small enough to check by hand. It needs to grow, and to be maintained.
- Live jobs come from Arbeitnow and Remotive, which skew towards Germany, the UK and remote roles. Irish job boards are next.
- It answers the judge's question only halfway. It sends you to events and drafts your LinkedIn posts, but it doesn't introduce you to anyone yet. Partnering with Skillnet Ireland, Intreo or community groups that support Polish and Ukrainian workers would.
- It needs a signal. An offline-first PWA, for people with patchy data, is on the list.
My Agent Session
I built Droichead with Claude Code in one session on hack day, from the voice note to the README. This is a curated version: my prompts lightly trimmed, Claude's turns summarised, and the tool calls and their outputs real. It includes the moment DigitalOcean's billing fell through, the benchmark that found Gemma 4 on my laptop, and the thinking-budget fix.














