We built DEV3 AI Job Board & Resume Matcher as a WordPress plugin in PHP with a React admin and front-end dashboards for employers and candidates. One plugin covers what usually takes a job board core plus four paid add-ons: job listings with JobPosting schema, company profiles, front-end submission with paid packages, applications with a hiring pipeline, candidate profiles with private resume files, and job alerts.
Key design decisions
- Protected attributes removed before matching.
Matcher::strip_protected() drops 49 normalised key names (name, email, phone, photo, age, date of birth, gender, marital status, nationality, religion, disability and more) at every depth of the profile, and anonymise() masks emails and phone numbers in free text and replaces the candidate's name with "[candidate]".
- A transparent rule score first. Skills 40%, experience 25%, role 20% and location or workplace fit 15%, each shown as its own bar with plain-language strengths and gaps. It runs without AI and gives the same result for the same input.
- AI reviews, rules anchor. With a key, the Google Gemini API sees the anonymised profile, the job and the rule pre-check, and returns its own criteria scores and explanation. The final score is the average of the rule score and the AI score, so the model cannot move it alone.
- Decision support only. A score never changes a pipeline stage, never hides an application and never rejects anyone. Every match card says so. Optional blind screening hides names on employer cards until the Interview stage.
- No protected fields in the parser. The resume-parsing schema has no field for any protected attribute, and a test asserts that none of those words appear in it.
- Private resumes. Files go to a private folder with random names and deny rules, and are streamed only to the candidate, the employer of an application that uses them, or a site manager.
Architecture
Jobs, companies and resumes are custom post types; applications, pipeline events, packages, payments, alerts and files have their own tables. Resume text is extracted in plain PHP from PDF text streams and Word .docx files; scanned PDFs go to the AI as a file instead. Embeddings of jobs and anonymised profiles power recommendations and part of the role score. Packages are paid through Stripe Checkout, WooCommerce or offline payment. The API client, background jobs, embeddings store and usage logs come from a shared core used across DEV3's plugins.