# I Built a Job Search App That Fights You Back — Because Slow and Steady Is the Only Strategy That Lasts

> Source: <https://dev.to/mpmike/i-built-a-job-search-app-that-fights-you-back-because-slow-and-steady-is-the-only-strategy-that-3mc4>
> Published: 2026-10-21 02:13:48+00:00

*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady](https://dev.to/challenges/hacktoberfest-week3-2026-10-19)*

The sloth moves at its own pace. It conserves energy. It survives. It has never once refreshed an applicant portal at 2 a.m.

Black Box is a job search app built in the sloth's honour — which means it is a job search app that deliberately slows you down. Every other tool in this space tries to make you faster: more applications, more alerts, more dashboards to check. Black Box does the opposite, on purpose, with mechanics instead of advice:

Who gets to be lazier because of this? Anyone in a long job search who is spending their limited energy on checking instead of living. Black Box's whole job is to give that time back.

**Live demo: [https://black-box-sy5x.onrender.com](https://black-box-sy5x.onrender.com)** (Render Starter plan — always on, no wake-up wait)

**Fastest way in: [https://black-box-sy5x.onrender.com/demo](https://black-box-sy5x.onrender.com/demo)** — a one-click demo account that seeds a week of sample applications, inbox mail, and mood marks into your browser and signs you in as [demo@mikedemo.email](mailto:demo@mikedemo.email), so the vault, the reframe, and the progress cards can all be exercised immediately. It's sample data, it lives only in your browser, and the app says so.

**The full walkthrough — 100 seconds, breathing gate and all:**

**And the breathing gate as a standalone minute** — the cover sloth, animated, with a guided 4 · 4 · 4:

The demo runs in "Demo mode": hosted Gemma 4, clearly labelled in the interface, because Render has no GPU. Run it locally (instructions in the repo) and the same code calls Gemma on your own machine instead — see below.

**A job search app that slows you down on purpose.**

**Live demo: [https://black-box-sy5x.onrender.com](https://black-box-sy5x.onrender.com)** (Render Starter plan — always on)

**One-click demo account: [https://black-box-sy5x.onrender.com/demo](https://black-box-sy5x.onrender.com/demo)** — seeds a week of sample applications, inbox mail, and mood marks into your browser and signs you in as [demo@mikedemo.email](mailto:demo@mikedemo.email), so the whole app (vault, reframe, progress cards) can be exercised immediately. Sample data only; it never leaves your browser.

Built for the [DEV Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady](https://dev.to/challenges/hacktoberfest-week3-2026-10-19) — build something with open-source AI that rewards laziness.

Every job search tool tries to make you go faster: more applications, more refreshing, more dashboards. Black Box does the opposite. It is named for the flight recorder — the box you only open when it matters — and for the closed lid it puts between you and compulsive status-checking.

One small Next.js app (App Router, TypeScript, Tailwind). No database. No server accounts. No analytics. Every piece of user data — applications, vault state, budget, mood log, profile, inbox, and the demo session — lives in the browser's local storage, on the user's machine.

The UX was designed before it was built, twice. First I gave Google Stitch this repo plus the `DESIGN.md` from my open-source [happy-code-library](https://github.com/Mike-Demo/happy-code-library/tree/main/.stitch) (the Web Awesome design system), created the design system in Stitch from that file, and generated the screens — email sign-in, the Today dashboard, the Vault with its inbox, the email reframe detail, and a check-in & progress screen. Then, after using the app for a day, I asked Stitch for redesigns with *no* design system attached, taking the whole aesthetic from Voda (the LGBTQIA+ wellbeing app) instead. It came back with two — a pastel daylight version and a dusk version — and I picked daylight: the shipped app is rebuilt toward it, with a warm cream background, a soft serif for headlines and greetings, pastel-tinted cards, and one deep indigo for actions. The design exports and both explorations live in the repo under `design/`. The restyle also replaced the mood emoji with plain words (Rough / Tiring / Neutral / Steady / Good) — plainer is calmer — and a later design pass turned the mood check-in into a gradient scale and added the progress cards, taking the shape of both from Voda's daily check-in and journey cards. The scale's handle is an emoji face that changes expression along the scale — a sloth when the day is unmarked — because one expressive exception earned its place; the words themselves stay plain.

The calm isn't only an aesthetic. The design is checked against Microsoft's Inclusive Design guidance for mental health — the [Mental Health Guidebook](https://inclusive.microsoft.design/articles/mental-health-guidebook) and its [design-pattern cards](https://inclusive.microsoft.design/articles/mental-health-cards), which also ship as a [Figma plugin](https://www.figma.com/community/plugin/1268611308971699930). Their three considerations map directly onto the app: *Preserve* — no push notifications, no badges, no red anywhere, nothing that manufactures urgency; *Direct* — progress you can see, and exactly one obvious next step on each screen; *Customize* — a privacy mode you choose per call, and a mood check-in that's a scale you slide rather than a form you fill in. The cards' AI Assistants guidance — keep the person in control, make AI output fact-checkable, never let the tool override the customer — is the same discipline the reframe prompt enforces.

The only server code is two stateless API routes, `/api/reframe` and `/api/score`, which call Gemma through a single provider layer (` src/lib/gemma.ts`) with three paths:

`gemma4:e4b` on the user's machine. The default, and the private path.
The prompts are contracts, not vibes. The reframe prompt forbids the model from changing any fact, softening silence into hope or hardening it into rejection, diagnosing, guessing at the reader's feelings, or adding reassurance the source text doesn't support. If the notice doesn't say something, the model must list it under "what it does not say" — never fill it in. Those rules come from an open-source skill I'd already built for exactly this problem, the [mental-health-support skill](https://github.com/Mike-Demo/agent-skills): transformations are display-only and labelled, originals are preserved, facts stay facts.

The score prompt is just as strict in the other direction: score only against what the profile and the description actually state, name omissions as omissions, no flattery and no predictions.

Because the most sensitive text in a job search should not have to leave your machine to be useful.

An outcome notice, a private profile of what you want next, a log of how the search is going — with a closed API, every one of those has to be shipped to someone else's server before a model can help you read it. With Gemma 4 — open weights, Apache 2.0 — the model comes to the data instead. Black Box in local mode runs the whole loop on the device in front of you, costs nothing per call, works offline, and cannot change its pricing or its terms on you mid-search.

I'll be precise about the limit, because it matters: the public demo can't do that. Render has no GPU, so the demo serves the same Gemma 4 weights from a hosted endpoint, and text you paste there is sent to that provider for the call. The app says so, in the interface, next to the toggle — and the toggle itself only exists because the open weights let one codebase honestly offer both paths. A closed model gives you one path and asks you not to think about it.

*Will fill out on Sunday*

`render.yaml` Blueprint in the repo.

🦥
