Norman Yee

Staff Full-Stack Engineer · Frontend Emphasis

I build the shared component libraries, UI standards and testing infrastructure other engineers depend on, as well as the customer-facing surfaces that run on top of them. I have shipped in fintech, martech, gaming, life sciences, observability SaaS and e-commerce. I work in React, Vue and TypeScript, usually in micro-frontend architectures, and across the stack with the depth on the frontend side. Previously Thermo Fisher, Observe, Intuit, Raptr, Adobe and Walmart.com.

When a tool I rely on is missing something, I build it, either as a pull request upstream or as a project of my own. I write and maintain several open source projects: a CLI on npm with a Claude Code plugin, two Home Assistant integrations, and a React reference app. Mostly TypeScript and Python. My projects are public and MIT licensed.

github.com/funkadelic · LinkedIn

Projects

React 19 reference app

Search, sort and paginate large datasets in the browser with no table library.

I wanted to find out how far a hand-rolled data table gets, and to hold one to frontend best practices. Theming, internationalization and localization (including an RTL pseudo-locale), accessibility, and responsive layout down to mobile, with view state in validated query parameters so any view can be copied out of the address bar. Axe sweeps run in both a simulated DOM and a real browser, and Chromatic captures visual regression snapshots of five deliberate view states, including the right-to-left locale and the empty result set.

Built withTypeScript · React · CSS Modules · Sass · i18n · axe · Vitest · Playwright · Visual regression testing

YART city list, search, sort and pagination
YART city list, search, sort and pagination

npm CLI and Claude Code plugin · macOS, Linux, Windows

Syncs a full Claude Code setup across machines through a private Git repo you own.

It covers custom skills, slash commands, tuned settings and past conversations. I built it to keep my own desktop and laptop on the same Claude Code setup. It rewrites the machine-specific paths embedded in transcripts so history survives projects living at different paths, and merges a shared settings base with per-host overrides. Before each push it scans the files about to sync with gitleaks and stops on any possible secret, with an interactive prompt to redact it, allow it or drop it. CI runs the test suites on multiple platforms, then generates the docs and publishes the npm release.

Built withTypeScript · Node · Git · Vitest · Stryker · gitleaks · Starlight

claude-nomad
claude-nomad

Home Assistant integration

Controls RainPoint Smart+ irrigation hardware and reports its status in Home Assistant.

I rebuilt an existing integration that did not have the test discipline I wanted. I reverse engineered the RainPoint app’s REST and MQTT traffic to get control and scheduling working. Unrecognized hardware triggers a notification that pre-fills a GitHub issue with the diagnostics I need, so requesting new device support takes a couple of clicks and I can onboard devices I do not own with minimal back and forth.

Built withPython · asyncio · pytest · mutmut · Ruff · REST · MQTT

Home Assistant integration

Imports hourly Alameda County Water District meter data into the Home Assistant Energy Dashboard.

I wrote it after the utility swapped my magnetic water meter for a smart one and cut off the Flume device I tracked usage with. I tried intercepting the new meter’s RF signal with a software-defined radio first, but it was encrypted, so I reverse engineered their REST API instead. Polls it hourly through the day, records long-term usage history, and can backfill any date range on demand.

Built withPython · pytest · Ruff · REST · BeautifulSoup

Engineering standard

Every project above runs the same checks:

  • 01Pre-commit hooks catch what they can locally (ESLint and Prettier through Husky, Ruff through pre-commit), then CI runs the rest.
  • 02100% code coverage enforced through Codecov, which also flags bundle size growth in the web apps.
  • 03Unit tests and lint (Vitest and ESLint, Pytest and Ruff), plus integration tests where they earn their place.
  • 04Mutation testing (StrykerJS, mutmut) checks that the tests catch bugs, not only that they run the code.
  • 05Static analysis and dependency scanning with CodeQL, SonarQube and Snyk, plus fallow or Knip to catch unused code and dependencies in JavaScript and TypeScript.
  • 06AI code review with CodeRabbit in every repo.
  • 07Dependabot keeps dependencies current.
  • 08release-please cuts releases from conventional commits.

claude-nomad scans everything it is about to publish for leaked secrets with gitleaks, and YART, a web app, runs visual regression tests in Chromatic to catch UI drift.

Upstream open source contributions

I have merged changes into Home Assistant core, its documentation site and its brands repository, into HACS where both my integrations are listed, and into projects I depend on like gsd-core, starlight-llms-txt and PyISY. In Home Assistant core, I added CO2 readings to the Govee Bluetooth integration. I also file and chase issues in stryker-js, AdGuardHome, Claude Code and RTK: reproducing bugs, tracing root causes and confirming fixes.

Colophon

This site is React 19 and TypeScript on Vite, prerendered to static HTML at build time and deployed to Cloudflare Pages on every push. It runs the same checks as the projects above. The light and dark palettes come from one set of design tokens resolved with CSS light-dark(), so neither theme can drift from the other. The control in the footer overrides your system setting.