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

@sayrio/paseo-plugin

v0.2.0

Published

A paseo plugin for viewing and managing your Sayr tasks

Readme

Sayr in Paseo

Project management right from your coding agent. View, comment, and manage your Sayr tasks, or click a button and pass it off to an agent. Define a default prompt when passing it along, or customize it when passing off.

Screenshots

Board — multi-org, status columns, filters

Task detail — inline editing, rich rendering, AI summary

For reference — the real Sayr web app the plugin's board mirrors

Requires

  • An account on Sayr.io or,
  • A self hosted instance of Sayr
  • Valid API key (can be created here)
  • Sayr CLI

Install

paseo plugin install npm:@sayrio/paseo-plugin

To install a specific release, add a version to the spec (npm:@sayrio/[email protected]). Pick up newer releases later with paseo plugin update sayr.

To track the latest source on main instead of published npm releases, install from git:

paseo plugin add dorasto/sayr --ref main --path packages/paseo-plugin

Either way the plugin installs under the ID sayr. Then work through Requirements below — the plugin is a thin shell over the sayr CLI, so it can't do anything until that's installed and logged in on the daemon machine.

How it works

The plugin doesn't call the Sayr API directly. Every RPC handler shells out to an installed sayr CLI binary (@sayrio/cli, see packages/cli/README.md) on the daemon machine and parses its --json output. That means:

  • Auth is whatever sayr login already has stored in ~/.sayr/config.json on the daemon — the plugin never sees or stores a token itself.
  • Every write action (status, priority, assignees, comments) round-trips through the same CLI commands you could run by hand, so plugin and CLI can never drift in what they're capable of.

Requirements

  • Paseo >=0.8.0.
  • The sayr CLI installed and logged in on the daemon machine (not just wherever the Paseo app itself is running):
    npm install -g @sayrio/cli
    sayr login --token api_xxxxxxxx

Settings

Settings → Plugins → Sayr lets you point the plugin at a different installed binary — e.g. sayr-local to work against a local dev backend instead of production (see the CLI README's SAYR_PROFILE section). Stored server-side at $PASEO_HOME/plugins/sayr/settings.json, defaulting to sayr.

Features

  • Board — every organization the CLI's logged-in user belongs to, fetched in parallel, with backlog/todo/in-progress columns (done/canceled tasks aren't fetched at all — the board isn't a full archive). Search, and per-org/per-priority filter chips.
  • Task detail — opens as a resizable side sheet, not a modal, mirroring the real product's panel behavior rather than replacing the whole screen. Status, priority, and assignees are all editable inline; assignee/category names and colors resolve the same way the web app's own pickers do.
  • Rich comment/description rendering — task descriptions and comment bodies are ProseKit documents, not markdown strings. client/prosekit-view.tsx renders the real node/mark tree (headings, bold/italic/strike/underline/code, lists, blockquotes, code blocks) as actual styled React Native elements, plus @user/#task/!category mention pills — not a flattened, unformatted dump of the text. See that file's header comment for exactly what is and isn't covered (no live task-title lookup in task mentions, no avatar image inside a mention pill, no table grids, no code block syntax highlighting).
  • Send to agent — hands a task's title, status, priority, description, and recent comments off to a new Paseo agent as a seed prompt (client/agent-prompt.ts), via a real workspace + agent creation call, not just a copy-paste.

Architecture

Standard Paseo plugin layout — client/ (React Native, no Node/DOM APIs except the one platform-gated client/web.ts), server/ (the daemon subprocess, shells out to the CLI, can use Node freely), shared/ (Zod RPC contracts and plain types, importable from both). Every write and every non-trivial read goes through a defineRpc contract in shared/task.ts/shared/settings.ts, handled in server/task-handlers.ts/server/settings-handlers.ts, called from client/ via useRpc(). See AGENTS.md's row for this package and the individual file header comments for the reasoning behind specific choices (why the sheet isn't a host Modal, why colors are priority-based rather than per-org, why shared/ has small local copies of a couple of @repo/util helpers instead of importing them, etc.).

Development

cd packages/paseo-plugin
pnpm typecheck        # tsc --noEmit
pnpm lint             # biome check .
pnpm lint:fix         # biome check . --write

No build step — Paseo loads plugin source directly. The loop after editing anything under client/, server/, or shared/:

paseo plugin reload sayr
paseo plugin logs sayr   # confirm "Plugin ready" with no error

Only run pnpm install at the repo root if you add a new dependency to package.json. Every RN client file should stay free of DOM/Node APIs (rg -n "document\.|window\.|className=|onClick=" client/ should only ever match client/web.ts), and no async arrow functions in client code (a Hermes bug) — worth a quick grep before reloading if you touched anything under client/.

Known gaps

  • Labels can be created but not edited or deleted. GET/POST /me/labels and the labels picker cover listing, selecting, and creating a label (with a public/private toggle), but there's no way to rename, recolor, or delete an existing one from the plugin — that still needs the web app.
  • Board doesn't show done/canceled tasks. The status picker still covers the full status enum, so a task can be moved there — it just drops off the board once it is.

Shoutouts

Inspiration of the layout & UI comes from gpambrozio's github-board plugin. Great resource for learning how to build Paseo plugins. <3