I am the front-end technical lead for the pay/compliance team. We deliver compliance, lien rights, and electronic signatures features for general contractors and subcontractors. I set API contracts before code gets written, I build the shared platform the team ships on, and I own the team's quality and security programs.
Each entry gives the problem, what I did, and the result. Details are general because the work is internal to Procore.
A new compliance feature needed new statuses and new endpoints. The frontend and backend teams had different views of what the UI must read and write.
The final design kept my API contract and component structure. Some details changed in negotiation, which is how a shared contract should work.
Our micro-frontends load inside other teams' pages through module federation, and nothing tested their integration. A dependabot dependency upgrade that I merged broke a shared viewer in 3 host products, while the synthetic monitors stayed green (they only checked that the remote was reachable).
That failure class is now caught before pull requests merge.
Required, audited programs: remove critical and high vulnerabilities, route dependencies through the company's artifact registry, and fix new findings within 14 days.
All three programs are complete. The team moved from one-time cleanup to a daily automated check, and other teams asked to adopt the alerting.
Subcontractors could not submit compliance documents as part of submitting an invoice.
Shipped to customers in increments.
Documents generate asynchronously. Two status APIs had different tradeoffs, and a wrong choice would spread an unstable contract to every document surface.
Compared the two APIs and led the decision. Then I built one reusable generation-gate component and applied it to every document surface.
One component in place of per-feature polling logic. A future contract/behavior changes touch one file.
A Kafka sink between two products had stopped. The rest of my team was away and nobody had taken ownership.
Took incident command, found the root cause in a configuration edge case, worked with the data platform team to resolve it, and ran the retro.
The pipeline is running again, and the retro produced process changes.
Compliance logic, types, and tables were copied across two applications, so each change was made twice. Our legacy document viewer was different from the platform's viewer.
Moved our applications to the platform document viewer, built a shared foundation and table component, and helped another product team adopt our viewer.
One implementation in place of two, and a component that another team now uses.
Repeated manual work: dependency-alert triage, deploy notes, and AI coding setup in each repository.
Wrote Claude Code skills that fix dependency alerts, analyze each Dependabot pull request for merge safety, and turn deploy alerts into readable summaries. Added AI coding setup to the team's repositories.
The analysis runs each weekday. The team lead chose it as the way to meet the 14-day fix target each sprint, and the on-call guide uses the skills.
Plans built on assumptions that nobody had checked.
Sprint capacity went to the right work.
Payments and compliance features lived in one legacy client, so no team could deploy on its own.
Helped bootstrap the payments React micro-frontend, helped create the compliance micro-frontend, and migrated the sub-tier experience into the lien-rights micro-frontend.
Each product area deploys on its own.
Main areas of work at Procore.