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

webappwiz

v0.0.59

Published

The parts of a web app that get written again every time, behind interfaces a test can replace

Readme

webappwiz

The parts of a web app that get written again every time, behind interfaces a test can replace. One package, one subpath per module.

bun add webappwiz
import { Duration } from "webappwiz/time";
import { NodeFs } from "webappwiz/system";

There is no webappwiz entry point, only the subpaths below. A barrel over all of them would make import "webappwiz" load every module, including the ones that only run in a browser or only on a server, and it would become the default for anything that resolves the package by name. Importing what you mean keeps the rest unread.

| Subpath | | | --- | --- | | webappwiz/abort | Ways of bringing an AbortSignal to bear on work that does not take one | | webappwiz/assert | The invariants a type cannot state, checked at runtime | | webappwiz/browser | The browser platform behind interfaces: scrolling, animation frames, device and visibility | | webappwiz/cmd | Builds a CLI: subcommands, typed positional arguments and flag options | | webappwiz/creds | API keys and tokens, read from the environment, a .env file or the operating system's secret store, as the caller lists | | webappwiz/dictate | Dictation: the browser's mic as PCM16, streamed to a server that transcribes it live | | webappwiz/disposable | Resources that must be released, and stacks that release them in reverse order | | webappwiz/events | Typed event dispatch, with a read-only view to hand to whoever listens | | webappwiz/geometry | The 2D value types a web app keeps rewriting: Rect, Position and a QuadTree | | webappwiz/id | A source of identifiers behind an interface, so tests can make them predictable | | webappwiz/log | Logging behind a Logger interface, with decorators and an in-memory double | | webappwiz/md | A markdown document as a data source: frontmatter fields, sections and code blocks | | webappwiz/ship | Releases every package in a workspace together, at one version | | webappwiz/skills | The agent skills a project installs from a repository's release tags, through the skills CLI | | webappwiz/system | Interfaces for the things that touch the machine, so code under test doesn't | | webappwiz/task | Somewhere to say "this needs doing again" without saying when | | webappwiz/time | Time as a seam: Duration, Clock and Timer, with fakes for each | | webappwiz/worker | Work sent somewhere else and answered, behind an interface |

Where a subpath runs

Most of these run anywhere. The ones that do not are kept off their module's main entry point, so importing a task queue on a server does not reach for requestAnimationFrame:

  • Needs a browser: webappwiz/browser, webappwiz/dictate/browser, webappwiz/task/browser, webappwiz/worker/web
  • Needs a server: webappwiz/cmd, webappwiz/dictate/server, webappwiz/ship, webappwiz/skills, webappwiz/system

platform.test.ts holds that line, failing if an entry point that runs anywhere starts reaching one that does not.

The fakes live beside what they replace, under /testing: webappwiz/dictate/testing, webappwiz/time/testing, webappwiz/system/testing, webappwiz/ship/testing, webappwiz/worker/testing.

The rest of webappwiz

Everything here has no dependencies to speak of. What does is published separately, so nothing you did not ask for arrives with it: @webappwiz/react (peer react), @webappwiz/aws (peers aws-cdk-lib, constructs), @webappwiz/scry, and the two commands, and @webappwiz/cli.