Resume
Where I've worked, newest first, and one project of my own.
Experience
Senior Software Engineer, Control D (Windscribe)
Mar 2024 to Apr 2026
DNS security and content filtering platform for consumer, business and MSP customers
- Led an accessibility overhaul of the customer dashboard, organization portal and marketing site, remediating 248 React components against an external WCAG 2.1 AA audit on a compliance deadline.
- Built the cypress-axe suite that keeps it passing: WCAG 2.1 A/AA assertions across 96 routes, each run in desktop and mobile at both light and dark themes, with network calls stubbed so results stay deterministic.
- Fixed focus management in the shared primitives instead of page by page. Modal and tray dialogs moved onto react-focus-lock, popups regained focus restoration, and colour contrast moved into the theme palette for both modes.
- Added keyboard navigation to card, row and filter components that had been mouse-only.
- Implemented SSO for four identity providers over 18 months, covering internal admins, customer organizations and personal users: Okta with group-to-role mapping, Google, Microsoft Entra ID with per-tenant OIDC discovery and PKCE, and Tailscale, all behind one entry point.
- Owned the HubSpot integration in production for 18 months. A PHP client created contacts, companies, deals, invoices and line items, driven by Stripe webhooks for payment, subscription and payment-method events.
- Built org-level scheduled reporting: React and RTK Query on the front, a PHP controller and cron behind it, branded PDFs out the other end.
Full Stack Developer, Life House
Oct 2022 to Feb 2024
Revenue management SaaS for independent hotels
- Primary frontend engineer on the guest-facing booking widget, an embeddable React and TypeScript booking flow hotels dropped onto their own sites with one script tag.
- Scoped every generated CSS rule to the widget container with a custom Emotion stylis plugin, avoiding both Shadow DOM and an iframe. Wrote the html-tag and keyframe exclusions that global and animation rules needed to survive it.
- Retrofitted five languages and multi-currency support onto a UI that had already shipped: 88 files, 22 i18next namespaces, served from Contentful over GraphQL.
- Built bulk rate editing for hotel operators. Date-range and weekday filters apply price overrides in one mutation, and the override editor derives per-night and percentage inputs from each other.
- Top contributor on the revenue and marketing dashboards, covering occupancy, ADR, RevPAR, competitor rates and booking pace over an Apollo Federation GraphQL gateway.
- Contributed to a published Radix design system shared by the admin and guest apps, and built a NestJS GraphQL subgraph over the Mews and Cloudbeds PMS APIs.
Frontend Engineer, Studio
Mar 2022 to Aug 2022
Brand and digital design agency
- Sole developer on the agency's marketing site after picking up a stalled prototype. Rebuilt the landing page, navigation and case-study system over roughly 170 pull requests, writing about 70% of the shipped source.
- Built the scroll engine driving the site: four coordinated GSAP ScrollTriggers per section for active state, page-chrome theming, paint gating on offscreen content and pinned stacked-section reveals, with offsets resolved per section and per breakpoint and full teardown on resize.
- Rendered route transitions on canvas. GSAP timelines paint staggered DPR-scaled ripples out from the click point, and navigation fires from the animation's completion callback.
- Wrote the deploy pipeline: three GitHub Actions workflows to Firebase Hosting production and dev, plus an ephemeral preview channel per pull request.
Full Stack Web Developer, Brandish Agency
Mar 2020 to Mar 2022
Digital agency; WordPress, headless and custom client builds
- Led development on the agency's main client accounts. Majority author on six of nine repositories, sole author on four, and primary merge integrator on every multi-developer project.
- Built a college website on a Timber/Twig WordPress theme with 8 custom post types and 67 ACF field groups, including an embedded React SPA program catalogue with Context API, custom hooks, react-query and React Testing Library coverage.
- Built the agency's own site headless: a Gatsby front end sourcing WordPress over WPGraphQL, on Netlify, with a serverless function handling forms.
- Wrote the CI pipeline for the largest client project. Builds fire only when source actually changes, with three-tier dependency caching, a two-stage React-then-theme build and deploy webhooks across four environments.
- Standardized a reusable theme build scaffold and a shared Elementor widget plugin across client projects. Mentored a junior developer.
Full Stack Developer, Elite Digital Agency
May 2018 to Mar 2020
Digital agency; enterprise applications and client web builds
- Architected the data model, REST API and React front end of an internal retail-execution contest platform for PepsiCo Canada. Roughly 2,000 field employees enrolled per contest, against a provisioned user base of 11,750.
- Designed the domain schema behind it, mapping a six-level national field sales hierarchy across nine roles with per-contest role assignment, and owned the REST API layer the whole front end runs on.
- Replaced the application's Vue front end with React and built the architecture that followed: eleven contexts, custom hooks, dynamic-import code splitting, an error boundary and skeleton loading.
- Built the submission and moderation flow: multi-photo upload with an in-browser image editor, a review queue, conversion-rate leaderboards and client-rendered PDF report cards, bilingual English and French.
- Tracked down production performance problems: a memory leak in a gallery endpoint over roughly 85,000 records, a missing-index migration on hot tables, and a query that ran on every authenticated request.
- Built a bilingual dual-market WordPress theme serving Canadian and US sites from one codebase with runtime country detection and per-market taxonomies.
Side projects
Juice Bros
2026
- Brand platform for a pickleball podcast, built in Next.js and TypeScript. Episode archive, newsletter integration and a set of free tools for players.
