job-lab: Designing a Career Desk, Not Another Job Board

A local-first job-search operating system for senior designers applying from India

15 min read

The first ask sounded like a job board: collect UX design roles, show them on cards, link out to the original posting. The useful product was somewhere else. A senior designer does not lose because there are too few job links. They lose time deciding which roles are real, whether remote includes India, what the application should say, who to reach, and whether the market is teaching them anything back.

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 the decision surface: map, filters, source freshness, role fit, and effort signals in one place.Kousik DuttaOriginal product screenshot

What was broken

Most job products optimize for volume. They let you search, save, and apply. That is not enough for the user I was designing for: a senior designer in India trying to find roles worth a careful application. The hard problem is not discovery. It is judgment under uncertainty.

User problemDesign responseEngineering response
Remote does not always mean remote from IndiaSeparate remote, hybrid, onsite and city-specific roles instead of flattening them into one listNormalize location text into workplace, city points and eligibility flags before the UI renders
A match score alone does not tell me what to doRename the score to Worth your hour and connect it to the next actionCombine role fit, freshness, application readiness, resume evidence and human-route signals
ATS advice is usually vague or dishonestGive rewrite guidance only where the resume lacks truthful evidenceCompare posting language against resume, portfolio projects and reusable profile data
Networking turns into spam quicklyDesign outreach as a decision path, not a send-more buttonGenerate templates from role, company, hiring-team clues and the user's portfolio proof
The product work was translating vague job-search pain into interface rules and data structures that could hold up under real roles.

My role

I designed and built the experiment end to end: source model, scoring logic, board IA, map interaction, ATS packet workflow, local storage, theme system, and validation scripts. This is the kind of design engineering I like most - the design decision is not a Figma note. 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 captured for the portfolio
8
top-level workflow views smoke-tested
The numbers matter less than the spread: sourcing, interface, workflow, theming and validation all had to move together.

The architecture is the product strategy

I split the product into three layers. The source layer reads public postings and cleans them into a consistent job object. The decision layer scores role fit, effort, readiness and human access. The interface layer turns those signals into a board, a detail view, an apply packet and a learning loop.

Public postings
Greenhouse, Lever, Ashby, Workable,
SmartRecruiters, Workday, aggregators

Normalize
role, level, location, salary, source

Score
fit, freshness, readiness, worth-your-hour

Board
map, filters, ranked roles

Apply packet
resume, portfolio proof, outreach

Outcome learning
reply, reject, interview, ghost

The loop matters. Once outcomes come back, the board should stop guessing and start ranking from the user's real conversion data.

That loop drove the UI structure. The board is for triage. The detail view is for deciding whether to spend the hour. The apply packet is for shaping the evidence. The tracker is for learning whether the system's advice is working. Each view has a different job, so each view carries a different density.

Designing the board as a control room

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.
Feature: Board. The board combines search, eligibility filters, seniority/workplace chips, worth-your-hour sorting, the role list and the India-first map so the user 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.
The map, chips, borders and cards were tuned as two complete working surfaces. This figure follows the portfolio theme automatically.Kousik DuttaOriginal product screenshot

The map became controversial for a good reason. The first version looked like decoration, and the India boundary was not acceptable for the context. I replaced that with an accepted world political map treatment and made India the default mental model: India boundary visible, remote roles separated, cities ranked on the right, and the ranked application list on the left.

Bad map
  • Decorative geography
  • Unclear political boundary
  • Remote roles plotted as if they had a city
  • No connection to the ranked list
Useful map
  • Accepted political map context
  • India-first view for the user's market
  • Remote work counted separately
  • Dots, city cards and jobs all agree
This is design engineering work because the fix is both visual and structural: the data model has to support the correct visual claim.

Interactive preview

Try the Worth your hour model

Worth your hour76

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

This is a simplified version of the board logic. Toggle the signals and watch how the recommendation changes from skip to shortlist to apply today.

Responsive design meant changing the job, not shrinking the screen

The desktop product is a control room: ranked list, filters, geographic context and split-view detail can coexist because comparison is the task. On a phone, I designed a different composition. Today becomes the compact starting point, five daily destinations stay in a safe-area bottom bar, secondary tools move into a progressive More sheet, and Board becomes list-first with collapsible filters. Opening a role creates a focused overlay with an explicit return path instead of compressing 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 x 844. Compact metrics and a two-column action grid keep the decision layer visible above thumb-reachable navigation.Kousik DuttaOriginal product screenshot
Product needDesktop behaviorMobile behavior
Choose what to do nextThe wide shell can keep multiple navigation destinations and context visibleToday leads with the most useful actions and five daily destinations
Scan the marketList, map, city summary and filters share one control-room viewBoard becomes list-first; filters collapse and geography becomes secondary context
Move across the workflowAll top-level destinations remain visible in the headerA safe-area bottom bar holds daily tasks; More reveals Advisor, Portfolio, Pay, Negotiate and Settings
Open a role and returnDetail and list can use the available split-view spaceDetail becomes an isolated overlay with inert covered content, preserved context and an explicit Back to roles action
I treated responsive behavior as an information-architecture decision: preserve the user's task and evidence, then change the composition.

The apply packet is where the product earns its keep

job-lab job detail showing a selected senior mobile UX designer role, score chips, application actions and readiness modules.
Feature: Job detail. The detail screen changes a posting from a link into a decision page: score, source, role tags, action buttons and readiness warnings appear 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.
Feature: Apply packet. The packet turns a posting into a checklist of work: role worth, resume gate, portfolio angle, human path and outreach copy. It makes the invisible preparation 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, hiring-team path, outreach draft, follow-up plan and interview prep. The interaction is designed to slow the user down before the external apply click, because that is where quality is won.

Packet moduleDesign decisionEngineering detail
Resume matchShow missing evidence and safe rewrites, not fake ATS hacksCompare JD terms, seniority and proof points against 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 advocacy angle
Who to contactMove from 'networking' to a specific human routeUse public company/team clues and keep manual review in the loop
Write to themMake the email specific enough to be useful and restrained enough to be ethicalTemplate from role context, profile data and portfolio URL instead of generic AI prose
Every module had to be specific to the role but safe enough that the user remains the final editor.

Interactive preview

Try packet readiness

readyRole fit

Profile fit and seniority match the posting.

blockedResume

Paste 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
This preview shows why the app blocks low-quality applications. A role can be a fit and still be blocked if the resume, portfolio, human route or autofill data is missing.

Every feature in the suite

job-lab Today view with the most useful next moves, outcome learning cards and burnout guard.
Feature: Today / autopilot. This is the daily command center. It does not ask the user to browse. It surfaces 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.
Feature: Resume matcher. The app treats resume text as local user data. It stays in the browser, unlocks JD-specific rewrites, and separates profile fit from actual resume evidence.Kousik DuttaOriginal product screenshot
job-lab Who to contact tab showing the LinkedIn referral bridge and hiring-team guidance.
Feature: A better LinkedIn referral path. Instead of scraping private data or pretending to know personal emails, the product gives a public, reviewable path to the most likely hiring-team contact and keeps the user in control.Kousik DuttaOriginal product screenshot
job-lab Write to them tab showing a role-specific outreach draft and application context.
Feature: Outreach draft. The email is assembled from the role, company context, user's portfolio proof and contact route, so it reads like a specific note rather than generic AI copy.Kousik DuttaOriginal product screenshot
job-lab Prepare tab showing interview prep and a story bank for the selected role.
Feature: Interview prep. The app converts a posting into interview themes and story prompts, so the designer can prepare examples before the first recruiter call.Kousik DuttaOriginal product screenshot
job-lab Advisor view with strategic guidance cards for improving the job search.
Feature: Advisor. This view turns the raw board into strategic advice: where the user is blocked, which market segment is strongest, and which action improves multiple applications at once.Kousik DuttaOriginal product screenshot
job-lab Applications view showing tracked applications and pipeline state.
Feature: Applications tracker. The tracker records applied, reply, rejection and interview outcomes so the board can learn from conversion data instead of staying a static recommendation list.Kousik DuttaOriginal product screenshot
job-lab Contacts view showing a lightweight contact tracker for hiring-team and referral conversations.
Feature: Contacts CRM. The contact tracker keeps referral and hiring-manager conversations connected to applications, rather than scattering them across LinkedIn, email and memory.Kousik DuttaOriginal product screenshot
job-lab Portfolio view showing the proof themes employers are asking for across roles.
Feature: Portfolio proof. Instead of optimizing only the resume, job-lab reads what the board is asking for and helps the user choose case studies that prove those themes.Kousik DuttaOriginal product screenshot
job-lab Pay view comparing benchmark compensation and posted salary bands by level.
Feature: Pay intelligence. Published benchmarks and disclosed job bands are kept separate, so the user can understand what they should make and what employers are actually advertising.Kousik DuttaOriginal product screenshot
job-lab Negotiate view with offer strategy and negotiation prompts.
Feature: Negotiation coach. The negotiation surface appears after the offer stage and uses market/pay context to help the user frame a counter without inventing leverage.Kousik DuttaOriginal product screenshot
job-lab Settings view with local profile fields used for resume matching, autofill and outreach drafts.
Feature: Settings / local profile. The app stores personal profile, resume, contact and portfolio inputs locally, because the experiment should help without uploading sensitive job-search data.Kousik DuttaOriginal product screenshot

Designing recovery before documenting polish

A local-first product still fails. A required job file can be missing, optional evidence can be malformed, local storage can reject a write, filters can return nothing, and a user can reach a tool before adding a resume or profile. I separated those states instead of routing all of them to a generic empty card. Required-data failure blocks only what cannot be trusted; optional-feed failure degrades the affected advice; local applications and contacts remain untouched.

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.
Recoverable core-data failure at 390 x 844. The product names the failed source, protects local work and gives one clear retry path.Kousik DuttaOriginal product screenshot
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; affected Advisor or company evidence identifies what is missingReload that feed while preserving the usable product
Search or filters return zero rolesThe roles still exist, but this view 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 evidenceRoute the user to the field that unlocks matching, outreach or autofill
A form or storage write failsThe error stays attached to the action instead of implying successCorrect the field, retry the write or reset only the affected local data
Loading, empty, degraded, invalid and failed are different product states because they preserve different amounts of trustworthy work.

Accessibility became part of the interaction architecture

The accessibility pass changed structure, not only colors. I added a skip path and landmarks, repaired heading and control names, made map points keyboard-operable, implemented real dialog and tab behavior, trapped and restored focus, made covered list content inert behind mobile detail, supported horizontal arrow keys across tabs, preserved visible focus, added reduced-motion behavior, and kept a readable list alternative to the geographic view.

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/back action and focus restorationMobile detail and More-sheet open/close paths at 320 and 390 pixels
Read both visual themesSemantic tokens for text, muted labels, status tones, focus and action contrastLight/dark contrast, persistence and first-paint theme checks
Zoom and reflowCompact cards and local table patterns avoid page-level two-dimensional scrolling320-pixel viewport and 200%-equivalent reflow coverage
Understand errors and stateErrors name the failed action, retain trustworthy work and provide a recovery controlCore-data, malformed-feed, empty-result, invalid-form and storage-state tests
The defensible claim is that the tested keyboard, semantic, contrast, motion and reflow paths passed. It is not a claim of exhaustive screen-reader or assistive-technology certification.

What I tested

I tested the product against common application platforms and the failure modes they create: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, iCIMS, Workable and generic employer forms. That changed the product. Autofill can prepare a user. It should not pretend every ATS behaves the same, and it should not auto-submit.

I also wrote browser tests for the live app. The desktop smoke test checks the political map, split-view detail, application tabs and every top-level workflow. The mobile suite exercises the complete product at 390 x 844 and 320 x 720, including navigation, list-detail-return, all detail tabs, empty states, invalid forms, required-data failure, malformed nested data and optional-feed degradation. Accessibility coverage checks keyboard and semantic behavior, contrast, reduced motion and 200%-equivalent reflow. A production smoke after deployment confirmed mobile navigation, Today, no horizontal overflow and zero page errors.

What I can and cannot claim

This was a solo experiment, so I can show ownership, implementation tradeoffs and a working deployed system; I cannot turn that into a story about cross-functional leadership that did not happen. The product is also too early for an honest placement or conversion claim. The next outcome layer should measure time from role discovery to decision, packet completion, application-to-reply conversion, interview conversion and whether the daily cap reduces low-quality applications without reducing opportunities.

What changed after critique

The useful critique was blunt: the map looked bad, the India treatment was wrong, the mobile interface felt like compressed desktop, and the product needed to be more than an attractive happy path. That pushed the design from a visual concept into a full operating system: accepted map context, source credibility, ATS readiness, compact task-first mobile composition, accessibility, recovery, outreach, interview prep, outcome learning and burnout guardrails.