Twenty-nine dashboard screens across three roles, and the four that exist because the EU AI Act and NYC Local Law 144 say they have to.
Twenty-nine dashboard screens: six for the job seeker, twelve for the employer, eleven for internal admin. All at 1512 by 982 minimum, all auto layout, sharing three role sidebar components so the navigation is defined once.
Four of them exist because the law says so, and they are the most interesting ones in the file.
Post a job, where two fields are gates
The employer posting form is the most important employer screen in the product, because it is where the platform's promise is either enforced or quietly abandoned.
Two fields are gates rather than suggestions. The salary range is a validation failure if you type "Competitive", with a message that names the reason: a listing without a number is not worth reading, and it is already unlawful across the EU from 7 June 2026. The attestation requires a named person, whose name then appears publicly on the listing.
A sidebar panel titled "Before this can go live" shows which gates are unmet. Company verified, ticked. Salary range set, empty. Vacancy attested by a named person, empty.
Making a rule visible as a checklist is the difference between a policy and a preference.
Candidate detail, the compliance surface
Ranking candidates is a high risk AI system under the EU AI Act, Annex III section 4, and an automated employment decision tool under NYC Local Law 144. Both require decisions that are logged, explainable and open to human override.
So the rank never appears alone. 92 sits beside "8 of 9 required skills, six years on Laravel and Postgres, missing Kubernetes". Underneath is a plain language panel: this rank was produced by an automated system, the candidate has been told, you can override it, and your override is logged with your name against it.
Three actions: Shortlist, Override the rank, Reject with a reason. There is no automatic rejection anywhere in the product, and the handover specs say there must be no endpoint capable of one.
The reason column is not a nicety. It is the compliance surface.
The AI decision log
Every automated decision that touched a person, with its inputs, output, model version, timestamp, and the named human who reviewed or overrode it. Retention 24 months.
The row I like most in the sample data is the one where a rank of 71 was overridden to a shortlist by a named recruiter, because it shows the system doing what it claims: the machine suggests, the human decides, and the decision is on the record.
ID verification, which argues against itself
Gartner expects one in four candidate profiles worldwide to be fake by 2028. Only 31% of companies run any deepfake detection. That is a real problem and it is tempting to design an automatic ban.
The screen shows three candidates whose liveness check failed, and then a note arguing with the reader: bad lighting, an old phone camera and a cracked screen all fail liveness, so two of these three are almost certainly real people having a bad time. Nothing here bans an account automatically, and a person makes every call.
A fraud screen that does not admit its own false positive rate is a screen that will ruin someone's week.
Company profile, split in two
The employer's company profile has two panels. Editable holds the name, the description, the headcount. Added by Vouch, not editable holds the verification date, the domain match, the response rate and the median first response.
That split is the business model made structural. If an employer could edit their own response rate, nothing else in the product would mean anything.
Refunds, with the policy written down
A small screen that saves a lot of arguments. Technical failure is always refunded, no discussion, same day. A duplicate purchase is always refunded. "It did not get me an interview" is not refunded, because the product never promised one and the pricing page says so in those words.
Writing the policy onto the screen means nobody has to decide it twice, and it means the refusal is consistent rather than a mood.
Reorganising, then wiring
Once the screens existed the page was a mess, so it got restructured: renamed to a Role / Screen convention, ordered left to right to match each sidebar, and grouped into three Figma sections.
Then the prototype. Every sidebar item navigates on every screen of its role, plus the real journeys: overview to a listing to the pipeline to a candidate; post a job to review to publish to listings; talent pools to candidate search to candidate detail. 338 connections on this page alone, and three flow starting points so you can enter as any role.
Where the file ended up
82 screens and 642 prototype connections across twelve pages, including flows, states and edge cases, five bilingual email templates, and a handover specs page.
That last page ends with seven non negotiables written as build constraints rather than preferences. No auto reject code path. Log every automated decision. Tell candidates when AI is involved. A missing salary range is a validation failure. The response rate cannot be edited, hidden or bought. Deletion is a real cascade, not a flag. Free stays free.
They are the parts a developer under deadline pressure would quietly drop, which is exactly why they are written down in the file rather than assumed.
Building scalable systems and developer-first tools. Lead Software Engineer at DSRPT.