npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@callstack/polygen

v0.2.1

Published

React Native Module for running WebAssembly modules, with native performance.

Readme

Getting started

[!WARNING] This library is still under active development. Feel free to hack around, but use at your own risk.

How it works?

Instead of interpreting the WebAssembly modules, or doing Just-in-Time compilation, Polygen instead leverages the Ahead-of-Time compilation. This solution can be used in iOS applications and other Apple devices, where JIT compilation is not allowed, without impacting performance.

It uses the wonderful wasm2c tool to generate C code from every WebAssembly module. Then, additional React Native/JSI glue native code is generated that allows to call the generated C code from JavaScript.

This gives us the ability to run WebAssembly modules in a statically compiled way, without the need for JIT compilation.

Features

| Feature | Status | |----------------------|----------| | WebAssembly 2.0 | 🟩 | | - Exceptions | 🟥 | | - Threads | 🟥 | | - Garbage Collection | 🟥 | | - Multiple Memories | 🟨 | | - Mutable Globals | 🟨 | | WebAPI | 🟨 | | - Fetch | 🟩 | | Native | 🟨 | | - Metro | 🟨 | | - Re.Pack | 🟥 |

Requirements

  • React Native 0.75+

Prerequisites

Because Polygen Codegen depends on wasm2c tool, you need to have it installed on your machine. You can install it using your package manager:

# macOS
brew install wabt

# linux
sudo apt install wabt

If for some reason:

  • you cannot use the package manager method,
  • you are on Windows,
  • or the version there is outdated,

you can still install wabt in a few other ways:

Option 1: Downloading prebuild binaries

Download precompiled binaries from the releases page of wabt project. Select correct version for your platform and extract it to the directory of your choice.

Option 2: Building from source

You can also build wabt from source. To do this, you need to have cmake and git installed on your machine.

$ git clone --recursive https://github.com/WebAssembly/wabt
$ cd wabt
$ git submodule update --init
$ cmake -B build -S .
$ cmake --build build

Install binaries

You need to make binaries visible to Polygen. You can do this by adding the directory with the binaries to your system environment:

# Using WABT_PATH variable:
$ export WABT_PATH=/path/to/wabt/binaries

# or adding to PATH:
$ export PATH="$PATH:/path/to/wabt/binaries"

If you built WABT from source, the path should point to the build directory.

To make those changes persistent, add them to your .bashrc/.zshrc/.profile file.

Installation

In your React Native project run:

npx @callstack/polygen init
# or
yarn dlx @callstack/polygen init

Usage

In your application folder run:

## npm
npx polygen scan
# apply changes in config
npx polygen generate

## yarn
yarn polygen scan
# apply changes in config
yarn polygen generate

Run polygen scan to search for changes in found WebModules. All modules must be explictly listed in polygen.config.[mc]js Run polygen generate after any of the WebAssembly module changed.

To use WebAssembly API, import @callstack/polygen/polyfill in your application (before any other imports):

import '@callstack/polygen/polyfill';

Metro

Polygen has a Metro plugin that allows you to import WebAssembly modules in your application.

[!WARNING] Currently, only modules from the current package are supported. This will be implemented in the next version.

Add @callstack/polygen-metro-config dependency to your project:

yarn add -D @callstack/polygen-metro-config

Then, in your metro.config.js file, add the following:

const { withPolygenConfig } = require('@callstack/polygen-metro-config');

And wrap your Metro configuration with withPolygenConfig call:

const config = {
  // ...
};

module.exports = withPolygenConfig(
  mergeConfig(getDefaultConfig(__dirname), config)
);

Then, you should be able to import module buffers in your application:

import example from '../table_test.wasm';

const instance = new WebAssembly.Instance(new WebAssembly.Module(example));

Using Fetch

You can also pass WebAssembly module binary loaded using fetch, or any other method:

await WebAssembly.compileStreaming(
  fetch('http://localhost:8000/example.wasm')
)

The downloaded module is not actually executed, but a native counterpart is searched based on the module checksum.

This does not require any additional setup, but it has the overhead of fetching the module on runtime, just for it to be discarded.

For it to work, you need:

  • Place exactly the same WebAssembly Module in src directory of your application.
  • The module binary checksums must match

Examples

See apps directory for usage examples.

Contributing

See the contributing guide to learn how to contribute to the repository and the development workflow.

Made with ❤️ at Callstack

Polygen is an open source project and will always remain free to use. If you think it's cool, please star it 🌟. Callstack is a group of React and React Native geeks, contact us at [email protected] if you need any help with these or just want to say hi!

Like the project? ⚛️ Join the team who does amazing stuff for clients and drives React Native Open Source! 🔥