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

freqlink

v1.0.4

Published

Terminal-based encrypted messaging over frequency-based channels

Readme

FreqLink

Terminal-based encrypted messaging over frequency-based channels.

FreqLink is a peer-to-peer encrypted chat system that runs in your terminal. Peers join numeric "frequencies" (e.g., 145.80) and exchange end-to-end encrypted messages. The relay server never sees plaintext — all encryption and decryption happens client-side.

Quick Start

Installs Node.js automatically if needed.

macOS / Linux

curl -fsSL https://freqlink.onrender.com/install | bash

Windows (PowerShell)

irm https://freqlink.onrender.com/install.ps1 | iex

Already have Node.js >= 18?

npx freqlink

A public relay is already running. You and your peer both run the command above, join the same frequency, and start communicating.

Example session

> /connect
  ✓ Connected to relay node

> /join 145.80 --key NIGHTFALL
  Joined frequency 145.80 MHz

> Hello
[falcon-node]: Hello

> /burn Eyes only — coordinates 51.5074,-0.1278
  ⚠ BURN message sent (TTL: 5s)

> /quit
  Session terminated. Keys purged.

Commands

| Command | Description | |---|---| | /connect | Connect to the relay server | | /join <freq> --key <secret> | Join a frequency with a passphrase (required) | | /leave | Leave the current frequency | | /peers | List peers on the current frequency | | /dm <peer> <message> | Send an encrypted direct message | | /burn <message> | Send a self-destructing message (default 5s TTL) | | /burn <message> --ttl <s> | Send a burn message with custom TTL (1–30 seconds) | | /quit | Disconnect and purge all session keys from memory | | /help | Show available commands |

Any input not starting with / is broadcast to all peers on the frequency.

Frequency Format

Frequencies use the format NNN.NN (e.g., 145.80, 001.00, 999.99). Frequencies are never discoverable — coordinate them out-of-band with your peer.

Self-hosting

The relay server is deployed at wss://freqlink.onrender.com by default. To run your own:

# Clone and install
git clone https://github.com/YOUR_USERNAME/freqlink.git
cd freqlink
npm install

# Start relay server
node server/index.js

# In another terminal, connect to it
FREQLINK_SERVER=ws://localhost:3200 node cli/index.js

Deploy to Render

Push to GitHub, create a new Web Service on render.com, connect the repo, and set:

  • Start command: node server/index.js
  • Health check path: /health

Environment variables

| Variable | Default | Description | |---|---|---| | PORT | 3200 | Server listen port | | MAX_PEERS_PER_FREQ | 50 | Maximum peers per frequency | | FREQLINK_SERVER | wss://freqlink.onrender.com | Relay server URL (client) |

Encryption

  • X25519 ECDH — ephemeral key pair per session; shared secret computed on join
  • HKDF-SHA256 — derives session key from ECDH shared secret + frequency
  • AES-256-GCM — encrypts every message with a unique 12-byte random IV
  • scrypt — derives an additional key from --key passphrase; XOR-combined with session key via HKDF
  • Zero-knowledge verification — HMAC-SHA256 challenge confirms shared passphrase without revealing it ( / per peer)
  • Memory hygiene — all key material is zeroed on /leave and /quit

The relay server is a dumb router. It never reads, stores, or logs message contents.

Project Structure

freqlink/
├── cli/
│   ├── index.js         # Entry point and REPL
│   ├── commands.js      # Command parser and dispatcher
│   ├── connection.js    # WebSocket client with reconnection
│   ├── state.js         # Session state and key management
│   └── ui.js            # Terminal rendering and formatting
├── crypto/
│   ├── encryption.js    # AES-256-GCM encrypt/decrypt
│   ├── keyDerivation.js # HKDF and scrypt key derivation
│   ├── keyExchange.js   # X25519 ECDH key exchange
│   └── utils.js         # Crypto utilities and helpers
├── server/
│   ├── index.js         # Relay server entry point
│   ├── heartbeat.js     # WebSocket keepalive monitor
│   ├── rateLimiter.js   # Sliding-window rate limiter
│   ├── relay.js         # In-memory frequency routing
│   └── validation.js    # Server-side input validation
└── shared/
    ├── constants.js     # Protocol limits and defaults
    └── protocol.js      # Message types and serialization