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

Software Engineer building reactive, browser-native interfaces

I'm Charl Roux — 7 years shipping enterprise frontend systems, deepest in Angular but not defined by it: React on client delivery since 2019, recently building browser-native AI with WebLLM/WebGPU, and shipping React on top of a FastAPI backend I wrote myself. I design reactive state, lead complex migrations, and ship accessible production UIs that hold up at scale.

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

now

available remote · full-time · US-authorized · no sponsorship · Michigan hiring
currently building AI tools that run entirely in the browser — no server, no API cost, no data leaving the device. focus
shipped a 10,000-row real-time data grid with an adjustable RxJS bufferTime window over live WebSocket streams, plus in-browser AI analysis — live now. live
architecture Angular Signals + OnPush change detection — fine-grained reactivity, no unnecessary re-renders. pattern
range also just shipped a React + FastAPI project — a live operator dashboard for a virtual BACnet device, first time owning the backend as well as the UI. new
background 7 years shipping production frontend — four on an enterprise cybersecurity SaaS platform, two and a half in agency delivery, the last nine months self-directed on browser-native AI. exp

01Selected work

Five projects across reactive streams, finite-state UIs, live device control, on-device AI, and large-scale virtualization — four run entirely in the browser; one talks to a real FastAPI backend over REST and WebSocket.

Precision Ledger — real-time crypto grid
// 02 live

Precision Ledger

Angular· RxJS· WebSockets· WebLLM

Real-time Binance feed streamed into a 10,000-row virtual grid. An adjustable RxJS bufferTime window decouples render pressure from the socket — 500+ events/sec batched into one update per interval; an in-browser LLM auto-analyzes any move over 2%. No server, no backend, no API key.

InvoiceFlow — invoice state machine
// 03 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
// 04 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.

// 05 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
v7→v19
Angular versions shipped, across green-field builds and incremental migrations of multi-team apps.

02Skills & stack

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

$tree ./stack --years frontend/
├── angular·······v7 → v19, signals, standalone  7y
├── typescript·····strict, generics, type utils  7y
├── rxjs···········streams, custom operators  7y
├── ngrx···········store, effects, entity  5y
├── react··········hooks, redux, client delivery  3y
├── 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
range/
└── fastapi·········rest + websocket backend new
$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