Case study

trclu-careers

ReactCloudflareNeonPostgres

Overview

The official hiring portal for TRC-LU. It runs the whole CSC recruitment process online, job posts, multi-step applications, document review, exam scheduling, and hiring decisions.

Problem

TRC-LU's recruitment ran on paper: applicants dropped off physical documents, HR sorted and reviewed them by hand, and checking status meant a phone call or a visit. There was no online portal for postings, applications, or status tracking.

Approach

I built a React 19 SPA on Cloudflare Pages with a serverless backend through Pages Functions. Sign in with Google or email/password. A multi-step application wizard covers education, training, work history, eligibility, and document upload, all configurable per job. The HR side gets pipeline management, document-review tools, and a CSC-format Excel export.

Architecture

Dual-backend architecture: legacy Google Apps Script (archived, migration reference) replaced by Cloudflare Pages Functions + Neon Postgres + Cloudflare R2. Action-based API router dispatches by action field. HMAC-SHA256 signed tokens with HttpOnly refresh cookies. Cursor-based pagination for HR application lists. Version-aware caching with data version tracking per entity. PSGC address system with edge-cached data.

Challenges

Moving off Google Apps Script and Sheets (no constraints, indexes, or transactions) onto Neon Postgres and R2 meant a full rewrite while keeping the site live. Apps Script's limits (30s runtime, 5,000 PBKDF2 iterations) forced some trade-offs. A multi-step form with per-job sections needed careful state handling. The document-review Excel export had to match the official 15-column CSC format. Rate limiting sits at the edge via Cloudflare KV.

Results

A live portal at trclu-careers.pages.dev serving TRC-LU's hiring. Applicants apply once and track status online; HR runs the full pipeline from review through exam scheduling to the hiring decision. Documentary review exports as CSC-compliant Excel workbooks.

Technology

React 19Cloudflare Pages FunctionsNeon PostgresVite 6Tailwind CSS v4Radix UIFramer Motion
Private repoLive site
Email copied