CertKeeper — Worker Certification Tracker
A working compliance prototype for tracking employee certifications across industrial sites. 24 seeded workers carrying 83 active OSHA / NFPA / DOT / FMCSA / AWS certs. Roster, expiring queue, by-certification coverage, audit CSV.
What it is
A certification-tracking prototype shaped for the question OSHA, ISN, or an internal auditor will ask: for every worker on this site, which certs are current, which are stale, and which expire this month.
What’s in it
- 24 seeded workers with realistic role mixes — site supervisors, welders, electricians, forklift ops, EMTs, CDL drivers, apprentices, logistics managers — distributed across 4 sites + warehouse + logistics.
- 15 certification types with real regulator references and validity windows: OSHA 10/30 (5yr), CPR/AED (2yr), Forklift PIT (OSHA 1910.178, 3yr), AWS Welder (1yr), HAZWOPER (1yr), Confined Space (OSHA 1910.146, 1yr), NFPA 70E Electrical (3yr), Rigging (OSHA 1926.1400, 5yr), DOT HazMat (3yr), CDL Class A medical (2yr), EMT-Basic (NREMT, 2yr), Lockout/Tagout (OSHA 1910.147, 1yr).
- Three views: roster (each worker’s cert chips at a glance), expiring queue (every cert ≤120d sorted by urgency), by-certification coverage (every cert type with named workers carrying it).
- Status pills at worker and cert level —
EXPIRED,<30 days,<60 days,Current. - Mark-renewed action demonstrates the renewal pipeline by pushing the next due date out by the cert’s validity window.
- CSV export with every worker × cert row including regulator, issue date, expiry, status — exactly the shape an ISN audit upload expects.
Why this shape
ISN, Avetta, and ComplyWorks all share the same evidence shape: who has what cert, when did they get it, when does it expire. Most companies maintain this in three spreadsheets and a folder of PDFs. The pipeline collapses to one screen of workers + one screen of expiring. That’s the whole product.
How it ships
Single HTML file, ~22KB. Zero dependencies. The cert catalog, expiry math, and CSV export are 280 lines of vanilla JavaScript. Renewal action mutates client-side, no server.