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

@hideandseekdigital/comet

v0.4.1

Published

Self-hosted feedback widget for Next.js. Submissions land in your Linear workspace using your own credentials.

Downloads

1,112

Readme

@hideandseekdigital/comet

Self-contained feedback widget for Next.js. Drop in a React component, re-export a server handler, submissions become Linear issues in your own workspace.

Install

npm install @hideandseekdigital/comet

Client

import { FeedbackWidget } from '@hideandseekdigital/comet'

export default function Layout({ children }) {
  return (
    <>
      {children}
      <FeedbackWidget />
    </>
  )
}

Server

Create app/api/comet/route.ts:

import { createHandler } from '@hideandseekdigital/comet/server'

export const runtime = 'nodejs'
export const { POST } = createHandler({
  allowedOrigins: ['https://yourdomain.com'],
  rateLimit: { perMinute: 10 },
})

The nodejs runtime declaration is required — the Linear SDK uses Node APIs and will fail silently on Edge.

Environment

LINEAR_API_KEY=lin_api_xxx
LINEAR_TEAM_ID=abc123

On first submission, Comet creates four labels in your Linear workspace if they don't exist: Comet, Bug Report, Feature Request, Feedback. Every issue gets the Comet label plus the category-specific one.

Props

All props are optional.

| Prop | Type | Default | Purpose | |---|---|---|---| | endpoint | string | /api/comet | Where the widget POSTs submissions | | categories | Category[] | all three | Which form tabs to show (pass a single-element array to lock the form to one category) | | getDebugState | () => Record<string, unknown> | — | Called when the user opens the form. Return any JSON-serializable object — it's surfaced in the Linear issue and Claude Code prompt. | | onReady | () => void | — | Fires once the SDK is attached to window |

Server config

interface CreateHandlerConfig {
  allowedOrigins: string[]
  rateLimit?: { perMinute: number }
  labels?: {
    always?: string    // default: 'Comet'
    bug?: string       // default: 'Bug Report'
    feature?: string   // default: 'Feature Request'
    feedback?: string  // default: 'Feedback'
  }
}

SDK

window.FeedbackWidget.setUser({ email, name })
window.FeedbackWidget.setCustomData({ plan: 'pro' })
window.FeedbackWidget.capture()
window.FeedbackWidget.on('submit', cb)

The SDK is attached during the component's first render. If you call SDK methods at app startup, use the onReady prop to wait.

Security

  • Origin check (primary): requests must come from a domain in allowedOrigins. The check is required in production — createHandler throws if omitted.
  • Rate limiting (opt-in): per-IP, in-memory, best-effort on serverless.
  • Token storage: your LINEAR_API_KEY lives in your .env.local only. Comet never sees it — there is no hosted Comet backend.

License

MIT