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 🙏

© 2026 – Pkg Stats / Ryan Hefner

rnrun

v0.4.9

Published

Drop-in replacement for the Expo dev server with a tiny memory footprint. Powered by browser-metro and pre-bundled packages from esm.reactnative.run.

Readme

rnrun

A drop-in replacement for the Expo dev server with a tiny memory footprint. Packages come pre-bundled from esm.reactnative.run, so there is no Metro and no node_modules to install for most projects.

npm install -g rnrun
cd my-expo-app
rnrun start

Open the printed exp:// URL in Expo Go (iOS/Android) or the web URL in a browser. Web has live HMR; native has Fast Refresh.

Commands

rnrun start [dir]              start the dev server (default command)
rnrun bundle [dir] [--out f]   one-shot bundle
rnrun help

start flags: --port, --host lan|localhost, --package-server <url>, --local-packages, --prewarm ios[,android][,web], --quiet.

Running in a container / hosted preview

rnrun is designed to run one project per container that scales to zero. Two things matter there, and both are the difference between a multi-second and a sub-second wake.

Persist the caches on a mounted volume

rnrun caches on disk under $HOME/.rnrun by default. On most container runtimes $HOME is the writable layer, which is wiped on stop/start — so the caches never survive a wake and every wake rebuilds. Under gVisor and other sandboxed or --read-only runtimes this is silent. Point the caches at a persistent volume:

| Env var | What it persists | Effect if ephemeral | |---|---|---| | RNRUN_BUNDLE_CACHE_DIR | assembled bundles | wake rebuilds (30–90s → ~0.5s when persisted) | | RNRUN_TOOLS_DIR | the reanimated worklets plugin | plugin re-fetched every wake | | RNRUN_PKG_CACHE_DIR | pre-bundled packages | packages re-fetched every wake |

RNRUN_BUNDLE_CACHE_DIR=/data/rnrun/bundles \
RNRUN_TOOLS_DIR=/data/rnrun/tools \
RNRUN_PKG_CACHE_DIR=/data/rnrun/pkg \
  rnrun start /app

rnrun prints a warning at startup if the bundle cache is on an ephemeral filesystem (overlay/tmpfs), so a misconfiguration is visible rather than silent.

Pre-bake the worklets plugin (optional)

If a project uses react-native-reanimated, rnrun fetches its babel plugin on first use. To keep that off the startup path, bake it into the image and point at it:

RNRUN_WORKLETS_PLUGIN=/opt/rnrun/react-native-worklets/plugin rnrun start /app

--prewarm vs the bundle cache

With a persistent RNRUN_BUNDLE_CACHE_DIR, a wake serves the cached bundle directly, so --prewarm is a no-op on a warm cache (it builds only when the cache is cold). Without a persistent cache, --prewarm still helps by building during idle rather than on the first scan. The module graph needed for Fast Refresh is built lazily on the first edit, so a cache-hit wake that only serves bundles to a device never pays for it.

Cache env reference

| Var | Default | Purpose | |---|---|---| | RNRUN_BUNDLE_CACHE_DIR | $HOME/.rnrun/bundle-cache | assembled-bundle cache | | RNRUN_BUNDLE_CACHE_MAX | 8 | max cached bundles (LRU) | | RNRUN_NO_BUNDLE_CACHE | — | disable the bundle cache | | RNRUN_TOOLS_DIR | $HOME/.rnrun/tools | fetched build tools (worklets plugin) | | RNRUN_WORKLETS_PLUGIN | — | explicit path to the worklets babel plugin | | RNRUN_PKG_CACHE_DIR | $HOME/.rnrun/pkg-cache | package-response cache | | RNRUN_NO_PKG_CACHE | — | disable the package-response cache |

Keeping devices in step with the server

A phone holds the numeric module ids of the bundle it loaded, and RN's HMRClient never reconnects once its /hot socket drops. So a dev-server restart, a package.json re-init, or a patch missed while the bundle was downloading used to leave Expo Go either silently stale or throwing Requiring unknown module "N" on every edit. rnrun handles this the way Metro's revision map does, plus an automatic reload:

  • every manifest mints an rnrunClient token into launchAsset.url; the bundle route records which bundler session + version it served per token;
  • register-entrypoints on /hot carries that URL back, and the initial update is the catch-up patch for anything the device missed (or a reload when it can't be patched);
  • native bundles carry a tiny dev client that connects to /__rnrun, reconnects with backoff, and calls DevSettings.reload() when the server no longer serves the bundle it is running. Reloads are per device, rate-floored, and loop-free (a reload re-fetches the same URL, which updates the token's record).

Broadcast reloads (full rebuilds, re-inits) still go out on /message.