https://github.com/thi-ng/umbrella
⛱ Broadly scoped ecosystem & mono-repository of 199 TypeScript projects (and ~180 examples) for general purpose, functional, data driven development
https://github.com/thi-ng/umbrella
color data-structures dataflow dsl functional-programming geometry html monorepo parser-combinators reactive-programming shadergraph streams transducers typescript ui vectors visualization webassembly webgl ziglang
Last synced: 6 days ago
JSON representation
⛱ Broadly scoped ecosystem & mono-repository of 199 TypeScript projects (and ~180 examples) for general purpose, functional, data driven development
- Host: GitHub
- URL: https://github.com/thi-ng/umbrella
- Owner: thi-ng
- License: apache-2.0
- Created: 2018-01-24T02:31:44.000Z (about 7 years ago)
- Default Branch: develop
- Last Pushed: 2024-10-17T15:47:58.000Z (6 months ago)
- Last Synced: 2024-10-29T21:26:38.021Z (6 months ago)
- 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
- Language: TypeScript
- Homepage: https://thi.ng
- Size: 211 MB
- Stars: 3,387
- Watchers: 47
- Forks: 150
- Open Issues: 56
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
- awesome-list - umbrella - repository of 151+ TypeScript projects for functional, data driven development | thi-ng | 2056 | (TypeScript)
- awesome - thi-ng/umbrella - ⛱ Broadly scoped ecosystem & mono-repository of 204 TypeScript projects (and ~185 examples) for general purpose, functional, data driven development (TypeScript)
- awesome-github-repos - thi-ng/umbrella - ⛱ Broadly scoped ecosystem & mono-repository of 204 TypeScript projects (and ~185 examples) for general purpose, functional, data driven development (TypeScript)
- awesome-javascript - umbrella - repository of 169+ TypeScript projects for functional, data driven development (Packages)
- awesome-javascript - umbrella - repository of 169+ TypeScript projects for functional, data driven development (Packages)
README

[](https://github.com/thi-ng/umbrella/actions?query=workflow%3Atest-all)
[](https://codeclimate.com/github/thi-ng/umbrella/maintainability)
[](https://www.patreon.com/thing_umbrella)
[](https://mastodon.thi.ng/@toxi)- [About](#about)
- [Getting Started](#getting-started)
- [Documentation](#documentation)
- [Project templates](#project-templates)
- [#HowToThing](#howtothing)
- [Blog posts](#blog-posts)
- [Videos](#videos)
- [Examples & Showcase](#examples--showcase)
- [awesome.thi.ng](#awesomething)
- [Generative art projects](#generative-art-projects)
- [Community, contributing, getting help](#community-contributing-getting-help)
- [Wiki](#wiki)
- [Projects](#projects)
- [Latest updates](#latest-updates)
- [Algorithms & data structures](#algorithms--data-structures)
- [DSLs](#dsls)
- [File / file format / hardware support](#file--file-format--hardware-support)
- [Frontend / UI](#frontend--ui)
- [Fundamentals](#fundamentals)
- [Geometry, image & visualization](#geometry-image--visualization)
- [Iterator, stream & sequence processing](#iterator-stream--sequence-processing)
- [Low-level, binary, memory management, interop](#low-level-binary-memory-management-interop)
- [Maths](#maths)
- [Network](#network)
- [Randomness](#randomness)
- [Reactive programming](#reactive-programming)
- [WebGL / GPGPU](#webgl--gpgpu)
- [Deprecated packages](#deprecated-packages)
- [Building](#building)
- [Building example projects](#building-example-projects)
- [Testing](#testing)
- [Building API docs](#building-api-docs)
- [Extracting code examples from readme files & comments](#extracting-code-examples-from-readme-files--comments)
- [Acknowledgements](#acknowledgements)
- [License](#license)
- [Contributors](#contributors-✨)## About
> "A collection of functional programming libraries that can be composed
> together. Unlike a framework, thi.ng is a suite of instruments and you (the
> user) must be the composer of. Geared towards versatility, not any specific
> type of music." —
> [@loganpowell](https://twitter.com/logantpowell/status/1186334119812304901)
> via Twitter
>
> Please visit [thi.ng](https://thi.ng) for additional information. You might
> also find the following tools useful to find & explore projects in this vast
> ecosystem:
>
> - [thi.ng tag browser](https://demo.thi.ng/umbrella/thing-browser/)
> - [tag-based search on the thi.ng website](https://thi.ng/#tags)
> - [repo-wide doc string search](https://demo.thi.ng/umbrella/rdom-search-docs/)
> - [generated API docs](https://docs.thi.ng/)**This project is NOT a framework and all packages can be used in isolation.**
Not including deprecations, this mono-repository is home to 204 individual
TypeScript libraries/packages/tools and ~185 example projects illustrating their
usage, currently totalling ~226k SLOC and ~4100 source files... Some of the
projects have been in regular development since 2015. The monorepo exists in its
current form since January 2018.Unlike most other large mono-repos, this one is not for a single project, but a
broad collection of jointly developed, yet independent libraries, tools and
general purpose building blocks for the following **non-exhaustive** list of
topics (see [package overview](#projects) below):- Functional programming (ES6 iterators/generators, composition, memoization,
transducers, multi-methods)
- Reactive programming, stream / transducer based dataflow graphs / pipelines /
DOM
- Fiber process tree abstraction for ES6 generators (co-routines / cooperative
multitasking)
- Data structures & data transformations for wide range of use cases (maps,
sets, heaps, queues, graphs etc.)
- WebAssembly bridge APIs & data structure bindings code generators for multiple
target languages (primarily aimed at Zig & C11)
- PEG-style functional parser combinators w/ (optional) custom grammar
definition language
- Customizable HTML & Markdown parsers
- 2D/3D geometry generation, shape primitives, math, manipulation,
intersections, conversions & visualizations
- Canvas abstractions, pixel buffers & SVG serialization/conversion
- Comprehensive function collection (900+) for nD-vectors and matrices (dense &
sparse)
- ECS implementations with optional support for strided memory layouts
- Semi-declarative WebGL 1/2 abstraction layer
- DSL for shader functions defined in TypeScript and cross-compilation to GLSL,
JS, VEX etc.
- Value-based equivalence (vs. native object identity) and associative data
structures (sets, maps)
- DSP building blocks: oscillators, noise generators, filters, 1D FFT/IFFT,
muxers, rate converters
- Immutable data handling, state containers, transacted state updates, Undo-Redo
history
- Reactive UI component toolkits (DOM-based, canvas-based, immediate-mode,
multiple approaches...)
- Multi-format, multi-channel pixel buffers (int & float based), conversions,
dithering, Porter-Duff alpha-blending operators
- Color space/format conversions, matrix based color manipulation, gradient
generators, color palettes, dominant color extraction
- Date-time abstraction, relative dates, iterators, formatters, math
- WebWorker workflow abstractions
- Forth-style pointfree DSL for functional composition and DSL
development/extension
- S-expression parser & runtime (interpreter) infrastructure for custom DSL
creation
- WASM-based SIMD batch-processing of vector data
- Pen-plotter (AxiDraw) toolchain & geometry conversions
- Interpolations, math helpers, automatic differentiation (Dual numbers)
- etc.Once more, **this project is NOT a framework**. There's no turn-key,
one-size-fits-all approach and instead the overall design philosophy encourages
a mix & match philosophy for key aspects of application design (inside & outside
the browser). Customization points are provided wherever useful and only expect
certain interfaces/type signatures rather than hard-coded concrete
implementations. In many cases presets are provided too.All packages:
- are versioned independently
- have auto-generated online documentation at [docs.thi.ng](https://docs.thi.ng)
- built via [esbuild](https://esbuild.github.io/) and tested via [bun.sh](https://bun.sh)
- released via [thi.ng/monopub](https://github.com/thi-ng/monopub) publishing toolchain
- distributed as ESM modules (ES2022 syntax) with export maps, TypeScript
typings & change logs
- highly modular with often only a single function / class (incl. closely
related functions) per file to help w/ selective imports and tree shaking
- provide re-exports of all their publics for full library imports
- have either none or only `@thi.ng` internal runtime dependencies (w/ very few
exceptions! All dependencies are listed in each package readme)
- declare public interfaces, enums & types in an `api.ts` file
- licensed under [Apache Software License 2.0](#license)## Getting started
A common misconception is to think of this repo as single project. It is not!
The sheer number and varied nature & purpose of these [packages](#packages)
makes it impossible to provide traditional "Getting started" tutorials — there
would have to be dozens of them... To compensate, this repo provides ~180
[example projects](#examples--showcase), detailed package readmes (at the very
least for all the larger and/or more important ones), as well as [hundreds of
small usage examples/snippets in doc strings & readme
files](#extracting-code-examples-from-readme-files--comments).### Documentation
- [Generated API docs (overview)](https://docs.thi.ng/)
- [Single page API docs for all pacakges (work-in-progress)](https://docs.thi.ng/umbrella)
- [Hundreds of usage examples/snippets](#extracting-code-examples-from-readme-files--comments)If you're unsure about something, please [reach
out](#community-contributing-getting-help)! Any constructive feedback is always
highly appreciated!### Project templates
You might find one of the following template repos an useful starting point
(only updated sporadically, make sure to update dependencies manually):- [tpl-umbrella-basic](https://github.com/thi-ng/tpl-umbrella-basic): Bare-bones
template repo for browser-based projects
- [tpl-umbrella-fxhash](https://github.com/thi-ng/tpl-umbrella-fxhash): Project
template repo for generative art projects on the fx(hash) platform
- [tpl-umbrella-zig](https://github.com/thi-ng/tpl-umbrella-zig): Minimal
browser project template for hybrid TypeScript & Zig (WebAssembly) apps### #HowToThing
Between August-November 2023,
[#HowToThing](https://mastodon.thi.ng/tags/HowToThing) was a series of short
posts & mini-tutorials on Mastodon, demonstrating a range of different
techniques, patterns and use cases from across the _thi.ng/umbrella_ ecosystem.
These are not necessarily intro examples, but each one comes with heavily
commented code (and often with visual outputs/results).- [001: FPS counter with moving average](https://mastodon.thi.ng/@toxi/110898928550740865)
- [002: Sorting an array by potentially CPU-costly sort criteria](https://mastodon.thi.ng/@toxi/110904190618425908)
- [003: Multiple key states and extracting commands via FSM](https://mastodon.thi.ng/@toxi/110934031101245644)
- [004: Creating text-based plots to debug & visualize sequential data](https://mastodon.thi.ng/@toxi/110942967462856117)
- [005: Barnsley fern IFS fractal](https://mastodon.thi.ng/@toxi/110946943031183702)
- [006: Clustering arbitrary n-dimensional data using K-means](https://mastodon.thi.ng/@toxi/110955825785005618)
- [007: Converting Google Maps bookmarks to KML](https://mastodon.thi.ng/@toxi/110961348580185768)
- [008: CSV parsing into structured data & multi-plot SVG dataviz](https://mastodon.thi.ng/@toxi/110967240994840257)
- [009: 2D canvas drawing & `threadLast()` dataflow operator](https://mastodon.thi.ng/@toxi/110972322869333970)
- [010: Basic web app UI/DOM via Zig/WASM and thi.ng/wasm-api](https://mastodon.thi.ng/@toxi/110975292505640048)
- [011: 2D cellular automata as WebGL2 multi-pass shader pipeline](https://mastodon.thi.ng/@toxi/110983734311624640)
- [012: Pure CSS image transition/reveal with thi.ng/hiccup-css](https://mastodon.thi.ng/@toxi/110995613345369326)
- [013: Lisp interpreter using thi.ng/sexpr & thi.ng/defmulti](https://mastodon.thi.ng/@toxi/111006345413482231)
- [014: A simple browser REPL for a Lispy mini language](https://mastodon.thi.ng/@toxi/111012777135967117)
- [015: Generative audio synth offline renderer and WAV file export](https://mastodon.thi.ng/@toxi/111018580750654608)
- [016: Building a reactive Mastodon UI, parsing & transforming API data](https://mastodon.thi.ng/@toxi/111069280667363259)
- [017: (Re)Constructing the thi.ng logo as 2D signed-distance field](https://mastodon.thi.ng/@toxi/111124858346572300)
- [018: Topological sorting, creating & visualizing a task dependency graph](https://mastodon.thi.ng/@toxi/111141659277277568)
- [019: Building a responsive & reactive stacked column layout](https://mastodon.thi.ng/@toxi/111182345509593440)
- [020: Generating randomized 4-point 2D multicolor gradient maps/images](https://mastodon.thi.ng/@toxi/111205034763399083)
- [021: Iterative animated convex polygon subdivision & heat map viz](https://mastodon.thi.ng/@toxi/111221943333023306)
- [022: Quasi-random voronoi lattice generator](https://mastodon.thi.ng/@toxi/111244412425832657)
- [023: Tag-based Jaccard similarity ranking/filtering using bitfields](https://mastodon.thi.ng/@toxi/111256960928934577)
- [024: 2.5D hidden line visualization of digital elevation files (DEM)](https://mastodon.thi.ng/@toxi/111269505611983570)
- [025: Fitting, transforming & plotting 10k data points per frame using SIMD](https://mastodon.thi.ng/@toxi/111283262419126958)
- [026: Shader meta-programming to generate animated function plots](https://mastodon.thi.ng/@toxi/111295842650216136)
- [027: Flocking sim with neighborhood queries to visualize proximity](https://mastodon.thi.ng/@toxi/111308439597090930)
- [028: Randomized, space-filling, nested 2D grid layout generator](https://mastodon.thi.ng/@toxi/111324566926701431)
- [029: Forth-like DSL & livecoding playground for 2D geometry generation](https://mastodon.thi.ng/@toxi/111335025037332972)
- [030: Procedural stochastic text generation via custom DSL & parse grammar](https://mastodon.thi.ng/@toxi/111347074558293056)### Blog posts
- "Of umbrellas, transducers, reactive streams & mushrooms" (ongoing series):
- [Part 1 - Project & series overview](https://github.com/thi-ng/blog/blob/main/2019/20190304-of-umbrellas-transducers-reactive-streams-pt1.md)
- [Part 2 - HOFs, Transducers, Reducers](https://github.com/thi-ng/blog/blob/main/2019/20190307-of-umbrellas-transducers-reactive-streams-pt2.md)
- [Part 3 - Convolution, 1D/2D Cellular automata](https://github.com/thi-ng/blog/blob/main/2019/20190310-of-umbrellas-transducers-reactive-streams-pt3.md)
- [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)
- [How to UI in 2018](https://github.com/thi-ng/blog/blob/main/2018/20180204-how-to-ui-in-2018.md)
- [The Jacob's Ladder of coding](https://github.com/thi-ng/blog/blob/main/2015/20151215-jacobs-ladder-of-coding.md)### Videos
The following videos have been migrated from YouTube to their new home at
[makertube.net](https://makertube.net/c/thingumbrella/videos) (more to come):- [Building a web editor for creating/testing parse grammars](https://makertube.net/w/ursFuQNJQQskmejx1ydL7q)
- [Building a shader graph editor (WebGL, shader AST transpiler, UI)](https://makertube.net/w/aTZXyecXhcexvt9G3hNX15)
- [Crash course: TypeScript mapped types in action](https://makertube.net/w/vai9TDyGjkduwapg7C9aJo)## Examples & Showcase
There's a steadily growing number (~180) of standalone examples of different
complexities (often combining functionality from several packages) in the
[**examples**](./examples/README.md) directory.| Example screenshots | (small selection) | |
|---------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
||
|
|
||
|
|
||
|
|
### awesome.thi.ng
Due to other priorities still very much in its infancy & planning stage, but
please help to document your own usage of these packages by contributing project
information to the [awesome.thi.ng](https://github.com/thi-ng/awesome.thi.ng)
repo, which will be used to build a showcase site... Thank you!### Generative art projects
Several generative art projects by [Karsten Schmidt on
fx(hash)](https://www.fxhash.xyz/u/toxi) were created exclusively with libraries
from this collection.| De/Frag series | | |
|--------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|
||
|
|
| Quasiflock | C-SCAPE | ASCII-SCAPE |
||
|
|
| Bubblemania | Danza (unreleased) | S-TRACE (unreleased) |
||
|
|
## Community, contributing, getting help
> [!NOTE]
> My [Mastodon](https://mastodon.thi.ng/@toxi) account is the best place to
> learn about ongoing developments. This is a multi-purpose account, but you can
> view [#ThingUmbrella tagged
> posts](http://mastodon.thi.ng/@toxi/tagged/ThingUmbrella) only and/or
> [subscribe to those via RSS](http://mastodon.thi.ng/@toxi/tagged/ThingUmbrella.rss).Join the [discussions here on
Github](https://github.com/thi-ng/umbrella/discussions), get in touch via
[Mastodon](https://mastodon.thi.ng/@toxi) or use the [issue
tracker](https://github.com/thi-ng/umbrella/issues). If you'd like to contribute
in other ways, please first read [this document](./CONTRIBUTING.md).In general, we welcome contributions of all kinds (docs, examples, bug fixes,
feature requests, [financial
contributions](https://github.com/sponsors/postspectacular/) etc.). You can find
a detailed overview for contributors here:
[CONTRIBUTING.md](https://github.com/thi-ng/umbrella/blob/develop/CONTRIBUTING.md).**Note: The default branch for this repo is `develop` and all PRs should be
based on this branch. This too means, the README files on this branch _might_
refer to yet-unreleased features or packages. Please use the
[main](https://github.com/thi-ng/umbrella/tree/main) branch for viewing the most
recently released version(s)!**.### Wiki
To date, the [wiki](https://github.com/thi-ng/umbrella/wiki) has only been
updated sporadically, but please be sure to check it out for project-wide
[glossary](https://github.com/thi-ng/umbrella/wiki/Glossary), information,
cookbooks, useful snippets etc.## Projects
### Latest updates
As of: 2025-04-06
| Status | Package | Version | Changelog |
|:----------------------------------------------|:--------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------|
|  | [`@thi.ng/block-fs`](./packages/block-fs) | [](https://www.npmjs.com/package/@thi.ng/block-fs) | [changelog](./packages/block-fs/CHANGELOG.md) |
|  | [`@thi.ng/wasm-api-canvas`](./packages/wasm-api-canvas) | [](https://www.npmjs.com/package/@thi.ng/wasm-api-canvas) | [changelog](./packages/wasm-api-canvas/CHANGELOG.md) |### Algorithms & data structures
| Project | Version | Changelog | Description |
|---------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------|------------------------------------------------|
| [`@thi.ng/adjacency`](./packages/adjacency) | [](https://www.npmjs.com/package/@thi.ng/adjacency) | [changelog](./packages/adjacency/CHANGELOG.md) | Adjacency matrices & graph algorithms |
| [`@thi.ng/arrays`](./packages/arrays) | [](https://www.npmjs.com/package/@thi.ng/arrays) | [changelog](./packages/arrays/CHANGELOG.md) | Array utilities |
| [`@thi.ng/associative`](./packages/associative) | [](https://www.npmjs.com/package/@thi.ng/associative) | [changelog](./packages/associative/CHANGELOG.md) | Alt Set & Map implementations |
| [`@thi.ng/atom`](./packages/atom) | [](https://www.npmjs.com/package/@thi.ng/atom) | [changelog](./packages/atom/CHANGELOG.md) | Immutable value wrappers, views, history |
| [`@thi.ng/bitfield`](./packages/bitfield) | [](https://www.npmjs.com/package/@thi.ng/bitfield) | [changelog](./packages/bitfield/CHANGELOG.md) | 1D/2D bit field implementations |
| [`@thi.ng/bidir-index`](./packages/bidir-index) | [](https://www.npmjs.com/package/@thi.ng/bidir-index) | [changelog](./packages/bidir-index/CHANGELOG.md) | Bi-directional key-value map/index |
| [`@thi.ng/buffers`](./packages/buffers) | [](https://www.npmjs.com/package/@thi.ng/buffers) | [changelog](./packages/buffers/CHANGELOG.md) | Generic read/write buffers w/ diff. behaviors |
| [`@thi.ng/cache`](./packages/cache) | [](https://www.npmjs.com/package/@thi.ng/cache) | [changelog](./packages/cache/CHANGELOG.md) | In-memory caches / strategies |
| [`@thi.ng/cellular`](./packages/cellular) | [](https://www.npmjs.com/package/@thi.ng/cellular) | [changelog](./packages/cellular/CHANGELOG.md) | Highly configurable 1D Cellular automata |
| [`@thi.ng/dcons`](./packages/dcons) | [](https://www.npmjs.com/package/@thi.ng/dcons) | [changelog](./packages/dcons/CHANGELOG.md) | Doubly-linked list |
| [`@thi.ng/diff`](./packages/diff) | [](https://www.npmjs.com/package/@thi.ng/diff) | [changelog](./packages/diff/CHANGELOG.md) | Array & object diffing |
| [`@thi.ng/disjoint-set`](./packages/disjoint-set) | [](https://www.npmjs.com/package/@thi.ng/disjoint-set) | [changelog](./packages/disjoint-set/CHANGELOG.md) | Disjoint Set data structure |
| [`@thi.ng/dgraph`](./packages/dgraph) | [](https://www.npmjs.com/package/@thi.ng/dgraph) | [changelog](./packages/dgraph/CHANGELOG.md) | Dependency graph |
| [`@thi.ng/ecs`](./packages/ecs) | [](https://www.npmjs.com/package/@thi.ng/ecs) | [changelog](./packages/ecs/CHANGELOG.md) | Entity-Component System |
| [`@thi.ng/gp`](./packages/gp) | [](https://www.npmjs.com/package/@thi.ng/gp) | [changelog](./packages/gp/CHANGELOG.md) | Genetic programming helpers / AST gen |
| [`@thi.ng/heaps`](./packages/heaps) | [](https://www.npmjs.com/package/@thi.ng/heaps) | [changelog](./packages/heaps/CHANGELOG.md) | Binary & d-ary heap impls |
| [`@thi.ng/idgen`](./packages/idgen) | [](https://www.npmjs.com/package/@thi.ng/idgen) | [changelog](./packages/idgen/CHANGELOG.md) | Versioned ID generation / free-list |
| [`@thi.ng/k-means`](./packages/k-means) | [](https://www.npmjs.com/package/@thi.ng/k-means) | [changelog](./packages/k-means/CHANGELOG.md) | K-means clustering of n-D data |
| [`@thi.ng/leaky-bucket`](./packages/leaky-bucket) | [](https://www.npmjs.com/package/@thi.ng/leaky-bucket) | [changelog](./packages/leaky-bucket/CHANGELOG.md) | Counter-based Leaky Bucket implementation |
| [`@thi.ng/ramp`](./packages/ramp) | [](https://www.npmjs.com/package/@thi.ng/ramp) | [changelog](./packages/ramp/CHANGELOG.md) | Parametric, interpolated lookup tables |
| [`@thi.ng/quad-edge`](./packages/quad-edge) | [](https://www.npmjs.com/package/@thi.ng/quad-edge) | [changelog](./packages/quad-edge/CHANGELOG.md) | Quad-edge, dual-graph data structure |
| [`@thi.ng/resolve-map`](./packages/resolve-map) | [](https://www.npmjs.com/package/@thi.ng/resolve-map) | [changelog](./packages/resolve-map/CHANGELOG.md) | DAG computations & value resolution |
| [`@thi.ng/sorted-map`](./packages/sorted-map) | [](https://www.npmjs.com/package/@thi.ng/sorted-map) | [changelog](./packages/sorted-map/CHANGELOG.md) | Sorted map & set datastructure |
| [`@thi.ng/sparse-set`](./packages/sparse-set) | [](https://www.npmjs.com/package/@thi.ng/sparse-set) | [changelog](./packages/sparse-set/CHANGELOG.md) | Sparse set datastructure |
| [`@thi.ng/trie`](./packages/trie) | [](https://www.npmjs.com/package/@thi.ng/trie) | [changelog](./packages/trie/CHANGELOG.md) | Trie-based map datastructure w/ prefix queries |
| [`@thi.ng/vclock`](./packages/vclock) | [](https://www.npmjs.com/package/@thi.ng/vclock) | [changelog](./packages/vclock/CHANGELOG.md) | Vector clock functions / comparators |
| [`@thi.ng/zipper`](./packages/zipper) | [](https://www.npmjs.com/package/@thi.ng/zipper) | [changelog](./packages/zipper/CHANGELOG.md) | Immutable tree editing / navigation |### DSLs
| Project | Version | Changelog | Description |
|-------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|-----------------------------------------------|
| [`@thi.ng/pointfree`](./packages/pointfree) | [](https://www.npmjs.com/package/@thi.ng/pointfree) | [changelog](./packages/pointfree/CHANGELOG.md) | Stack-based DSL & functional composition |
| [`@thi.ng/pointfree-lang`](./packages/pointfree-lang) | [](https://www.npmjs.com/package/@thi.ng/pointfree-lang) | [changelog](./packages/pointfree-lang/CHANGELOG.md) | Forth-like syntax layer for @thi.ng/pointfree |
| [`@thi.ng/proctext`](./packages/proctext) | [](https://www.npmjs.com/package/@thi.ng/proctext) | [changelog](./packages/proctext/CHANGELOG.md) | Procedural text generation engine |
| [`@thi.ng/sexpr`](./packages/sexpr) | [](https://www.npmjs.com/package/@thi.ng/sexpr) | [changelog](./packages/sexpr/CHANGELOG.md) | S-Expression parser & runtime infrastructure |### File / file format / hardware support
| Project | Version | Changelog | Description |
|-------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------|-------------------------------------------------|
| [`@thi.ng/axidraw`](./packages/axidraw) | [](https://www.npmjs.com/package/@thi.ng/axidraw) | [changelog](./packages/axidraw/CHANGELOG.md) | Minimal, declarative AxiDraw plotter controller |
| [`@thi.ng/bencode`](./packages/bencode) | [](https://www.npmjs.com/package/@thi.ng/bencode) | [changelog](./packages/bencode/CHANGELOG.md) | Bencode binary format encoding |
| [`@thi.ng/csv`](./packages/csv) | [](https://www.npmjs.com/package/@thi.ng/csv) | [changelog](./packages/csv/CHANGELOG.md) | Customizable CSV parser/object mapper |
| [`@thi.ng/dot`](./packages/dot) | [](https://www.npmjs.com/package/@thi.ng/dot) | [changelog](./packages/dot/CHANGELOG.md) | Graphviz DOM & export |
| [`@thi.ng/dsp-io-wav`](./packages/dsp-io-wav) | [](https://www.npmjs.com/package/@thi.ng/dsp-io-wav) | [changelog](./packages/dsp-io-wav/CHANGELOG.md) | WAV file format exporter |
| [`@thi.ng/egf`](./packages/egf) | [](https://www.npmjs.com/package/@thi.ng/egf) | [changelog](./packages/egf/CHANGELOG.md) | Extensible Graph Format |
| [`@thi.ng/file-io`](./packages/file-io) | [](https://www.npmjs.com/package/@thi.ng/file-io) | [changelog](./packages/file-io/CHANGELOG.md) | Assorted file I/O utils for NodeJS |
| [`@thi.ng/geom-io-obj`](./packages/geom-io-obj) | [](https://www.npmjs.com/package/@thi.ng/geom-io-obj) | [changelog](./packages/geom-io-obj/CHANGELOG.md) | Wavefront OBJ model parser |
| [`@thi.ng/hiccup-css`](./packages/hiccup-css) | [](https://www.npmjs.com/package/@thi.ng/hiccup-css) | [changelog](./packages/hiccup-css/CHANGELOG.md) | CSS from nested JS data structures |
| [`@thi.ng/hiccup-html`](./packages/hiccup-html) | [](https://www.npmjs.com/package/@thi.ng/hiccup-html) | [changelog](./packages/hiccup-html/CHANGELOG.md) | Type-checked HTML5 element wrappers for hiccup |
| [`@thi.ng/hiccup-html-parse`](./packages/hiccup-html-parse) | [](https://www.npmjs.com/package/@thi.ng/hiccup-html-parse) | [changelog](./packages/hiccup-html-parse/CHANGELOG.md) | HTML parsing & transformation to hiccup format |
| [`@thi.ng/hiccup-markdown`](./packages/hiccup-markdown) | [](https://www.npmjs.com/package/@thi.ng/hiccup-markdown) | [changelog](./packages/hiccup-markdown/CHANGELOG.md) | Hiccup-to-Markdown serialization |
| [`@thi.ng/hiccup-svg`](./packages/hiccup-svg) | [](https://www.npmjs.com/package/@thi.ng/hiccup-svg) | [changelog](./packages/hiccup-svg/CHANGELOG.md) | hiccup based SVG vocab |
| [`@thi.ng/iges`](./packages/iges) | [](https://www.npmjs.com/package/@thi.ng/iges) | [changelog](./packages/iges/CHANGELOG.md) | IGES format geometry serialization |
| [`@thi.ng/markdown-table`](./packages/markdown-table) | [](https://www.npmjs.com/package/@thi.ng/markdown-table) | [changelog](./packages/markdown-table/CHANGELOG.md) | Markdown table generator / formatter |
| [`@thi.ng/mime`](./packages/mime) | [](https://www.npmjs.com/package/@thi.ng/mime) | [changelog](./packages/mime/CHANGELOG.md) | File extension to MIME type mappings |
| [`@thi.ng/msgpack`](./packages/msgpack) | [](https://www.npmjs.com/package/@thi.ng/msgpack) | [changelog](./packages/msgpack/CHANGELOG.md) | Msgpack serialization/deserialization |
| [`@thi.ng/pixel-io-geotiff`](./packages/pixel-io-geotiff) | [](https://www.npmjs.com/package/@thi.ng/pixel-io-geotiff) | [changelog](./packages/pixel-io-geotiff/CHANGELOG.md) | GeoTIFF reader support for thi.ng/pixel |
| [`@thi.ng/pixel-io-netpbm`](./packages/pixel-io-netpbm) | [](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 |
| [`@thi.ng/pixel-io-pfm`](./packages/pixel-io-pfm) | [](https://www.npmjs.com/package/@thi.ng/pixel-io-pfm) | [changelog](./packages/pixel-io-pfm/CHANGELOG.md) | Portable FloatMap image format reader/writer |
| [`@thi.ng/prefixes`](./packages/prefixes) | [](https://www.npmjs.com/package/@thi.ng/prefixes) | [changelog](./packages/prefixes/CHANGELOG.md) | Linked Data, RDF & xmlns prefixes/URLs |
| [`@thi.ng/sax`](./packages/sax) | [](https://www.npmjs.com/package/@thi.ng/sax) | [changelog](./packages/sax/CHANGELOG.md) | SAX-like XML parser / transducer |
| [`@thi.ng/tangle`](./packages/tangle) | [](https://www.npmjs.com/package/@thi.ng/tangle) | [changelog](./packages/tangle/CHANGELOG.md) | Literate programming utilities |### Frontend / UI
| Project | Version | Changelog | Description |
|-----------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------|--------------------------------------------------|
| [`@thi.ng/blurhash`](./packages/blurhash) | [](https://www.npmjs.com/package/@thi.ng/blurhash) | [changelog](./packages/blurhash/CHANGELOG.md) | Fast image blurhash encoder/decoder |
| [`@thi.ng/canvas`](./packages/canvas) | [](https://www.npmjs.com/package/@thi.ng/canvas) | [changelog](./packages/canvas/CHANGELOG.md) | Canvas creation & HDPI support helpers |
| [`@thi.ng/dl-asset`](./packages/dl-asset) | [](https://www.npmjs.com/package/@thi.ng/dl-asset) | [changelog](./packages/dl-asset/CHANGELOG.md) | Asset/canvas/file download helpers |
| [`@thi.ng/emoji`](./packages/emoji) | [](https://www.npmjs.com/package/@thi.ng/emoji) | [changelog](./packages/emoji/CHANGELOG.md) | Bi-directional emoji lookup tables (names/chars) |
| [`@thi.ng/hdiff`](./packages/hdiff) | [](https://www.npmjs.com/package/@thi.ng/hdiff) | [changelog](./packages/hdiff/CHANGELOG.md) | String diffing w/ hiccup output (includes CLI) |
| [`@thi.ng/hdom`](./packages/hdom) | [](https://www.npmjs.com/package/@thi.ng/hdom) | [changelog](./packages/hdom/CHANGELOG.md) | Hiccup based VDOM & diffing |
| [`@thi.ng/hdom-canvas`](./packages/hdom-canvas) | [](https://www.npmjs.com/package/@thi.ng/hdom-canvas) | [changelog](./packages/hdom-canvas/CHANGELOG.md) | hdom adapter for hiccup-canvas |
| [`@thi.ng/hdom-components`](./packages/hdom-components) | [](https://www.npmjs.com/package/@thi.ng/hdom-components) | [changelog](./packages/hdom-components/CHANGELOG.md) | hdom based UI components |
| [`@thi.ng/hdom-mock`](./packages/hdom-mock) | [](https://www.npmjs.com/package/@thi.ng/hdom-mock) | [changelog](./packages/hdom-mock/CHANGELOG.md) | hdom mock implementation (testing / prototyping) |
| [`@thi.ng/hiccup`](./packages/hiccup) | [](https://www.npmjs.com/package/@thi.ng/hiccup) | [changelog](./packages/hiccup/CHANGELOG.md) | S-expression based HTML/XML serialization |
| [`@thi.ng/hiccup-canvas`](./packages/hiccup-canvas) | [](https://www.npmjs.com/package/@thi.ng/hiccup-canvas) | [changelog](./packages/hiccup-canvas/CHANGELOG.md) | hiccup interpreter for canvas api |
| [`@thi.ng/hiccup-carbon-icons`](./packages/hiccup-carbon-icons) | [](https://www.npmjs.com/package/@thi.ng/hiccup-carbon-icons) | [changelog](./packages/hiccup-carbon-icons/CHANGELOG.md) | IBM Carbon icons in hiccup format |
| [`@thi.ng/imgui`](./packages/imgui) | [](https://www.npmjs.com/package/@thi.ng/imgui) | [changelog](./packages/imgui/CHANGELOG.md) | Immediate mode GUI |
| [`@thi.ng/interceptors`](./packages/interceptors) | [](https://www.npmjs.com/package/@thi.ng/interceptors) | [changelog](./packages/interceptors/CHANGELOG.md) | Composable event handlers & processor |
| [`@thi.ng/meta-css`](./packages/meta-css) | [](https://www.npmjs.com/package/@thi.ng/meta-css) | [changelog](./packages/meta-css/CHANGELOG.md) | CSS framework codegen, transpiler, bundler |
| [`@thi.ng/rdom`](./packages/rdom) | [](https://www.npmjs.com/package/@thi.ng/rdom) | [changelog](./packages/rdom/CHANGELOG.md) | Reactive, diff-less, async UI components |
| [`@thi.ng/rdom-canvas`](./packages/rdom-canvas) | [](https://www.npmjs.com/package/@thi.ng/rdom-canvas) | [changelog](./packages/rdom-canvas/CHANGELOG.md) | rdom component wrapper for thi.ng/hiccup-canvas |
| [`@thi.ng/rdom-components`](./packages/rdom-components) | [](https://www.npmjs.com/package/@thi.ng/rdom-components) | [changelog](./packages/rdom-components/CHANGELOG.md) | Unstyled, customizable component collection |
| [`@thi.ng/rdom-forms`](./packages/rdom-forms) | [](https://www.npmjs.com/package/@thi.ng/rdom-forms) | [changelog](./packages/rdom-forms/CHANGELOG.md) | Datadriven HTML form generation |
| [`@thi.ng/router`](./packages/router) | [](https://www.npmjs.com/package/@thi.ng/router) | [changelog](./packages/router/CHANGELOG.md) | Customizable browser & non-browser router |
| [`@thi.ng/text-canvas`](./packages/text-canvas) | [](https://www.npmjs.com/package/@thi.ng/text-canvas) | [changelog](./packages/text-canvas/CHANGELOG.md) | Text-mode canvas, drawing, tables, charts |
| [`@thi.ng/text-format`](./packages/text-format) | [](https://www.npmjs.com/package/@thi.ng/text-format) | [changelog](./packages/text-format/CHANGELOG.md) | Color text formatting w/ ANSI & HTML presets |### Fundamentals
| Project | Version | Changelog | Description |
|---------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------|----------------------------------------------------------|
| [`@thi.ng/args`](./packages/args) | [](https://www.npmjs.com/package/@thi.ng/args) | [changelog](./packages/args/CHANGELOG.md) | Declarative & functional CLI arg parsing & coercions |
| [`@thi.ng/api`](./packages/api) | [](https://www.npmjs.com/package/@thi.ng/api) | [changelog](./packages/api/CHANGELOG.md) | Common types, decorators, mixins |
| [`@thi.ng/bench`](./packages/bench) | [](https://www.npmjs.com/package/@thi.ng/bench) | [changelog](./packages/bench/CHANGELOG.md) | Basic benchmarking helpers |
| [`@thi.ng/checks`](./packages/checks) | [](https://www.npmjs.com/package/@thi.ng/checks) | [changelog](./packages/checks/CHANGELOG.md) | Type & value checks |
| [`@thi.ng/compare`](./packages/compare) | [](https://www.npmjs.com/package/@thi.ng/compare) | [changelog](./packages/compare/CHANGELOG.md) | Comparators |
| [`@thi.ng/compose`](./packages/compose) | [](https://www.npmjs.com/package/@thi.ng/compose) | [changelog](./packages/compose/CHANGELOG.md) | Functional composition helpers |
| [`@thi.ng/date`](./packages/date) | [](https://www.npmjs.com/package/@thi.ng/date) | [changelog](./packages/date/CHANGELOG.md) | Date/time iterators, formatters, rounding |
| [`@thi.ng/defmulti`](./packages/defmulti) | [](https://www.npmjs.com/package/@thi.ng/defmulti) | [changelog](./packages/defmulti/CHANGELOG.md) | Dynamic multiple dispatch |
| [`@thi.ng/distance`](./packages/distance) | [](https://www.npmjs.com/package/@thi.ng/distance) | [changelog](./packages/distance/CHANGELOG.md) | n-D distance metrics & K-nearest neighborhoods |
| [`@thi.ng/equiv`](./packages/equiv) | [](https://www.npmjs.com/package/@thi.ng/equiv) | [changelog](./packages/equiv/CHANGELOG.md) | Deep value equivalence checking |
| [`@thi.ng/errors`](./packages/errors) | [](https://www.npmjs.com/package/@thi.ng/errors) | [changelog](./packages/errors/CHANGELOG.md) | Custom error types |
| [`@thi.ng/expose`](./packages/expose) | [](https://www.npmjs.com/package/@thi.ng/expose) | [changelog](./packages/expose/CHANGELOG.md) | Conditional global variable exposition |
| [`@thi.ng/fibers`](./packages/fibers) | [](https://www.npmjs.com/package/@thi.ng/fibers) | [changelog](./packages/fibers/CHANGELOG.md) | Process hierarchies & ops for cooperative multitasking |
| [`@thi.ng/hex`](./packages/hex) | [](https://www.npmjs.com/package/@thi.ng/hex) | [changelog](./packages/hex/CHANGELOG.md) | Hex value formatters for U4-64 words |
| [`@thi.ng/logger`](./packages/logger) | [](https://www.npmjs.com/package/@thi.ng/logger) | [changelog](./packages/logger/CHANGELOG.md) | Basis infrastructure for arbitrary logging |
| [`@thi.ng/memoize`](./packages/memoize) | [](https://www.npmjs.com/package/@thi.ng/memoize) | [changelog](./packages/memoize/CHANGELOG.md) | Function memoization w/ customizable caching |
| [`@thi.ng/object-utils`](./packages/object-utils) | [](https://www.npmjs.com/package/@thi.ng/object-utils) | [changelog](./packages/object-utils/CHANGELOG.md) | Plain JS object & map manipulation |
| [`@thi.ng/oquery`](./packages/oquery) | [](https://www.npmjs.com/package/@thi.ng/oquery) | [changelog](./packages/oquery/CHANGELOG.md) | Pattern based query engine for JS objects |
| [`@thi.ng/parse`](./packages/parse) | [](https://www.npmjs.com/package/@thi.ng/parse) | [changelog](./packages/parse/CHANGELOG.md) | Parser combinators & AST generator/transformer |
| [`@thi.ng/paths`](./packages/paths) | [](https://www.npmjs.com/package/@thi.ng/paths) | [changelog](./packages/paths/CHANGELOG.md) | Immutable nested object accessors |
| [`@thi.ng/strings`](./packages/strings) | [](https://www.npmjs.com/package/@thi.ng/strings) | [changelog](./packages/strings/CHANGELOG.md) | Higher-order string formatting utils |
| [`@thi.ng/system`](./packages/system) | [](https://www.npmjs.com/package/@thi.ng/system) | [changelog](./packages/system/CHANGELOG.md) | Minimal life cycle container for stateful app components |
| [`@thi.ng/timestamp`](./packages/timestamp) | [](https://www.npmjs.com/package/@thi.ng/timestamp) | [changelog](./packages/timestamp/CHANGELOG.md) | Timestamp abstraction/wrapper |
| [`@thi.ng/transclude`](./packages/transclude) | [](https://www.npmjs.com/package/@thi.ng/transclude) | [changelog](./packages/transclude/CHANGELOG.md) | Template engine for text document generation |
| [`@thi.ng/units`](./packages/units) | [](https://www.npmjs.com/package/@thi.ng/units) | [changelog](./packages/units/CHANGELOG.md) | Extensible SI unit conversions |### Geometry, image & visualization
| Project | Version | Changelog | Description |
|---------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------|-----------------------------------------------------|
| [`@thi.ng/boids`](./packages/boids) | [](https://www.npmjs.com/package/@thi.ng/boids) | [changelog](./packages/boids/CHANGELOG.md) | Configurable n-dimensional boids simulation |
| [`@thi.ng/color`](./packages/color) | [](https://www.npmjs.com/package/@thi.ng/color) | [changelog](./packages/color/CHANGELOG.md) | Color conversions, gradients |
| [`@thi.ng/color-palettes`](./packages/color-palettes) | [](https://www.npmjs.com/package/@thi.ng/color-palettes) | [changelog](./packages/color-palettes/CHANGELOG.md) | Collection of image-based color palettes |
| [`@thi.ng/dgraph-dot`](./packages/dgraph-dot) | [](https://www.npmjs.com/package/@thi.ng/dgraph-dot) | [changelog](./packages/dgraph-dot/CHANGELOG.md) | Dependency graph -> Graphviz |
| [`@thi.ng/distance-transform`](./packages/distance-transform) | [](https://www.npmjs.com/package/@thi.ng/distance-transform) | [changelog](./packages/distance-transform/CHANGELOG.md) | Image based distance field generation |
| [`@thi.ng/fuzzy-viz`](./packages/fuzzy-viz) | [](https://www.npmjs.com/package/@thi.ng/fuzzy-viz) | [changelog](./packages/fuzzy-viz/CHANGELOG.md) | Visualization, instrumentation for @thi.ng/fuzzy |
| [`@thi.ng/geom`](./packages/geom) | [](https://www.npmjs.com/package/@thi.ng/geom) | [changelog](./packages/geom/CHANGELOG.md) | 2D only geometry types & ops |
| [`@thi.ng/geom-accel`](./packages/geom-accel) | [](https://www.npmjs.com/package/@thi.ng/geom-accel) | [changelog](./packages/geom-accel/CHANGELOG.md) | Spatial indexing data structures |
| [`@thi.ng/geom-axidraw`](./packages/geom-axidraw) | [](https://www.npmjs.com/package/@thi.ng/geom-axidraw) | [changelog](./packages/geom-axidraw/CHANGELOG.md) | Shape conversions for AxiDraw pen plotter |
| [`@thi.ng/geom-arc`](./packages/geom-arc) | [](https://www.npmjs.com/package/@thi.ng/geom-arc) | [changelog](./packages/geom-arc/CHANGELOG.md) | 2D elliptic arc utils |
| [`@thi.ng/geom-clip-line`](./packages/geom-clip-line) | [](https://www.npmjs.com/package/@thi.ng/geom-clip-line) | [changelog](./packages/geom-clip-line/CHANGELOG.md) | 2D line clipping |
| [`@thi.ng/geom-clip-poly`](./packages/geom-clip-poly) | [](https://www.npmjs.com/package/@thi.ng/geom-clip-poly) | [changelog](./packages/geom-clip-poly/CHANGELOG.md) | 2D convex polygon clipping |
| [`@thi.ng/geom-closest-point`](./packages/geom-closest-point) | [](https://www.npmjs.com/package/@thi.ng/geom-closest-point) | [changelog](./packages/geom-closest-point/CHANGELOG.md) | Closest point helpers |
| [`@thi.ng/geom-fuzz`](./packages/geom-fuzz) | [](https://www.npmjs.com/package/@thi.ng/geom-fuzz) | [changelog](./packages/geom-fuzz/CHANGELOG.md) | Fuzzy 2D shape drawing / filling |
| [`@thi.ng/geom-hull`](./packages/geom-hull) | [](https://www.npmjs.com/package/@thi.ng/geom-hull) | [changelog](./packages/geom-hull/CHANGELOG.md) | 2D convex hull (Graham scan) |
| [`@thi.ng/geom-isec`](./packages/geom-isec) | [](https://www.npmjs.com/package/@thi.ng/geom-isec) | [changelog](./packages/geom-isec/CHANGELOG.md) | Point & shape intersection tests |
| [`@thi.ng/geom-isoline`](./packages/geom-isoline) | [](https://www.npmjs.com/package/@thi.ng/geom-isoline) | [changelog](./packages/geom-isoline/CHANGELOG.md) | 2D contour line extraction |
| [`@thi.ng/geom-poly-utils`](./packages/geom-poly-utils) | [](https://www.npmjs.com/package/@thi.ng/geom-poly-utils) | [changelog](./packages/geom-poly-utils/CHANGELOG.md) | 2D polygon helpers |
| [`@thi.ng/geom-resample`](./packages/geom-resample) | [](https://www.npmjs.com/package/@thi.ng/geom-resample) | [changelog](./packages/geom-resample/CHANGELOG.md) | nD polyline / curve resampling |
| [`@thi.ng/geom-sdf`](./packages/geom-sdf) | [](https://www.npmjs.com/package/@thi.ng/geom-sdf) | [changelog](./packages/geom-sdf/CHANGELOG.md) | 2D SDF creation, conversions, operators, utilities |
| [`@thi.ng/geom-splines`](./packages/geom-splines) | [](https://www.npmjs.com/package/@thi.ng/geom-splines) | [changelog](./packages/geom-splines/CHANGELOG.md) | nD cubic / quadratic spline ops |
| [`@thi.ng/geom-subdiv-curve`](./packages/geom-subdiv-curve) | [](https://www.npmjs.com/package/@thi.ng/geom-subdiv-curve) | [changelog](./packages/geom-subdiv-curve/CHANGELOG.md) | nD iterative subdivision curves |
| [`@thi.ng/geom-tessellate`](./packages/geom-tessellate) | [](https://www.npmjs.com/package/@thi.ng/geom-tessellate) | [changelog](./packages/geom-tessellate/CHANGELOG.md) | nD convex polygon tessellators |
| [`@thi.ng/geom-trace-bitmap`](./packages/geom-trace-bitmap) | [](https://www.npmjs.com/package/@thi.ng/geom-trace-bitmap) | [changelog](./packages/geom-trace-bitmap/CHANGELOG.md) | bitmap image to vector conversion |
| [`@thi.ng/geom-voronoi`](./packages/geom-voronoi) | [](https://www.npmjs.com/package/@thi.ng/geom-voronoi) | [changelog](./packages/geom-voronoi/CHANGELOG.md) | 2D iterative delaunay/voronoi |
| [`@thi.ng/geom-webgl`](./packages/geom-webgl) | [](https://www.npmjs.com/package/@thi.ng/geom-webgl) | [changelog](./packages/geom-webgl/CHANGELOG.md) | thi.ng/geom / WebGL shape conversion & interop |
| [`@thi.ng/imago`](./packages/imago) | [](https://www.npmjs.com/package/@thi.ng/imago) | [changelog](./packages/imago/CHANGELOG.md) | Declarative & extensible image processing pipelines |
| [`@thi.ng/lsys`](./packages/lsys) | [](https://www.npmjs.com/package/@thi.ng/lsys) | [changelog](./packages/lsys/CHANGELOG.md) | Extensible L-System architecture |
| [`@thi.ng/pixel`](./packages/pixel) | [](https://www.npmjs.com/package/@thi.ng/pixel) | [changelog](./packages/pixel/CHANGELOG.md) | Multi-format pixel buffers |
| [`@thi.ng/pixel-convolve`](./packages/pixel-convolve) | [](https://www.npmjs.com/package/@thi.ng/pixel-convolve) | [changelog](./packages/pixel-convolve/CHANGELOG.md) | Extensible image convolution & kernel presets |
| [`@thi.ng/pixel-dominant-colors`](./packages/pixel-dominant-colors) | [](https://www.npmjs.com/package/@thi.ng/pixel-dominant-colors) | [changelog](./packages/pixel-dominant-colors/CHANGELOG.md) | k-means based dominant colors extraction |
| [`@thi.ng/pixel-dither`](./packages/pixel-dither) | [](https://www.npmjs.com/package/@thi.ng/pixel-dither) | [changelog](./packages/pixel-dither/CHANGELOG.md) | Image dithering w/ various algorithm presets |
| [`@thi.ng/poisson`](./packages/poisson) | [](https://www.npmjs.com/package/@thi.ng/poisson) | [changelog](./packages/poisson/CHANGELOG.md) | nD Poisson disk sampling |
| [`@thi.ng/porter-duff`](./packages/porter-duff) | [](https://www.npmjs.com/package/@thi.ng/porter-duff) | [changelog](./packages/porter-duff/CHANGELOG.md) | Alpha blending / compositing ops |
| [`@thi.ng/rasterize`](./packages/rasterize) | [](https://www.npmjs.com/package/@thi.ng/rasterize) | [changelog](./packages/rasterize/CHANGELOG.md) | Shape drawing, filling & rasterization |
| [`@thi.ng/scenegraph`](./packages/scenegraph) | [](https://www.npmjs.com/package/@thi.ng/scenegraph) | [changelog](./packages/scenegraph/CHANGELOG.md) | Extensible 2D/3D scenegraph |
| [`@thi.ng/simd`](./packages/simd) | [](https://www.npmjs.com/package/@thi.ng/simd) | [changelog](./packages/simd/CHANGELOG.md) | WebAssembly SIMD vector batch processing |
| [`@thi.ng/tsne`](./packages/tsne) | [](https://www.npmjs.com/package/@thi.ng/tsne) | [changelog](./packages/tsne/CHANGELOG.md) | Configurable t-SNE visualization solver |
| [`@thi.ng/viz`](./packages/viz) | [](https://www.npmjs.com/package/@thi.ng/viz) | [changelog](./packages/viz/CHANGELOG.md) | Declarative & functional data visualization toolkit |### Iterator, stream & sequence processing
| Project | Version | Changelog | Description |
|---------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------|-----------------------------------------|
| [`@thi.ng/csp`](./packages/csp) | [](https://www.npmjs.com/package/@thi.ng/csp) | [changelog](./packages/csp/CHANGELOG.md) | Channel based async ops |
| [`@thi.ng/grid-iterators`](./packages/grid-iterators) | [](https://www.npmjs.com/package/@thi.ng/grid-iterators) | [changelog](./packages/grid-iterators/CHANGELOG.md) | 2D grid iterator strategies |
| [`@thi.ng/seq`](./packages/seq) | [](https://www.npmjs.com/package/@thi.ng/seq) | [changelog](./packages/seq/CHANGELOG.md) | Lisp/Clojure-style sequence abstraction |
| [`@thi.ng/transducers`](./packages/transducers) | [](https://www.npmjs.com/package/@thi.ng/transducers) | [changelog](./packages/transducers/CHANGELOG.md) | Composable data transformations |
| [`@thi.ng/transducers-async`](./packages/transducers-async) | [](https://www.npmjs.com/package/@thi.ng/transducers-async) | [changelog](./packages/transducers-async/CHANGELOG.md) | Async transducers, reducers & iterators |
| [`@thi.ng/transducers-binary`](./packages/transducers-binary) | [](https://www.npmjs.com/package/@thi.ng/transducers-binary) | [changelog](./packages/transducers-binary/CHANGELOG.md) | Binary data related transducers |
| [`@thi.ng/transducers-fsm`](./packages/transducers-fsm) | [](https://www.npmjs.com/package/@thi.ng/transducers-fsm) | [changelog](./packages/transducers-fsm/CHANGELOG.md) | Finite state transducer |
| [`@thi.ng/transducers-hdom`](./packages/transducers-hdom) | [](https://www.npmjs.com/package/@thi.ng/transducers-hdom) | [changelog](./packages/transducers-hdom/CHANGELOG.md) | Transducer based hdom UI updates |
| [`@thi.ng/transducers-patch`](./packages/transducers-patch) | [](https://www.npmjs.com/package/@thi.ng/transducers-patch) | [changelog](./packages/transducers-patch/CHANGELOG.md) | Patch-based, array & object editing |
| [`@thi.ng/transducers-stats`](./packages/transducers-stats) | [](https://www.npmjs.com/package/@thi.ng/transducers-stats) | [changelog](./packages/transducers-stats/CHANGELOG.md) | Technical / statistical analysis |### Low-level, binary, memory management, interop
| Project | Version | Changelog | Description |
|-------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------|-------------------------------------------------|
| [`@thi.ng/base-n`](./packages/base-n) | [](https://www.npmjs.com/package/@thi.ng/base-n) | [changelog](./packages/base-n/CHANGELOG.md) | Arbitrary base-n encoding/decoding with presets |
| [`@thi.ng/binary`](./packages/binary) | [](https://www.npmjs.com/package/@thi.ng/binary) | [changelog](./packages/binary/CHANGELOG.md) | Assorted binary / bitwise ops, utilities |
| [`@thi.ng/bitstream`](./packages/bitstream) | [](https://www.npmjs.com/package/@thi.ng/bitstream) | [changelog](./packages/bitstream/CHANGELOG.md) | Bitwise input / output streams |
| [`@thi.ng/dlogic`](./packages/dlogic) | [](https://www.npmjs.com/package/@thi.ng/dlogic) | [changelog](./packages/dlogic/CHANGELOG.md) | Digital logic ops / constructs |
| [`@thi.ng/leb128`](./packages/leb128) | [](https://www.npmjs.com/package/@thi.ng/leb128) | [changelog](./packages/leb128/CHANGELOG.md) | WASM based LEB128 varint encoder / decoder |
| [`@thi.ng/malloc`](./packages/malloc) | [](https://www.npmjs.com/package/@thi.ng/malloc) | [changelog](./packages/malloc/CHANGELOG.md) | Raw & typed array memory pool & allocator |
| [`@thi.ng/morton`](./packages/morton) | [](https://www.npmjs.com/package/@thi.ng/morton) | [changelog](./packages/morton/CHANGELOG.md) | Z-order-curve / Morton coding |
| [`@thi.ng/range-coder`](./packages/range-coder) | [](https://www.npmjs.com/package/@thi.ng/range-coder) | [changelog](./packages/range-coder/CHANGELOG.md) | Binary data Range encoder / decoder |
| [`@thi.ng/rle-pack`](./packages/rle-pack) | [](https://www.npmjs.com/package/@thi.ng/rle-pack) | [changelog](./packages/rle-pack/CHANGELOG.md) | Run-length encoding data compression |
| [`@thi.ng/soa`](./packages/soa) | [](https://www.npmjs.com/package/@thi.ng/soa) | [changelog](./packages/soa/CHANGELOG.md) | Memory mapped data structures & serialization |
| [`@thi.ng/unionstruct`](./packages/unionstruct) | [](https://www.npmjs.com/package/@thi.ng/unionstruct) | [changelog](./packages/unionstruct/CHANGELOG.md) | Wrapper for C-like structs / unions |
| [`@thi.ng/vector-pools`](./packages/vector-pools) | [](https://www.npmjs.com/package/@thi.ng/vector-pools) | [changelog](./packages/vector-pools/CHANGELOG.md) | Data structures for memory mapped vectors |
| [`@thi.ng/wasm-api`](./packages/wasm-api) | [](https://www.npmjs.com/package/@thi.ng/wasm-api) | [changelog](./packages/wasm-api/CHANGELOG.md) | Modular, extensible JS/WebAssembly bridge API |
| [`@thi.ng/wasm-api-bindgen`](./packages/wasm-api-bindgen) | [](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 |
| [`@thi.ng/wasm-api-canvas`](./packages/wasm-api-canvas) | [](https://www.npmjs.com/package/@thi.ng/wasm-api-canvas) | [changelog](./packages/wasm-api-canvas/CHANGELOG.md) | WASM-side Canvas2D API bindings |
| [`@thi.ng/wasm-api-dom`](./packages/wasm-api-dom) | [](https://www.npmjs.com/package/@thi.ng/wasm-api-dom) | [changelog](./packages/wasm-api-dom/CHANGELOG.md) | WASM-side DOM manipulation |
| [`@thi.ng/wasm-api-schedule`](./packages/wasm-api-schedule) | [](https://www.npmjs.com/package/@thi.ng/wasm-api-schedule) | [changelog](./packages/wasm-api-schedule/CHANGELOG.md) | WASM-side delayed code execution/scheduling |### Maths
| Project | Version | Changelog | Description |
|---------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------|------------------------------------------------------------|
| [`@thi.ng/dual-algebra`](./packages/dual-algebra) | [](https://www.npmjs.com/package/@thi.ng/dual-algebra) | [changelog](./packages/dual-algebra/CHANGELOG.md) | Dual number algebra / automatic differentiation |
| [`@thi.ng/dsp`](./packages/dsp) | [](https://www.npmjs.com/package/@thi.ng/dsp) | [changelog](./packages/dsp/CHANGELOG.md) | DSP utils, composable signal gens/processors |
| [`@thi.ng/fuzzy`](./packages/fuzzy) | [](https://www.npmjs.com/package/@thi.ng/fuzzy) | [changelog](./packages/fuzzy/CHANGELOG.md) | Fuzzy logic primitives & rule inference engine |
| [`@thi.ng/intervals`](./packages/intervals) | [](https://www.npmjs.com/package/@thi.ng/intervals) | [changelog](./packages/intervals/CHANGELOG.md) | Open/closed intervals, queries, set ops |
| [`@thi.ng/math`](./packages/math) | [](https://www.npmjs.com/package/@thi.ng/math) | [changelog](./packages/math/CHANGELOG.md) | Assorted common math functions & utilities |
| [`@thi.ng/matrices`](./packages/matrices) | [](https://www.npmjs.com/package/@thi.ng/matrices) | [changelog](./packages/matrices/CHANGELOG.md) | Matrix operations |
| [`@thi.ng/sparse`](./packages/sparse) | [](https://www.npmjs.com/package/@thi.ng/sparse) | [changelog](./packages/sparse/CHANGELOG.md) | Sparse matrix & vector impls |
| [`@thi.ng/timestep`](./packages/timestep) | [](https://www.npmjs.com/package/@thi.ng/timestep) | [changelog](./packages/timestep/CHANGELOG.md) | Fixed timestep simulation updates with state interpolation |
| [`@thi.ng/vectors`](./packages/vectors) | [](https://www.npmjs.com/package/@thi.ng/vectors) | [changelog](./packages/vectors/CHANGELOG.md) | Fixed & arbitrary-length vector ops |### Network
| Project | Version | Changelog | Description |
|---------------------------------------|-------------------------------------------------------------------------------------------------------------|---------------------------------------------|----------------------------------------------------|
| [`@thi.ng/server`](./packages/server) | [](https://www.npmjs.com/package/@thi.ng/server) | [changelog](./packages/server/CHANGELOG.md) | Minimal, extensible, interceptor-based HTTP server |### Randomness
| Project | Version | Changelog | Description |
|-----------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------|----------------------------------------------------------|
| [`@thi.ng/colored-noise`](./packages/colored-noise) | [](https://www.npmjs.com/package/@thi.ng/colored-noise) | [changelog](./packages/colored-noise/CHANGELOG.md) | 1D colored noise generators |
| [`@thi.ng/ksuid`](./packages/ksuid) | [](https://www.npmjs.com/package/@thi.ng/ksuid) | [changelog](./packages/ksuid/CHANGELOG.md) | K-sortable unique identifiers, binary & base-N encoded |
| [`@thi.ng/lowdisc`](./packages/lowdisc) | [](https://www.npmjs.com/package/@thi.ng/lowdisc) | [changelog](./packages/lowdisc/CHANGELOG.md) | n-D Low discrepancy sequence generators |
| [`@thi.ng/random`](./packages/random) | [](https://www.npmjs.com/package/@thi.ng/random) | [changelog](./packages/random/CHANGELOG.md) | Seedable PRNG implementations, distributions & utilities |
| [`@thi.ng/random-fxhash`](./packages/random-fxhash) | [](https://www.npmjs.com/package/@thi.ng/random-fxhash) | [changelog](./packages/random-fxhash/CHANGELOG.md) | PRNG impl & utilities for fxhash projects |
| [`@thi.ng/uuid`](./packages/uuid) | [](https://www.npmjs.com/package/@thi.ng/uuid) | [changelog](./packages/uuid/CHANGELOG.md) | Binary & string-based UUID v4 generator |### Reactive programming
| Project | Version | Changelog | Description |
|-----------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|----------------------------------------------|
| [`@thi.ng/rstream`](./packages/rstream) | [](https://www.npmjs.com/package/@thi.ng/rstream) | [changelog](./packages/rstream/CHANGELOG.md) | Push-based, reactive event stream primitves |
| [`@thi.ng/rstream-csp`](./packages/rstream-csp) | [](https://www.npmjs.com/package/@thi.ng/rstream-csp) | [changelog](./packages/rstream-csp/CHANGELOG.md) | Adapter bridge CSP -> rstream |
| [`@thi.ng/rstream-dot`](./packages/rstream-dot) | [](https://www.npmjs.com/package/@thi.ng/rstream-dot) | [changelog](./packages/rstream-dot/CHANGELOG.md) | Graphviz visualization of rstream topologies |
| [`@thi.ng/rstream-gestures`](./packages/rstream-gestures) | [](https://www.npmjs.com/package/@thi.ng/rstream-gestures) | [changelog](./packages/rstream-gestures/CHANGELOG.md) | Mouse & touch event stream abstraction |
| [`@thi.ng/rstream-graph`](./packages/rstream-graph) | [](https://www.npmjs.com/package/@thi.ng/rstream-graph) | [changelog](./packages/rstream-graph/CHANGELOG.md) | Declarative dataflow graph construction |
| [`@thi.ng/rstream-log`](./packages/rstream-log) | [](https://www.npmjs.com/package/@thi.ng/rstream-log) | [changelog](./packages/rstream-log/CHANGELOG.md) | Hierarchical structured data logging |
| [`@thi.ng/rstream-log-file`](./packages/rstream-log-file) | [](https://www.npmjs.com/package/@thi.ng/rstream-log-file) | [changelog](./packages/rstream-log-file/CHANGELOG.md) | Log-file output handler |
| [`@thi.ng/rstream-query`](./packages/rstream-query) | [](https://www.npmjs.com/package/@thi.ng/rstream-query) | [changelog](./packages/rstream-query/CHANGELOG.md) | Triple store & query engine |### WebGL / GPGPU
| Project | Version | Changelog | Description |
|-----------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------|------------------------------------|
| [`@thi.ng/shader-ast`](./packages/shader-ast) | [](https://www.npmjs.com/package/@thi.ng/shader-ast) | [changelog](./packages/shader-ast/CHANGELOG.md) | AST DSL for x-platform shader code |
| [`@thi.ng/shader-ast-glsl`](./packages/shader-ast-glsl) | [](https://www.npmjs.com/package/@thi.ng/shader-ast-glsl) | [changelog](./packages/shader-ast-glsl/CHANGELOG.md) | GLSL code generator |
| [`@thi.ng/shader-ast-js`](./packages/shader-ast-js) | [](https://www.npmjs.com/package/@thi.ng/shader-ast-js) | [changelog](./packages/shader-ast-js/CHANGELOG.md) | JS code generator |
| [`@thi.ng/shader-ast-optimize`](./packages/shader-ast-optimize) | [](https://www.npmjs.com/package/@thi.ng/shader-ast-optimize) | [changelog](./packages/shader-ast-optimize/CHANGELOG.md) | AST code optimization strategies |
| [`@thi.ng/shader-ast-stdlib`](./packages/shader-ast-stdlib) | [](https://www.npmjs.com/package/@thi.ng/shader-ast-stdlib) | [changelog](./packages/shader-ast-stdlib/CHANGELOG.md) | 100+ useful AST shader functions |
| [`@thi.ng/webgl`](./packages/webgl) | [](https://www.npmjs.com/package/@thi.ng/webgl) | [changelog](./packages/webgl/CHANGELOG.md) | WebGL 1/2 / GPGPU facilities |
| [`@thi.ng/webgl-msdf`](./packages/webgl-msdf) | [](https://www.npmjs.com/package/@thi.ng/webgl-msdf) | [changelog](./packages/webgl-msdf/CHANGELOG.md) | MSDF font rendering |
| [`@thi.ng/webgl-shadertoy`](./packages/webgl-shadertoy) | [](https://www.npmjs.com/package/@thi.ng/webgl-shadertoy) | [changelog](./packages/webgl-shadertoy/CHANGELOG.md) | Shadertoy-like WebGL setup |### Deprecated packages
The following packages have been deprecated. Their readmes describe reasons and alternatives:
| Project | Version | Changelog | Description |
|--------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------|------------------------------------------------|---------------------------------------|
| [`@thi.ng/fsm`](./deprecated/packages/fsm) | [](https://www.npmjs.com/package/@thi.ng/fsm) | [changelog](./packages/fsm/CHANGELOG.md) | FSM / parser primitives |
| [`@thi.ng/geom-api`](./deprecated/packages/geom-api) | [](https://www.npmjs.com/package/@thi.ng/geom-api) | [changelog](./packages/geom-api/CHANGELOG.md) | Shared types for thi.ng/geom packages |
| [`@thi.ng/iterators`](./deprecated/packages/iterators) | [](https://www.npmjs.com/package/@thi.ng/iterators) | [changelog](./packages/iterators/CHANGELOG.md) | ES6 generators / iterators |
| [`@thi.ng/testament`](./deprecated/packages/testament) | [](https://www.npmjs.com/package/@thi.ng/testament) | [changelog](./packages/testament/CHANGELOG.md) | Minimal test runner |## Building
```bash
git clone https://github.com/thi-ng/umbrella.git
cd umbrellayarn install
yarn build
```Once the entire mono-repo has been fully built at least once before, individual
packages can then be (re)built like so:```bash
yarn workspace @thi.ng/transducers run build# or
(cd packages/transducers && yarn build)
# or
(cd packages/transducers && yarn build:esbuild)
```Note: The `yarn build` script alias will also generate TS type declaration
files. This step is only needed once in the beginning or if updating the public
API of a package. If you're confident it's not needed, using the `build:esbuild`
alias is sufficient and much faster. Also, TS declaration files can be manually
rebuilt via `build:decl`...### Building example projects
Please see the [example build
instructions](https://github.com/thi-ng/umbrella/wiki/Example-build-instructions)
in the wiki for further details.### Testing
(Most, but not all packages have tests)
Test for all packages are run via [bun.sh](https://bun.sh).
```bash
# build all packages, then run all tests (in one go)
yarn test# only run all tests
yarn test:only# or individually
yarn workspace @thi.ng/rstream run test
```### Building API docs
Autogenerated documentation (using
[TypeDoc](https://github.com/TypeStrong/typedoc)) will be saved under
`/packages/*/doc/` ([more info](#documentation)).```bash
yarn doc
```### Extracting code examples from readme files & comments
All packages in this repo have prepared infrastructure to extract various code
examples & snippets from their README files and from comments in the source
code. Altogether, there're 800-1000 of them in this repo, but only ~420 have
been processed thus far (it's an ongoing time consuming manual process to
prepare & check each of them, but work is under way! Please get in touch if you
want to help!).The code extraction is handled via
[thi.ng/tangle](https://github.com/thi-ng/umbrella/blob/develop/packages/tangle),
itself a part of thi.ng/umbrella. You can read more details about this process
here:- [Mastodon post #1](https://mastodon.thi.ng/@toxi/111959275083112668)
- [Mastodon post #2](https://mastodon.thi.ng/@toxi/112026554577015934)
- [thi.ng/tangle readme](https://github.com/thi-ng/umbrella/blob/develop/packages/tangle/README.md)To extract code blocks as source files from readmes:
```bash
# in the repo root (to process all packages)
yarn doc:readme# for a single package only
(cd packages/ && yarn doc:readme)
```To extract example code blocks from doc strings (API docs) in source code:
```bash
# in the repo root (to process all packages)
yarn tool:tangle# for a single package only
(cd packages/ && yarn tool:tangle)
```In all cases, the extracted files will be saved in each package's `/export`
folder and can then be run directly via [bun](https://bun.sh):```bash
bun packages/arrays/export/topo-sort.ts
```## Acknowledgements
Maintaining a large monorepo like this requires a lot of infrastructure and I'm
grateful for the tooling provided by the following projects to simplify those
tasks:- [bun](https://bun.sh)
- [esbuild](https://github.com/evanw/esbuild)
- [html-minifier-terser](https://terser.org/html-minifier-terser/)
- [typedoc](https://typedoc.org/)
- [TypeScript](https://www.typescriptlang.org/)
- [Vite](http://vitejs.dev/)
- [@thi.ng/monopub](https://github.com/thi-ng/monopub)## License
© 2015 - 2025 Karsten Schmidt // Apache Software License 2.0
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Karsten Schmidt
💻 📖 🚧 💵
Alberto
💻 💡 🐛 🤔 💵
Arthur Carabott
💻 🤔 💡 📝 💵
André Wachter
💻 🤔 🐛
Gavin Cannizzaro
💻 🐛 🤔
Logan Powell
📖 🐛 🤔 💵
Marcin Ignac
🐛
arcticnoah
💻
allforabit
🐛 💻 🤔 💵
Yifan Wu
🐛 📖
stwind
💻 🐛
evilive
💻
Bnaya Peretz
💻 🐛 🤔
oljeger
🐛
Nik Shevchenko
🐛 💻
Matei Adriel
💻 🐛 🤔
Pierre Grimaud
📖
Matt Huebert
💵
Raphael Saunier
💵
Eric Ihli
💵
David Pham
💵
TBD
🐛 🤔
Pedro Henriques dos Santos Teixeira
💵
Jamie Owen
💻 🐛
Robert Kesteson
🐛 💻
Chancy Kennedy
💵
Jarred Sumner
🐛
Jamie Slome
🐛 🛡️
d3v53c
🐛 🛡️
Jannis Pohlmann
🐛
Shakthi Prasad G S
🐛 💻
Robin Gower
🐛
Michael Latzoni
🐛
Z Yin
🐛
Damien Seguin
🐛 💻
Rui Gil
🐛
Ja|nz
💻 🚇 🚧
Tyler Freeman
🐛 💻
blackhuman
🐛
David Negstad
💻
Muhammad Ridho
🐛 💻
MarcusWagberg
💻
Masashi Yoshikawa
🐛
Guido Schmidt
🐛 💵
tsukamotohideki
💵
Dave Meehan
💻 🤔
Aurélien Bottazini
🐛
Alex
🐛 💵
Ross Cairns
💵
Ruslan Prakapchuk
💵
Jarrod Davis
💵
Nicolas Lebrun
💡
Dawid Górny
💵
Michael Reitzenstein
💵
Sam Nosenzo
💵
Igor Loskutov
💻 🤔
Yury
💻 🤔 💵
Jean-Frédéric Faust
💻 🐛
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!