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

@bugfreedback/bugfreedback

v0.0.12

Published

Nuxt feedback widget with pluggable storage and export adapters

Downloads

260

Readme

bugfreedback

Nuxt feedback widget with screen capture, annotation, pluggable screenshot storage (GCS / S3), and modular export adapters (GitHub, Linear, Jira, Notion, Slack, Asana, Trello, Webhook, IFTTT).

Quick start

Install the module and its peer dependency:

npm install @bugfreedback/bugfreedback @nuxt/ui
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxt/ui', '@bugfreedback/bugfreedback'],
  bugfreedback: {
    enabled: true,
    storage: { provider: 'gcs', bucket: process.env.BUGFREEDBACK_GCS_BUCKET! },
    export: {
      provider: 'github',
      token: process.env.BUGFREEDBACK_GITHUB_TOKEN!,
      owner: 'your-org',
      repo: 'your-repo',
    },
  },
})
<!-- layouts/default.vue -->
<template>
  <div>
    <slot />
    <BugfreedbackHost />
  </div>
</template>

See the getting started guide for theming and the full adapter catalog.

Integration

Submit API

The module registers POST /api/_bugfreedback/submit (override with submitPath). The widget uploads an optional screenshot to your configured storage adapter, then routes the report through your export adapter (GitHub Issue, Linear, Slack, custom webhook, etc.).

| Concern | Guide | |---------|--------| | Storage (GCS / S3) | Storage | | Export providers | Adapters overview | | All module options | Configuration |

Runtime secrets

Adapter credentials can be set in nuxt.config.ts or injected at runtime via environment variables (useful for containers and CI/CD where secrets should not be baked into the build):

| Variable | Used for | |----------|----------| | NUXT_BUGFREEDBACK_EXPORT_TOKEN | GitHub export token (highest precedence) | | GITHUB_FEEDBACK_TOKEN / BUGFREEDBACK_GITHUB_TOKEN | GitHub export token (fallbacks) | | NUXT_BUGFREEDBACK_STORAGE_BUCKET | GCS screenshot bucket (highest precedence) | | FEEDBACK_GCS_BUCKET / BUGFREEDBACK_GCS_BUCKET | GCS screenshot bucket (fallbacks) | | BUGFREEDBACK_* | Per-provider export/storage overrides — see each export guide |

Leave token / bucket empty in config when relying on runtime injection; the submit handler resolves secrets from process.env on each request.

Auth hooks

bugfreedback does not validate JWTs itself. Host apps wire their own auth:

Client — set auth: 'required' and provide a token accessor:

export default defineNuxtPlugin(() => {
  provideBugfreedbackAuth({
    getToken: () => myAuth.getToken(),
    getUser: () => myAuth.user.value,
  })
})

The widget sends Authorization: Bearer <token> when a token is available.

Server — add Nitro middleware on the submit route that validates the Bearer token and sets reporter context:

// event.context.bugfreedbackReporter = { id, username, email }

With auth: 'required', the submit handler returns 401 when neither a Bearer header nor bugfreedbackReporter is present. Token signature/expiry validation is the host's responsibility.

Webhook export

For export.provider: 'webhook', configure outbound auth headers so your receiver can verify requests:

export: {
  provider: 'webhook',
  url: process.env.BUGFREEDBACK_WEBHOOK_URL || '',
  headers: {
    Authorization: `Bearer ${process.env.BUGFREEDBACK_WEBHOOK_SECRET}`,
  },
},

See the webhook export guide for payload format and response expectations.

Screenshots on mobile and tablet

Mobile browsers (iOS and Android) do not support tab capture via getDisplayMedia(). On those platforms the widget shows Attach a screenshot instead of Take a screenshot, opens the device file picker, and runs the same annotate → submit flow.

A (?) help button next to attach explains how to take a system screenshot on the detected device (iPhone, iPad, Samsung, Pixel, OnePlus, Xiaomi, and other major Android OEMs).

| Platform | Screenshot method | |----------|-------------------| | Desktop (Windows, macOS, Linux) | Take a screenshot — tab capture + permission overlay | | iOS / Android (phone or tablet) | Attach a screenshot — system screenshot + file picker |

Development

npm install
npm run dev:prepare
npm run dev          # playground
npm test
npm run docs:dev     # VitePress site

Maintainers: see RELEASING.md for version bumps and npm publish.

Docs & demo: npm run docs:dev · npm run dev (playground at http://localhost:3000)

License

MIT