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

2,037 contributions on GitHub in the last year

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. It covers theming, internationalization and localization (including an RTL pseudo-locale), accessibility, and responsive layout down to mobile. View state lives 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 view states, including the right-to-left locale and the empty result set.

Built withType-checks the table, its locale and query-state logic with no any. · Renders the table, its controls and the search and pagination UI. · Scopes every component's styles so none leak across the page. · Shares one visually-hidden mixin for screen-reader-only text across modules. · Resolves a stored or system locale across four catalogs, including an RTL pseudo-locale. · Sweeps the rendered app for accessibility violations in jsdom and a real browser. · Runs the unit tests in jsdom and in a real browser, with 100% coverage. · Runs the end-to-end specs for search, sort, paging, theming and URL state. · Chromatic snapshots states like dark theme, RTL and empty results.

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

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

Latest release: v0.69.0 (Sep 2026) · 28,498 npm downloads in the last year

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 still loads when a project sits at a different path on each machine, 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 Linux and Windows, then generates the docs and publishes the npm release.

Built withType-checks the CLI, its sync engine and every command module. · Handles cross-platform file and path work, plus a Windows-only reconcile step. · Commits and pushes the synced files, and pulls with rebase to merge changes. · Runs the unit, integration and platform-parity test suites, with 100% coverage. · Mutation-tests the CLI's source incrementally to check the Vitest suite catches bugs. · Scans staged files before push and prompts to redact, allow or drop secrets. · Builds the docs site published to GitHub Pages.

claude-nomad
claude-nomad

Home Assistant integration

Latest release: v1.24.0 (Sep 2026)

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. Requesting support for a new device takes a couple of clicks, and I can add devices I do not own with little back and forth.

Built withImplements the whole integration, from the RainPoint client to its entities. · Awaits one batched status call, falling back to per-hub calls without blocking. · Runs the unit suite with branch coverage held to 100%. · Mutation-tests the integration's source to check the suite catches bugs. · Lints and formats the integration's Python source. · Logs in and polls RainPoint's device and status endpoints. · Applies push updates from paired hubs between the coordinator's poll cycles.

Home Assistant integration

Latest release: v1.0.35 (Jul 2026)

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 the Flume device I had tracked usage with for years could not read it. I tried intercepting the new meter's RF signal with a software-defined radio first, but it was encrypted, so I reverse-engineered the utility's REST API instead. The integration polls the API hourly, records long-term usage history, and can backfill any date range on demand.

Built withImplements the whole integration, from the login flow to the energy import. · Splits unit tests from HA-fixture integration tests by marker. · Lints and formats the integration's Python source. · Signs in and pulls hourly meter data as JSON from the utility's API. · Parses the login page's HTML to pull the CSRF token.

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 DTCG design tokens, built with Style Dictionary and resolved with CSS light-dark(), so neither theme can drift from the other. The switch in the header overrides your system setting. An llms.txt is generated from the same data that renders this page.