Full-featured HR CRM for managing 3,500–10,000+ inspection resources. React + Vite · Supabase (PostgreSQL) · Recharts · Lucide Icons
cd hrm-pro
npm install
npm run dev
# Opens at http://localhost:3000 — uses localStorage automaticallyLogin:
| Role | Password | |
|---|---|---|
| Admin | admin@hrm.com | Admin@123 |
| Manager | manager@hrm.com | Manager@123 |
| Recruiter | recruiter@hrm.com | Recruit@123 |
| Viewer | viewer@hrm.com | Viewer@123 |
- supabase.com → New Project (choose Canada/US region)
- Supabase Dashboard → SQL Editor → New Query
- Paste contents of
supabase/schema.sql→ Run
- Settings → API → copy Project URL and anon public key
cp .env.example .env
# Fill in:
VITE_SUPABASE_URL=https://yourproject.supabase.co
VITE_SUPABASE_ANON_KEY=eyJ...The sidebar badge shows Cloud (green) or Local (amber).
# Add to .env:
VITE_ANTHROPIC_KEY=sk-ant-api03-...Without the key, the smart algorithm still works well for most queries.
- Google Sheets → File → Download → CSV
- Open CSV in Notepad → Ctrl+A → Ctrl+C
- HRM Pro → Candidates → Import → Paste Data
- Preview → Import
What's auto-mapped: All 107 columns from the Engrity Database, including:
X,x,yes,Yes→truefor certifications- Priority
1.0/2.0/3.0→1/2/3 - Multi-line headers (
NACE\n1) handled correctly - Chunked at 500 rows — handles 10,000+ rows with progress bar
- Multi-select filter chips — select multiple screening statuses, priorities, or availability values at once
- Filter chips show counts, can be cleared individually or all at once
- Cert filter buttons (CWB 1/2/3, API 510/570, etc.) below main filters
- Column preferences saved to localStorage
Four complete discipline scripts embedded:
- QC Inspector — 15 sections covering ITP, drawings, codes, material receiving, WPS/PQR, NDT, hydro testing, flange inspection, torquing, AB83/81/40, turnover, soft skills
- E&I Inspector — 14 questions covering cables, terminations, drawings, torquing, PPE, NCR, RFI, ITP
- Coating Inspector — SSPC standards, holiday testing, adhesion/hardness tests, documentation
- NDT (Magnetic Particle) — 10 multiple-choice questions with correct answers marked
Scripts include hints, correct answers, and point values — visible during screening as reference.
Every certification now has a paired expiry date field:
- Candidate Detail shows expiry status: Expired (red), Expiring Soon (amber, within 90 days), Valid (green)
- Alert banner at top of profile when any cert is expired or expiring
- Safety Tickets renamed from Trades, with full names:
- CSTS 2020/09, WHMIS 2015, H2S Alive, Fall Protection, Confined Space, Standard First Aid, Common Safety Orientation
- No horizontal scroll — use the left sidebar to jump between 15 sections
- Cert/Safety sections show certifications as checkboxes with inline expiry date pickers
- Modern date pickers on all date fields
- Position field is a smart datalist (dropdown + free type)
Tabs: Overview · Certifications · Safety Tickets · Trade Ratings · Full Details · Documents
- Overview: side-by-side Status and Basic Info
- Certifications: list all 23 certs with expiry status per cert
- Trade Ratings: visual bar charts per category, auto-calculated average
- Documents: resume URL, incorporation doc, direct deposit, WCB clearance
Automatically computed as the average of all non-blank trade ratings (piping, pressure vessels, boiler, pipeline, structural, piles, furnace, tank, computer). Blank fields are excluded from the average.
P1 = Red · P2 = Amber · P3 = Red
Dropdown with 19 preset options + free-text typing. Admin can add/edit/delete options in Admin Panel → Positions.
Deleted candidates are marked deleted=true — not permanently removed. Recovery coming in next update.
- Users — Add/edit/disable users, permissions matrix
- Positions — Add/edit/delete position dropdown options
- Database — Table relationship diagram (SVG), schema stats, SQL quick reference
- Integrations — BambooHR, Workday, SAP SuccessFactors, Custom API/Webhook with configuration fields
Configure your API key and subdomain in Admin → Integrations to pull:
- Employee directory (name, email, phone, job title)
- Job tables and payroll summaries
- Time-off records
- Custom fields and documents
Now correctly handles both sync (localStorage) and async (Supabase) data sources.
# Vercel
npx vercel --prod
# Set env vars: VITE_SUPABASE_URL, VITE_SUPABASE_ANON_KEY, VITE_ANTHROPIC_KEY
# Build for any host
npm run build
# Serve /dist as static files — nginx: try_files $uri $uri/ /index.html;Step 1 — Add to Supabase:
ALTER TABLE public.candidates ADD COLUMN IF NOT EXISTS my_field text;Step 2 — Add to src/contexts/DataContext.jsx:
myField: { label: 'My Field Label', type: 'text', group: 'basic' },Step 3 — Add to src/lib/supabase.js CSV_HEADER_MAP if importing from CSV.
| Layer | Technology |
|---|---|
| Frontend | React 18 + Vite 5 |
| Routing | React Router v6 |
| Database | Supabase (PostgreSQL) |
| Local mode | localStorage (auto) |
| Charts | Recharts |
| Icons | Lucide React |
| AI Search | Anthropic Claude API |
| Typography | DM Sans + DM Mono |