diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7cde4251..f7af3e69 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,11 +9,12 @@
## Changelog
+### **HEAD -> main** 2022/11/22 mandic00@live.com
+
+
### **3.0.1** 2022/11/22 mandic00@live.com
-
-### **origin/main** 2022/11/22 mandic00@live.com
-
+- support dynamic loads
- polish demos
- add facedetect demo and fix model async load
- enforce markdown linting
diff --git a/TODO.md b/TODO.md
index 2dab37ae..9effe164 100644
--- a/TODO.md
+++ b/TODO.md
@@ -50,58 +50,3 @@ No support for running in **web workers** as Safari still does not support `Offs
## Pending Release Changes
-
-Optimizations:
-- Enabled high-resolution optimizations
- Internal limits are increased from **2k** to **4k**
-- Enhanced device capabilities detection
- See `human.env.[agent, wasm, webgl, webgpu]` for details
-- If `config.backend` is not set, Human will auto-select best backend
- based on device capabilities
-- Enhanced support for `webgpu`
-- Reduce build dependencies
- `Human` is now 30% smaller :)
- As usual, `Human` has **zero** runtime dependencies,
- all *devDependencies* are only to rebuild `Human` itself
-- Default hand skeleton model changed from `handlandmark-full` to `handlandmark-lite`
- Both models are still supported, this reduces default size and increases performance
-
-Features:
-- Add [draw label templates](https://github.com/vladmandic/human/wiki/Draw)
- Allows easy customization of results labels drawn on canvas
-- Add `config.filter.autoBrightness` (*enabled by default*)
- Per-frame video on-the-fly brightness adjustments
- Which significantly increases performance and precision in poorly lit scenes
-- Add new demo [face detect]((https://vladmandic.github.io/human/demo/facedetect/index.html))
-- Improved `config.filter.equalization` (*disabled by default*)
- Image and video on-demand histogram equalization
-- Support selecting specific video source when multiple cameras are present
- See `human.webcam.enumerate()`
-- Updated algorithm to determine distance from camera based on iris size
- See `human.result.face[n].distance`
-
-Architecture:
-- Upgrade to **TFJS 4.1** with **strong typing**
- see [notes](https://github.com/vladmandic/human#typedefs) on how to use
-- `TypeDef` refactoring
-- Re-architect `human.models` namespace for better dynamic model handling
- Added additional methods `load`, `list`, `loaded`, `reset`
-- Repack external typedefs
- Removes all external typedef dependencies
-- Refactor namespace exports
- Better [TypeDoc specs](https://vladmandic.github.io/human/typedoc/index.html)
-- Add named export for improved bundler support when using non-default imports
-- Cleanup Git history for `dist`/`typedef`/`types`
-- Cleanup `@vladmandic/human-models`
-- Support for **NodeJS v19**
-- Upgrade to **TypeScript 4.9**
-- Support for dynamic module load in **NodeJS**
- See
-
-Breaking changes:
-- Replaced `result.face[n].iris` with `result.face[n].distance`
-- Replaced `human.getModelStats()` with `human.models.stats()`
-- Moved `human.similarity`, `human.distance` and `human.match` to namespace `human.match.*`
-- Obsolete `human.enhance()`
-- Obsolete `human.gl`
-- Renamed model `mb3-centernet` to `centernet`
diff --git a/test/build.log b/test/build.log
index 206ea15b..a5c3ccc2 100644
--- a/test/build.log
+++ b/test/build.log
@@ -1,50 +1,50 @@
-2022-11-22 10:34:25 [32mDATA: [39m Build {"name":"@vladmandic/human","version":"3.0.1"}
-2022-11-22 10:34:25 [36mINFO: [39m Application: {"name":"@vladmandic/human","version":"3.0.1"}
-2022-11-22 10:34:25 [36mINFO: [39m Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true}
-2022-11-22 10:34:25 [36mINFO: [39m Toolchain: {"build":"0.7.14","esbuild":"0.15.15","typescript":"4.9.3","typedoc":"0.23.21","eslint":"8.28.0"}
-2022-11-22 10:34:25 [36mINFO: [39m Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
-2022-11-22 10:34:25 [35mSTATE:[39m Clean: {"locations":["dist/*","types/*","typedoc/*"]}
-2022-11-22 10:34:25 [35mSTATE:[39m Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361}
-2022-11-22 10:34:25 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924}
-2022-11-22 10:34:25 [35mSTATE:[39m Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":80,"inputBytes":670542,"outputBytes":317619}
-2022-11-22 10:34:25 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928}
-2022-11-22 10:34:25 [35mSTATE:[39m Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":80,"inputBytes":670546,"outputBytes":317623}
-2022-11-22 10:34:25 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876}
-2022-11-22 10:34:25 [35mSTATE:[39m Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":80,"inputBytes":671494,"outputBytes":317734}
-2022-11-22 10:34:25 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670}
-2022-11-22 10:34:25 [35mSTATE:[39m Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":80,"inputBytes":670288,"outputBytes":316195}
-2022-11-22 10:34:26 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1138192}
-2022-11-22 10:34:26 [35mSTATE:[39m Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":80,"inputBytes":1807810,"outputBytes":1450757}
-2022-11-22 10:34:26 [35mSTATE:[39m Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":80,"inputBytes":1807810,"outputBytes":1894174}
-2022-11-22 10:34:30 [35mSTATE:[39m Typings: {"input":"src/human.ts","output":"types/lib","files":15}
-2022-11-22 10:34:31 [35mSTATE:[39m TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":77,"generated":true}
-2022-11-22 10:34:31 [35mSTATE:[39m Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6082,"outputBytes":2872}
-2022-11-22 10:34:31 [35mSTATE:[39m Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17572,"outputBytes":9456}
-2022-11-22 10:34:40 [35mSTATE:[39m Lint: {"locations":["**/*.json","src/**/*.ts","test/**/*.js","demo/**/*.js","**/*.md"],"files":169,"errors":0,"warnings":0}
-2022-11-22 10:34:40 [35mSTATE:[39m ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
-2022-11-22 10:34:40 [35mSTATE:[39m Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"}
-2022-11-22 10:34:40 [36mINFO: [39m Done...
-2022-11-22 10:34:40 [35mSTATE:[39m Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"}
-2022-11-22 10:34:40 [35mSTATE:[39m Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"}
-2022-11-22 10:34:40 [35mSTATE:[39m Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"}
-2022-11-22 10:34:40 [35mSTATE:[39m Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"}
-2022-11-22 10:34:40 [35mSTATE:[39m Filter: {"input":"types/tfjs-core.d.ts"}
-2022-11-22 10:34:41 [35mSTATE:[39m API-Extractor: {"succeeeded":true,"errors":0,"warnings":204}
-2022-11-22 10:34:41 [35mSTATE:[39m Filter: {"input":"types/human.d.ts"}
-2022-11-22 10:34:41 [35mSTATE:[39m Write: {"output":"dist/human.esm-nobundle.d.ts"}
-2022-11-22 10:34:41 [35mSTATE:[39m Write: {"output":"dist/human.esm.d.ts"}
-2022-11-22 10:34:41 [35mSTATE:[39m Write: {"output":"dist/human.d.ts"}
-2022-11-22 10:34:41 [35mSTATE:[39m Write: {"output":"dist/human.node-gpu.d.ts"}
-2022-11-22 10:34:41 [35mSTATE:[39m Write: {"output":"dist/human.node.d.ts"}
-2022-11-22 10:34:41 [35mSTATE:[39m Write: {"output":"dist/human.node-wasm.d.ts"}
-2022-11-22 10:34:41 [36mINFO: [39m Analyze models: {"folders":8,"result":"models/models.json"}
-2022-11-22 10:34:41 [35mSTATE:[39m Models {"folder":"./models","models":12}
-2022-11-22 10:34:41 [35mSTATE:[39m Models {"folder":"../human-models/models","models":41}
-2022-11-22 10:34:41 [35mSTATE:[39m Models {"folder":"../blazepose/model/","models":4}
-2022-11-22 10:34:41 [35mSTATE:[39m Models {"folder":"../anti-spoofing/model","models":1}
-2022-11-22 10:34:41 [35mSTATE:[39m Models {"folder":"../efficientpose/models","models":3}
-2022-11-22 10:34:41 [35mSTATE:[39m Models {"folder":"../insightface/models","models":5}
-2022-11-22 10:34:41 [35mSTATE:[39m Models {"folder":"../movenet/models","models":3}
-2022-11-22 10:34:41 [35mSTATE:[39m Models {"folder":"../nanodet/models","models":4}
-2022-11-22 10:34:42 [35mSTATE:[39m Models: {"count":55,"totalSize":372917743}
-2022-11-22 10:34:42 [36mINFO: [39m Human Build complete... {"logFile":"test/build.log"}
+2022-11-22 10:59:38 [32mDATA: [39m Build {"name":"@vladmandic/human","version":"3.0.1"}
+2022-11-22 10:59:38 [36mINFO: [39m Application: {"name":"@vladmandic/human","version":"3.0.1"}
+2022-11-22 10:59:38 [36mINFO: [39m Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true}
+2022-11-22 10:59:38 [36mINFO: [39m Toolchain: {"build":"0.7.14","esbuild":"0.15.15","typescript":"4.9.3","typedoc":"0.23.21","eslint":"8.28.0"}
+2022-11-22 10:59:38 [36mINFO: [39m Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
+2022-11-22 10:59:38 [35mSTATE:[39m Clean: {"locations":["dist/*","types/*","typedoc/*"]}
+2022-11-22 10:59:38 [35mSTATE:[39m Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361}
+2022-11-22 10:59:38 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924}
+2022-11-22 10:59:38 [35mSTATE:[39m Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":80,"inputBytes":670542,"outputBytes":317619}
+2022-11-22 10:59:38 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928}
+2022-11-22 10:59:38 [35mSTATE:[39m Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":80,"inputBytes":670546,"outputBytes":317623}
+2022-11-22 10:59:38 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876}
+2022-11-22 10:59:38 [35mSTATE:[39m Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":80,"inputBytes":671494,"outputBytes":317734}
+2022-11-22 10:59:38 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670}
+2022-11-22 10:59:38 [35mSTATE:[39m Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":80,"inputBytes":670288,"outputBytes":316195}
+2022-11-22 10:59:39 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1138192}
+2022-11-22 10:59:39 [35mSTATE:[39m Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":80,"inputBytes":1807810,"outputBytes":1450757}
+2022-11-22 10:59:39 [35mSTATE:[39m Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":80,"inputBytes":1807810,"outputBytes":1894174}
+2022-11-22 10:59:43 [35mSTATE:[39m Typings: {"input":"src/human.ts","output":"types/lib","files":15}
+2022-11-22 10:59:45 [35mSTATE:[39m TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":77,"generated":true}
+2022-11-22 10:59:45 [35mSTATE:[39m Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6082,"outputBytes":2872}
+2022-11-22 10:59:45 [35mSTATE:[39m Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17572,"outputBytes":9456}
+2022-11-22 10:59:54 [35mSTATE:[39m Lint: {"locations":["**/*.json","src/**/*.ts","test/**/*.js","demo/**/*.js","**/*.md"],"files":169,"errors":0,"warnings":0}
+2022-11-22 10:59:54 [35mSTATE:[39m ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
+2022-11-22 10:59:54 [35mSTATE:[39m Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"}
+2022-11-22 10:59:54 [36mINFO: [39m Done...
+2022-11-22 10:59:54 [35mSTATE:[39m Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"}
+2022-11-22 10:59:54 [35mSTATE:[39m Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"}
+2022-11-22 10:59:54 [35mSTATE:[39m Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"}
+2022-11-22 10:59:54 [35mSTATE:[39m Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"}
+2022-11-22 10:59:54 [35mSTATE:[39m Filter: {"input":"types/tfjs-core.d.ts"}
+2022-11-22 10:59:54 [35mSTATE:[39m API-Extractor: {"succeeeded":true,"errors":0,"warnings":204}
+2022-11-22 10:59:54 [35mSTATE:[39m Filter: {"input":"types/human.d.ts"}
+2022-11-22 10:59:54 [35mSTATE:[39m Write: {"output":"dist/human.esm-nobundle.d.ts"}
+2022-11-22 10:59:54 [35mSTATE:[39m Write: {"output":"dist/human.esm.d.ts"}
+2022-11-22 10:59:54 [35mSTATE:[39m Write: {"output":"dist/human.d.ts"}
+2022-11-22 10:59:54 [35mSTATE:[39m Write: {"output":"dist/human.node-gpu.d.ts"}
+2022-11-22 10:59:54 [35mSTATE:[39m Write: {"output":"dist/human.node.d.ts"}
+2022-11-22 10:59:54 [35mSTATE:[39m Write: {"output":"dist/human.node-wasm.d.ts"}
+2022-11-22 10:59:54 [36mINFO: [39m Analyze models: {"folders":8,"result":"models/models.json"}
+2022-11-22 10:59:54 [35mSTATE:[39m Models {"folder":"./models","models":12}
+2022-11-22 10:59:54 [35mSTATE:[39m Models {"folder":"../human-models/models","models":41}
+2022-11-22 10:59:54 [35mSTATE:[39m Models {"folder":"../blazepose/model/","models":4}
+2022-11-22 10:59:54 [35mSTATE:[39m Models {"folder":"../anti-spoofing/model","models":1}
+2022-11-22 10:59:54 [35mSTATE:[39m Models {"folder":"../efficientpose/models","models":3}
+2022-11-22 10:59:54 [35mSTATE:[39m Models {"folder":"../insightface/models","models":5}
+2022-11-22 10:59:54 [35mSTATE:[39m Models {"folder":"../movenet/models","models":3}
+2022-11-22 10:59:54 [35mSTATE:[39m Models {"folder":"../nanodet/models","models":4}
+2022-11-22 10:59:55 [35mSTATE:[39m Models: {"count":55,"totalSize":372917743}
+2022-11-22 10:59:55 [36mINFO: [39m Human Build complete... {"logFile":"test/build.log"}