WEBWorx.solutions

WEBWorx · Ottawa, Canada

Web software for the hard requirements.

We design and build systems that have to work offline, pass an accessibility audit, and speak more than one language — including right‑to‑left.

WEBWorx builds the parts most teams treat as someone else's problem: the disconnected path, the screen-reader path, the Arabic path, the audit trail. Two decades of that work has been delivered inside Government of Canada programmes; the current products carry it further — a casualty-care application that runs with no network at all, and a school system operating in three languages.

  • Ottawa, Ontario
  • Reliability clearance to Jan 2030
  • EN · FR · AR interfaces
  • 20+ years delivering
  • 20+ Years designing and building web systems, mostly Government of Canada
  • 7 Interface languages shipped
  • 335 Automated test files
  • 4 Products live in production
  • AA WCAG 2.1 the standard, not the stretch goal

01 — Recent work

Two products, built end to end

Both are ours from data model to deployment — architecture, interface, accessibility, translation, test suite, CI and hosting. They are the clearest statement of what WEBWorx does.

Healthcare · Emergency response

AidPost

Live
aidpost.ca

An offline-first progressive web application for casualty care and transport documentation. Field responders capture patient identity, injuries marked on an anatomical body chart, vitals and treatments, then sign off and hand over to a hospital as an HL7 FHIR R4 bundle — with no connectivity required at any point.

  • Works at zero signal. Records live on the device in IndexedDB; the service worker keeps the whole application available offline after first load.
  • Encrypted at rest. AES-256-GCM through WebCrypto, with the key derived from a passphrase and held only in memory — an exported backup is unreadable without it.
  • Seven languages, three right-to-left. English, French, Arabic, Spanish, Farsi, Swahili and Urdu, with translation that works offline.
  • Optional convergence. Devices sharing a self-hosted server merge through a conflict-aware operation log — never last-write-wins, and switched off by default.
  • Deploys two ways. One container image serves either an organisation server with PostgreSQL and automatic TLS, or a field kit on Raspberry Pi class hardware with no internet at all.
Test files
223
Browser E2E
~40
CI workflows
9
Languages
7
  • React 18
  • TypeScript
  • Vite
  • Dexie / IndexedDB
  • Workbox
  • Fastify 5
  • PostgreSQL
  • HL7 FHIR R4
  • WebCrypto
  • Playwright
  • axe-core
  • Docker

Prototype status: not a medical device and not for clinical use.

Education · School administration

ESMS

Live
esms.school

A complete school information system for an Ontario JK–8 school of roughly 600 students: enrolment, attendance, gradebook, assessment, timetabling, discipline, health office, fees and statutory filings — plus a separate parent portal on the public internet. Interface in English, French and Arabic with full right-to-left support.

  • Roles decide what exists. A bursar is never offered a class register; a teacher sees one class. Access is shaped by role, not hidden by the interface.
  • Money needs two people. A fee entered by one person is approved by another — separation of duties enforced in the data model, not in a policy document.
  • The parent portal is a separate build. The internet-facing surface ships its own bundle carrying no court order, no medical note, and no other family's child.
  • Ten jobs run unattended, and something watches them. Backups with a restore check, audit-chain verification, retention purges, statutory filings and instalment runs — with a health board that reports what did not send.
  • Arabic that survives printing. Report cards are generated as PDFs with Arabic properly shaped and bidirectional text resolved, not flattened to an image.
Modules
20
Test modules
112
Scheduled jobs
10
Languages
3
  • Django 5.2
  • DRF
  • PostgreSQL
  • React 18
  • TypeScript
  • Vite
  • WeasyPrint
  • RFC 6238 TOTP
  • mypy
  • ruff
  • Gunicorn

Ontario is the reference edition; other jurisdictions are added as edition profiles.

02 — Capabilities

What WEBWorx designs and builds

Depth is stated honestly. Specialist means work most practitioners do not take on; applied means shipped and working, without claiming mastery.

03 — Approach

Six convictions, visible in the code

These recur across unrelated domains — emergency medicine, school administration, federal service delivery, retail operations, household finance. Recurrence across domains is what separates a conviction from a coincidence.

01

Offline is the architecture, not a feature

Every product assumes the network is missing and designs from there. Connectivity is the optional enhancement, and the disconnected path is the one that gets the tests.

In practice

  • A casualty-care application fully usable at zero connectivity, with sync default-off and admin-gated
  • A field-kit profile targeting Raspberry Pi class hardware with no internet at all
  • Business tools that run by double-clicking an HTML file over file://
  • A finance application with no server, no analytics and no network calls of any kind
02

Accessibility and language are substrate

Not a remediation pass at the end. Seven interface languages, three right-to-left, and the hard parts handled rather than avoided. Decisions are made per screen reader, not per specification.

In practice

  • Arabic shaped and bidi-resolved inside generated PDFs, not flattened to an image
  • A documented refusal to put role="button" on <summary> — it forces NVDA into focus mode
  • Verification across NVDA, JAWS, VoiceOver and TalkBack
  • axe-core assertions running inside the browser suite, not as a manual audit
03

A dependency is a security decision

Time-based one-time passwords written out rather than installed — because both RFCs publish official test vectors, so the implementation can be proved against the standard instead of trusted because it is popular. The argument is committed beside the code.

In practice

  • A four-line requirements.txt, each line carrying a written justification
  • A static site generator using only Node built-ins, so the build needs no npm install
  • Single-file browser applications with zero dependencies, several thousand lines each
  • CodeQL, secret scanning and a CycloneDX SBOM wired in alongside the tests
04

Least privilege is designed in, then measured

A government portal was re-architected from client-side reads and a direct record POST to server-rendered queries and a back-end flow. Required database table permissions went from three tables with Create and Read to zero — recorded as a before-and-after table rather than left implicit.

In practice

  • Client lookups replaced by server-side queries; record creation moved behind an automation flow
  • CAPTCHA verification moved server-side, removing another permission entirely
  • Custom validation retired in favour of the framework's native validator
05

Rules belong in the model

Anything that matters is enforced where it cannot be bypassed — not hidden by an interface that a different route can reach around. Roles determine what is offered, not merely what is permitted.

In practice

  • Separation of duties on money: entered by one person, approved by another
  • Access rights that differ between two children in the same family because a court order says so
  • A public portal built as a separate bundle so restricted data is never shipped to it
  • Hash-chained audit with a verification command and a retention schedule
06

The documentation argues, and admits things

Architecture documents ship as Markdown and PDF together with file inventories, sequence diagrams, decision tables and a named section for known constraints and their workarounds. Comments record where a default was wrong — one type-checker note states that the defaults were inspecting about 3% of the tree, and that enabling the stricter flag took it from 0 to 141 real errors.

In practice

  • Roadmaps stating, per feature, the specific check that closes it
  • A generated test catalogue committed from the suite's own output
  • Lint exclusions scoped to one file and one rule, with the reason written out
  • RFP-grade functional specifications, test artifacts and operational deliverables

04 — More work

Across sectors, from portals to shop floors

Federal service delivery, commercial sites, operations tooling and product discovery. Filter by technology to see where each capability shows up.

Government of Canada · Health Canada

Public repos

SafePort — public service portals

Bilingual public-facing portals for the Travelling Public Programme: a General Inspection report and a Ship Sanitation Inspection request, both multi-step forms with conditional logic, file upload, CAPTCHA and comprehensive screen-reader support — on Power Pages and Dataverse under WET4 / GCWeb and WCAG 2.1 AA.

Roughly 21,000 lines of hand-written client library sit behind these: validation, an accessible date picker, a bilingual time selector, a universal announcer, a native file bridge and session-timeout handling.

Client library
~21k lines
AT stacks
4
Languages
EN / FR
  • Power Pages
  • Dataverse
  • Liquid
  • JavaScript
  • WET-BOEW / GCWeb
  • WCAG 2.1 AA
  • OData
  • FetchXML
  • Power Automate
View the client library

Government of Canada · Public data

Public

Cruise ship inspection scores

A public, read-only browse interface over five years of Health Canada cruise ship inspection results — a two-tier tree of cruise lines, vessels and inspection history with search, filtering and lazy loading.

The accessibility architecture is why this is here: native <details> disclosure chosen over a scripted tree for zero-library correctness, and an ARIA role deliberately omitted because it would flip NVDA into the wrong mode.

  • Power Pages
  • Liquid
  • JavaScript
  • OData
  • Native disclosure
  • Lazy loading
  • WCAG 2.1 AA
Architecture & source

Tooling · Reusable scaffold

Public

Power Pages single-page form scaffold

The SafePort work generalised into a reusable kit: a console script that extracts a form's schema directly from the maker environment, a generic form controller, a Liquid template and a written checklist that takes a Power Apps form to a WET4-compliant portal.

Turning one delivery into a repeatable asset — bilingual message overrides, cross-field rules, conditional visibility and pattern validation expressed as configuration rather than code.

  • Power Pages
  • Dataverse Web API
  • Liquid
  • JavaScript
  • Power Automate
  • WET4
View the scaffold

Commercial site · Build tooling

Public · Live

tireplus.ca — static rebuild

A bilingual Bootstrap 5 rebuild of a live commercial site, compiled from partials by a hand-written static site generator that uses only Node built-ins — the build requires no npm install at all.

The pipeline is the interesting part: push to main auto-deploys to staging, production is a manual dispatch, and the workflow swaps in environment-specific server configuration — cache-disabled and no-index for staging, cached with security headers for production.

Pages
85
Runtime deps
0
Languages
EN / FR
  • Node.js
  • Bootstrap 5
  • GitHub Actions
  • FTP deploy
  • Apache config
  • Smoke tests
View the generator

Operations tooling · Four applications

Public

Shop operations suite — single-file apps

Four complete business tools, each running by double-clicking an HTML file: sales reporting with print-perfect A4 output, inventory dissection that decodes and audits search tags, invoice history with PDF-fidelity rendering and stock reconciliation, and a loyalty programme with a campaigns engine.

No server, no install, no dependencies, no monthly fee — and the data never leaves the browser it is loaded in. Constraint-driven engineering for users who should not have to maintain anything.

Applications
4
Dependencies
0
Runs from
file://
  • Vanilla JS
  • CSV parsing
  • localStorage
  • Print CSS
  • Service Worker
  • Web manifest
Browse the four repositories

Companion app · Published book

Public · Live

Money Is a Tool — companion calculators

Four spreadsheet calculators from a published household finance guide, rebuilt as one installable progressive web app with stable hash routes so each chapter's QR code opens its own tool directly.

Private by construction — no server, no analytics, no network calls of any kind. Every entry stays in the browser's own storage, with per-tool resets and a global clear.

  • Vanilla JS
  • PWA
  • Service Worker
  • localStorage
  • Hash routing
  • SVG charts
  • Light / dark
moneyisatool.ca

Product site · Six languages

Live

aidpost.ca — multilingual static site

The AidPost product site in six languages — English, French, Arabic, Spanish, Swahili and Urdu — as plain HTML and CSS with no build step, no framework and no dependencies, on Cloudflare Pages.

Each language is a fully translated page rather than a string swap, with hreflang alternates in the sitemap and right-to-left handled properly.

  • HTML5
  • CSS3
  • Cloudflare Pages
  • Wrangler
  • hreflang
  • RTL
  • SVG
aidpost.ca

Product discovery · Phase 0

Public

Ontario patient transportation — market study

A discovery engagement rather than a codebase: a system map of Ontario's non-emergency patient transfer market, a bottom-up opportunity model with every assumption written down and auditable, a source register with per-source confidence ratings, and an operating business case.

The analyst half of the job. It also contains a read-only assessment that overturns the study's own earlier assumption — the record of a conclusion being corrected by evidence.

  • Market analysis
  • Unit economics
  • Source register
  • Technical writing
Read the study

05 — Technology

Everything we actually use

Only technologies in production use or evidenced in the delivery record. Nothing aspirational.

Languages

  • TypeScript
  • JavaScript (ES2020+)
  • Python 3.12
  • C# / .NET
  • SQL
  • PL/SQL
  • Liquid
  • HTML5
  • CSS3
  • PowerShell
  • VB.NET
  • XML / XSLT

Front end

  • React 18
  • Vite
  • Dexie
  • IndexedDB
  • Workbox
  • Service Workers
  • Web App Manifest
  • WebCrypto
  • Bootstrap 5
  • WET-BOEW / GCWeb
  • CDTS
  • SVG
  • Print CSS
  • onnxruntime-web

Back end & data

  • Django 5.2
  • Django REST Framework
  • Fastify 5
  • Node.js
  • PostgreSQL
  • SQLite
  • Dataverse
  • SQL Server
  • Oracle
  • Gunicorn
  • SSIS
  • Entity Framework

Testing & quality

  • Vitest
  • Playwright
  • Testing Library
  • fake-indexeddb
  • pg-mem
  • jsdom
  • axe-core
  • ESLint
  • mypy
  • ruff
  • user-event

Platform & delivery

  • GitHub Actions
  • Docker
  • Cloudflare Pages
  • GitHub Pages
  • Render
  • Azure DevOps
  • CodeQL
  • CycloneDX SBOM
  • Let's Encrypt
  • Wrangler
  • Apache config

Standards & interop

  • HL7 FHIR R4
  • WCAG 2.1 AA
  • WET4 / GCWeb
  • OpenAPI / Swagger
  • OData
  • FetchXML
  • RFC 6238 / 4226
  • AAMVA
  • WebVTT
  • hreflang
  • Official Languages Act

Microsoft Power Platform

  • Power Pages
  • Power Apps (model-driven)
  • Power Automate
  • Dataverse
  • Dynamics 365 CE
  • PCF controls
  • Business Process Flows
  • Plugins (C#)
  • SSRS

Security

  • AES-256-GCM
  • PBKDF2-SHA-256
  • TOTP / MFA
  • Hash-chained audit logs
  • Content Security Policy
  • reCAPTCHA
  • Secret scanning
  • Least-privilege design

AI-assisted delivery

  • Claude Code
  • Agent skills
  • MCP servers
  • Automated review in CI
  • Committed agent instructions

06 — The practice

Who you work with

WEBWorx is a senior-only practice. Engagements are led and delivered by the principal — there is no hand-off from the person you met to a team you did not.

Akram Farhat

Principal Senior Consultant

Twenty years of enterprise software engineering and systems analysis, eight of them specialising in Power Apps, Power Pages, Power Automate, Dataverse and Dynamics 365 CE. Delivery lead on public-facing Government of Canada service portals under GCWeb / WET-BOEW and WCAG, with database design and data-modelling depth behind it — and the architect and developer of AidPost and ESMS.

  • Based Ottawa, Ontario
  • Clearance Reliability status, valid to January 2030
  • Education BSc (Hons) Computer Engineering Technology, University of Teesside
  • Languages English and Arabic; working knowledge of French

Delivery record

  1. Health Canada System Analyst, Level 3 2025 – 2026

    SafePort, GI Report, SSI Request and Cruise Ship Scores portals. Power Pages and Dataverse under GCWeb 17 / WET4; led accessibility remediation for a portal serving thousands of users; modernised client-side code to TypeScript.

  2. Canada Revenue Agency System Analyst, Level 3 2023 – 2024

    GCcase — Government of Canada case management on Dynamics 365 CE. Dataverse data models, PCF grid and field controls in TypeScript and React, SSIS migration of legacy datasets, PowerShell release automation in Azure DevOps.

  3. BC Ministry of Attorney General Senior Developer / Analyst 2022 – 2023

    FAMS (maintenance enforcement) and CARMA (case review and adjudication). Dynamics 365 CE and Power Apps solutions with .NET, FetchXML and JavaScript; OpenAPI contracts for integration endpoints.

  4. Elections Canada Senior Developer / Analyst 2019 – 2022

    EC Connex intake and case management on Dynamics 365. Business process flows, SSRS reporting, SharePoint integration patterns, and performance testing of web form intake at scale.

  5. National Research Council (IRAP) System Analyst 2017 – 2019

    IRAP Innovation Portal, SONAR and Concierge. Modernisation of a client-facing portal for thousands of users aligned to the Canada.ca theme and WCAG 2.0, on ASP.NET with WCF services.

  6. Natural Resources Canada System Analyst 2012 – 2016

    EnerGuide Rating System. Oracle 11g PL/SQL, Erwin logical and physical data models, data conversion from legacy stores, multi-tier ASP.NET delivery under WCAG 2.0 and WET v4.

  7. City of Ottawa Senior Programmer / Developer 2003 – 2004

    GROVER — ambulance call reporting for the Emergency Medical Services branch, 650 paramedic users. Oracle back end, 60+ VB.NET class objects, a data-warehouse reporting subsystem, and the full design documentation set.

The first entry and the newest one are the same problem. In 2003 the work was capturing patient treatment and response data for 650 paramedics. In 2026 it is AidPost — casualty care and transport documentation for field responders, offline, encrypted, in seven languages. Twenty-three years apart, on the technology that finally makes it portable. Also omitted for brevity: Employment and Social Development Canada, Transport Canada, the Immigration and Refugee Board, and Fisheries and Oceans.

How this page was written. The capabilities and approach above were compiled by reading the code — twenty-six repositories with their commit history, build configuration, test suites and architecture documents — rather than from a résumé. Nine of those repositories are private and appear here by capability and technology only: no client identifiers, no source excerpts, no screenshots.

Available for design & development engagements

Let's talk about the hard part

Offline-first architecture, accessibility that survives an audit, bilingual or right-to-left delivery, or Power Platform work that has to meet federal standards. Tell us what has to be true, and we will tell you how we would build it.