online · open to remote
~ charl-roux · —— EDT · Michigan, USA
// 00 — index

Principal Angular Engineer building reactive, browser-native interfaces

I'm Charl Roux — 7 years shipping enterprise Angular systems, most recently wiring WebLLM and WebGPU directly into Angular 19. I lead complex migrations, design reactive state with RxJS, and ship accessible production UIs that hold up at scale.

LOC
Michigan, USA
TZ
EDT · UTC−4
EXP
7 years
STATUS
open to remote

now

currently browser-native AI in Angular — WebLLM, WebGPU, Web Workers. focus
shipping a 10k-row reactive grid with adjustable RxJS throttling. in flight
signals migrating reactive primitives to Angular Signals — fine-grained, zone-less, no manual markForCheck. pattern
onpush OnPush change detection by default — async pipe end-to-end, immutable inputs, zero zone.run escapes. perf
websockets long-lived RxJS socket streams with exponential backoff, throttle-trailing buffers, and graceful reconnect. infra
available remote · contract or full-time · starting Q3 2026 hiring

01Selected work

Four projects across reactive streams, finite-state UIs, on-device AI, and large-scale virtualization. Each runs entirely in the browser.

InvoiceFlow — invoice state machine
// 02 live

InvoiceFlow

Angular· CDK· TypeScript

Invoice lifecycle app where draft → pending → paid is a finite state machine at the service layer — invalid transitions are structurally impossible.

VaultKey — on-device password helper
// 03 live

VaultKey

Angular· WebLLM· Web Worker

Generates a strong password and maps each character to a memorable word. Runs entirely in a Web Worker via a local LLM — no server, nothing leaves the device.

TalentBoard — virtualized jobs board
// 04 live

TalentBoard

Angular· Transformers.js· WebGPU

1,000+ listings virtualized on a single page. Hybrid vector + BM25 search via Orama and all-MiniLM-L6-v2, running on WebGPU; filter state synced to the URL.

// regression
−50%
Regression defects, after introducing a Cypress/Jest test layer on a legacy Angular monolith.
// migrated
v2→v19
Angular versions shipped, across green-field builds and incremental migrations of multi-team apps.
// runtime
100%
Of inference for the AI-powered projects runs on-device — no server, no API key, no telemetry.

02Skills & stack

A pragmatic, opinionated stack — picked because it scales for teams, not because it's fashionable.

$tree ./stack --years frontend/
├── angular·······v2 → v19, signals, standalone  7y
├── typescript·····strict, generics, type utils  7y
├── rxjs···········streams, custom operators  7y
├── ngrx···········store, effects, entity  5y
├── html···········semantic, WCAG 2.1  7y
└── css············grid, animations, arch  7y
browser-native AI/
├── webllm·········qwen2.5, in-browser LLM  1y
├── webgpu·········transformers.js, embeddings  1y
└── web workers····off-main-thread inference  3y
$tree ./stack --platform platform/
├── node.js········express, async/await, REST  4y
├── ci-cd··········github actions, docker  4y
├── nx·············monorepos, affected graph  3y
└── module-fed·····runtime micro-frontends  3y
quality/
├── cypress········e2e, visual regression  5y
├── jest···········unit, TestBed  5y
└── accessibility··aria, keyboard, axe  6y
approach/
├── reactive·······streams over imperative
├── strict-types···types as documentation
└── a11y-first·····a baseline, not a polish
// 03 — contact

Let's talk.

I'd love to hear about your project and how I could help. Drop a note via the form, or reach me directly — I read everything and reply within a day or two.

contact.sh — new message
⏎ shift+enter for newline · enter to send