Back to Work

Canonical Academy

Role
Full-Stack Engineer (In-house)
Stack
Go · Node.js · React
Year
2023–2024

The platform powering Ubuntucertifications at scale.

Exams Conducted
10,000+
Core Stack
Go · Node · React
academy.canonical.com
Canonical Academy exam selection page
The Project

A certification platformbuilt from the inside.

Canonical Academy is the official certification platform for Ubuntu and Linux professionals. Engineers worldwide use it to purchase exams, schedule them under live proctored conditions, and earn globally recognised Credly badges upon passing.

This was built in-house as part of the Canonical engineering team — not as a client engagement. The platform handles the full certification lifecycle, from payment processing to identity verification to exam delivery to credential issuance.

The Challenge

A legacy codebase thatcouldn't keep up.

Full-page reloads

Every state change triggered a complete page reload, creating a fragmented experience during high-stakes exam flows.

Tightly coupled templates

Jinja templates bound the frontend to the backend. UI changes required backend knowledge and were expensive to test.

Slow engineer onboarding

New team members had to understand the entire Flask monolith before contributing to either layer.

Scattered integrations

External vendor APIs were embedded in the monolith, making them brittle and difficult to maintain independently.

The Architecture

A deliberate separationof concerns.

The rebuild introduced a three-layer architecture — each layer with a clear, bounded responsibility.

The Go backend owns all business-critical infrastructure. The Node BFF handles all external API orchestration. The React frontend owns the user experience entirely.

Keeping the BFF separate from the Go backend meant external vendor changes — Proctor360 API updates, Credly webhook changes — never touched core business logic.

System Diagram

React Frontend

User experience · SPA · State management

Node.js BFF

External orchestration · Session management

Proctor360Credly

Go Backend

Payments · Exam catalogue · Student records

01 · Layer

Go Backend

Payments, exam creation, student management, banning and compliance. Source of truth for all business logic.

02 · Layer

Node BFF

Proctor360 session creation, webhook handling, Credly badge issuance. All external API contracts live here.

03 · Layer

React Frontend

Migrated from Jinja templates. Client-side state management, no full-page reloads, clean component architecture.

Proctoring Integration

Live identity verificationvia webhook-driven flow.

Certification exams require verified identity and a monitored environment. The platform integrates Proctor360 to handle this entirely via API.

The check-in flow is webhook-driven by design — rather than polling P360 for status, the BFF listens for P360's confirmation event. This keeps the exam flow responsive and eliminates unnecessary API calls during a time-sensitive user journey.

  1. 01

    User schedules exam

  2. 02

    BFF creates session with Proctor360

  3. 03

    P360 emails user for environment check-in

  4. 04

    User completes check-in on P360's platform

    ID verified, environment scanned for flags

  5. 05

    P360 fires webhook → BFF confirms check-in

  6. 06

    Exam window opens → user takes exam

    Pass → Credly badge issued automatically

academy.canonical.com/exams
Canonical Academy exam dashboard showing attempt status and scheduling actions

Exam dashboard showing attempt status and scheduling actions.

The Experience

From purchase tocertified in one flow.

academy.canonical.com/exams
Canonical Academy checkout page

Step 01 — Purchase

Select and purchase an exam from the catalogue.

academy.canonical.com/schedule
Canonical Academy scheduling page

Step 02 — Schedule

Choose country, timezone, date and time slot.

academy.canonical.com/confirmation
Canonical Academy confirmation page

Step 03 — Confirmed

Everything is ready. Reminders sent automatically.

Payments

End-to-end checkouthandled by Go.

The Go backend owns the entire payment lifecycle — exam pricing, order creation, VAT calculation, and transaction records. The checkout experience is a full two-step flow: billing address collection followed by card payment with live order summary.

Payment processing is handled via Stripe integration within the Go layer, keeping financial data entirely separate from the BFF and frontend.

academy.canonical.com/checkout
Canonical Academy payment and order summary
Outcomes

Shipped. Scaled.Still running.

01

10,000+

Exams conducted

on the platform

02

Faster

onboarding

New engineers contribute to both layers independently

03

Eliminated

Jinja coupling

React migration decoupled UI from backend

04

Resilient

integrations

Proctor360 and Credly isolated in the BFF

Let's Build

Interested in what a well-architected platform looks like for your product?