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

@qontinui/wrapper-v0

v0.1.0

Published

UI Bridge wrapper — Vercel v0 (api-primary with Playwright fallback).

Downloads

74

Readme

@qontinui/wrapper-v0

UI Bridge wrapper for Vercel v0. API-primary with a Playwright fallback for actions v0's public API does not cover.

Actions

| Action | Transports | Endpoint / Notes | | --------------------------- | ----------------------- | --------------------------------------------------------------- | | create-component | api, headless, headed | POST /v1/chats | | iterate-component | api | POST /v1/chats/:chatId/messages (returns ChatDetail) | | export-code | api | GET /v1/chats/:chatId/versions/:versionId (files inline) | | download-component | api | GET /v1/chats/:chatId/versions/:versionId/download (binary) | | list-recent | api | GET /v1/chats?limit=N | | step-through-iterations | headless, headed | Clicks next iteration control | | inspect-preview-state | headless, headed | Reads preview iframe metadata |

Each action declares its supported transports. registerHandlers(transport) only registers the actions that the transport can satisfy, and returns the registered/skipped lists. A NO_HANDLER dispatch error is easier to diagnose than a runtime crash deep inside an action handler that assumed a different context.

The action contracts use componentId and iterationId as parameter names for backward compatibility — internally these are v0's chatId and versionId. Each action file's header comment documents the mapping.

v0 API surface evolves — paths above reflect the OpenAPI spec at https://api.v0.dev/v1/openapi.json as of 2026-04-25. If an action starts failing with 404, re-check against the current spec; the migration from /v1/components to /v1/chats (early 2026) is the kind of churn this wrapper has to track.

Gotchas

OpenAPI spec ≠ live behavior. v0's spec lists multiple response formats for chats.downloadVersion (application/zip and application/gzip), but the live endpoint always returns zip today — Accept: application/gzip is silently ignored, ?format=gzip query returns 422. The download-component action accepts a format parameter as an Accept hint for forward-compat, but result.format reflects the server's actual Content-Type, not the request. So format: 'gzip' today returns { format: 'zip', ... } — truthful instead of misleading. If v0 starts honoring gzip in the future, the wrapper picks it up automatically via Content-Type. Verify-don't-trust applies to any spec-documented capability you haven't probed live.

Setup

cp .env.example .env
# Fill in V0_ACCESS_TOKEN.
# For Playwright-backed actions, also set V0_STORAGE_STATE_PATH to a
# pre-warmed storage state JSON created via:
#   npx playwright open --save-storage=./v0-storage.json https://v0.app

Scripts

npm run build      # tsup (cjs+esm) + tsc (.d.ts)
npm run typecheck  # tsc --noEmit
npm run test       # vitest