{"id":13448649,"url":"https://github.com/thi-ng/umbrella","last_synced_at":"2025-05-14T08:05:18.208Z","repository":{"id":38473635,"uuid":"118700275","full_name":"thi-ng/umbrella","owner":"thi-ng","description":"⛱  Broadly scoped ecosystem \u0026 mono-repository of 206 TypeScript projects (and ~185 examples) for general purpose, functional, data driven development","archived":false,"fork":false,"pushed_at":"2025-05-04T19:44:32.000Z","size":238030,"stargazers_count":3567,"open_issues_count":55,"forks_count":149,"subscribers_count":47,"default_branch":"develop","last_synced_at":"2025-05-07T07:02:18.317Z","etag":null,"topics":["color","data-structures","dataflow","dsl","functional-programming","geometry","html","monorepo","parser-combinators","reactive-programming","shadergraph","streams","transducers","typescript","ui","vectors","visualization","webassembly","webgl","ziglang"],"latest_commit_sha":null,"homepage":"https://thi.ng","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thi-ng.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"postspectacular","patreon":"thing_umbrella","liberapay":"thi.ng"}},"created_at":"2018-01-24T02:31:44.000Z","updated_at":"2025-05-06T06:24:42.000Z","dependencies_parsed_at":"2023-12-08T18:38:47.520Z","dependency_job_id":"90d69eca-6488-40ee-9d41-254409f62017","html_url":"https://github.com/thi-ng/umbrella","commit_stats":{"total_commits":10558,"total_committers":50,"mean_commits":211.16,"dds":"0.44061375260465996","last_synced_commit":"9219c4c1d5fff4869d8afce6c06531e3b08a1527"},"previous_names":[],"tags_count":42394,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thi-ng%2Fumbrella","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thi-ng%2Fumbrella/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thi-ng%2Fumbrella/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thi-ng%2Fumbrella/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thi-ng","download_url":"https://codeload.github.com/thi-ng/umbrella/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253391494,"owners_count":21900952,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["color","data-structures","dataflow","dsl","functional-programming","geometry","html","monorepo","parser-combinators","reactive-programming","shadergraph","streams","transducers","typescript","ui","vectors","visualization","webassembly","webgl","ziglang"],"created_at":"2024-07-31T05:01:51.630Z","updated_at":"2025-05-14T08:05:18.200Z","avatar_url":"https://github.com/thi-ng.png","language":"TypeScript","funding_links":["https://github.com/sponsors/postspectacular","https://patreon.com/thing_umbrella","https://liberapay.com/thi.ng","https://www.patreon.com/thing_umbrella","https://github.com/sponsors/postspectacular/"],"categories":["TypeScript","Packages","webgl"],"sub_categories":[],"readme":"![thi.ng/umbrella](https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/banners/thing-umbrella-masthead.jpg)\n\n[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/thi-ng/umbrella/test.yml?branch=main)](https://github.com/thi-ng/umbrella/actions?query=workflow%3Atest-all)\n[![Code Climate](https://api.codeclimate.com/v1/badges/592940419adb5bf8abaf/maintainability)](https://codeclimate.com/github/thi-ng/umbrella/maintainability)\n[![Become a patron](https://img.shields.io/badge/patreon-donate-yellow.svg)](https://www.patreon.com/thing_umbrella)\n[![Mastodon Follow](https://img.shields.io/mastodon/follow/109331703950160316?domain=https%3A%2F%2Fmastodon.thi.ng\u0026style=social)](https://mastodon.thi.ng/@toxi)\n\n- [About](#about)\n- [Getting Started](#getting-started)\n  - [Documentation](#documentation)\n  - [Project templates](#project-templates)\n  - [#HowToThing](#howtothing)\n  - [Blog posts](#blog-posts)\n  - [Videos](#videos)\n- [Examples \u0026 Showcase](#examples--showcase)\n  - [awesome.thi.ng](#awesomething)\n  - [Generative art projects](#generative-art-projects)\n- [Community, contributing, getting help](#community-contributing-getting-help)\n  - [Wiki](#wiki)\n- [Projects](#projects)\n  - [Latest updates](#latest-updates)\n  - [Algorithms \u0026 data structures](#algorithms--data-structures)\n  - [DSLs](#dsls)\n  - [File / file format / hardware support](#file--file-format--hardware-support)\n  - [Frontend / UI](#frontend--ui)\n  - [Fundamentals](#fundamentals)\n  - [Geometry, image \u0026 visualization](#geometry-image--visualization)\n  - [Iterator, stream \u0026 sequence processing](#iterator-stream--sequence-processing)\n  - [Low-level, binary, memory management, interop](#low-level-binary-memory-management-interop)\n  - [Maths](#maths)\n  - [Network](#network)\n  - [Randomness](#randomness)\n  - [Reactive programming](#reactive-programming)\n  - [WebGL / GPGPU](#webgl--gpgpu)\n  - [Deprecated packages](#deprecated-packages)\n- [Building](#building)\n  - [Building example projects](#building-example-projects)\n  - [Testing](#testing)\n  - [Building API docs](#building-api-docs)\n  - [Extracting code examples from readme files \u0026 comments](#extracting-code-examples-from-readme-files--comments)\n- [Acknowledgements](#acknowledgements)\n- [License](#license)\n- [Contributors](#contributors-✨)\n\n## About\n\n\u003e \"A collection of functional programming libraries that can be composed\n\u003e together. Unlike a framework, thi.ng is a suite of instruments and you (the\n\u003e user) must be the composer of. Geared towards versatility, not any specific\n\u003e type of music.\" \u0026mdash;\n\u003e [@loganpowell](https://twitter.com/logantpowell/status/1186334119812304901)\n\u003e via Twitter\n\u003e\n\u003e Please visit [thi.ng](https://thi.ng) for additional information. You might\n\u003e also find the following tools useful to find \u0026 explore projects in this vast\n\u003e ecosystem:\n\u003e\n\u003e - [thi.ng tag browser](https://demo.thi.ng/umbrella/thing-browser/)\n\u003e - [tag-based search on the thi.ng website](https://thi.ng/#tags)\n\u003e - [repo-wide doc string search](https://demo.thi.ng/umbrella/rdom-search-docs/)\n\u003e - [generated API docs](https://docs.thi.ng/)\n\n**This project is NOT a framework and all packages can be used in isolation.**\n\nNot including deprecations, this mono-repository is home to 206 individual\nTypeScript libraries/packages/tools and ~185 example projects illustrating their\nusage, currently totalling ~238k SLOC and ~4250 source files... Some of the\nprojects have been in regular development since 2015. The monorepo exists in its\ncurrent form since January 2018.\n\nUnlike most other large mono-repos, this one is not for a single project, but a\nbroad collection of jointly developed, yet independent libraries, tools and\ngeneral purpose building blocks for the following **non-exhaustive** list of\ntopics (see [package overview](#projects) below):\n\n- Functional programming (ES6 iterators/generators, composition, memoization,\n  transducers, multi-methods)\n- Reactive programming, stream / transducer based dataflow graphs / pipelines /\n  DOM\n- Fiber process tree abstraction for ES6 generators (co-routines / cooperative\n  multitasking)\n- Data structures \u0026 data transformations for wide range of use cases (maps,\n  sets, heaps, queues, graphs etc.)\n- WebAssembly bridge APIs \u0026 data structure bindings code generators for multiple\n  target languages (primarily aimed at Zig \u0026 C11)\n- PEG-style functional parser combinators w/ (optional) custom grammar\n  definition language\n- Customizable HTML \u0026 Markdown parsers\n- 2D/3D geometry generation, shape primitives, math, manipulation,\n  intersections, conversions \u0026 visualizations\n- Canvas abstractions, pixel buffers \u0026 SVG serialization/conversion\n- Comprehensive function collection (900+) for nD-vectors and matrices (dense \u0026\n  sparse)\n- ECS implementations with optional support for strided memory layouts\n- Semi-declarative WebGL 1/2 abstraction layer\n- DSL for shader functions defined in TypeScript and cross-compilation to GLSL,\n  JS, VEX etc.\n- Value-based equivalence (vs. native object identity) and associative data\n  structures (sets, maps)\n- DSP building blocks: oscillators, noise generators, filters, 1D FFT/IFFT,\n  muxers, rate converters\n- Immutable data handling, state containers, transacted state updates, Undo-Redo\n  history\n- Reactive UI component toolkits (DOM-based, canvas-based, immediate-mode,\n  multiple approaches...)\n- Multi-format, multi-channel pixel buffers (int \u0026 float based), conversions,\n  dithering, Porter-Duff alpha-blending operators\n- Color space/format conversions, matrix based color manipulation, gradient\n  generators, color palettes, dominant color extraction\n- Date-time abstraction, relative dates, iterators, formatters, math\n- WebWorker workflow abstractions\n- Forth-style pointfree DSL for functional composition and DSL\n  development/extension\n- S-expression parser \u0026 runtime (interpreter) infrastructure for custom DSL\n  creation\n- WASM-based SIMD batch-processing of vector data\n- Pen-plotter (AxiDraw) toolchain \u0026 geometry conversions\n- Interpolations, math helpers, automatic differentiation (Dual numbers)\n- etc.\n\nOnce more, **this project is NOT a framework**. There's no turn-key,\none-size-fits-all approach and instead the overall design philosophy encourages\na mix \u0026 match philosophy for key aspects of application design (inside \u0026 outside\nthe browser). Customization points are provided wherever useful and only expect\ncertain interfaces/type signatures rather than hard-coded concrete\nimplementations. In many cases presets are provided too.\n\nAll packages:\n\n- are versioned independently\n- have auto-generated online documentation at [docs.thi.ng](https://docs.thi.ng)\n- built via [esbuild](https://esbuild.github.io/) and tested via [bun.sh](https://bun.sh)\n- released via [thi.ng/monopub](https://github.com/thi-ng/monopub) publishing toolchain\n- distributed as ESM modules (ES2022 syntax) with export maps, TypeScript\n  typings \u0026 change logs\n- highly modular with often only a single function / class (incl. closely\n  related functions) per file to help w/ selective imports and tree shaking\n- provide re-exports of all their publics for full library imports\n- have either none or only `@thi.ng` internal runtime dependencies (w/ very few\n  exceptions! All dependencies are listed in each package readme)\n- declare public interfaces, enums \u0026 types in an `api.ts` file\n- licensed under [Apache Software License 2.0](#license)\n\n## Getting started\n\nA common misconception is to think of this repo as single project. It is not!\nThe sheer number and varied nature \u0026 purpose of these [packages](#packages)\nmakes it impossible to provide traditional \"Getting started\" tutorials — there\nwould have to be dozens of them... To compensate, this repo provides ~180\n[example projects](#examples--showcase), detailed package readmes (at the very\nleast for all the larger and/or more important ones), as well as [hundreds of\nsmall usage examples/snippets in doc strings \u0026 readme\nfiles](#extracting-code-examples-from-readme-files--comments).\n\n### Documentation\n\n- [Generated API docs (overview)](https://docs.thi.ng/)\n- [Single page API docs for all pacakges (work-in-progress)](https://docs.thi.ng/umbrella)\n- [Hundreds of usage examples/snippets](#extracting-code-examples-from-readme-files--comments)\n\nIf you're unsure about something, please [reach\nout](#community-contributing-getting-help)! Any constructive feedback is always\nhighly appreciated!\n\n### Project templates\n\nYou might find one of the following template repos an useful starting point\n(only updated sporadically, make sure to update dependencies manually):\n\n- [tpl-umbrella-basic](https://github.com/thi-ng/tpl-umbrella-basic): Bare-bones\n  template repo for browser-based projects\n- [tpl-umbrella-fxhash](https://github.com/thi-ng/tpl-umbrella-fxhash): Project\n  template repo for generative art projects on the fx(hash) platform\n- [tpl-umbrella-zig](https://github.com/thi-ng/tpl-umbrella-zig): Minimal\n  browser project template for hybrid TypeScript \u0026 Zig (WebAssembly) apps\n\n### #HowToThing\n\nBetween August-November 2023,\n[#HowToThing](https://mastodon.thi.ng/tags/HowToThing) was a series of short\nposts \u0026 mini-tutorials on Mastodon, demonstrating a range of different\ntechniques, patterns and use cases from across the _thi.ng/umbrella_ ecosystem.\nThese are not necessarily intro examples, but each one comes with heavily\ncommented code (and often with visual outputs/results).\n\n- [001: FPS counter with moving average](https://mastodon.thi.ng/@toxi/110898928550740865)\n- [002: Sorting an array by potentially CPU-costly sort criteria](https://mastodon.thi.ng/@toxi/110904190618425908)\n- [003: Multiple key states and extracting commands via FSM](https://mastodon.thi.ng/@toxi/110934031101245644)\n- [004: Creating text-based plots to debug \u0026 visualize sequential data](https://mastodon.thi.ng/@toxi/110942967462856117)\n- [005: Barnsley fern IFS fractal](https://mastodon.thi.ng/@toxi/110946943031183702)\n- [006: Clustering arbitrary n-dimensional data using K-means](https://mastodon.thi.ng/@toxi/110955825785005618)\n- [007: Converting Google Maps bookmarks to KML](https://mastodon.thi.ng/@toxi/110961348580185768)\n- [008: CSV parsing into structured data \u0026 multi-plot SVG dataviz](https://mastodon.thi.ng/@toxi/110967240994840257)\n- [009: 2D canvas drawing \u0026 `threadLast()` dataflow operator](https://mastodon.thi.ng/@toxi/110972322869333970)\n- [010: Basic web app UI/DOM via Zig/WASM and thi.ng/wasm-api](https://mastodon.thi.ng/@toxi/110975292505640048)\n- [011: 2D cellular automata as WebGL2 multi-pass shader pipeline](https://mastodon.thi.ng/@toxi/110983734311624640)\n- [012: Pure CSS image transition/reveal with thi.ng/hiccup-css](https://mastodon.thi.ng/@toxi/110995613345369326)\n- [013: Lisp interpreter using thi.ng/sexpr \u0026 thi.ng/defmulti](https://mastodon.thi.ng/@toxi/111006345413482231)\n- [014: A simple browser REPL for a Lispy mini language](https://mastodon.thi.ng/@toxi/111012777135967117)\n- [015: Generative audio synth offline renderer and WAV file export](https://mastodon.thi.ng/@toxi/111018580750654608)\n- [016: Building a reactive Mastodon UI, parsing \u0026 transforming API data](https://mastodon.thi.ng/@toxi/111069280667363259)\n- [017: (Re)Constructing the thi.ng logo as 2D signed-distance field](https://mastodon.thi.ng/@toxi/111124858346572300)\n- [018: Topological sorting, creating \u0026 visualizing a task dependency graph](https://mastodon.thi.ng/@toxi/111141659277277568)\n- [019: Building a responsive \u0026 reactive stacked column layout](https://mastodon.thi.ng/@toxi/111182345509593440)\n- [020: Generating randomized 4-point 2D multicolor gradient maps/images](https://mastodon.thi.ng/@toxi/111205034763399083)\n- [021: Iterative animated convex polygon subdivision \u0026 heat map viz](https://mastodon.thi.ng/@toxi/111221943333023306)\n- [022: Quasi-random voronoi lattice generator](https://mastodon.thi.ng/@toxi/111244412425832657)\n- [023: Tag-based Jaccard similarity ranking/filtering using bitfields](https://mastodon.thi.ng/@toxi/111256960928934577)\n- [024: 2.5D hidden line visualization of digital elevation files (DEM)](https://mastodon.thi.ng/@toxi/111269505611983570)\n- [025: Fitting, transforming \u0026 plotting 10k data points per frame using SIMD](https://mastodon.thi.ng/@toxi/111283262419126958)\n- [026: Shader meta-programming to generate animated function plots](https://mastodon.thi.ng/@toxi/111295842650216136)\n- [027: Flocking sim with neighborhood queries to visualize proximity](https://mastodon.thi.ng/@toxi/111308439597090930)\n- [028: Randomized, space-filling, nested 2D grid layout generator](https://mastodon.thi.ng/@toxi/111324566926701431)\n- [029: Forth-like DSL \u0026 livecoding playground for 2D geometry generation](https://mastodon.thi.ng/@toxi/111335025037332972)\n- [030: Procedural stochastic text generation via custom DSL \u0026 parse grammar](https://mastodon.thi.ng/@toxi/111347074558293056)\n\n### Blog posts\n\n- \"Of umbrellas, transducers, reactive streams \u0026 mushrooms\" (ongoing series):\n  - [Part 1 - Project \u0026 series overview](https://github.com/thi-ng/blog/blob/main/2019/20190304-of-umbrellas-transducers-reactive-streams-pt1.md)\n  - [Part 2 - HOFs, Transducers, Reducers](https://github.com/thi-ng/blog/blob/main/2019/20190307-of-umbrellas-transducers-reactive-streams-pt2.md)\n  - [Part 3 - Convolution, 1D/2D Cellular automata](https://github.com/thi-ng/blog/blob/main/2019/20190310-of-umbrellas-transducers-reactive-streams-pt3.md)\n  - [Part 4 - Disjoint Sets, Graph analysis, Signed Distance Fields](https://github.com/thi-ng/blog/blob/main/2019/20190314-of-umbrellas-transducers-reactive-streams-pt4.md)\n- [How to UI in 2018](https://github.com/thi-ng/blog/blob/main/2018/20180204-how-to-ui-in-2018.md)\n- [The Jacob's Ladder of coding](https://github.com/thi-ng/blog/blob/main/2015/20151215-jacobs-ladder-of-coding.md)\n\n### Videos\n\nThe following videos have been migrated from YouTube to their new home at\n[makertube.net](https://makertube.net/c/thingumbrella/videos) (more to come):\n\n- [Building a web editor for creating/testing parse grammars](https://makertube.net/w/ursFuQNJQQskmejx1ydL7q)\n- [Building a shader graph editor (WebGL, shader AST transpiler, UI)](https://makertube.net/w/aTZXyecXhcexvt9G3hNX15)\n- [Crash course: TypeScript mapped types in action](https://makertube.net/w/vai9TDyGjkduwapg7C9aJo)\n\u003c!-- - [thi.ng/umbrella livestream #3](https://www.youtube.com/watch?v=_chKFhArGK0) --\u003e\n\n## Examples \u0026 Showcase\n\nThere's a steadily growing number (~180) of standalone examples of different\ncomplexities (often combining functionality from several packages) in the\n[**examples**](./examples/README.md) directory.\n\n| Example screenshots                                                                                                                                     | (small selection)                                                                                                                                             |                                                                                                                                                                 |\n|---------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| \u003ca href=\"https://github.com/thi-ng/umbrella/blob/develop/examples/boid-basics\"\u003e\u003cimg src=\"./assets/examples/boid-basics.png\" width=\"240\"/\u003e\u003c/a\u003e           | \u003ca href=\"https://github.com/thi-ng/umbrella/blob/develop/examples/imgui\"\u003e\u003cimg src=\"./assets/imgui/imgui-all.png\" width=\"240\"/\u003e\u003c/a\u003e                            | \u003ca href=\"https://github.com/thi-ng/umbrella/blob/develop/examples/shader-ast-raymarch\"\u003e\u003cimg src=\"./assets/shader-ast/shader-ast-raymarch.jpg\" width=\"240\"/\u003e\u003c/a\u003e |\n| \u003ca href=\"https://github.com/thi-ng/umbrella/blob/develop/examples/geom-terrain-viz\"\u003e\u003cimg src=\"./assets/examples/geom-terrain-viz.jpg\" width=\"240\"/\u003e\u003c/a\u003e | \u003ca href=\"https://github.com/thi-ng/umbrella/blob/develop/examples/poly-subdiv\"\u003e\u003cimg src=\"./assets/examples/poly-subdiv.jpg\" width=\"240\"/\u003e\u003c/a\u003e                 | \u003ca href=\"https://github.com/thi-ng/umbrella/blob/develop/examples/crypto-chart\"\u003e\u003cimg src=\"./assets/examples/crypto-chart.png\" width=\"240\"/\u003e\u003c/a\u003e                 |\n| \u003ca href=\"https://github.com/thi-ng/umbrella/blob/develop/examples/layout-gridgen\"\u003e\u003cimg src=\"./assets/examples/layout-gridgen.png\" width=\"240\"/\u003e\u003c/a\u003e     | \u003ca href=\"https://github.com/thi-ng/umbrella/blob/develop/examples/webgl-channel-mixer\"\u003e\u003cimg src=\"./assets/examples/webgl-channel-mixer.jpg\" width=\"240\"/\u003e\u003c/a\u003e | \u003ca href=\"https://github.com/thi-ng/umbrella/blob/develop/examples/geom-tessel\"\u003e\u003cimg src=\"./assets/geom/tessel.png\" width=\"240\"/\u003e\u003c/a\u003e                            |\n\n### awesome.thi.ng\n\nDue to other priorities still very much in its infancy \u0026 planning stage, but\nplease help to document your own usage of these packages by contributing project\ninformation to the [awesome.thi.ng](https://github.com/thi-ng/awesome.thi.ng)\nrepo, which will be used to build a showcase site... Thank you!\n\n### Generative art projects\n\nSeveral generative art projects by [Karsten Schmidt on\nfx(hash)](https://www.fxhash.xyz/u/toxi) were created exclusively with libraries\nfrom this collection.\n\n| De/Frag series                                                                                         |                                                                                                    |                                                                                                        |\n|--------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|\n| \u003ca href=\"https://www.fxhash.xyz/generative/981\"\u003e\u003cimg src=\"./assets/fxhash/defrag1-240.jpg\"/\u003e\u003c/a\u003e       | \u003ca href=\"https://www.fxhash.xyz/generative/3496\"\u003e\u003cimg src=\"./assets/fxhash/defrag2-240.jpg\"/\u003e\u003c/a\u003e  | \u003ca href=\"https://www.fxhash.xyz/generative/4304\"\u003e\u003cimg src=\"./assets/fxhash/defrag3-240.jpg\"/\u003e\u003c/a\u003e      |\n| Quasiflock                                                                                             | C-SCAPE                                                                                            | ASCII-SCAPE                                                                                            |\n| \u003ca href=\"https://www.fxhash.xyz/generative/6671\"\u003e\u003cimg src=\"./assets/fxhash/quasiflock-240.jpg\"/\u003e\u003c/a\u003e   | \u003ca href=\"https://www.fxhash.xyz/generative/13992\"\u003e\u003cimg src=\"./assets/fxhash/c-scape-240.jpg\"/\u003e\u003c/a\u003e | \u003ca href=\"https://www.fxhash.xyz/generative/16205\"\u003e\u003cimg src=\"./assets/fxhash/ascii-scape-240.jpg\"/\u003e\u003c/a\u003e |\n| Bubblemania                                                                                            | Danza (unreleased)                                                                                 | S-TRACE (unreleased)                                                                                   |\n| \u003ca href=\"https://www.fxhash.xyz/generative/26702\"\u003e\u003cimg src=\"./assets/fxhash/bubblemania-240.jpg\"/\u003e\u003c/a\u003e | \u003cimg src=\"./assets/fxhash/danza-240.jpg\"/\u003e                                                         | \u003cimg src=\"./assets/fxhash/s-trace-240.jpg\"/\u003e                                                           |\n\n## Community, contributing, getting help\n\n\u003e [!NOTE]\n\u003e My [Mastodon](https://mastodon.thi.ng/@toxi) account is the best place to\n\u003e learn about ongoing developments. This is a multi-purpose account, but you can\n\u003e view [#ThingUmbrella tagged\n\u003e posts](http://mastodon.thi.ng/@toxi/tagged/ThingUmbrella) only and/or\n\u003e [subscribe to those via RSS](http://mastodon.thi.ng/@toxi/tagged/ThingUmbrella.rss).\n\nJoin the [discussions here on\nGithub](https://github.com/thi-ng/umbrella/discussions), get in touch via\n[Mastodon](https://mastodon.thi.ng/@toxi) or use the [issue\ntracker](https://github.com/thi-ng/umbrella/issues). If you'd like to contribute\nin other ways, please first read [this document](./CONTRIBUTING.md).\n\nIn general, we welcome contributions of all kinds (docs, examples, bug fixes,\nfeature requests, [financial\ncontributions](https://github.com/sponsors/postspectacular/) etc.). You can find\na detailed overview for contributors here:\n[CONTRIBUTING.md](https://github.com/thi-ng/umbrella/blob/develop/CONTRIBUTING.md).\n\n**Note: The default branch for this repo is `develop` and all PRs should be\nbased on this branch. This too means, the README files on this branch _might_\nrefer to yet-unreleased features or packages. Please use the\n[main](https://github.com/thi-ng/umbrella/tree/main) branch for viewing the most\nrecently released version(s)!**.\n\n### Wiki\n\nTo date, the [wiki](https://github.com/thi-ng/umbrella/wiki) has only been\nupdated sporadically, but please be sure to check it out for project-wide\n[glossary](https://github.com/thi-ng/umbrella/wiki/Glossary), information,\ncookbooks, useful snippets etc.\n\n## Projects\n\n\u003c!--\n### New / unreleased packages in development\n\n(These packages might be still unreleased and only available on their\nfeature or `develop` branches)\n--\u003e\n\n### Latest updates\n\nAs of: 2025-05-10\n\n| Status                                        | Package                                               | Version                                                                                                                     | Changelog                                           |\n|:----------------------------------------------|:------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------|\n| ![](https://img.shields.io/badge/-feat-green) | [`@thi.ng/boids`](./packages/boids)                   | [![version](https://img.shields.io/npm/v/@thi.ng/boids.svg)](https://www.npmjs.com/package/@thi.ng/boids)                   | [changelog](./packages/boids/CHANGELOG.md)          |\n| ![](https://img.shields.io/badge/-feat-green) | [`@thi.ng/color-palettes`](./packages/color-palettes) | [![version](https://img.shields.io/npm/v/@thi.ng/color-palettes.svg)](https://www.npmjs.com/package/@thi.ng/color-palettes) | [changelog](./packages/color-palettes/CHANGELOG.md) |\n| ![](https://img.shields.io/badge/-feat-green) | [`@thi.ng/tensors`](./packages/tensors)               | [![version](https://img.shields.io/npm/v/@thi.ng/tensors.svg)](https://www.npmjs.com/package/@thi.ng/tensors)               | [changelog](./packages/tensors/CHANGELOG.md)        |\n\n### Algorithms \u0026 data structures\n\n| Project                                           | Version                                                                                                                 | Changelog                                         | Description                                    |\n|---------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------|------------------------------------------------|\n| [`@thi.ng/adjacency`](./packages/adjacency)       | [![version](https://img.shields.io/npm/v/@thi.ng/adjacency.svg)](https://www.npmjs.com/package/@thi.ng/adjacency)       | [changelog](./packages/adjacency/CHANGELOG.md)    | Adjacency matrices \u0026 graph algorithms          |\n| [`@thi.ng/arrays`](./packages/arrays)             | [![version](https://img.shields.io/npm/v/@thi.ng/arrays.svg)](https://www.npmjs.com/package/@thi.ng/arrays)             | [changelog](./packages/arrays/CHANGELOG.md)       | Array utilities                                |\n| [`@thi.ng/associative`](./packages/associative)   | [![version](https://img.shields.io/npm/v/@thi.ng/associative.svg)](https://www.npmjs.com/package/@thi.ng/associative)   | [changelog](./packages/associative/CHANGELOG.md)  | Alt Set \u0026 Map implementations                  |\n| [`@thi.ng/atom`](./packages/atom)                 | [![version](https://img.shields.io/npm/v/@thi.ng/atom.svg)](https://www.npmjs.com/package/@thi.ng/atom)                 | [changelog](./packages/atom/CHANGELOG.md)         | Immutable value wrappers, views, history       |\n| [`@thi.ng/bitfield`](./packages/bitfield)         | [![version](https://img.shields.io/npm/v/@thi.ng/bitfield.svg)](https://www.npmjs.com/package/@thi.ng/bitfield)         | [changelog](./packages/bitfield/CHANGELOG.md)     | 1D/2D bit field implementations                |\n| [`@thi.ng/bidir-index`](./packages/bidir-index)   | [![version](https://img.shields.io/npm/v/@thi.ng/bidir-index.svg)](https://www.npmjs.com/package/@thi.ng/bidir-index)   | [changelog](./packages/bidir-index/CHANGELOG.md)  | Bi-directional key-value map/index             |\n| [`@thi.ng/buffers`](./packages/buffers)           | [![version](https://img.shields.io/npm/v/@thi.ng/buffers.svg)](https://www.npmjs.com/package/@thi.ng/buffers)           | [changelog](./packages/buffers/CHANGELOG.md)      | Generic read/write buffers w/ diff. behaviors  |\n| [`@thi.ng/cache`](./packages/cache)               | [![version](https://img.shields.io/npm/v/@thi.ng/cache.svg)](https://www.npmjs.com/package/@thi.ng/cache)               | [changelog](./packages/cache/CHANGELOG.md)        | In-memory caches / strategies                  |\n| [`@thi.ng/cellular`](./packages/cellular)         | [![version](https://img.shields.io/npm/v/@thi.ng/cellular.svg)](https://www.npmjs.com/package/@thi.ng/cellular)         | [changelog](./packages/cellular/CHANGELOG.md)     | Highly configurable 1D Cellular automata       |\n| [`@thi.ng/dcons`](./packages/dcons)               | [![version](https://img.shields.io/npm/v/@thi.ng/dcons.svg)](https://www.npmjs.com/package/@thi.ng/dcons)               | [changelog](./packages/dcons/CHANGELOG.md)        | Doubly-linked list                             |\n| [`@thi.ng/diff`](./packages/diff)                 | [![version](https://img.shields.io/npm/v/@thi.ng/diff.svg)](https://www.npmjs.com/package/@thi.ng/diff)                 | [changelog](./packages/diff/CHANGELOG.md)         | Array \u0026 object diffing                         |\n| [`@thi.ng/disjoint-set`](./packages/disjoint-set) | [![version](https://img.shields.io/npm/v/@thi.ng/disjoint-set.svg)](https://www.npmjs.com/package/@thi.ng/disjoint-set) | [changelog](./packages/disjoint-set/CHANGELOG.md) | Disjoint Set data structure                    |\n| [`@thi.ng/dgraph`](./packages/dgraph)             | [![version](https://img.shields.io/npm/v/@thi.ng/dgraph.svg)](https://www.npmjs.com/package/@thi.ng/dgraph)             | [changelog](./packages/dgraph/CHANGELOG.md)       | Dependency graph                               |\n| [`@thi.ng/ecs`](./packages/ecs)                   | [![version](https://img.shields.io/npm/v/@thi.ng/ecs.svg)](https://www.npmjs.com/package/@thi.ng/ecs)                   | [changelog](./packages/ecs/CHANGELOG.md)          | Entity-Component System                        |\n| [`@thi.ng/gp`](./packages/gp)                     | [![version](https://img.shields.io/npm/v/@thi.ng/gp.svg)](https://www.npmjs.com/package/@thi.ng/gp)                     | [changelog](./packages/gp/CHANGELOG.md)           | Genetic programming helpers / AST gen          |\n| [`@thi.ng/heaps`](./packages/heaps)               | [![version](https://img.shields.io/npm/v/@thi.ng/heaps.svg)](https://www.npmjs.com/package/@thi.ng/heaps)               | [changelog](./packages/heaps/CHANGELOG.md)        | Binary \u0026 d-ary heap impls                      |\n| [`@thi.ng/idgen`](./packages/idgen)               | [![version](https://img.shields.io/npm/v/@thi.ng/idgen.svg)](https://www.npmjs.com/package/@thi.ng/idgen)               | [changelog](./packages/idgen/CHANGELOG.md)        | Versioned ID generation / free-list            |\n| [`@thi.ng/k-means`](./packages/k-means)           | [![version](https://img.shields.io/npm/v/@thi.ng/k-means.svg)](https://www.npmjs.com/package/@thi.ng/k-means)           | [changelog](./packages/k-means/CHANGELOG.md)      | K-means clustering of n-D data                 |\n| [`@thi.ng/leaky-bucket`](./packages/leaky-bucket) | [![version](https://img.shields.io/npm/v/@thi.ng/leaky-bucket.svg)](https://www.npmjs.com/package/@thi.ng/leaky-bucket) | [changelog](./packages/leaky-bucket/CHANGELOG.md) | Counter-based Leaky Bucket implementation      |\n| [`@thi.ng/ramp`](./packages/ramp)                 | [![version](https://img.shields.io/npm/v/@thi.ng/ramp.svg)](https://www.npmjs.com/package/@thi.ng/ramp)                 | [changelog](./packages/ramp/CHANGELOG.md)         | Parametric, interpolated lookup tables         |\n| [`@thi.ng/quad-edge`](./packages/quad-edge)       | [![version](https://img.shields.io/npm/v/@thi.ng/quad-edge.svg)](https://www.npmjs.com/package/@thi.ng/quad-edge)       | [changelog](./packages/quad-edge/CHANGELOG.md)    | Quad-edge, dual-graph data structure           |\n| [`@thi.ng/resolve-map`](./packages/resolve-map)   | [![version](https://img.shields.io/npm/v/@thi.ng/resolve-map.svg)](https://www.npmjs.com/package/@thi.ng/resolve-map)   | [changelog](./packages/resolve-map/CHANGELOG.md)  | DAG computations \u0026 value resolution            |\n| [`@thi.ng/sorted-map`](./packages/sorted-map)     | [![version](https://img.shields.io/npm/v/@thi.ng/sorted-map.svg)](https://www.npmjs.com/package/@thi.ng/sorted-map)     | [changelog](./packages/sorted-map/CHANGELOG.md)   | Sorted map \u0026 set datastructure                 |\n| [`@thi.ng/sparse-set`](./packages/sparse-set)     | [![version](https://img.shields.io/npm/v/@thi.ng/sparse-set.svg)](https://www.npmjs.com/package/@thi.ng/sparse-set)     | [changelog](./packages/sparse-set/CHANGELOG.md)   | Sparse set datastructure                       |\n| [`@thi.ng/tensors`](./packages/tensors)           | [![version](https://img.shields.io/npm/v/@thi.ng/tensors.svg)](https://www.npmjs.com/package/@thi.ng/tensors)           | [changelog](./packages/tensors/CHANGELOG.md)      | 1D-4D tensors, views \u0026 operations              |\n| [`@thi.ng/trie`](./packages/trie)                 | [![version](https://img.shields.io/npm/v/@thi.ng/trie.svg)](https://www.npmjs.com/package/@thi.ng/trie)                 | [changelog](./packages/trie/CHANGELOG.md)         | Trie-based map datastructure w/ prefix queries |\n| [`@thi.ng/vclock`](./packages/vclock)             | [![version](https://img.shields.io/npm/v/@thi.ng/vclock.svg)](https://www.npmjs.com/package/@thi.ng/vclock)             | [changelog](./packages/vclock/CHANGELOG.md)       | Vector clock functions / comparators           |\n| [`@thi.ng/zipper`](./packages/zipper)             | [![version](https://img.shields.io/npm/v/@thi.ng/zipper.svg)](https://www.npmjs.com/package/@thi.ng/zipper)             | [changelog](./packages/zipper/CHANGELOG.md)       | Immutable tree editing / navigation            |\n\n### DSLs\n\n| Project                                               | Version                                                                                                                     | Changelog                                           | Description                                   |\n|-------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|-----------------------------------------------|\n| [`@thi.ng/pointfree`](./packages/pointfree)           | [![version](https://img.shields.io/npm/v/@thi.ng/pointfree.svg)](https://www.npmjs.com/package/@thi.ng/pointfree)           | [changelog](./packages/pointfree/CHANGELOG.md)      | Stack-based DSL \u0026 functional composition      |\n| [`@thi.ng/pointfree-lang`](./packages/pointfree-lang) | [![version](https://img.shields.io/npm/v/@thi.ng/pointfree-lang.svg)](https://www.npmjs.com/package/@thi.ng/pointfree-lang) | [changelog](./packages/pointfree-lang/CHANGELOG.md) | Forth-like syntax layer for @thi.ng/pointfree |\n| [`@thi.ng/proctext`](./packages/proctext)             | [![version](https://img.shields.io/npm/v/@thi.ng/proctext.svg)](https://www.npmjs.com/package/@thi.ng/proctext)             | [changelog](./packages/proctext/CHANGELOG.md)       | Procedural text generation engine             |\n| [`@thi.ng/sexpr`](./packages/sexpr)                   | [![version](https://img.shields.io/npm/v/@thi.ng/sexpr.svg)](https://www.npmjs.com/package/@thi.ng/sexpr)                   | [changelog](./packages/sexpr/CHANGELOG.md)          | S-Expression parser \u0026 runtime infrastructure  |\n\n### File / file format / hardware support\n\n| Project                                                     | Version                                                                                                                           | Changelog                                              | Description                                     |\n|-------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------|-------------------------------------------------|\n| [`@thi.ng/axidraw`](./packages/axidraw)                     | [![version](https://img.shields.io/npm/v/@thi.ng/axidraw.svg)](https://www.npmjs.com/package/@thi.ng/axidraw)                     | [changelog](./packages/axidraw/CHANGELOG.md)           | Minimal, declarative AxiDraw plotter controller |\n| [`@thi.ng/bencode`](./packages/bencode)                     | [![version](https://img.shields.io/npm/v/@thi.ng/bencode.svg)](https://www.npmjs.com/package/@thi.ng/bencode)                     | [changelog](./packages/bencode/CHANGELOG.md)           | Bencode binary format encoding                  |\n| [`@thi.ng/csv`](./packages/csv)                             | [![version](https://img.shields.io/npm/v/@thi.ng/csv.svg)](https://www.npmjs.com/package/@thi.ng/csv)                             | [changelog](./packages/csv/CHANGELOG.md)               | Customizable CSV parser/object mapper           |\n| [`@thi.ng/dot`](./packages/dot)                             | [![version](https://img.shields.io/npm/v/@thi.ng/dot.svg)](https://www.npmjs.com/package/@thi.ng/dot)                             | [changelog](./packages/dot/CHANGELOG.md)               | Graphviz DOM \u0026 export                           |\n| [`@thi.ng/dsp-io-wav`](./packages/dsp-io-wav)               | [![version](https://img.shields.io/npm/v/@thi.ng/dsp-io-wav.svg)](https://www.npmjs.com/package/@thi.ng/dsp-io-wav)               | [changelog](./packages/dsp-io-wav/CHANGELOG.md)        | WAV file format exporter                        |\n| [`@thi.ng/egf`](./packages/egf)                             | [![version](https://img.shields.io/npm/v/@thi.ng/egf.svg)](https://www.npmjs.com/package/@thi.ng/egf)                             | [changelog](./packages/egf/CHANGELOG.md)               | Extensible Graph Format                         |\n| [`@thi.ng/file-io`](./packages/file-io)                     | [![version](https://img.shields.io/npm/v/@thi.ng/file-io.svg)](https://www.npmjs.com/package/@thi.ng/file-io)                     | [changelog](./packages/file-io/CHANGELOG.md)           | Assorted file I/O utils for NodeJS              |\n| [`@thi.ng/geom-io-obj`](./packages/geom-io-obj)             | [![version](https://img.shields.io/npm/v/@thi.ng/geom-io-obj.svg)](https://www.npmjs.com/package/@thi.ng/geom-io-obj)             | [changelog](./packages/geom-io-obj/CHANGELOG.md)       | Wavefront OBJ model parser                      |\n| [`@thi.ng/hiccup-css`](./packages/hiccup-css)               | [![version](https://img.shields.io/npm/v/@thi.ng/hiccup-css.svg)](https://www.npmjs.com/package/@thi.ng/hiccup-css)               | [changelog](./packages/hiccup-css/CHANGELOG.md)        | CSS from nested JS data structures              |\n| [`@thi.ng/hiccup-html`](./packages/hiccup-html)             | [![version](https://img.shields.io/npm/v/@thi.ng/hiccup-html.svg)](https://www.npmjs.com/package/@thi.ng/hiccup-html)             | [changelog](./packages/hiccup-html/CHANGELOG.md)       | Type-checked HTML5 element wrappers for hiccup  |\n| [`@thi.ng/hiccup-html-parse`](./packages/hiccup-html-parse) | [![version](https://img.shields.io/npm/v/@thi.ng/hiccup-html-parse.svg)](https://www.npmjs.com/package/@thi.ng/hiccup-html-parse) | [changelog](./packages/hiccup-html-parse/CHANGELOG.md) | HTML parsing \u0026 transformation to hiccup format  |\n| [`@thi.ng/hiccup-markdown`](./packages/hiccup-markdown)     | [![version](https://img.shields.io/npm/v/@thi.ng/hiccup-markdown.svg)](https://www.npmjs.com/package/@thi.ng/hiccup-markdown)     | [changelog](./packages/hiccup-markdown/CHANGELOG.md)   | Hiccup-to-Markdown serialization                |\n| [`@thi.ng/hiccup-svg`](./packages/hiccup-svg)               | [![version](https://img.shields.io/npm/v/@thi.ng/hiccup-svg.svg)](https://www.npmjs.com/package/@thi.ng/hiccup-svg)               | [changelog](./packages/hiccup-svg/CHANGELOG.md)        | hiccup based SVG vocab                          |\n| [`@thi.ng/iges`](./packages/iges)                           | [![version](https://img.shields.io/npm/v/@thi.ng/iges.svg)](https://www.npmjs.com/package/@thi.ng/iges)                           | [changelog](./packages/iges/CHANGELOG.md)              | IGES format geometry serialization              |\n| [`@thi.ng/markdown-table`](./packages/markdown-table)       | [![version](https://img.shields.io/npm/v/@thi.ng/markdown-table.svg)](https://www.npmjs.com/package/@thi.ng/markdown-table)       | [changelog](./packages/markdown-table/CHANGELOG.md)    | Markdown table generator / formatter            |\n| [`@thi.ng/mime`](./packages/mime)                           | [![version](https://img.shields.io/npm/v/@thi.ng/mime.svg)](https://www.npmjs.com/package/@thi.ng/mime)                           | [changelog](./packages/mime/CHANGELOG.md)              | File extension to MIME type mappings            |\n| [`@thi.ng/msgpack`](./packages/msgpack)                     | [![version](https://img.shields.io/npm/v/@thi.ng/msgpack.svg)](https://www.npmjs.com/package/@thi.ng/msgpack)                     | [changelog](./packages/msgpack/CHANGELOG.md)           | Msgpack serialization/deserialization           |\n| [`@thi.ng/pixel-io-geotiff`](./packages/pixel-io-geotiff)   | [![version](https://img.shields.io/npm/v/@thi.ng/pixel-io-geotiff.svg)](https://www.npmjs.com/package/@thi.ng/pixel-io-geotiff)   | [changelog](./packages/pixel-io-geotiff/CHANGELOG.md)  | GeoTIFF reader support for thi.ng/pixel         |\n| [`@thi.ng/pixel-io-netpbm`](./packages/pixel-io-netpbm)     | [![version](https://img.shields.io/npm/v/@thi.ng/pixel-io-netpbm.svg)](https://www.npmjs.com/package/@thi.ng/pixel-io-netpbm)     | [changelog](./packages/pixel-io-netpbm/CHANGELOG.md)   | 1/8/16/24bit NetPBM image format reader/writer  |\n| [`@thi.ng/pixel-io-pfm`](./packages/pixel-io-pfm)           | [![version](https://img.shields.io/npm/v/@thi.ng/pixel-io-pfm.svg)](https://www.npmjs.com/package/@thi.ng/pixel-io-pfm)           | [changelog](./packages/pixel-io-pfm/CHANGELOG.md)      | Portable FloatMap image format reader/writer    |\n| [`@thi.ng/prefixes`](./packages/prefixes)                   | [![version](https://img.shields.io/npm/v/@thi.ng/prefixes.svg)](https://www.npmjs.com/package/@thi.ng/prefixes)                   | [changelog](./packages/prefixes/CHANGELOG.md)          | Linked Data, RDF \u0026 xmlns prefixes/URLs          |\n| [`@thi.ng/sax`](./packages/sax)                             | [![version](https://img.shields.io/npm/v/@thi.ng/sax.svg)](https://www.npmjs.com/package/@thi.ng/sax)                             | [changelog](./packages/sax/CHANGELOG.md)               | SAX-like XML parser / transducer                |\n| [`@thi.ng/tangle`](./packages/tangle)                       | [![version](https://img.shields.io/npm/v/@thi.ng/tangle.svg)](https://www.npmjs.com/package/@thi.ng/tangle)                       | [changelog](./packages/tangle/CHANGELOG.md)            | Literate programming utilities                  |\n\n### Frontend / UI\n\n| Project                                                         | Version                                                                                                                               | Changelog                                                | Description                                      |\n|-----------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------|--------------------------------------------------|\n| [`@thi.ng/blurhash`](./packages/blurhash)                       | [![version](https://img.shields.io/npm/v/@thi.ng/blurhash.svg)](https://www.npmjs.com/package/@thi.ng/blurhash)                       | [changelog](./packages/blurhash/CHANGELOG.md)            | Fast image blurhash encoder/decoder              |\n| [`@thi.ng/canvas`](./packages/canvas)                           | [![version](https://img.shields.io/npm/v/@thi.ng/canvas.svg)](https://www.npmjs.com/package/@thi.ng/canvas)                           | [changelog](./packages/canvas/CHANGELOG.md)              | Canvas creation \u0026 HDPI support helpers           |\n| [`@thi.ng/dl-asset`](./packages/dl-asset)                       | [![version](https://img.shields.io/npm/v/@thi.ng/dl-asset.svg)](https://www.npmjs.com/package/@thi.ng/dl-asset)                       | [changelog](./packages/dl-asset/CHANGELOG.md)            | Asset/canvas/file download helpers               |\n| [`@thi.ng/emoji`](./packages/emoji)                             | [![version](https://img.shields.io/npm/v/@thi.ng/emoji.svg)](https://www.npmjs.com/package/@thi.ng/emoji)                             | [changelog](./packages/emoji/CHANGELOG.md)               | Bi-directional emoji lookup tables (names/chars) |\n| [`@thi.ng/hdiff`](./packages/hdiff)                             | [![version](https://img.shields.io/npm/v/@thi.ng/hdiff.svg)](https://www.npmjs.com/package/@thi.ng/hdiff)                             | [changelog](./packages/hdiff/CHANGELOG.md)               | String diffing w/ hiccup output (includes CLI)   |\n| [`@thi.ng/hdom`](./packages/hdom)                               | [![version](https://img.shields.io/npm/v/@thi.ng/hdom.svg)](https://www.npmjs.com/package/@thi.ng/hdom)                               | [changelog](./packages/hdom/CHANGELOG.md)                | Hiccup based VDOM \u0026 diffing                      |\n| [`@thi.ng/hdom-canvas`](./packages/hdom-canvas)                 | [![version](https://img.shields.io/npm/v/@thi.ng/hdom-canvas.svg)](https://www.npmjs.com/package/@thi.ng/hdom-canvas)                 | [changelog](./packages/hdom-canvas/CHANGELOG.md)         | hdom adapter for hiccup-canvas                   |\n| [`@thi.ng/hdom-components`](./packages/hdom-components)         | [![version](https://img.shields.io/npm/v/@thi.ng/hdom-components.svg)](https://www.npmjs.com/package/@thi.ng/hdom-components)         | [changelog](./packages/hdom-components/CHANGELOG.md)     | hdom based UI components                         |\n| [`@thi.ng/hdom-mock`](./packages/hdom-mock)                     | [![version](https://img.shields.io/npm/v/@thi.ng/hdom-mock.svg)](https://www.npmjs.com/package/@thi.ng/hdom-mock)                     | [changelog](./packages/hdom-mock/CHANGELOG.md)           | hdom mock implementation (testing / prototyping) |\n| [`@thi.ng/hiccup`](./packages/hiccup)                           | [![version](https://img.shields.io/npm/v/@thi.ng/hiccup.svg)](https://www.npmjs.com/package/@thi.ng/hiccup)                           | [changelog](./packages/hiccup/CHANGELOG.md)              | S-expression based HTML/XML serialization        |\n| [`@thi.ng/hiccup-canvas`](./packages/hiccup-canvas)             | [![version](https://img.shields.io/npm/v/@thi.ng/hiccup-canvas.svg)](https://www.npmjs.com/package/@thi.ng/hiccup-canvas)             | [changelog](./packages/hiccup-canvas/CHANGELOG.md)       | hiccup interpreter for canvas api                |\n| [`@thi.ng/hiccup-carbon-icons`](./packages/hiccup-carbon-icons) | [![version](https://img.shields.io/npm/v/@thi.ng/hiccup-carbon-icons.svg)](https://www.npmjs.com/package/@thi.ng/hiccup-carbon-icons) | [changelog](./packages/hiccup-carbon-icons/CHANGELOG.md) | IBM Carbon icons in hiccup format                |\n| [`@thi.ng/imgui`](./packages/imgui)                             | [![version](https://img.shields.io/npm/v/@thi.ng/imgui.svg)](https://www.npmjs.com/package/@thi.ng/imgui)                             | [changelog](./packages/imgui/CHANGELOG.md)               | Immediate mode GUI                               |\n| [`@thi.ng/interceptors`](./packages/interceptors)               | [![version](https://img.shields.io/npm/v/@thi.ng/interceptors.svg)](https://www.npmjs.com/package/@thi.ng/interceptors)               | [changelog](./packages/interceptors/CHANGELOG.md)        | Composable event handlers \u0026 processor            |\n| [`@thi.ng/meta-css`](./packages/meta-css)                       | [![version](https://img.shields.io/npm/v/@thi.ng/meta-css.svg)](https://www.npmjs.com/package/@thi.ng/meta-css)                       | [changelog](./packages/meta-css/CHANGELOG.md)            | CSS framework codegen, transpiler, bundler       |\n| [`@thi.ng/rdom`](./packages/rdom)                               | [![version](https://img.shields.io/npm/v/@thi.ng/rdom.svg)](https://www.npmjs.com/package/@thi.ng/rdom)                               | [changelog](./packages/rdom/CHANGELOG.md)                | Reactive, diff-less, async UI components         |\n| [`@thi.ng/rdom-canvas`](./packages/rdom-canvas)                 | [![version](https://img.shields.io/npm/v/@thi.ng/rdom-canvas.svg)](https://www.npmjs.com/package/@thi.ng/rdom-canvas)                 | [changelog](./packages/rdom-canvas/CHANGELOG.md)         | rdom component wrapper for thi.ng/hiccup-canvas  |\n| [`@thi.ng/rdom-components`](./packages/rdom-components)         | [![version](https://img.shields.io/npm/v/@thi.ng/rdom-components.svg)](https://www.npmjs.com/package/@thi.ng/rdom-components)         | [changelog](./packages/rdom-components/CHANGELOG.md)     | Unstyled, customizable component collection      |\n| [`@thi.ng/rdom-forms`](./packages/rdom-forms)                   | [![version](https://img.shields.io/npm/v/@thi.ng/rdom-forms.svg)](https://www.npmjs.com/package/@thi.ng/rdom-forms)                   | [changelog](./packages/rdom-forms/CHANGELOG.md)          | Datadriven HTML form generation                  |\n| [`@thi.ng/router`](./packages/router)                           | [![version](https://img.shields.io/npm/v/@thi.ng/router.svg)](https://www.npmjs.com/package/@thi.ng/router)                           | [changelog](./packages/router/CHANGELOG.md)              | Customizable browser \u0026 non-browser router        |\n| [`@thi.ng/text-canvas`](./packages/text-canvas)                 | [![version](https://img.shields.io/npm/v/@thi.ng/text-canvas.svg)](https://www.npmjs.com/package/@thi.ng/text-canvas)                 | [changelog](./packages/text-canvas/CHANGELOG.md)         | Text-mode canvas, drawing, tables, charts        |\n| [`@thi.ng/text-format`](./packages/text-format)                 | [![version](https://img.shields.io/npm/v/@thi.ng/text-format.svg)](https://www.npmjs.com/package/@thi.ng/text-format)                 | [changelog](./packages/text-format/CHANGELOG.md)         | Color text formatting w/ ANSI \u0026 HTML presets     |\n\n### Fundamentals\n\n| Project                                           | Version                                                                                                                 | Changelog                                         | Description                                              |\n|---------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------|----------------------------------------------------------|\n| [`@thi.ng/args`](./packages/args)                 | [![version](https://img.shields.io/npm/v/@thi.ng/args.svg)](https://www.npmjs.com/package/@thi.ng/args)                 | [changelog](./packages/args/CHANGELOG.md)         | Declarative \u0026 functional CLI arg parsing \u0026 coercions     |\n| [`@thi.ng/api`](./packages/api)                   | [![version](https://img.shields.io/npm/v/@thi.ng/api.svg)](https://www.npmjs.com/package/@thi.ng/api)                   | [changelog](./packages/api/CHANGELOG.md)          | Common types, decorators, mixins                         |\n| [`@thi.ng/bench`](./packages/bench)               | [![version](https://img.shields.io/npm/v/@thi.ng/bench.svg)](https://www.npmjs.com/package/@thi.ng/bench)               | [changelog](./packages/bench/CHANGELOG.md)        | Basic benchmarking helpers                               |\n| [`@thi.ng/checks`](./packages/checks)             | [![version](https://img.shields.io/npm/v/@thi.ng/checks.svg)](https://www.npmjs.com/package/@thi.ng/checks)             | [changelog](./packages/checks/CHANGELOG.md)       | Type \u0026 value checks                                      |\n| [`@thi.ng/compare`](./packages/compare)           | [![version](https://img.shields.io/npm/v/@thi.ng/compare.svg)](https://www.npmjs.com/package/@thi.ng/compare)           | [changelog](./packages/compare/CHANGELOG.md)      | Comparators                                              |\n| [`@thi.ng/compose`](./packages/compose)           | [![version](https://img.shields.io/npm/v/@thi.ng/compose.svg)](https://www.npmjs.com/package/@thi.ng/compose)           | [changelog](./packages/compose/CHANGELOG.md)      | Functional composition helpers                           |\n| [`@thi.ng/date`](./packages/date)                 | [![version](https://img.shields.io/npm/v/@thi.ng/date.svg)](https://www.npmjs.com/package/@thi.ng/date)                 | [changelog](./packages/date/CHANGELOG.md)         | Date/time iterators, formatters, rounding                |\n| [`@thi.ng/defmulti`](./packages/defmulti)         | [![version](https://img.shields.io/npm/v/@thi.ng/defmulti.svg)](https://www.npmjs.com/package/@thi.ng/defmulti)         | [changelog](./packages/defmulti/CHANGELOG.md)     | Dynamic multiple dispatch                                |\n| [`@thi.ng/distance`](./packages/distance)         | [![version](https://img.shields.io/npm/v/@thi.ng/distance.svg)](https://www.npmjs.com/package/@thi.ng/distance)         | [changelog](./packages/distance/CHANGELOG.md)     | n-D distance metrics \u0026 K-nearest neighborhoods           |\n| [`@thi.ng/equiv`](./packages/equiv)               | [![version](https://img.shields.io/npm/v/@thi.ng/equiv.svg)](https://www.npmjs.com/package/@thi.ng/equiv)               | [changelog](./packages/equiv/CHANGELOG.md)        | Deep value equivalence checking                          |\n| [`@thi.ng/errors`](./packages/errors)             | [![version](https://img.shields.io/npm/v/@thi.ng/errors.svg)](https://www.npmjs.com/package/@thi.ng/errors)             | [changelog](./packages/errors/CHANGELOG.md)       | Custom error types                                       |\n| [`@thi.ng/expose`](./packages/expose)             | [![version](https://img.shields.io/npm/v/@thi.ng/expose.svg)](https://www.npmjs.com/package/@thi.ng/expose)             | [changelog](./packages/expose/CHANGELOG.md)       | Conditional global variable exposition                   |\n| [`@thi.ng/fibers`](./packages/fibers)             | [![version](https://img.shields.io/npm/v/@thi.ng/fibers.svg)](https://www.npmjs.com/package/@thi.ng/fibers)             | [changelog](./packages/fibers/CHANGELOG.md)       | Process hierarchies \u0026 ops for cooperative multitasking   |\n| [`@thi.ng/hex`](./packages/hex)                   | [![version](https://img.shields.io/npm/v/@thi.ng/hex.svg)](https://www.npmjs.com/package/@thi.ng/hex)                   | [changelog](./packages/hex/CHANGELOG.md)          | Hex value formatters for U4-64 words                     |\n| [`@thi.ng/logger`](./packages/logger)             | [![version](https://img.shields.io/npm/v/@thi.ng/logger.svg)](https://www.npmjs.com/package/@thi.ng/logger)             | [changelog](./packages/logger/CHANGELOG.md)       | Basis infrastructure for arbitrary logging               |\n| [`@thi.ng/memoize`](./packages/memoize)           | [![version](https://img.shields.io/npm/v/@thi.ng/memoize.svg)](https://www.npmjs.com/package/@thi.ng/memoize)           | [changelog](./packages/memoize/CHANGELOG.md)      | Function memoization w/ customizable caching             |\n| [`@thi.ng/object-utils`](./packages/object-utils) | [![version](https://img.shields.io/npm/v/@thi.ng/object-utils.svg)](https://www.npmjs.com/package/@thi.ng/object-utils) | [changelog](./packages/object-utils/CHANGELOG.md) | Plain JS object \u0026 map manipulation                       |\n| [`@thi.ng/oquery`](./packages/oquery)             | [![version](https://img.shields.io/npm/v/@thi.ng/oquery.svg)](https://www.npmjs.com/package/@thi.ng/oquery)             | [changelog](./packages/oquery/CHANGELOG.md)       | Pattern based query engine for JS objects                |\n| [`@thi.ng/parse`](./packages/parse)               | [![version](https://img.shields.io/npm/v/@thi.ng/parse.svg)](https://www.npmjs.com/package/@thi.ng/parse)               | [changelog](./packages/parse/CHANGELOG.md)        | Parser combinators \u0026 AST generator/transformer           |\n| [`@thi.ng/paths`](./packages/paths)               | [![version](https://img.shields.io/npm/v/@thi.ng/paths.svg)](https://www.npmjs.com/package/@thi.ng/paths)               | [changelog](./packages/paths/CHANGELOG.md)        | Immutable nested object accessors                        |\n| [`@thi.ng/strings`](./packages/strings)           | [![version](https://img.shields.io/npm/v/@thi.ng/strings.svg)](https://www.npmjs.com/package/@thi.ng/strings)           | [changelog](./packages/strings/CHANGELOG.md)      | Higher-order string formatting utils                     |\n| [`@thi.ng/system`](./packages/system)             | [![version](https://img.shields.io/npm/v/@thi.ng/system.svg)](https://www.npmjs.com/package/@thi.ng/system)             | [changelog](./packages/system/CHANGELOG.md)       | Minimal life cycle container for stateful app components |\n| [`@thi.ng/timestamp`](./packages/timestamp)       | [![version](https://img.shields.io/npm/v/@thi.ng/timestamp.svg)](https://www.npmjs.com/package/@thi.ng/timestamp)       | [changelog](./packages/timestamp/CHANGELOG.md)    | Timestamp abstraction/wrapper                            |\n| [`@thi.ng/transclude`](./packages/transclude)     | [![version](https://img.shields.io/npm/v/@thi.ng/transclude.svg)](https://www.npmjs.com/package/@thi.ng/transclude)     | [changelog](./packages/transclude/CHANGELOG.md)   | Template engine for text document generation             |\n| [`@thi.ng/units`](./packages/units)               | [![version](https://img.shields.io/npm/v/@thi.ng/units.svg)](https://www.npmjs.com/package/@thi.ng/units)               | [changelog](./packages/units/CHANGELOG.md)        | Extensible SI unit conversions                           |\n\n### Geometry, image \u0026 visualization\n\n| Project                                                             | Version                                                                                                                                   | Changelog                                                  | Description                                         |\n|---------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------|-----------------------------------------------------|\n| [`@thi.ng/boids`](./packages/boids)                                 | [![version](https://img.shields.io/npm/v/@thi.ng/boids.svg)](https://www.npmjs.com/package/@thi.ng/boids)                                 | [changelog](./packages/boids/CHANGELOG.md)                 | Configurable n-dimensional boids simulation         |\n| [`@thi.ng/color`](./packages/color)                                 | [![version](https://img.shields.io/npm/v/@thi.ng/color.svg)](https://www.npmjs.com/package/@thi.ng/color)                                 | [changelog](./packages/color/CHANGELOG.md)                 | Color conversions, gradients                        |\n| [`@thi.ng/color-palettes`](./packages/color-palettes)               | [![version](https://img.shields.io/npm/v/@thi.ng/color-palettes.svg)](https://www.npmjs.com/package/@thi.ng/color-palettes)               | [changelog](./packages/color-palettes/CHANGELOG.md)        | Collection of image-based color palettes            |\n| [`@thi.ng/dgraph-dot`](./packages/dgraph-dot)                       | [![version](https://img.shields.io/npm/v/@thi.ng/dgraph-dot.svg)](https://www.npmjs.com/package/@thi.ng/dgraph-dot)                       | [changelog](./packages/dgraph-dot/CHANGELOG.md)            | Dependency graph -\u003e Graphviz                        |\n| [`@thi.ng/distance-transform`](./packages/distance-transform)       | [![version](https://img.shields.io/npm/v/@thi.ng/distance-transform.svg)](https://www.npmjs.com/package/@thi.ng/distance-transform)       | [changelog](./packages/distance-transform/CHANGELOG.md)    | Image based distance field generation               |\n| [`@thi.ng/fuzzy-viz`](./packages/fuzzy-viz)                         | [![version](https://img.shields.io/npm/v/@thi.ng/fuzzy-viz.svg)](https://www.npmjs.com/package/@thi.ng/fuzzy-viz)                         | [changelog](./packages/fuzzy-viz/CHANGELOG.md)             | Visualization, instrumentation for @thi.ng/fuzzy    |\n| [`@thi.ng/geom`](./packages/geom)                                   | [![version](https://img.shields.io/npm/v/@thi.ng/geom.svg)](https://www.npmjs.com/package/@thi.ng/geom)                                   | [changelog](./packages/geom/CHANGELOG.md)                  | 2D only geometry types \u0026 ops                        |\n| [`@thi.ng/geom-accel`](./packages/geom-accel)                       | [![version](https://img.shields.io/npm/v/@thi.ng/geom-accel.svg)](https://www.npmjs.com/package/@thi.ng/geom-accel)                       | [changelog](./packages/geom-accel/CHANGELOG.md)            | Spatial indexing data structures                    |\n| [`@thi.ng/geom-axidraw`](./packages/geom-axidraw)                   | [![version](https://img.shields.io/npm/v/@thi.ng/geom-axidraw.svg)](https://www.npmjs.com/package/@thi.ng/geom-axidraw)                   | [changelog](./packages/geom-axidraw/CHANGELOG.md)          | Shape conversions for AxiDraw pen plotter           |\n| [`@thi.ng/geom-arc`](./packages/geom-arc)                           | [![version](https://img.shields.io/npm/v/@thi.ng/geom-arc.svg)](https://www.npmjs.com/package/@thi.ng/geom-arc)                           | [changelog](./packages/geom-arc/CHANGELOG.md)              | 2D elliptic arc utils                               |\n| [`@thi.ng/geom-clip-line`](./packages/geom-clip-line)               | [![version](https://img.shields.io/npm/v/@thi.ng/geom-clip-line.svg)](https://www.npmjs.com/package/@thi.ng/geom-clip-line)               | [changelog](./packages/geom-clip-line/CHANGELOG.md)        | 2D line clipping                                    |\n| [`@thi.ng/geom-clip-poly`](./packages/geom-clip-poly)               | [![version](https://img.shields.io/npm/v/@thi.ng/geom-clip-poly.svg)](https://www.npmjs.com/package/@thi.ng/geom-clip-poly)               | [changelog](./packages/geom-clip-poly/CHANGELOG.md)        | 2D convex polygon clipping                          |\n| [`@thi.ng/geom-closest-point`](./packages/geom-closest-point)       | [![version](https://img.shields.io/npm/v/@thi.ng/geom-closest-point.svg)](https://www.npmjs.com/package/@thi.ng/geom-closest-point)       | [changelog](./packages/geom-closest-point/CHANGELOG.md)    | Closest point helpers                               |\n| [`@thi.ng/geom-fuzz`](./packages/geom-fuzz)                         | [![version](https://img.shields.io/npm/v/@thi.ng/geom-fuzz.svg)](https://www.npmjs.com/package/@thi.ng/geom-fuzz)                         | [changelog](./packages/geom-fuzz/CHANGELOG.md)             | Fuzzy 2D shape drawing / filling                    |\n| [`@thi.ng/geom-hull`](./packages/geom-hull)                         | [![version](https://img.shields.io/npm/v/@thi.ng/geom-hull.svg)](https://www.npmjs.com/package/@thi.ng/geom-hull)                         | [changelog](./packages/geom-hull/CHANGELOG.md)             | 2D convex hull (Graham scan)                        |\n| [`@thi.ng/geom-isec`](./packages/geom-isec)                         | [![version](https://img.shields.io/npm/v/@thi.ng/geom-isec.svg)](https://www.npmjs.com/package/@thi.ng/geom-isec)                         | [changelog](./packages/geom-isec/CHANGELOG.md)             | Point \u0026 shape intersection tests                    |\n| [`@thi.ng/geom-isoline`](./packages/geom-isoline)                   | [![version](https://img.shields.io/npm/v/@thi.ng/geom-isoline.svg)](https://www.npmjs.com/package/@thi.ng/geom-isoline)                   | [changelog](./packages/geom-isoline/CHANGELOG.md)          | 2D contour line extraction                          |\n| [`@thi.ng/geom-poly-utils`](./packages/geom-poly-utils)             | [![version](https://img.shields.io/npm/v/@thi.ng/geom-poly-utils.svg)](https://www.npmjs.com/package/@thi.ng/geom-poly-utils)             | [changelog](./packages/geom-poly-utils/CHANGELOG.md)       | 2D polygon helpers                                  |\n| [`@thi.ng/geom-resample`](./packages/geom-resample)                 | [![version](https://img.shields.io/npm/v/@thi.ng/geom-resample.svg)](https://www.npmjs.com/package/@thi.ng/geom-resample)                 | [changelog](./packages/geom-resample/CHANGELOG.md)         | nD polyline / curve resampling                      |\n| [`@thi.ng/geom-sdf`](./packages/geom-sdf)                           | [![version](https://img.shields.io/npm/v/@thi.ng/geom-sdf.svg)](https://www.npmjs.com/package/@thi.ng/geom-sdf)                           | [changelog](./packages/geom-sdf/CHANGELOG.md)              | 2D SDF creation, conversions, operators, utilities  |\n| [`@thi.ng/geom-splines`](./packages/geom-splines)                   | [![version](https://img.shields.io/npm/v/@thi.ng/geom-splines.svg)](https://www.npmjs.com/package/@thi.ng/geom-splines)                   | [changelog](./packages/geom-splines/CHANGELOG.md)          | nD cubic / quadratic spline ops                     |\n| [`@thi.ng/geom-subdiv-curve`](./packages/geom-subdiv-curve)         | [![version](https://img.shields.io/npm/v/@thi.ng/geom-subdiv-curve.svg)](https://www.npmjs.com/package/@thi.ng/geom-subdiv-curve)         | [changelog](./packages/geom-subdiv-curve/CHANGELOG.md)     | nD iterative subdivision curves                     |\n| [`@thi.ng/geom-tessellate`](./packages/geom-tessellate)             | [![version](https://img.shields.io/npm/v/@thi.ng/geom-tessellate.svg)](https://www.npmjs.com/package/@thi.ng/geom-tessellate)             | [changelog](./packages/geom-tessellate/CHANGELOG.md)       | nD convex polygon tessellators                      |\n| [`@thi.ng/geom-trace-bitmap`](./packages/geom-trace-bitmap)         | [![version](https://img.shields.io/npm/v/@thi.ng/geom-trace-bitmap.svg)](https://www.npmjs.com/package/@thi.ng/geom-trace-bitmap)         | [changelog](./packages/geom-trace-bitmap/CHANGELOG.md)     | bitmap image to vector conversion                   |\n| [`@thi.ng/geom-voronoi`](./packages/geom-voronoi)                   | [![version](https://img.shields.io/npm/v/@thi.ng/geom-voronoi.svg)](https://www.npmjs.com/package/@thi.ng/geom-voronoi)                   | [changelog](./packages/geom-voronoi/CHANGELOG.md)          | 2D iterative delaunay/voronoi                       |\n| [`@thi.ng/geom-webgl`](./packages/geom-webgl)                       | [![version](https://img.shields.io/npm/v/@thi.ng/geom-webgl.svg)](https://www.npmjs.com/package/@thi.ng/geom-webgl)                       | [changelog](./packages/geom-webgl/CHANGELOG.md)            | thi.ng/geom / WebGL shape conversion \u0026 interop      |\n| [`@thi.ng/imago`](./packages/imago)                                 | [![version](https://img.shields.io/npm/v/@thi.ng/imago.svg)](https://www.npmjs.com/package/@thi.ng/imago)                                 | [changelog](./packages/imago/CHANGELOG.md)                 | Declarative \u0026 extensible image processing pipelines |\n| [`@thi.ng/lsys`](./packages/lsys)                                   | [![version](https://img.shields.io/npm/v/@thi.ng/lsys.svg)](https://www.npmjs.com/package/@thi.ng/lsys)                                   | [changelog](./packages/lsys/CHANGELOG.md)                  | Extensible L-System architecture                    |\n| [`@thi.ng/pixel`](./packages/pixel)                                 | [![version](https://img.shields.io/npm/v/@thi.ng/pixel.svg)](https://www.npmjs.com/package/@thi.ng/pixel)                                 | [changelog](./packages/pixel/CHANGELOG.md)                 | Multi-format pixel buffers                          |\n| [`@thi.ng/pixel-convolve`](./packages/pixel-convolve)               | [![version](https://img.shields.io/npm/v/@thi.ng/pixel-convolve.svg)](https://www.npmjs.com/package/@thi.ng/pixel-convolve)               | [changelog](./packages/pixel-convolve/CHANGELOG.md)        | Extensible image convolution \u0026 kernel presets       |\n| [`@thi.ng/pixel-dominant-colors`](./packages/pixel-dominant-colors) | [![version](https://img.shields.io/npm/v/@thi.ng/pixel-dominant-colors.svg)](https://www.npmjs.com/package/@thi.ng/pixel-dominant-colors) | [changelog](./packages/pixel-dominant-colors/CHANGELOG.md) | k-means based dominant colors extraction            |\n| [`@thi.ng/pixel-dither`](./packages/pixel-dither)                   | [![version](https://img.shields.io/npm/v/@thi.ng/pixel-dither.svg)](https://www.npmjs.com/package/@thi.ng/pixel-dither)                   | [changelog](./packages/pixel-dither/CHANGELOG.md)          | Image dithering w/ various algorithm presets        |\n| [`@thi.ng/poisson`](./packages/poisson)                             | [![version](https://img.shields.io/npm/v/@thi.ng/poisson.svg)](https://www.npmjs.com/package/@thi.ng/poisson)                             | [changelog](./packages/poisson/CHANGELOG.md)               | nD Poisson disk sampling                            |\n| [`@thi.ng/porter-duff`](./packages/porter-duff)                     | [![version](https://img.shields.io/npm/v/@thi.ng/porter-duff.svg)](https://www.npmjs.com/package/@thi.ng/porter-duff)                     | [changelog](./packages/porter-duff/CHANGELOG.md)           | Alpha blending / compositing ops                    |\n| [`@thi.ng/rasterize`](./packages/rasterize)                         | [![version](https://img.shields.io/npm/v/@thi.ng/rasterize.svg)](https://www.npmjs.com/package/@thi.ng/rasterize)                         | [changelog](./packages/rasterize/CHANGELOG.md)             | Shape drawing, filling \u0026 rasterization              |\n| [`@thi.ng/scenegraph`](./packages/scenegraph)                       | [![version](https://img.shields.io/npm/v/@thi.ng/scenegraph.svg)](https://www.npmjs.com/package/@thi.ng/scenegraph)                       | [changelog](./packages/scenegraph/CHANGELOG.md)            | Extensible 2D/3D scenegraph                         |\n| [`@thi.ng/simd`](./packages/simd)                                   | [![version](https://img.shields.io/npm/v/@thi.ng/simd.svg)](https://www.npmjs.com/package/@thi.ng/simd)                                   | [changelog](./packages/simd/CHANGELOG.md)                  | WebAssembly SIMD vector batch processing            |\n| [`@thi.ng/tsne`](./packages/tsne)                                   | [![version](https://img.shields.io/npm/v/@thi.ng/tsne.svg)](https://www.npmjs.com/package/@thi.ng/tsne)                                   | [changelog](./packages/tsne/CHANGELOG.md)                  | Configurable t-SNE visualization solver             |\n| [`@thi.ng/viz`](./packages/viz)                                     | [![version](https://img.shields.io/npm/v/@thi.ng/viz.svg)](https://www.npmjs.com/package/@thi.ng/viz)                                     | [changelog](./packages/viz/CHANGELOG.md)                   | Declarative \u0026 functional data visualization toolkit |\n\n### Iterator, stream \u0026 sequence processing\n\n| Project                                                       | Version                                                                                                                             | Changelog                                               | Description                             |\n|---------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------|-----------------------------------------|\n| [`@thi.ng/csp`](./packages/csp)                               | [![version](https://img.shields.io/npm/v/@thi.ng/csp.svg)](https://www.npmjs.com/package/@thi.ng/csp)                               | [changelog](./packages/csp/CHANGELOG.md)                | Channel based async ops                 |\n| [`@thi.ng/grid-iterators`](./packages/grid-iterators)         | [![version](https://img.shields.io/npm/v/@thi.ng/grid-iterators.svg)](https://www.npmjs.com/package/@thi.ng/grid-iterators)         | [changelog](./packages/grid-iterators/CHANGELOG.md)     | 2D grid iterator strategies             |\n| [`@thi.ng/seq`](./packages/seq)                               | [![version](https://img.shields.io/npm/v/@thi.ng/seq.svg)](https://www.npmjs.com/package/@thi.ng/seq)                               | [changelog](./packages/seq/CHANGELOG.md)                | Lisp/Clojure-style sequence abstraction |\n| [`@thi.ng/transducers`](./packages/transducers)               | [![version](https://img.shields.io/npm/v/@thi.ng/transducers.svg)](https://www.npmjs.com/package/@thi.ng/transducers)               | [changelog](./packages/transducers/CHANGELOG.md)        | Composable data transformations         |\n| [`@thi.ng/transducers-async`](./packages/transducers-async)   | [![version](https://img.shields.io/npm/v/@thi.ng/transducers-async.svg)](https://www.npmjs.com/package/@thi.ng/transducers-async)   | [changelog](./packages/transducers-async/CHANGELOG.md)  | Async transducers, reducers \u0026 iterators |\n| [`@thi.ng/transducers-binary`](./packages/transducers-binary) | [![version](https://img.shields.io/npm/v/@thi.ng/transducers-binary.svg)](https://www.npmjs.com/package/@thi.ng/transducers-binary) | [changelog](./packages/transducers-binary/CHANGELOG.md) | Binary data related transducers         |\n| [`@thi.ng/transducers-fsm`](./packages/transducers-fsm)       | [![version](https://img.shields.io/npm/v/@thi.ng/transducers-fsm.svg)](https://www.npmjs.com/package/@thi.ng/transducers-fsm)       | [changelog](./packages/transducers-fsm/CHANGELOG.md)    | Finite state transducer                 |\n| [`@thi.ng/transducers-hdom`](./packages/transducers-hdom)     | [![version](https://img.shields.io/npm/v/@thi.ng/transducers-hdom.svg)](https://www.npmjs.com/package/@thi.ng/transducers-hdom)     | [changelog](./packages/transducers-hdom/CHANGELOG.md)   | Transducer based hdom UI updates        |\n| [`@thi.ng/transducers-patch`](./packages/transducers-patch)   | [![version](https://img.shields.io/npm/v/@thi.ng/transducers-patch.svg)](https://www.npmjs.com/package/@thi.ng/transducers-patch)   | [changelog](./packages/transducers-patch/CHANGELOG.md)  | Patch-based, array \u0026 object editing     |\n| [`@thi.ng/transducers-stats`](./packages/transducers-stats)   | [![version](https://img.shields.io/npm/v/@thi.ng/transducers-stats.svg)](https://www.npmjs.com/package/@thi.ng/transducers-stats)   | [changelog](./packages/transducers-stats/CHANGELOG.md)  | Technical / statistical analysis        |\n\n### Low-level, binary, memory management, interop\n\n| Project                                                     | Version                                                                                                                           | Changelog                                              | Description                                     |\n|-------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------|-------------------------------------------------|\n| [`@thi.ng/base-n`](./packages/base-n)                       | [![version](https://img.shields.io/npm/v/@thi.ng/base-n.svg)](https://www.npmjs.com/package/@thi.ng/base-n)                       | [changelog](./packages/base-n/CHANGELOG.md)            | Arbitrary base-n encoding/decoding with presets |\n| [`@thi.ng/binary`](./packages/binary)                       | [![version](https://img.shields.io/npm/v/@thi.ng/binary.svg)](https://www.npmjs.com/package/@thi.ng/binary)                       | [changelog](./packages/binary/CHANGELOG.md)            | Assorted binary / bitwise ops, utilities        |\n| [`@thi.ng/bitstream`](./packages/bitstream)                 | [![version](https://img.shields.io/npm/v/@thi.ng/bitstream.svg)](https://www.npmjs.com/package/@thi.ng/bitstream)                 | [changelog](./packages/bitstream/CHANGELOG.md)         | Bitwise input / output streams                  |\n| [`@thi.ng/block-fs`](./packages/block-fs)                   | [![version](https://img.shields.io/npm/v/@thi.ng/block-fs.svg)](https://www.npmjs.com/package/@thi.ng/block-fs)                   | [changelog](./packages/block-fs/CHANGELOG.md)          | Block-based storage \u0026 filesystem                |\n| [`@thi.ng/dlogic`](./packages/dlogic)                       | [![version](https://img.shields.io/npm/v/@thi.ng/dlogic.svg)](https://www.npmjs.com/package/@thi.ng/dlogic)                       | [changelog](./packages/dlogic/CHANGELOG.md)            | Digital logic ops / constructs                  |\n| [`@thi.ng/leb128`](./packages/leb128)                       | [![version](https://img.shields.io/npm/v/@thi.ng/leb128.svg)](https://www.npmjs.com/package/@thi.ng/leb128)                       | [changelog](./packages/leb128/CHANGELOG.md)            | WASM based LEB128 varint encoder / decoder      |\n| [`@thi.ng/malloc`](./packages/malloc)                       | [![version](https://img.shields.io/npm/v/@thi.ng/malloc.svg)](https://www.npmjs.com/package/@thi.ng/malloc)                       | [changelog](./packages/malloc/CHANGELOG.md)            | Raw \u0026 typed array memory pool \u0026 allocator       |\n| [`@thi.ng/morton`](./packages/morton)                       | [![version](https://img.shields.io/npm/v/@thi.ng/morton.svg)](https://www.npmjs.com/package/@thi.ng/morton)                       | [changelog](./packages/morton/CHANGELOG.md)            | Z-order-curve / Morton coding                   |\n| [`@thi.ng/range-coder`](./packages/range-coder)             | [![version](https://img.shields.io/npm/v/@thi.ng/range-coder.svg)](https://www.npmjs.com/package/@thi.ng/range-coder)             | [changelog](./packages/range-coder/CHANGELOG.md)       | Binary data Range encoder / decoder             |\n| [`@thi.ng/rle-pack`](./packages/rle-pack)                   | [![version](https://img.shields.io/npm/v/@thi.ng/rle-pack.svg)](https://www.npmjs.com/package/@thi.ng/rle-pack)                   | [changelog](./packages/rle-pack/CHANGELOG.md)          | Run-length encoding data compression            |\n| [`@thi.ng/soa`](./packages/soa)                             | [![version](https://img.shields.io/npm/v/@thi.ng/soa.svg)](https://www.npmjs.com/package/@thi.ng/soa)                             | [changelog](./packages/soa/CHANGELOG.md)               | Memory mapped data structures \u0026 serialization   |\n| [`@thi.ng/unionstruct`](./packages/unionstruct)             | [![version](https://img.shields.io/npm/v/@thi.ng/unionstruct.svg)](https://www.npmjs.com/package/@thi.ng/unionstruct)             | [changelog](./packages/unionstruct/CHANGELOG.md)       | Wrapper for C-like structs / unions             |\n| [`@thi.ng/vector-pools`](./packages/vector-pools)           | [![version](https://img.shields.io/npm/v/@thi.ng/vector-pools.svg)](https://www.npmjs.com/package/@thi.ng/vector-pools)           | [changelog](./packages/vector-pools/CHANGELOG.md)      | Data structures for memory mapped vectors       |\n| [`@thi.ng/wasm-api`](./packages/wasm-api)                   | [![version](https://img.shields.io/npm/v/@thi.ng/wasm-api.svg)](https://www.npmjs.com/package/@thi.ng/wasm-api)                   | [changelog](./packages/wasm-api/CHANGELOG.md)          | Modular, extensible JS/WebAssembly bridge API   |\n| [`@thi.ng/wasm-api-bindgen`](./packages/wasm-api-bindgen)   | [![version](https://img.shields.io/npm/v/@thi.ng/wasm-api-bindgen.svg)](https://www.npmjs.com/package/@thi.ng/wasm-api-bindgen)   | [changelog](./packages/wasm-api-bindgen/CHANGELOG.md)  | Polyglot bindings code generator for C/Zig/TS   |\n| [`@thi.ng/wasm-api-canvas`](./packages/wasm-api-canvas)     | [![version](https://img.shields.io/npm/v/@thi.ng/wasm-api-canvas.svg)](https://www.npmjs.com/package/@thi.ng/wasm-api-canvas)     | [changelog](./packages/wasm-api-canvas/CHANGELOG.md)   | WASM-side Canvas2D API bindings                 |\n| [`@thi.ng/wasm-api-dom`](./packages/wasm-api-dom)           | [![version](https://img.shields.io/npm/v/@thi.ng/wasm-api-dom.svg)](https://www.npmjs.com/package/@thi.ng/wasm-api-dom)           | [changelog](./packages/wasm-api-dom/CHANGELOG.md)      | WASM-side DOM manipulation                      |\n| [`@thi.ng/wasm-api-schedule`](./packages/wasm-api-schedule) | [![version](https://img.shields.io/npm/v/@thi.ng/wasm-api-schedule.svg)](https://www.npmjs.com/package/@thi.ng/wasm-api-schedule) | [changelog](./packages/wasm-api-schedule/CHANGELOG.md) | WASM-side delayed code execution/scheduling     |\n\n### Maths\n\n| Project                                           | Version                                                                                                                 | Changelog                                         | Description                                                |\n|---------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------|------------------------------------------------------------|\n| [`@thi.ng/dual-algebra`](./packages/dual-algebra) | [![version](https://img.shields.io/npm/v/@thi.ng/dual-algebra.svg)](https://www.npmjs.com/package/@thi.ng/dual-algebra) | [changelog](./packages/dual-algebra/CHANGELOG.md) | Dual number algebra / automatic differentiation            |\n| [`@thi.ng/dsp`](./packages/dsp)                   | [![version](https://img.shields.io/npm/v/@thi.ng/dsp.svg)](https://www.npmjs.com/package/@thi.ng/dsp)                   | [changelog](./packages/dsp/CHANGELOG.md)          | DSP utils, composable signal gens/processors               |\n| [`@thi.ng/fuzzy`](./packages/fuzzy)               | [![version](https://img.shields.io/npm/v/@thi.ng/fuzzy.svg)](https://www.npmjs.com/package/@thi.ng/fuzzy)               | [changelog](./packages/fuzzy/CHANGELOG.md)        | Fuzzy logic primitives \u0026 rule inference engine             |\n| [`@thi.ng/intervals`](./packages/intervals)       | [![version](https://img.shields.io/npm/v/@thi.ng/intervals.svg)](https://www.npmjs.com/package/@thi.ng/intervals)       | [changelog](./packages/intervals/CHANGELOG.md)    | Open/closed intervals, queries, set ops                    |\n| [`@thi.ng/math`](./packages/math)                 | [![version](https://img.shields.io/npm/v/@thi.ng/math.svg)](https://www.npmjs.com/package/@thi.ng/math)                 | [changelog](./packages/math/CHANGELOG.md)         | Assorted common math functions \u0026 utilities                 |\n| [`@thi.ng/matrices`](./packages/matrices)         | [![version](https://img.shields.io/npm/v/@thi.ng/matrices.svg)](https://www.npmjs.com/package/@thi.ng/matrices)         | [changelog](./packages/matrices/CHANGELOG.md)     | Matrix operations                                          |\n| [`@thi.ng/sparse`](./packages/sparse)             | [![version](https://img.shields.io/npm/v/@thi.ng/sparse.svg)](https://www.npmjs.com/package/@thi.ng/sparse)             | [changelog](./packages/sparse/CHANGELOG.md)       | Sparse matrix \u0026 vector impls                               |\n| [`@thi.ng/timestep`](./packages/timestep)         | [![version](https://img.shields.io/npm/v/@thi.ng/timestep.svg)](https://www.npmjs.com/package/@thi.ng/timestep)         | [changelog](./packages/timestep/CHANGELOG.md)     | Fixed timestep simulation updates with state interpolation |\n| [`@thi.ng/vectors`](./packages/vectors)           | [![version](https://img.shields.io/npm/v/@thi.ng/vectors.svg)](https://www.npmjs.com/package/@thi.ng/vectors)           | [changelog](./packages/vectors/CHANGELOG.md)      | Fixed \u0026 arbitrary-length vector ops                        |\n\n### Network\n\n| Project                               | Version                                                                                                     | Changelog                                   | Description                                        |\n|---------------------------------------|-------------------------------------------------------------------------------------------------------------|---------------------------------------------|----------------------------------------------------|\n| [`@thi.ng/server`](./packages/server) | [![version](https://img.shields.io/npm/v/@thi.ng/server.svg)](https://www.npmjs.com/package/@thi.ng/server) | [changelog](./packages/server/CHANGELOG.md) | Minimal, extensible, interceptor-based HTTP server |\n\n### Randomness\n\n| Project                                             | Version                                                                                                                   | Changelog                                          | Description                                              |\n|-----------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------|----------------------------------------------------------|\n| [`@thi.ng/colored-noise`](./packages/colored-noise) | [![version](https://img.shields.io/npm/v/@thi.ng/colored-noise.svg)](https://www.npmjs.com/package/@thi.ng/colored-noise) | [changelog](./packages/colored-noise/CHANGELOG.md) | 1D colored noise generators                              |\n| [`@thi.ng/ksuid`](./packages/ksuid)                 | [![version](https://img.shields.io/npm/v/@thi.ng/ksuid.svg)](https://www.npmjs.com/package/@thi.ng/ksuid)                 | [changelog](./packages/ksuid/CHANGELOG.md)         | K-sortable unique identifiers, binary \u0026 base-N encoded   |\n| [`@thi.ng/lowdisc`](./packages/lowdisc)             | [![version](https://img.shields.io/npm/v/@thi.ng/lowdisc.svg)](https://www.npmjs.com/package/@thi.ng/lowdisc)             | [changelog](./packages/lowdisc/CHANGELOG.md)       | n-D Low discrepancy sequence generators                  |\n| [`@thi.ng/random`](./packages/random)               | [![version](https://img.shields.io/npm/v/@thi.ng/random.svg)](https://www.npmjs.com/package/@thi.ng/random)               | [changelog](./packages/random/CHANGELOG.md)        | Seedable PRNG implementations, distributions \u0026 utilities |\n| [`@thi.ng/random-fxhash`](./packages/random-fxhash) | [![version](https://img.shields.io/npm/v/@thi.ng/random-fxhash.svg)](https://www.npmjs.com/package/@thi.ng/random-fxhash) | [changelog](./packages/random-fxhash/CHANGELOG.md) | PRNG impl \u0026 utilities for fxhash projects                |\n| [`@thi.ng/uuid`](./packages/uuid)                   | [![version](https://img.shields.io/npm/v/@thi.ng/uuid.svg)](https://www.npmjs.com/package/@thi.ng/uuid)                   | [changelog](./packages/uuid/CHANGELOG.md)          | Binary \u0026 string-based UUID v4 generator                  |\n\n### Reactive programming\n\n| Project                                                   | Version                                                                                                                         | Changelog                                             | Description                                  |\n|-----------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|----------------------------------------------|\n| [`@thi.ng/rstream`](./packages/rstream)                   | [![version](https://img.shields.io/npm/v/@thi.ng/rstream.svg)](https://www.npmjs.com/package/@thi.ng/rstream)                   | [changelog](./packages/rstream/CHANGELOG.md)          | Push-based, reactive event stream primitves  |\n| [`@thi.ng/rstream-csp`](./packages/rstream-csp)           | [![version](https://img.shields.io/npm/v/@thi.ng/rstream-csp.svg)](https://www.npmjs.com/package/@thi.ng/rstream-csp)           | [changelog](./packages/rstream-csp/CHANGELOG.md)      | Adapter bridge CSP -\u003e rstream                |\n| [`@thi.ng/rstream-dot`](./packages/rstream-dot)           | [![version](https://img.shields.io/npm/v/@thi.ng/rstream-dot.svg)](https://www.npmjs.com/package/@thi.ng/rstream-dot)           | [changelog](./packages/rstream-dot/CHANGELOG.md)      | Graphviz visualization of rstream topologies |\n| [`@thi.ng/rstream-gestures`](./packages/rstream-gestures) | [![version](https://img.shields.io/npm/v/@thi.ng/rstream-gestures.svg)](https://www.npmjs.com/package/@thi.ng/rstream-gestures) | [changelog](./packages/rstream-gestures/CHANGELOG.md) | Mouse \u0026 touch event stream abstraction       |\n| [`@thi.ng/rstream-graph`](./packages/rstream-graph)       | [![version](https://img.shields.io/npm/v/@thi.ng/rstream-graph.svg)](https://www.npmjs.com/package/@thi.ng/rstream-graph)       | [changelog](./packages/rstream-graph/CHANGELOG.md)    | Declarative dataflow graph construction      |\n| [`@thi.ng/rstream-log`](./packages/rstream-log)           | [![version](https://img.shields.io/npm/v/@thi.ng/rstream-log.svg)](https://www.npmjs.com/package/@thi.ng/rstream-log)           | [changelog](./packages/rstream-log/CHANGELOG.md)      | Hierarchical structured data logging         |\n| [`@thi.ng/rstream-log-file`](./packages/rstream-log-file) | [![version](https://img.shields.io/npm/v/@thi.ng/rstream-log-file.svg)](https://www.npmjs.com/package/@thi.ng/rstream-log-file) | [changelog](./packages/rstream-log-file/CHANGELOG.md) | Log-file output handler                      |\n| [`@thi.ng/rstream-query`](./packages/rstream-query)       | [![version](https://img.shields.io/npm/v/@thi.ng/rstream-query.svg)](https://www.npmjs.com/package/@thi.ng/rstream-query)       | [changelog](./packages/rstream-query/CHANGELOG.md)    | Triple store \u0026 query engine                  |\n\n### WebGL / GPGPU\n\n| Project                                                         | Version                                                                                                                               | Changelog                                                | Description                        |\n|-----------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------|------------------------------------|\n| [`@thi.ng/shader-ast`](./packages/shader-ast)                   | [![version](https://img.shields.io/npm/v/@thi.ng/shader-ast.svg)](https://www.npmjs.com/package/@thi.ng/shader-ast)                   | [changelog](./packages/shader-ast/CHANGELOG.md)          | AST DSL for x-platform shader code |\n| [`@thi.ng/shader-ast-glsl`](./packages/shader-ast-glsl)         | [![version](https://img.shields.io/npm/v/@thi.ng/shader-ast-glsl.svg)](https://www.npmjs.com/package/@thi.ng/shader-ast-glsl)         | [changelog](./packages/shader-ast-glsl/CHANGELOG.md)     | GLSL code generator                |\n| [`@thi.ng/shader-ast-js`](./packages/shader-ast-js)             | [![version](https://img.shields.io/npm/v/@thi.ng/shader-ast-js.svg)](https://www.npmjs.com/package/@thi.ng/shader-ast-js)             | [changelog](./packages/shader-ast-js/CHANGELOG.md)       | JS code generator                  |\n| [`@thi.ng/shader-ast-optimize`](./packages/shader-ast-optimize) | [![version](https://img.shields.io/npm/v/@thi.ng/shader-ast-optimize.svg)](https://www.npmjs.com/package/@thi.ng/shader-ast-optimize) | [changelog](./packages/shader-ast-optimize/CHANGELOG.md) | AST code optimization strategies   |\n| [`@thi.ng/shader-ast-stdlib`](./packages/shader-ast-stdlib)     | [![version](https://img.shields.io/npm/v/@thi.ng/shader-ast-stdlib.svg)](https://www.npmjs.com/package/@thi.ng/shader-ast-stdlib)     | [changelog](./packages/shader-ast-stdlib/CHANGELOG.md)   | 100+ useful AST shader functions   |\n| [`@thi.ng/webgl`](./packages/webgl)                             | [![version](https://img.shields.io/npm/v/@thi.ng/webgl.svg)](https://www.npmjs.com/package/@thi.ng/webgl)                             | [changelog](./packages/webgl/CHANGELOG.md)               | WebGL 1/2 / GPGPU facilities       |\n| [`@thi.ng/webgl-msdf`](./packages/webgl-msdf)                   | [![version](https://img.shields.io/npm/v/@thi.ng/webgl-msdf.svg)](https://www.npmjs.com/package/@thi.ng/webgl-msdf)                   | [changelog](./packages/webgl-msdf/CHANGELOG.md)          | MSDF font rendering                |\n| [`@thi.ng/webgl-shadertoy`](./packages/webgl-shadertoy)         | [![version](https://img.shields.io/npm/v/@thi.ng/webgl-shadertoy.svg)](https://www.npmjs.com/package/@thi.ng/webgl-shadertoy)         | [changelog](./packages/webgl-shadertoy/CHANGELOG.md)     | Shadertoy-like WebGL setup         |\n\n### Deprecated packages\n\nThe following packages have been deprecated. Their readmes describe reasons and alternatives:\n\n| Project                                                | Version                                                                                                           | Changelog                                      | Description                           |\n|--------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------|------------------------------------------------|---------------------------------------|\n| [`@thi.ng/fsm`](./deprecated/packages/fsm)             | [![version](https://img.shields.io/npm/v/@thi.ng/fsm.svg)](https://www.npmjs.com/package/@thi.ng/fsm)             | [changelog](./packages/fsm/CHANGELOG.md)       | FSM / parser primitives               |\n| [`@thi.ng/geom-api`](./deprecated/packages/geom-api)   | [![version](https://img.shields.io/npm/v/@thi.ng/geom-api.svg)](https://www.npmjs.com/package/@thi.ng/geom-api)   | [changelog](./packages/geom-api/CHANGELOG.md)  | Shared types for thi.ng/geom packages |\n| [`@thi.ng/iterators`](./deprecated/packages/iterators) | [![version](https://img.shields.io/npm/v/@thi.ng/iterators.svg)](https://www.npmjs.com/package/@thi.ng/iterators) | [changelog](./packages/iterators/CHANGELOG.md) | ES6 generators / iterators            |\n| [`@thi.ng/testament`](./deprecated/packages/testament) | [![version](https://img.shields.io/npm/v/@thi.ng/testament.svg)](https://www.npmjs.com/package/@thi.ng/testament) | [changelog](./packages/testament/CHANGELOG.md) | Minimal test runner                   |\n\n## Building\n\n```bash\ngit clone https://github.com/thi-ng/umbrella.git\ncd umbrella\n\nyarn install\nyarn build\n```\n\nOnce the entire mono-repo has been fully built at least once before, individual\npackages can then be (re)built like so:\n\n```bash\nyarn workspace @thi.ng/transducers run build\n\n# or\n\n(cd packages/transducers \u0026\u0026 yarn build)\n\n# or\n\n(cd packages/transducers \u0026\u0026 yarn build:esbuild)\n```\n\nNote: The `yarn build` script alias will also generate TS type declaration\nfiles. This step is only needed once in the beginning or if updating the public\nAPI of a package. If you're confident it's not needed, using the `build:esbuild`\nalias is sufficient and much faster. Also, TS declaration files can be manually\nrebuilt via `build:decl`...\n\n### Building example projects\n\nPlease see the [example build\ninstructions](https://github.com/thi-ng/umbrella/wiki/Example-build-instructions)\nin the wiki for further details.\n\n### Testing\n\n(Most, but not all packages have tests)\n\nTest for all packages are run via [bun.sh](https://bun.sh).\n\n```bash\n# build all packages, then run all tests (in one go)\nyarn test\n\n# only run all tests\nyarn test:only\n\n# or individually\nyarn workspace @thi.ng/rstream run test\n```\n\n### Building API docs\n\nAutogenerated documentation (using\n[TypeDoc](https://github.com/TypeStrong/typedoc)) will be saved under\n`/packages/*/doc/` ([more info](#documentation)).\n\n```bash\nyarn doc\n```\n\n### Extracting code examples from readme files \u0026 comments\n\nAll packages in this repo have prepared infrastructure to extract various code\nexamples \u0026 snippets from their README files and from comments in the source\ncode. Altogether, there're 800-1000 of them in this repo, but only ~420 have\nbeen processed thus far (it's an ongoing time consuming manual process to\nprepare \u0026 check each of them, but work is under way! Please get in touch if you\nwant to help!).\n\nThe code extraction is handled via\n[thi.ng/tangle](https://github.com/thi-ng/umbrella/blob/develop/packages/tangle),\nitself a part of thi.ng/umbrella. You can read more details about this process\nhere:\n\n- [Mastodon post #1](https://mastodon.thi.ng/@toxi/111959275083112668)\n- [Mastodon post #2](https://mastodon.thi.ng/@toxi/112026554577015934)\n- [thi.ng/tangle readme](https://github.com/thi-ng/umbrella/blob/develop/packages/tangle/README.md)\n\nTo extract code blocks as source files from readmes:\n\n```bash\n# in the repo root (to process all packages)\nyarn doc:readme\n\n# for a single package only\n(cd packages/\u003cname\u003e \u0026\u0026 yarn doc:readme)\n```\n\nTo extract example code blocks from doc strings (API docs) in source code:\n\n```bash\n# in the repo root (to process all packages)\nyarn tool:tangle\n\n# for a single package only\n(cd packages/\u003cname\u003e \u0026\u0026 yarn tool:tangle)\n```\n\nIn all cases, the extracted files will be saved in each package's `/export`\nfolder and can then be run directly via [bun](https://bun.sh):\n\n```bash\nbun packages/arrays/export/topo-sort.ts\n```\n\n\u003c!-- Furthermore, an experimental [tsdoc](https://github.com/microsoft/tsdoc)-based\ndocumentation repo provides an alternative markdown output including\ncross-references between all packages, but currently isn't frequently updated\n(only every few months):\n\nhttps://github.com/thi-ng/umbrella-docs-temp --\u003e\n\n## Acknowledgements\n\nMaintaining a large monorepo like this requires a lot of infrastructure and I'm\ngrateful for the tooling provided by the following projects to simplify those\ntasks:\n\n- [bun](https://bun.sh)\n- [esbuild](https://github.com/evanw/esbuild)\n- [html-minifier-terser](https://terser.org/html-minifier-terser/)\n- [typedoc](https://typedoc.org/)\n- [TypeScript](https://www.typescriptlang.org/)\n- [Vite](http://vitejs.dev/)\n- [@thi.ng/monopub](https://github.com/thi-ng/monopub)\n\n## License\n\n\u0026copy; 2015 - 2025 Karsten Schmidt // Apache Software License 2.0\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://thi.ng\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/52302?v=4?s=100\" width=\"100px;\" alt=\"Karsten Schmidt\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKarsten Schmidt\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/thi-ng/umbrella/commits?author=postspectacular\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/thi-ng/umbrella/commits?author=postspectacular\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#maintenance-postspectacular\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e \u003ca href=\"#financial-postspectacular\" title=\"Financial\"\u003e💵\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/nkint\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/609314?v=4?s=100\" width=\"100px;\" alt=\"Alberto\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAlberto\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/thi-ng/umbrella/commits?author=nkint\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#example-nkint\" title=\"Examples\"\u003e💡\u003c/a\u003e \u003ca href=\"https://github.com/thi-ng/umbrella/issues?q=author%3Ankint\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"#ideas-nkint\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"#financial-nkint\" title=\"Financial\"\u003e💵\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://www.arthurcarabott.com/\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/66132?v=4?s=100\" width=\"100px;\" alt=\"Arthur Carabott\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eArthur Carabott\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/thi-ng/umbrella/commits?author=acarabott\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#ideas-acarabott\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"#example-acarabott\" title=\"Examples\"\u003e💡\u003c/a\u003e \u003ca href=\"#blog-acarabott\" title=\"Blogposts\"\u003e📝\u003c/a\u003e \u003ca href=\"#financial-acarabott\" title=\"Financial\"\u003e💵\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://andrewachter.de\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/179225?v=4?s=100\" width=\"100px;\" alt=\"André Wachter\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAndré Wachter\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/thi-ng/umbrella/commits?author=andrew8er\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#ideas-andrew8er\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/thi-ng/umbrella/issues?q=author%3Aandrew8er\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/gavinpc-mindgrub\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/29873545?v=4?s=100\" width=\"100px;\" alt=\"Gavin Cannizzaro\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eGavin Cannizzaro\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/thi-ng/umbrella/commits?author=gavinpc-mindgrub\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/thi-ng/umbrella/issues?q=author%3Agavi","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthi-ng%2Fumbrella","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthi-ng%2Fumbrella","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthi-ng%2Fumbrella/lists"}