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

  • 15 min read
  • Case study, Design engineering, Product systems

The first idea was a job board: collect UX design roles, show them on cards, link out to the posting. I was the user, and that was not what I needed. I never ran out of job links. I ran out of hours: working out which roles were real, whether remote included India, what the application should 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.

The job-lab board showing an India-focused political map, city role clusters, remote-role count, and a ranked list of design jobs.
The board is where the decision happens: map, filters, source freshness, role fit, and effort, all in one place.Kousik DuttaOriginal product screenshot

Volume was never the problem

Most job products optimize for volume: search, save, apply. That falls apart for a senior designer in India looking for roles worth a careful application. Finding roles was never the hard part. Judging them, with half the information missing, was.

The real work: turning vague job-search pain into interface rules and data structures that hold up against real roles.
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
The real work: turning vague job-search pain into interface rules and data structures that hold up against real roles.

I designed it, built it, and tested it

I designed and built it end to end: source model, scoring logic, board IA, map interaction, ATS packet workflow, local storage, theme system, and validation scripts. This is the work I love most. A design decision doesn’t stay a note in Figma. It becomes a typed model, a component, a route, a test, and a build artifact.

7+
public job-source families normalized
76
roles in the latest local board capture
2
complete visual themes, light and dark
8
top-level workflow views smoke-tested
The spread matters more than any single number: sourcing, interface, workflow, theming, and validation all had to move together.

The architecture is the strategy

I split it into three layers. The source layer reads public postings and cleans them into one consistent job object. The decision layer scores fit, effort, readiness, and access to a real person. The interface layer turns those signals into a board, a detail view, an apply packet, and a loop that learns.

The loop is the point. Once outcomes come back, the board stops guessing and ranks from real conversion data.

That loop set the UI structure. The board is for triage. The detail view decides whether a role gets the hour. The apply packet shapes the evidence. The tracker checks whether the advice is actually working. Four views, four jobs, so each one gets its own density.

The board is for triage

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.
Board. Search, eligibility filters, seniority and workplace chips, worth-your-hour sorting, the role list, and an India-first map, so you can triage the market without opening ten tabs.Kousik DuttaOriginal product screenshot
The job-lab board showing the India-focused role map, remote-role summary, city cards, and ranked job list.
I tuned the map, chips, borders, and cards as two complete working surfaces. This figure follows the site’s theme.Kousik DuttaOriginal product screenshot

The map got pushback, and it deserved it. The first version was decoration, and its India boundary was not acceptable for the context. I replaced it with an accepted world political map and made India the default: India’s boundary visible, remote roles counted separately, cities ranked on the right, the ranked application list on the left.

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
The fix was visual and structural at once. The data model has to support the claim the map makes.

Interactive preview

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. Toggle the signals and watch the call move from skip to shortlist to apply today.

On a phone, the job changes

On desktop, comparison is the task, so the ranked list, filters, map, and split-view detail all share one screen. A phone is a different job, so I designed a different composition. Today is the compact starting point. Five daily destinations sit in a bottom bar that respects the safe area. Secondary tools move into a More sheet. Board goes list-first with collapsible filters. Opening a role gives you a focused overlay with a clear way back, not squeezed desktop panes.

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. Compact metrics and a two-column action grid keep the next decision in view, above navigation your thumb can reach.Kousik DuttaOriginal product screenshot
Responsive is an information-architecture call. Keep the task and the evidence, change the composition.
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
Responsive is an information-architecture call. Keep the task and the evidence, change the composition.

Compact, not cramped

Compact never meant small targets. Controls stay at 44 pixels where precision matters, safe areas are handled, and document overflow is gone. I tested at 320 × 720, 390 × 844 and a 200%-equivalent reflow viewport. Desktop kept its own split view and map.

The apply packet earns its keep

job-lab job detail showing a selected senior mobile UX designer role, score chips, application actions, and readiness modules.
Job detail. A posting stops being a link and becomes a decision: score, source, role tags, actions, and readiness warnings, all before the apply click.Kousik DuttaOriginal product screenshot
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: role worth, resume gate, portfolio angle, human path, and outreach copy. All the invisible prep, made visible.Kousik DuttaOriginal product screenshot

A normal job card ends at the apply link. job-lab starts there. The detail page turns a posting into an application packet: role fit, resume gaps, portfolio proof, a path to the hiring team, an outreach draft, a follow-up plan, and interview prep. I designed it to slow you down before the external apply click, because that is where the quality of an application is won.

Every module is specific to the role, and the user always has the final edit.
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
Every module is specific to the role, and the user always has the final edit.

Interactive preview

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
Why the app blocks weak applications. 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 testEvery screen, recovery states, accessibility structure, and test coverage

Every screen has one job

job-lab Today view with the most useful next moves, outcome learning cards, and burnout guard.
Today and autopilot. The daily starting point. It doesn’t ask you to browse. It shows the most useful next moves, tracks what the market is teaching, and caps the day at a small number of quality applications.Kousik DuttaOriginal product screenshot
job-lab Resume tab showing a no-resume-loaded state and an explanation that resume text stays in the browser.
Resume matcher. Resume text is local data. It stays in the browser, powers JD-specific rewrites, and keeps profile fit separate from what the resume actually proves.Kousik DuttaOriginal product screenshot
job-lab Who to contact tab showing the LinkedIn referral bridge and hiring-team guidance.
A better LinkedIn referral path. No scraping private data, no pretending to know personal emails. It shows a public, reviewable path to the most likely hiring-team contact, and the user stays in control.Kousik DuttaOriginal product screenshot
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, so it reads like a real note, not generic AI copy.Kousik DuttaOriginal product screenshot
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, so the examples are ready before the first recruiter call.Kousik DuttaOriginal product screenshot
job-lab Advisor view with strategic guidance cards for improving the job search.
Advisor. The raw board becomes strategy: where the search is blocked, which market segment is strongest, and which one action improves several applications at once.Kousik DuttaOriginal product screenshot
job-lab Applications view showing tracked applications and pipeline state.
Applications tracker. Applied, reply, rejection, and interview outcomes get recorded, so the board learns from conversion data instead of staying a static list.Kousik DuttaOriginal product screenshot
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, not scattered across LinkedIn, email, and memory.Kousik DuttaOriginal product screenshot
job-lab Portfolio view showing the proof themes employers are asking for across roles.
Portfolio proof. The resume is only half of it. job-lab reads what the board is asking for and helps pick the case studies that prove it.Kousik DuttaOriginal product screenshot
job-lab Pay view comparing benchmark compensation and posted salary bands by level.
Pay intelligence. Published benchmarks and disclosed job bands stay separate, so you see what you should make next to what employers actually advertise.Kousik DuttaOriginal product screenshot
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, without bluffing about bargaining power.Kousik DuttaOriginal product screenshot
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. A job search is sensitive, and none of it needs uploading to help.Kousik DuttaOriginal product screenshot

Failure is a designed state too

Local-first products still fail. A required job file can go missing, optional evidence can arrive malformed, local storage can reject a write, filters can return nothing, and someone can open a tool before adding a resume or profile. I gave each of those its own state instead of routing them all to one generic empty card. If required data fails, only what can’t be trusted gets blocked. If an optional feed fails, only the affected advice degrades. Local applications and contacts are never touched.

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. The product names the source that failed, protects local work, and gives one clear retry.Kousik DuttaOriginal product screenshot
Loading, empty, degraded, invalid, and failed are five different states, because each one keeps a different amount of trustworthy work.
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
Loading, empty, degraded, invalid, and failed are five different states, because each one keeps a different amount of trustworthy work.

Accessibility changed the structure

The accessibility pass changed structure, not just colors. I added a skip link and landmarks, fixed heading and control names, made map points keyboard-operable, built real dialog and tab behavior, trapped and restored focus, made the list inert behind mobile detail, supported arrow keys across tabs, kept focus visible, added reduced-motion behavior, and kept a readable list as the alternative to the map.

What I claim: the keyboard, semantic, contrast, motion, and reflow paths I tested all passed. That is not a full screen-reader or assistive-technology certification, and I don’t call it one.
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
What I claim: the keyboard, semantic, contrast, motion, and reflow paths I tested all passed. That is not a full screen-reader or assistive-technology certification, and I don’t call it one.

I tested it against real ATS platforms

I tested against the application platforms people actually hit, and the ways each one breaks: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, iCIMS, Workable, and generic employer forms. That changed the product. Autofill can prepare you. It shouldn’t pretend every ATS behaves the same, and it never auto-submits.

I also wrote browser tests for the live app. The desktop smoke test covers the political map, split-view detail, application tabs, and every top-level workflow. The mobile suite runs the whole product at 390 × 844 and 320 × 720: navigation, list to detail and back, every detail tab, empty states, invalid forms, required-data failure, malformed nested data, and optional-feed degradation. Accessibility checks cover keyboard and semantics, contrast, reduced motion, and 200%-equivalent reflow. After deployment, a production smoke test confirmed mobile navigation, Today, no horizontal overflow, and zero page errors.

Rendering is not proof

If the claim is “this helps a designer apply better,” a screen that renders proves nothing. The workflows have to survive missing data, narrow screens, keyboard use, both themes, and the trip back from a focused task.

What this proves, and what it doesn’t yet

I built this alone, so it shows how I own a product end to end: the trade-offs, the implementation, and a working deployed system. It doesn’t show team leadership, and it is too early for placement or conversion numbers. The next layer measures exactly that: time from finding a role to deciding on it, packet completion, application-to-reply rate, interview rate, and whether the daily cap cuts weak applications without cutting opportunities.

Shipped is not the same as impact

Browser tests prove the product works. Only real use over time proves it improves a job search. Knowing the difference is part of the job.

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. It pushed the design from a visual concept into a full operating system: accepted map context, source credibility, ATS readiness, a task-first mobile layout, accessibility, recovery, outreach, interview prep, outcome learning, and a burnout guard.

The takeaway

job-lab covers my whole range: product framing, public-data architecture, scoring models, interaction design, visual systems, local-first privacy, theming, and real browser testing. The board isn’t the product. The product is the system that tells you what to do next.

Was this useful? Your pick is saved on this device and counted anonymously.