Projects & open source

Notable delivery and public GitHub work.

Notable work

k6 Performance Suite

Questrade · OAA · Performance

Load testing suite for OAA onboarding (100 VUs, 10 min sustained, P95 < 2000ms, error rate < 1%). Covers critical compliance endpoints: PEP checks and tax residency across 3 jurisdictions. Observability validated with Datadog on GCP during runs.

100 VUs · 10 min sustained P95 < 2 000ms
k6 Datadog GCP JavaScript

QA Observability Platform

Questrade · TCC evolution · Observability

Evolution of the QA Metrics undergrad thesis (open source) at Questrade: Dockerized platform with GitHub Actions — Newman integrates SonarCloud, Jira and Google Sheets via API → InfluxDB → real-time Grafana dashboards, replacing manual spreadsheet extraction and giving the team, manager and PO visibility into rework hotspots and root cause analysis.

real-time dashboards · root cause analysis evolved from open-source TCC · GitHub Actions
Docker GitHub Actions InfluxDB Grafana Newman SonarCloud

Mobile MFA & IDV Coverage

Questrade · Mobile · MFA/IDV

QA coverage for mobile MFA and IDV flows not covered by the existing Detox setup — inspecting payloads via Android Studio in debug mode. Cross-device regression on BrowserStack and physical devices, validating selfie and document approval/rejection via Mitek SDK; backend checks in SQL Server and MongoDB.

physical devices · BrowserStack Android Studio debug · Mitek SDK
Android Studio BrowserStack Mitek SDK SQL Server MongoDB

API & Component Test Suite

Questrade · KYC/OAA · 8+ services

Three-layer coverage: Postman/Newman (800+ tests) for KYC, onboarding and lifecycle flows; Cypress component testing integrated into CI/CD; Playwright for MFA with OAuth2/PKCE, TOTP and multi-tenant isolation (8+ services) in SIT/UAT.

800+ tests · 3 layers · 8+ services
Postman Newman Cypress Playwright GitLab CI JSON Schema Docker Jenkins OAuth2/PKCE
GitLab CI · Newman smoke

API collections also ran headless in GitLab CI (not only in the Postman desktop app): official Newman Alpine image, HTML artifact plus JUnit so failures surface on the merge request pipeline.

postman/newman CI image (Alpine)
CLI · HTML · JUnit Reporters
report.html Always-on artifact
report.xml JUnit on the MR
.gitlab-ci.yml
stages:
  - test

postman_tests:
  stage: test
  image:
    name: postman/newman_alpine33
    entrypoint: [""]
  script:
    - newman --version
    - npm install -g newman-reporter-html
    - newman run collection.json --reporters cli,html,junit \
        --reporter-html-export report.html \
        --reporter-junit-export report.xml
  artifacts:
    when: always
    paths:
      - report.html
    reports:
      junit: report.xml
Postman · JSON Schema validation

Beyond status codes: tests assert response shape with JSON Schema (pm.response.to.have.jsonSchema), locking required fields and rejecting unexpected properties, aligned with Swagger/OpenAPI contracts.

jsonSchema Postman assertion
required[] Mandatory fields
additionalProperties: false No surprise keys
SwaggerHub Schema source
Tests · schema validation.js
const schema = {
  type: "object",
  properties: {
    code: { type: "string" },
    error: {
      type: "object",
      properties: { message: { type: "string" } },
      required: ["message"]
    },
    tags: {
      type: "array",
      minItems: 1,
      maxItems: 3,
      items: { type: "string" }
    }
  },
  required: ["code", "error"],
  additionalProperties: false
};

pm.test("Validate schema", () => {
  pm.response.to.have.jsonSchema(schema);
});
Newman · Docker & local runners

Collections also ran inside the official Newman image with the working directory mounted as a volume, plus CSV --iteration-data for file-upload cases. For a fuller local stack, Jenkins was started in Docker with Postman/Newman support (UTF-8 JVM, persistent jenkins_home).

-v $PWD:/etc/newman Volume mount
--iteration-data CSV data-driven
host.docker.internal Host URL from container
jenkins_home Jenkins volume
newman · docker
# Run collection inside Newman container
docker run -v "$PWD:/etc/newman" -t postman/newman \
  run collection.json --iteration-data data.csv

# data.csv (file upload iterations)
# fileName,statusCode
# file1.txt,200
# file2.txt,400

# Local Jenkins + Postman/Newman image
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure \
  -v jenkins_home:/var/jenkins_home \
  --env JAVA_OPTS="-Dfile.encoding=UTF8" \
  vdespa/jenkins-postman

Responsive Viewport Coverage

Questrade · KYC onboarding · Cross-device

Viewport library built from the product's own design system breakpoints (360–599 mobile / 600–839 tablet / 840+ desktop) — not a generic device library. Key insight: three pairs of Responsive Viewer profiles at exactly 1px apart to catch boundary regressions: modal layout shift (519/520px), submenu visibility (1019/1020px), and action button swap (1279/1280px). Boundary Value Analysis applied to responsive design.

18 viewports · 4 device families 6 boundary pairs · BVA (Boundary Value Analysis) at 1px
Responsive Viewer BVA Cypress Design System Cross-device
▶ Responsive Viewer config
responsive-viewer.json 5 tabs · 22 active profiles · 52 total screens

Exportable profile library with mobile, tablet, desktop and BREAKPOINTS tabs (BVA pairs at 1px). Import via Responsive Viewer extension → Load JSON.

Mobile
Tablet
Desktop
Wide
Mobile · 360–599px
Galaxy S9 360px
iPhone 12/13 390px
Galaxy S9+ 412px
iPhone XR/11 414px
Mobile Max ▶ 599px
Tablet · 600–839px
Nexus 7 600px
iPad 768px
iPad Pro 10.5″ 834px
Tablet Max ▶ 839px
Desktop · 840–1919px
Desktop Min ▶ 840px
Laptop 1366px
Desktop 1536px
Desktop 1600px
Wide · 1920px+
Desktop 1920 1920px
User agents:
iPhone · Samsung
Pixel · Chrome
▶ Boundary viewports — behavior-driven, 1px apart
519px
Modal in Full Screen
+1px
520px
Modal Background Overlay
modal
layout shift
1019px
Hide Submenu
+1px
1020px
Show Submenu
nav
visibility
1279px
Show Arrow Button
+1px
1280px
Show Edit Button
action
button swap

BVA — Boundary Value Analysis. Classic test technique: exercise values immediately before and after a threshold where behavior changes. Pairs here differ by 1px to catch off-by-one regressions in media queries and layout rules.

GitHub Projects

Most public demo apps are too simple to test meaningfully. I built TestFlow to change that — a realistic web application with authentication, multi-role workflows, and API layers that mirror what you'd find in production. Six automation suites run against it: Cypress, Playwright, PyTest, Appium, k6 and Selenium. The app ships as a Docker image so anyone can spin it up in seconds.

Who it's for: QA engineers learning Cypress, Playwright, PyTest, Appium, k6 or Selenium, interview prep, workshops, and anyone who wants a production-like sandbox without building the app from scratch.

TestFlow

TestFlow ecosystem
active JavaScript

Cypress 15 E2E + component suite: smoke, auth, dashboard, team, wizard, API, a11y, visual regression via Percy. Parallel CI on GitHub Actions — results recorded to Cypress Cloud with Test Replay.

↗ runs against testflow @ :5050
CI Status Cypress Cloud updated …
↗ View commit history
Cypress 15 JavaScript Percy axe-core 22 spec files GitHub Actions Cypress Cloud
active TypeScript

Playwright TypeScript suite — mirror of the Cypress coverage with POM, axe-core a11y, visual regression and cross-browser projects (Chromium / Firefox / WebKit). 17 parallel CI matrix jobs across smoke, auth, API, wizard, a11y and visual.

↗ runs against testflow @ :5050
CI Status updated …
↗ View commit history
Playwright TypeScript axe-core 17 projects GitHub Actions
active Python

PyTest + Playwright for Python suite for TestFlow — mirror of the Cypress and Playwright coverage with Page Object Model, fixtures, factories and data-testid selectors. 12 suites: smoke, auth, dashboard, team, settings, components, wizard, activity, advanced, states, API and visual regression. axe-playwright a11y, pytest markers (@smoke, @critical, @a11y) and traceable [TC-xxxx] ids. GitHub Actions parallel matrix against qaschool/testflow @ :5050.

↗ runs against testflow @ :5050
CI Status updated …
↗ View commit history
PyTest Python 3.11+ Playwright POM axe-core 12 suites GitHub Actions
active TypeScript

Appium 2 + WebdriverIO 9 mobile web suite for TestFlow — mirror of the Cypress, Playwright and PyTest coverage through Chrome on Android and Safari on iOS, plus REST API checks without a device. 17 specs including gestures, device orientation, WEBVIEW contexts and locator strategies. POM with data-testid, Allure reports and traceable [TC-xxxx] ids. CI: API smoke + Android emulator on GitHub Actions; Allure published to GitHub Pages.

↗ runs against testflow @ :5050
CI Status updated …
↗ View commit history
Appium 2 WebdriverIO TypeScript Allure 17 specs Android · iOS GitHub Actions
active JavaScript

k6 performance suite for TestFlow — smoke CI gate, load (auth/users/mixed), stress, spike and soak scenarios, multi-step journeys and k6 browser login. SLO thresholds for P95 latency and error rate; GitHub Actions smoke on push/PR plus manual load profiles. Mirrors functional API coverage on /health, /api/auth/login and /api/users @ :5050.

↗ runs against testflow @ :5050
CI Status updated …
↗ View commit history
k6 JavaScript Docker Grafana 9 scenarios SLO · P95 GitHub Actions
CI performance report · 7 scenarios Open report ↗ Grafana ↗
More projects
active Java 17

Production-quality Rest Assured suite for Spring Petclinic REST — reusable API clients, dynamic test data, JSON schema validation, WireMock stubs, parameterized negatives and multi-step E2E flows. Java 17 · JUnit 5 · Maven · Allure · Docker Compose for local and CI.

↗ runs against spring-petclinic-rest @ :9966
CI Status updated …
↗ View commit history
Rest Assured 5 JUnit 5 Maven Allure WireMock owners + pets API Docker Compose GitHub Actions
Allure report · GitHub Pages Open report ↗ Docs hub ↗
active JavaScript

Selenium WebDriver 4 E2E suite for TestFlow — pure Selenium mirror of testflow-cypress (no WebDriverIO/Nightwatch) with Page Object Model, data-testid selectors, Mocha + Chai, mochawesome reports and Ajv JSON Schema API checks. 11 suites (@smoke · @regression · @api) with traceable [TC-xxxx] ids. GitHub Actions against qaschool/testflow @ :5050.

↗ runs against testflow @ :5050
CI Status updated …
↗ View commit history
Selenium WebDriver 4 JavaScript Mocha Chai mochawesome Ajv Page Object Model 11 suites GitHub Actions
Allure report · GitHub Pages Open report ↗ Docs hub ↗

QA Metrics · TCC

Contribution activity
GitHub contribution chart