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

@cavuno/board

v1.36.0

Published

Typed isomorphic client for the Cavuno Board API

Readme

@cavuno/board

Typed, isomorphic client for the Cavuno Board API — the headless toolkit for building fully custom job board frontends. Zero dependencies; runs in the browser, Node ≥ 20, and Cloudflare Workers.

You bring the framework and own the layout; the SDK brings the job board: jobs and search, companies, salaries, blog, board-user auth, saved jobs, applications, job alerts, messaging, employer self-service, checkout, and the candidate paywall — every method typed from the API's own OpenAPI contract.

Building with a coding agent

The package ships an Agent Skills corpus for Codex, Claude Code, Cursor, and other compatible coding agents. It teaches them how to wire a board correctly — client setup, auth and session ownership, pagination, gating, error handling, and a runtime smoke test:

npm install @cavuno/board     # or: pnpm add / yarn add / bun add
npx @cavuno/board setup       # copies version-matched Agent Skills

Then ask your agent: "set up my Cavuno board" — it reads the cavuno-board-setup skill and works surface by surface. Because the skills live in your project and match your installed version, the agent never works from stale docs.

Quick start (by hand)

import { createBoardClient } from '@cavuno/board';

const board = createBoardClient({
  board: process.env.PUBLIC_CAVUNO_BOARD!, // pk_… publishable key
});

const { name, theme, features } = await board.context();
const page = await board.jobs.list({ limit: 20 });
const job = await board.jobs.retrieve('senior-chef');

Every method accepts trailing FetchOptionssignal, headers, and framework caching directives (next: { tags }, cf: {…}) pass through to fetch untouched. Walk full catalogs with the async iterator:

import { paginate } from '@cavuno/board';

// the query `limit` is the page size; toArray's `limit` caps items collected
for await (const card of paginate(board.jobs.list, { limit: 100 })) {
  urls.push(card.links.public);
}
const first500 = await paginate(board.companies.list, { limit: 100 })
  .toArray({ limit: 500 });

Errors are typed — every non-2xx throws a BoardApiError carrying the full v1 envelope (status, code, details, requestId), with guards like isNotFound, isRateLimited, and isBoardPasswordRequired.

Auth model

Three tiers, safe for browsers by construction:

  • pk_… publishable key — identifies the board; public by design.
  • Board-user JWT — candidate/employer sessions via board.auth.*. Pluggable storage (memory in the browser, nostore on the server); on SSR, keep the session in an httpOnly cookie your app owns and pass the token per call. No auto-refresh on 401 — rotation is explicit.
  • No secret keys — operator/admin credentials never touch this SDK.

Escape hatch

board.client.fetch<T>(path, init) sends a typed request through the full pipeline (board base path, headers, bearer token, hooks) for endpoints the SDK doesn't cover yet.

Docs

  • SDK guides and reference: https://cavuno.com/docs/sdk
  • The OpenAPI document: GET https://api.cavuno.com/v1/openapi.json
  • Reference starter (TanStack Start on Cloudflare Workers): https://github.com/wollemiahq/cavuno-board-starter

MIT © Wollemia