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

@vitrinka/link

v0.1.3

Published

vitrinka device link — the Netflix-style code flow that mints an ingest-only recorder token for the web and Expo recorders. Zero dependencies.

Readme

@vitrinka/link

The device link both vitrinka recorders authenticate with: the recorder asks the server for a short code, the tester approves it in vitrinka (same device via a link, or another device via the server-rendered QR), and the recorder receives an ingest-only vkr_ token. No baked secrets, no QR library.

import { startLink, pollLink, linkWorkspace, LinkExpired, LinkWorkspaceMismatch } from '@vitrinka/link';

const base = 'https://app.vitrinka.ai/w/acme';
const workspace = linkWorkspace(base); // 'acme' — undefined for a bare origin
const start = await startLink(base, { label: 'Safari on macOS · app.example.test', workspace });
start.user_code;  // 'ABCD-EFGH' — show it
start.verifyUrl;  // open on the same device (…&workspace=acme preselects it)
start.qrUrl;      // <img src> for the desktop→phone path (SVG from the server)
const linked = await pollLink(start.base, start.device_code, { interval: start.interval, expiresIn: start.expires_in, workspace });
linked.token;     // 'vkr_…' — store it, send it as the bearer

Doors (at the base URL's origin): POST /api/v1/cli/auth {kind:"recorder",label} → 201 {device_code, user_code, verify_path, verify_url?, qr_path, interval, expires_in}; POST /api/v1/cli/auth/claim {device_code} → 202 pending · 200 {token, kind, workspace, label, expires_in} · 404 expired (LinkExpired). A transient claim failure (network TypeError, 5xx, 408, 429) never ends the poll: it backs off (doubling, capped at 30s, honouring a readable Retry-After) until expiresIn passes, then rejects with LinkExpired; any other 4xx rejects with LinkError. A 401 from any session door means the token is dead: forget it and link again.

A token only authenticates in the workspace it was approved into, so a /w/<slug> base passes that slug as workspace: it rides the approve and QR URLs as a workspace=<slug> preselect (never the start body), and a claim approved into another workspace rejects with LinkWorkspaceMismatch (linked, expected, a ready-to-show message) — the token is discarded.

Dock (@vitrinka/link/dock)

Where a recorder HUD may rest, shared by every recorder so a throw lands the same way everywhere: six spots (corners plus top and bottom centre), a release projected along its velocity, and a tuck into a side-edge tab when more than a third of the HUD is pushed past that edge. Pure numbers.

import { settle, neighbour, parsePlace, spotRect } from '@vitrinka/link/dock';

settle(releasedRect, { x: vx, y: vy }, viewport, insets); // { spot: 'tr' } | { tuck: 'right', y: 0.4 }
neighbour({ spot: 'br' }, 'ArrowLeft');                   // { spot: 'bc' } — the keyboard alternative