job-lab: I needed judgment, not more job links.

A local-first job-search desk for a senior designer applying from India: private, with a public demo.

  • 8 min read

The first idea was a job board, but I was the user, and I never ran out of job links. I ran out of hours: checking which roles were real, whether remote included India, what to say, who to write to, and whether the market was teaching me anything back.

Private desk, public demo

The real desk is private and stays behind a login. The public demo runs on fictional data, so you can try every screen. Try it at job.kousikdutta.com/?demo=1 (opens in a new tab).

Open job-lab (opens in a new tab)

The job-lab board showing an India-focused political map, city role clusters, remote-role count, and a ranked list of design jobs.

Volume was never the problem.

Most job products optimize for volume. That fails a senior designer in India looking for roles worth a careful application.

Article data table
User problemDesign responseEngineering response
Remote does not always mean remote from IndiaSplit remote, hybrid, onsite, and city roles instead of flattening them into one listNormalize location text into workplace, city points, and eligibility flags before anything renders
A match score alone does not tell me what to doRename the score Worth your hour and tie it to the next actionCombine role fit, freshness, application readiness, resume evidence, and human-route signals
Most ATS advice is vague or dishonestSuggest rewrites only where the resume lacks truthful evidenceCompare posting language against the resume, portfolio projects, and saved profile data
Networking turns into spam fastDesign outreach as a decision, not a send-more buttonBuild templates from the role, the company, hiring-team clues, and portfolio proof

I designed it, directed the build, and tested it.

Each design decision becomes a typed model, a component, and a test.

7+
public job-source families normalized
76
roles in the latest local board capture
8
top-level workflow views smoke-tested

The architecture is the strategy.

Three layers: sources become one clean job object, a decision layer scores fit, effort, readiness, and access to a real person, and the interface turns those signals into action.

The board is for triage.

Board. Search, filters, the role list, and an India-first map, so you can triage the market without opening ten tabs.

job-lab Board view with search, eligibility chips, worth-your-hour sorting, a ranked role list, and an India political map with city role clusters.

The map got pushback, and it deserved it. The first version was decoration, and its India boundary was not acceptable, so I replaced it with an accepted world political map.

The first map
  • Decorative geography
  • Unclear political boundary
  • Remote roles plotted as if they had a city
  • No link to the ranked list
The map that works
  • Accepted political map context
  • India first, because that is the market
  • Remote work counted separately
  • Dots, city cards, and jobs all agree

Toggle the signals and watch the call move.

Try the Worth your hour model

Worth your hour76

Worth a look, but fix the resume gate before opening the ATS.

A simplified version of the board logic.

On a phone, the job changes.

Desktop is for comparison. A phone is a different job, so it gets a different composition.

Mobile job-lab Today view at 390 pixels wide with compact metrics, a two-column next-move grid, and safe-area bottom task navigation.
Mobile Today at 390 × 844.

Each product need, and how desktop and the phone meet it.

Article data table
Product needDesktop behaviorMobile behavior
Choose what to do nextThe wide layout keeps several destinations and their context visibleToday leads with the most useful actions and five daily destinations
Scan the marketList, map, city summary, and filters share one viewBoard goes list-first; filters collapse and the map becomes secondary context
Move across the workflowEvery top-level destination stays in the headerA safe-area bottom bar holds daily tasks; More opens Advisor, Portfolio, Pay, Negotiate, and Settings
Open a role and returnDetail and list share the split-view spaceDetail becomes its own overlay: the content behind it goes inert, context is kept, and Back to roles is always there

The apply packet earns its keep.

Job detail. A posting stops being a link and becomes a decision, before the apply click.

job-lab job detail showing a selected senior mobile UX designer role, score chips, application actions, and readiness modules.
job-lab Apply packet tab showing the application assembly line with worth-your-hour, gate, resume move, portfolio angle, human path, and outreach copy.
Apply packet. The posting becomes a checklist of work.

A normal job card ends at the apply link. job-lab starts there, and slows you down before the external click, because that is where an application is won.

Article data table
Packet moduleDesign decisionEngineering detail
Resume matchShow missing evidence and honest rewrites, never fake ATS hacksCompare JD terms, seniority, and proof points against the stored resume text
Portfolio proofAsk for the two projects that answer this posting, not five random linksMatch job keywords to saved project themes and generate a short pitch angle
Who to contactReplace “go network” with a specific route to a personUse public company and team clues, with a manual review every time
Write to themSpecific enough to be useful, restrained enough to be ethicalBuilt from role context, profile data, and the portfolio URL, not generic AI prose

Try packet readiness

ReadyRole fit

Profile fit and seniority match the posting.

BlockedResume

Paste your resume once in Settings.

ReadyPortfolio proof

Two case studies map to the role.

BlockedHuman route

Find one person before outreach.

ReadyAutofill

Name, email, and portfolio URL are ready.

Packet readiness60
A role can fit and still be blocked if the resume, portfolio, human route, or autofill data is missing.
See every screen, failure state, and test

Every screen has one job.

Today and autopilot. It shows the most useful next moves and caps the day at a small number of quality applications.

job-lab Today view with the most useful next moves, outcome learning cards, and burnout guard.
job-lab Resume tab showing a no-resume-loaded state and an explanation that resume text stays in the browser.
Resume matcher. Resume text stays in the browser.
job-lab Who to contact tab showing the LinkedIn referral bridge and hiring-team guidance.
LinkedIn referral path. No scraping private data, no pretending to know personal emails.
job-lab Write to them tab showing a role-specific outreach draft and application context.
Outreach draft. The email is built from the role, the company, portfolio proof, and the contact route.
job-lab Prepare tab showing interview prep and a story bank for the selected role.
Interview prep. A posting becomes interview themes and story prompts.
job-lab Advisor view with strategic guidance cards for improving the job search.
Advisor. Where the search is blocked, and which one action improves several applications at once.
job-lab Applications view showing tracked applications and pipeline state.
Applications tracker. Outcomes get recorded, so the board learns from conversion data.
job-lab Contacts view showing a lightweight contact tracker for hiring-team and referral conversations.
Contacts CRM. Referral and hiring-manager conversations stay tied to their applications.
job-lab Portfolio view showing the proof themes employers are asking for across roles.
Portfolio proof. job-lab reads what the board is asking for and helps pick the case studies that prove it.
job-lab Pay view comparing benchmark compensation and posted salary bands by level.
Pay intelligence. Published benchmarks and disclosed job bands stay separate.
job-lab Negotiate view with offer strategy and negotiation prompts.
Negotiation coach. It shows up after the offer stage and uses market and pay context to frame a counter.
job-lab Settings view with local profile fields used for resume matching, autofill, and outreach drafts.
Settings and local profile. Profile, resume, contact, and portfolio inputs are stored locally.

Failure is a designed state too.

Local-first products still fail. Each failure gets its own state instead of one generic empty card.

Mobile job-lab Board unavailable state explaining that required job data failed, confirming locally saved applications and contacts are unchanged, and offering a Try loading again action.
Core-data failure at 390 × 844.

Each failure state, what the interface says, and how it recovers.

Article data table
StateWhat the interface saysRecovery behavior
Required board data failsThe Board is unavailable; local applications and contacts were not changedRetry the failed source without clearing private local state
Optional evidence is malformedThe Board still works; the affected Advisor or company evidence names what is missingReload that feed and keep the rest of the product usable
Search or filters return zero rolesThe roles still exist, this view just has no matchesClear search and filters in one action
Resume, profile, or portfolio proof is missingThe relevant packet module is blocked and names the missing evidenceSend the user to the field that enables matching, outreach, or autofill
A form or storage write failsThe error stays on the action instead of implying successFix the field, retry the write, or reset only the affected local data

Accessibility changed the structure.

The ranked list doubles as a readable alternative to the map.

The keyboard, semantic, contrast, motion, and reflow paths I tested all passed. That is not a full screen-reader or assistive-technology certification.
User needImplementation evidenceValidation
Navigate without a pointerNamed buttons, keyboard map points, tab semantics, and logical focus orderKeyboard review across every primary view and all job-detail tabs
Keep context through overlaysFocus trap, inert covered content, explicit close and back actions, focus restorationMobile detail and More-sheet open and close paths at 320 and 390 pixels
Read both visual themesSemantic tokens for text, muted labels, status tones, focus and action contrastLight and dark contrast, persistence, and first-paint theme checks
Zoom and reflowCompact cards and local table patterns avoid page-level two-way scrolling320-pixel viewport and 200%-equivalent reflow coverage
Understand errors and stateErrors name the failed action, keep trustworthy work, and offer a recovery controlCore-data, malformed-feed, empty-result, invalid-form, and storage-state tests
The keyboard, semantic, contrast, motion, and reflow paths I tested all passed. That is not a full screen-reader or assistive-technology certification.

I tested it against real ATS platforms.

I tested against Greenhouse, Lever, Ashby, Workday, SmartRecruiters, iCIMS, Workable, and generic employer forms. Autofill can prepare you, but it doesn’t pretend every ATS behaves the same, and it never auto-submits.

Browser tests cover the whole product at 390 × 844 and 320 × 720. A production smoke test after deployment found no horizontal overflow and zero page errors.

What this proves, and what it doesn’t yet.

I designed and directed this alone, with Claude Code writing the code. It shows end-to-end ownership of a working deployed system, not team leadership, and it is too early for placement or conversion numbers. The next layer measures time to decision, packet completion, reply and interview rates, and whether the daily cap cuts weak applications without cutting opportunities.

Blunt feedback made it better.

The useful feedback was blunt: the map looked bad, the India treatment was wrong, mobile felt like a squeezed desktop, and a pretty happy path was not enough.

The board isn’t the product. The product is the system that tells you what to do next.