←Back
←Back
Jobs2122
SearchManage Column
RequirementsJob IDDateStatusMSP/VMSClientCountryAssigned
Java Developer#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada+5
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
PendingCovendisCovendis technologiesCanada+5
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
HoldCovendisCovendis technologiesCanada+5
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
ClosedCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Jobs2122
SearchManage Column
RequirementsJob IDDateStatusMSP/VMSClientCountryAssigned
Java Developer#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada+5
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
PendingCovendisCovendis technologiesCanada+5
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
HoldCovendisCovendis technologiesCanada+5
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
ClosedCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Jobs2122
SearchManage Column
RequirementsJob IDDateStatusMSP/VMSClientCountryAssigned
Java Developer#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada+5
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
PendingCovendisCovendis technologiesCanada+5
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
HoldCovendisCovendis technologiesCanada+5
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
ClosedCovendisCovendis technologiesCanada
Technical Specialist- Expert (EHR Epic Rev Cycle)#12434Open: 10-01-2023
Close: 10-02-2023
OpenCovendisCovendis technologiesCanada

APPLICANT TRACKING SYSTEM · B2B SAAS

Xseed.AI

Xseed.AI

Xseed.AI

Xseed.AI renders the same screen differently depending on who’s logged in. Three roles, with the recruiter split into admin and view access. One screen renders four ways, and engineers build a permission gate for each. I designed those screens in Figma, then wrote the React that shipped them.

ADOPTED BY

tCognition’s in-house staffing team

TEAM

11-person team

TIMELINE

Jan 2023 to Apr 2024, 16 months

TOOLS

Figma · React · TypeScript · JavaScript · Material UI · Jest

COMPANY

tCognition LLC, a 175-person IT staffing firm on 4 continents

STATUS

Shipped B2B product

THE CHALLENGE

Three roles share one hiring loop and see different slices of it.

An applicant tracking system covers the whole loop: post a job, source candidates, move them through stages, submit them to a client, onboard the hire. A design file organized by feature hides the thing engineers actually build against, which is the role.

THE SOLUTION

Hand off by role, then build from components that hold every state.

I organized the Figma handoff by role and access level, built the component library the screens are assembled from, wrote frontend-ready specs, and converted them into production React.

3

roles

48

screens

Forty-eight desktop screens on the recruiter handoff page alone, from login validation to the templates master.

410

components

7

filter states

Components on the design-system page, and the job list’s filter panel drawn seven times as variants of one component.

An applicant tracking system with three front doors.

Xseed.AI is tCognition’s applicant tracking system, and the firm’s own staffing team adopted it. Recruiters post jobs with scraped enrichment, parse resumes, rank candidates with ML, schedule interviews, manage offers and onboarding, and read analytics. Candidates register, build a profile, upload a video resume and track their applications. Admins manage users and roles, plus the integrations with MSP and VMS platforms.

I joined in January 2023 as a final-semester intern and the role converted to full-time. For sixteen months I sat between the designers and the codebase, in person in India. tCognition already had a product-requirements process and I worked inside it. React and TypeScript on the front, Material UI for the components, Spring Boot services behind.

I worked across the recruiter and candidate surfaces. The file structure and the component library are the parts I can walk through page by page.

Xseed.AI
applicant tracking system
Job posting · Submissions · Resume parsing · Interview scheduling · Onboarding · Notifications · Analytics
View access · Can read the pipeline, can’t change it.

Everything in the file follows one loop.

Create a job in three steps: job details, hiring workflow, attract candidates. Source candidates into pools, then move each one through the pipeline from Applied to Submitted to Client. The pipeline reads back on the job page.

Java DeveloperID 12434
Candidate 1
Tagged
Date added
20 Oct 2023
Source
Pool
match
Java.NetSQL+5
Candidate 2
Applied
Date added
20 Oct 2023
Source
Pool
match
Java.NetSQL+5
Candidate 3
Applied
Date added
20 Oct 2023
Source
Pool
match
Java.NetSQL+5
Candidate 4
Interview
Date added
20 Oct 2023
Source
Pool
match
Java.NetSQL+5
Candidate 5
Submitted to Client
Date added
20 Oct 2023
Source
Pool
match
Java.NetSQL+5

The hiring workflow step is where the role model shows. Each person on a job’s hiring team carries an access level, job admin, edit access or access requested, and the stages are an editable list with a default set to fall back on.

Hiring workflow step of the new-job wizard

Figure 1. The hiring workflow step of the new-job wizard. Access is set per person, and the process is a list the recruiter edits, with a default to fall back on.

One page per role and access level.

Engineers build a permission gate, then another. A file grouped by feature makes them answer the same question on every screen: which of these does a view-access recruiter get?

I organized the handoff so each role and access level had its own page, with a templates master and a mid-fidelity work-in-progress page kept away from handoff truth. The recruiter admin page holds the login flow with every validation state, the job list, the new-job wizard, the job workflow and the candidate views, with redlined spacing specs beside the screens they describe. An engineer building a gate opens one page and sees everything that role sees.

    • LoginRecruiter · admin access
    • LoginRecruiter · view access
    • LoginAdmin
    • LoginCandidate
    • Job listingRecruiter · admin access
    • Job listingRecruiter · view access
    • Job listingAdmin
    • Job listingCandidate
The engineer asks
Which of these does a view-access recruiter get?
Asked on every screen.

The structure I turned down

One page per feature with role annotations. It reads well for designers and badly for the person implementing a gate.

Figma pages panel of the Xseed.AI file: one page per role and access level

Figure 2. The file’s pages panel in Figma: one page per role and access level, with the mid-fidelity work in progress kept apart.

Design it, then find out what it costs.

Because I wrote the React as well, the handoff shortened. I’d design in Figma, then implement or pair on the same screens, with WCAG 2.1 AA contrast and keyboard patterns carried through the component library into every recruitment module.

Contrast, focus order and keyboard paths were decided in the component, so every screen inherited them. Building my own designs changed how I designed. A state that looks free in Figma can cost a network request or a refactor. Knowing that, I started drawing the states an engineer needs annotated and leaving out the ones the component already answers.

Figma
selected
stage
Interview
ABC Technologies Java Developer
Java.NetSQL+5
CandidateRow.tsx
Focus order: checkbox, name, actions

One component carries all of its states.

An engineer gets one component with every state it can be in, and builds from that.

Two screens I can point to. The job listing carries its filter sets as variants of one component, so the filter panel, the applied-filter chips and the empty state come from the same source. The candidate detail carries an embedded resume viewer, a pipeline stage bar and the save and submit actions, again as one component with variant properties.

Properties
Filters
Rows
FiltersSearchManage columns
StatusOpenClosedPendingOn hold
PostedIn 1 dayIn 2 daysIn 3 days
Job typeFull timeRemoteContract
TitleIDStatusClientCountry
Technical Specialist#12434OpenCovendisCanada
Technical Specialist#12434OpenCovendisCanada
Technical Specialist#12434OpenCovendisCanada
Technical Specialist#12434OpenCovendisCanada
Technical Specialist#12434OpenCovendisCanada
Job list / Filters=Open, Rows=Populated
Job list empty state in Xseed.AI with the New job button
Job list empty state in Xseed.AI with the New job button

Figure 3. The job list’s empty state, one of seven filter states drawn as variants of the same component.

Candidates view in Xseed.AI with pools, bulk actions and a stage per row

Figure 4. The candidates view: pools, bulk actions and skill tags on every row. Every control on it comes from the library.

410 components, six type sizes, one primary ladder.

For states to live in variants, the library had to hold them properly.

Buttons with default, hover and pressed states, inputs with validation, table atoms, pagination, the top action bar, filters, checkboxes, step tabs and modals, plus a preloader. Six type sizes at four weights. A seven-step primary ladder and four secondary colors for status.

Color
Primary
Secondary
Green
Yellow
Red
Purple
Text and backgrounds
Type
H1 · 24pxJava Developer, Covendis, Canada
H2 · 20pxJava Developer, Covendis, Canada
H3 · 18pxJava Developer, Covendis, Canada
Text L · 16pxJava Developer, Covendis, Canada
Text M · 14pxJava Developer, Covendis, Canada
Text S · 12pxJava Developer, Covendis, Canada
Inventory
410
components
  • Button (default, hover, pressed)
  • Input (validation)
  • WYSIWYG toolbar
  • Navigation L1 / L2
  • Table cell
  • Table header
  • Pagination
  • Top action bar
  • Filters
  • Checkbox / Radio
  • Column chooser
  • Step tabs
  • Add member
  • Modal
  • Preloader
  • Icons

Shipped in React, with me on both the spec and the code.

The role-based file plus the shared components meant a new module could start from the library and the right handoff page.

Clarification messages from engineering after each handoff dropped. I didn’t count them, so I keep that directional.

If I were measuring it now, I’d track clarification messages per sprint against the months before the library, time to first screen for a new module, and an accessibility audit pass rate across modules. The library followed AA patterns, and no module had a formal audit.

Where the direction changed.

Sitting next to designers is where my direction changed. I’d watch a real recruiter frustration turn into a simple screen through a series of small, careful decisions, and I wanted to make those decisions as well as build them.

I left in April 2024 for the MS in User Experience at Arizona State.

Project takeaways.

01
Organize the handoff around what engineers build against
On Xseed, engineers built against roles. One page per role and access level meant the question “which of these does a view-access recruiter get?” stopped coming up.
02
One component, all its states
A screen per state goes stale the first time the component changes. Variants carried the filter sets and the row actions, with the validation states alongside.
03
Writing the code you designed teaches you which annotations matter
Knowing what a state costs to build changed which ones I drew. I annotate the states an engineer needs and leave out the ones the component already answers.