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

@brian-dausman/aog-widget

v1.0.17

Published

An awesome widget for allowing users to Air their Grievences. Using Typescript and Supabase, but highly extendable to use your own services.

Readme

AoG Widget Documentation

Quick Start

  1. Add the script to your HTML:
<script src="https://www.nerdswithcharisma.com/aog/nwc-aog.js"></script>
  1. Initialize with your project ID:
window.AoGWidget.init({
  projectId: "your-project-id",
});

That's it! You'll now have a feedback button with all the defaults on your page. You can access the dashboard at NWC's AoG login page


Configuration

Basic Config

OOtB you can turn off screenshots if you want to using the disableScreenshot property. You can also set the theme to light or dark, but don't worry, you can customize farther later on.

window.AoGWidget.init({
  projectId: "your-project-id",
  disableScreenshot: false, // Set to true to disable screenshot capture
  theme: {
    mode: "light", // or "dark"
  },
});

Animations

The default animation is a subtle fade/scale animation, but if you want to do something crazy, go right ahead and modify the easing prop. You can control how long the animation takes with the duration property too.

animation: {
  duration: 5000, // milliseconds
  easing: "cubic-bezier(0.4, 1.56, 0.7, 1)"
}

Feedback Button

You can customize the look and feel of the button as well (this is the docked button that triggers the modal, incase that wasn't obious).

All are pretty self-explanitory except, element. What's this, you ask?! If you want a custom button to trigger the feedback, you'd use that, making all the other values pretty much useless but hey, control!

button: {
  color: "rgb(255, 0, 92)", // Background color, hex or rgba
  textColor: "#ffffff", // Text color
  position: "bottom-right", // top-left, top-right, bottom-left, bottom-right
  text: "WHAT?!", // Button text
  - or -
  element: document.querySelector("#custom-button") // Use custom element as trigger
}

Modal

You can customize the look of the modal itself once it's open.

modal: {
  title: "I'm A Modal Title!!!!",   // the heading at the top of the modal
  tagline: "We'd love to hear from you, unless it's bad news, then keep it to yourself.", // the taline below the heading
  customStyles: "background-color: rgb(255, 0, 92) !important;", // any custom styles applied to the modal itself
}

Ratings

Inside the modal you can change the rating schema. Change the color, the label title, the value sent back or to the db, and the icon

ratings: [
  {
    color: "#ff4444",
    title: "Poor",
    icon: "fa fa-frown", // :: todo
    value: 1,
  },
  {
    color: "#00c851",
    title: "Excellent",
    icon: "fa fa-smile",
    value: 5,
  },
];

Inputs

Style the inputs how you'd like as well.

inputs: {
  email: {
    label: "Give us your email",
    customStyles: "border: 2px solid rgb(255, 0, 92);"
  },
  message: {
    label: "Feed us feedback!",
    customStyles: "border: 2px solid rgb(255, 0, 92);"
  }
}

Modal Buttons

Style or change the content of the submit or cancel button inside the modal.

submit: {
  text: "GOOOOOOO!",
  customStyles: "background-color: rgb(255, 0, 92); color: #ffffff; padding: 2px 10px; border-radius: 4px;"
}
cancel: {
  text: "Back up",
  customStyles:
    "background-color: #fff; border: 1px solid #d7d7d7; color: #000000; padding: 5px 10px; border-radius: 6px;",
},

Toast Messages

When the submit event happens, we will throw a success or error scenario, which you can customize the messaging (you can use css to customize the styles in your own css file if you'd like).

messages: {
  success: "Got it, 'ppreciate it!",
  error: "Ugh, how rude!"
}

Callback

Don't want to use our db? Have your own or want to do cool custom stuff with the feedback, then this is the part you should really pay attention to.

onSubmit: async (payload) => {
  console.log("🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥", payload);
  // payload  will look like
  /*
  {
    email: string;
    message: string;
    projectId: string;
    rating: number (or custom if you've overridden);
    screenshot: baseImage;
    deviceData: {
      colorScheme: MediaQueryList;
      language: BrowserLanguage;
      platform: DeviceOsType;
      referrer: string;
      url: string (where they submitted the feedback);
      userAgent: sting;
      viewport: {
        width: number;
        height: number;
      }
    }
  */
};

Public Methods

const widget = window.AoGWidget.init({...});
widget.open();  // Open the feedback modal
widget.close(); // Close the feedback modal
widget.setProject("new-project-id"); // Change project ID