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

cordless

v3.0.0

Published

🤖 Create a Discord bot with 3 lines of code!

Readme

cordless

cordless is a simple wrapper for discord.js that allows you to create extensive and extensible Discord bots.

yarn add cordless
npm i cordless

Quick Start

⏲️ Estimated time: 5 minutes

  1. Follow docs/setup.md to create a new bot in the Discord developer portal.
  2. Write your first command and initialize your bot:
// TypeScript
import { BotCommand, init } from 'cordless'

const ping: BotCommand = {
  name: 'ping',
  handler: ({ interaction }) => interaction.reply('Pong!'),
}

init({ commands: [ping], token: 'your.bot.token' })
// JavaScript
const cordless = require('cordless')

const ping = {
  name: 'ping',
  handler: ({ interaction }) => interaction.reply('Pong!'),
}

cordless.init({ commands: [ping], token: 'your.bot.token' })

Advanced Usage

Create advanced interactions

Cordless allows you to interface with the full Discord Application Commands API in a declarative fashion:

For a quick overview of the commands API, see: docs/commands.md

Subscribe to Gateway Events

Commands are the easiest way to let users interact with your bot, but sometimes you need to react to other events as they happen (for example: user joined the server, a message was deleted, etc). You can use the built-in event handlers to easily subscribe to any Discord Gateway Event.

For example, let's say our bot needs to greet new text channels whenever they are created, expect for channels that start with admin-. We can subscribe an event handler to the channelCreate event:

// TypeScript
import { BotEventHandler } from 'cordless'
import { ChannelType } from 'discord.js'

const channelGreeter: BotEventHandler<'channelCreate'> = {
  event: 'channelCreate',
  condition: (channel) => !channel.name.startsWith('admin-'),
  callback: (channel) => {
    if (channel.type === ChannelType.GuildText) {
      return channel.send(`Hello world! This is ${channel.name}`)
    }
  },
}

See: docs/events.md

Using discord.js features

The init method returns a logged-in discord.js Client.

const client = await init({
  // ...
})

console.log(`Logged in as ${client.user.tag}!`)

See discord.js documentation for more information about using the client.

Context and State Management

You can share business logic and state between your different event handlers using context. By default, the context contains the discord.js client and the current list of event handlers. You can also extend the context with your own custom context to share additional business logic and even implement state management.

See: docs/context.md

Override the default Gateway Intents

By default, cordless initializes the discord.js client with the Gateway Intents [GUILDS, GUILD_MESSAGES]. This should be sufficient for bots that only use command interactions, or bots that only subscribe to events like "messageCreate". You can provide your own list of intents if you need additional functionality.

See: docs/intents.md

Local development

Clone and install the dependencies:

git clone https://github.com/TomerRon/cordless.git
cd cordless
yarn

We recommend installing yalc. Publish your changes locally with:

yalc publish

You can then test your changes in a local app using:

yalc add cordless

Unit tests

Run the unit tests:

yarn test

End-to-end tests

You must first create two bots and add them to a Discord server. One of the bots will run the cordless client, and the other bot will pretend to be a normal user. The cordless client bot must have the "Message Content Intent" enabled - you can enable it in the Discord Developer Dashboard, in your application's "Bot" page.

You'll need the tokens for both of the bots, and the channel ID of a channel where the bots can send messages.

Copy the .env file and edit it:

cp .example.env .env
# .env
E2E_CLIENT_TOKEN=some.discord.token
E2E_USER_TOKEN=some.discord.token
E2E_CHANNEL_ID=12345678

Run the e2e tests:

yarn e2e

Special thanks

Huge shoutout to fivenp (@fivenp) for the amazing visual assets. Go check out his work!

License

This project is licensed under the ISC License - see the LICENSE file for details.