Skip to main content
2026

HR Assessment & Certification Portals

A serverless assessment engine that certifies employees on internal training, with AI-graded written answers and an HR admin dashboard.

Showcase of HR Assessment & Certification Portals

Role

Full-Stack Developer (sole build — frontend, Supabase data/auth layer, and AI grading edge functions)

Client

Concept Dash

Duration

Apr 2026 – Jun 2026 (~8 weeks across four portals)

Concept Dash runs mandatory internal training — POSH compliance, interviewer conduct, effective communication, and Civil 3D/AutoCAD drafting standards — and needed a way to verify that people actually absorbed it. Grading written answers by hand does not scale, and pure multiple-choice does not test whether someone can reason through a real situation. The result is a single assessment engine, deployed four times as four self-contained certification portals, each with its own candidate login, question bank, marking scheme, and admin register.

Each portal is a no-build static frontend (hand-written HTML, CSS and vanilla JavaScript) sitting on Supabase for data, auth and serverless compute. Candidates sign in against an RLS-locked whitelist table through a SECURITY DEFINER Postgres function, so there is no self-registration and the credential table is unreadable from the browser even with a valid session. Multiple-choice sections are scored in the browser; free-text and case-study sections are posted to a Deno edge function that grades them semantically against a per-question rubric using Anthropic's Claude on AWS Bedrock, then writes the result row with the service-role key. The frontend only ever holds the anon key. The Effective Communication portal is the deliberate simple case — all deterministic MCQ, no edge function, submitted through a single SECURITY DEFINER RPC.

The technically interesting part is not calling the model, it is refusing to trust it. The model was caught awarding marks for answers that were just the question text pasted back, so the edge function applies deterministic guards after grading that can only ever reduce a score: answers below a minimum length are voided, an answer containing none of its question's on-topic keywords is voided as off-topic, an answer with high token overlap against any displayed question (Jaccard ≥ 0.6, or 85% of its tokens being a subset of a question) is voided as an echo, and any two surviving answers that are near-duplicates of each other (Jaccard ≥ 0.85) are both voided, since one answer cannot correctly answer two different questions. Totals are recomputed from the corrected breakdown and a note is appended to the candidate's remark. The specific exploit this closed — pasting one scenario answer into all four case boxes — went from scoring 32/40 to 0/40, caught three independent ways. A second safeguard covers the opposite failure: if Bedrock times out or is unreachable, grading falls back to a deterministic keyword marker and the submission still saves, flagged graded_by: 'fallback', so no candidate ever loses a completed attempt to a network blip.

Around the assessment itself is the operational layer that made it something HR could run without engineering. The admin dashboard has KPI cards, search and date filtering, paginated results, per-candidate PDF reports rendered client-side with pdfmake showing every question with marks earned, and a full Excel export via ExcelJS. A submission tracker joins the whitelist against results to show who has not taken the assessment yet, with a one-click copy of pending emails for reminders. Candidates get draft autosave to localStorage, unlimited numbered retakes, an instant scored breakdown and their own PDF. Each portal ships with a written HR handover runbook and a rebuild reference carrying the full DDL, RPC definitions and edge-function contract — plus a costed architecture note weighing consolidating the four Supabase projects into one against rebuilding the data layer on AWS, and recommending the cheaper, lower-effort option.

Tech Stack

Vanilla JavaScript (ES2020, no build step)HTML5CSS3SupabasePostgreSQLSupabase AuthSupabase Edge Functions (Deno)supabase-js v2AWS BedrockAnthropic Claude 3 HaikuPostgreSQL Row Level SecuritySECURITY DEFINER RPCspdfmakeExcelJSFileSaver.jscanvas-confettiGoogle Fonts (IBM Plex Sans, Source Sans 3)

Features

  • AI semantic grading of written answersFree-text and case-study responses are graded against a per-question rubric by Claude on AWS Bedrock inside a Deno edge function, so spelling and grammar mistakes don't produce false negatives.
  • Deterministic anti-gaming guards over the AI scoreAfter grading, the function voids answers that are too short, off-topic against the question's keywords, an echo of a displayed question (Jaccard token overlap), or a near-duplicate of another answer — the model's score can only be reduced, never inflated.
  • Fallback grader so no submission is lostIf Bedrock errors or exceeds a 15-second timeout, grading falls back to a deterministic keyword marker and the attempt still saves, flagged in the record as graded_by 'fallback'.
  • Whitelist-only auth with an unreadable credential tableCandidates authenticate through a SECURITY DEFINER Postgres function against an RLS-locked whitelist, blocking self-registration and keeping credentials unreadable by any browser client; result rows are written only with the service-role key inside the edge function.
  • HR admin dashboard and submission trackerKPI cards, search, date filtering and pagination over the results register, plus a tracker that joins the whitelist against submissions to show who still hasn't taken the assessment, with one-click copy of pending emails.
  • Client-side PDF and Excel reportingPer-candidate branded PDF reports rendered in the browser with pdfmake show every question with marks awarded, and the whole register exports to Excel via ExcelJS — no reporting server involved.
Available for work

Let's create your next big idea.