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

@restorehub/widget

v1.0.4

Published

Embeddable Discord verification widget for Restore Hub. Add Discord SSO and member verification to any website with one line of code.

Readme

@restorehub/widget

Add a "Login with Discord" button to any website. Users verify through Discord OAuth, get a role in your server, and your site gets their identity — all in one click.

Install

npm install @restorehub/widget

Which approach should I use?

I want a pre-built Discord button (React)

Renders a styled button with the Discord logo. Drop it in and it works.

import { RestoreHubButton } from "@restorehub/widget/react";

function App() {
  return (
    <RestoreHubButton
      serverSlug="your-server-slug"
      onSuccess={(result) => {
        console.log("Verified!", result.user.username);
        console.log("Token:", result.token);
      }}
      onError={(err) => console.error(err)}
    />
  );
}

Props:

| Prop | Type | Default | Description | |------|------|---------|-------------| | serverSlug | string | required | Your server's slug from the dashboard | | onSuccess | function | — | Called with { token, user } after verification | | onError | function | — | Called if verification fails or popup is closed | | buttonText | string | "Login with Discord" | Button label | | buttonColor | string | "#5865F2" | Button background color | | buttonTextColor | string | "#FFFFFF" | Button text color |

I want to use my own button (any framework)

verify() doesn't render anything — it just opens the popup. Attach it to whatever button you want.

<button id="discord-btn">Sign in with Discord</button>

<script type="module">
  import { verify } from "@restorehub/widget";

  document.getElementById("discord-btn").onclick = async () => {
    try {
      const result = await verify("your-server-slug");
      console.log("Verified!", result.user.username);
      console.log("Token:", result.token);
    } catch (err) {
      console.error("Failed:", err.message);
    }
  };
</script>

What happens when the user clicks

  1. A popup opens showing the Discord OAuth consent screen
  2. User clicks "Authorize" — Discord confirms their identity
  3. Restore Hub verifies them, assigns their role, signs a JWT
  4. Popup closes automatically
  5. Your onSuccess callback fires with the user's info and a signed token

Verifying the token on your backend

The result.token is a signed JWT. Don't trust it client-side — verify it on your server:

curl -X POST https://api.restorehub.net/api/widget/token/verify \
  -H "Content-Type: application/json" \
  -d '{"token": "eyJhbG..."}'
{
  "valid": true,
  "userId": "123456789",
  "username": "johndoe",
  "serverId": "abc-123",
  "guildId": "987654321"
}

Error handling

try {
  const result = await verify("my-server");
} catch (err) {
  // err.code is one of:
  // "POPUP_BLOCKED"       — browser blocked the popup
  // "POPUP_CLOSED"        — user closed without completing
  // "VERIFICATION_FAILED" — blocked by security checks
  // "NETWORK_ERROR"       — connection issue
  // "TIMEOUT"             — took longer than 10 minutes
}

Setup (one time)

  1. Create an account at restorehub.net
  2. Add your Discord bot and server
  3. Go to Server Settings → Widget and enable it
  4. Add your website's domain to Allowed Origins
  5. Use the server's slug (from General settings) in your code

Links

License

MIT