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

chrxmeestream

v1.1.0

Published

A dead-simple Lavalink alternative powered by FFMPEG + yt-dlp.

Downloads

269

Readme

🎵 ChrxmeeStream

A dead-simple Lavalink alternative powered by FFMPEG + yt-dlp. Even a baby could use it. 🍼


What is this?

ChrxmeeStream is a standalone audio node for Discord bots.
Your bot sends commands over WebSocket → ChrxmeeStream resolves the source, runs FFMPEG, and streams raw PCM audio back.
No bloat. No Java. No suffering.


Requirements

Before starting, make sure you have these installed on your server:

| Tool | Install | |---|---| | Node.js ≥ 18 | https://nodejs.org | | FFMPEG | apt install ffmpeg / brew install ffmpeg / winget install ffmpeg | | yt-dlp | pip install yt-dlp / brew install yt-dlp / winget install yt-dlp |


Install

npm install chrxmeestream

Start the server

# Default settings
npx chrxmeestream

# Custom settings via environment variables
CHRXMEE_PORT=2333 \
CHRXMEE_PASSWORD=mysecretpassword \
CHRXMEE_AUDIO_DIR=./audio \
npx chrxmeestream

| Variable | Default | Description | |---|---|---| | CHRXMEE_PORT | 2333 | WebSocket port | | CHRXMEE_HOST | 0.0.0.0 | Host to bind to | | CHRXMEE_PASSWORD | chrxmee | Auth password | | CHRXMEE_AUDIO_DIR | ./audio | Folder for local files |


Connecting from your Discord bot

Connect via WebSocket with these headers:

const ws = new WebSocket("ws://localhost:2333", {
  headers: {
    "Authorization": "chrxmee",   // your password
    "Guild-Id": "123456789",       // Discord guild ID
  }
});

Commands (ops)

Send JSON text frames to control playback.

▶️ Play

{ "op": "play", "source": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }
{ "op": "play", "source": "WRITE(mysong.mp3)" }
{ "op": "play", "source": "https://soundcloud.com/artist/track" }

⏹️ Stop

{ "op": "stop" }

⏸️ Pause / ▶️ Resume

{ "op": "pause" }
{ "op": "resume" }

🔊 Volume (0–200)

{ "op": "volume", "value": 80 }

⏩ Seek (seconds)

{ "op": "seek", "value": 90 }

🎛️ Filter

{ "op": "filter", "filters": ["bassboost"] }
{ "op": "filter", "filters": ["nightcore", "echo"] }
{ "op": "filter", "filters": [] }

Events (what ChrxmeeStream sends back)

Receive JSON text frames for control events.
Receive binary frames for raw PCM audio chunks.

| Event | Data | Description | |---|---|---| | ready | { sessionId, version } | Fired on connect | | trackStart | { source } | Track began playing | | trackEnd | — | Track finished | | stopped | — | Manually stopped | | paused | — | Paused | | resumed | — | Resumed | | volumeSet | { volume } | Volume changed | | seeked | { position } | Seeked to position | | error | { message } | Something went wrong |

Binary frames = raw PCM audio (s16le, 48kHz, stereo) — pipe straight into @discordjs/voice.


WRITE() — Local file playback

Drop any audio file into your /audio folder and play it with:

{ "op": "play", "source": "WRITE(mysong.mp3)" }

Or shorthand (no WRITE() needed if it doesn't start with http):

{ "op": "play", "source": "mysong.mp3" }

Supported formats: .mp3 .wav .ogg .flac .m4a .opus .aac .webm


Supported streaming services

Anything yt-dlp supports — which is a lot:

  • ✅ YouTube
  • ✅ SoundCloud
  • ✅ Twitch (live streams too)
  • ✅ Bandcamp
  • ✅ Deezer
  • ✅ Tidal
  • ✅ Vimeo
  • ✅ Twitter / X
  • ✅ Reddit
  • ✅ Bilibili
  • ⚠️ Spotify (requires yt-dlp Spotify plugin or spotDL)
  • ⚠️ Apple Music (regional restrictions may apply)
  • ➕ 1000+ more sites

Available filters

Apply audio effects to any track:

| Filter | Effect | |---|---| | bassboost | Pumps the low end | | nightcore | Speed up + pitch up | | vaporwave | Slow down + pitch down | | slowed | Slowed + reverb | | echo | Delay echo | | reverb | Cave-like reverb | | normalize | Even out volume | | earrape | ⚠️ DO NOT USE WITH HEADPHONES | | karaoke | Remove vocals (kinda) | | mono | Merge to mono | | treble | Boost high end | | soft | Smooth low-pass | | underwater | Pool vibes | | telephone | Nokia ringtone vibes | | chipmunk | Alvin would be proud | | deep | Low and menacing | | robot | Metallic robot voice |

Stack them:

{ "op": "filter", "filters": ["bassboost", "echo"] }

Clear filters:

{ "op": "filter", "filters": [] }

Example bot snippet (discord.js + @discordjs/voice)

import { createAudioPlayer, createAudioResource, NoSubscriberBehavior } from "@discordjs/voice";
import { Readable } from "stream";
import WebSocket from "ws";

const ws = new WebSocket("ws://localhost:2333", {
  headers: { "Authorization": "chrxmee", "Guild-Id": guildId }
});

const audioStream = new PassThrough();
const resource    = createAudioResource(audioStream);
const player      = createAudioPlayer({ behaviors: { noSubscriber: NoSubscriberBehavior.Pause } });

player.play(resource);
voiceConnection.subscribe(player);

ws.on("message", (data, isBinary) => {
  if (isBinary) {
    // Raw PCM chunk — push it into the stream
    audioStream.push(data);
  } else {
    const event = JSON.parse(data.toString());
    console.log("Event:", event);
  }
});

// Play a song
ws.send(JSON.stringify({ op: "play", source: "https://youtu.be/dQw4w9WgXcQ" }));

License

MIT — do whatever you want with it.