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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@hakanai/client

v2.19.2

Published

Zero-knowledge client library for Hakanai one-time secret sharing

Readme

@hakanai/client

Zero-knowledge client library for Hakanai one-time secret sharing service.

Features

  • 🔐 Client-side encryption using AES-256-GCM
  • 🚀 Zero-knowledge - server never sees unencrypted data
  • 📦 TypeScript support with full type definitions
  • 🌐 Works in browsers and Node.js environments
  • 🔑 Secure key generation and management

Installation

npm install @hakanai/client

Usage

Basic Example

import { HakanaiClient } from '@hakanai/client';

// Create a client instance
const client = new HakanaiClient('https://hakanai.link');

// Create and send a text secret
async function shareSecret() {
  const payload = client.createPayload();
  const encoder = new TextEncoder();
  payload.setFromBytes(encoder.encode('My secret message'));

  // Send with 24-hour expiration
  const url = await client.sendPayload(payload, 86400);
  console.log('Secret URL:', url);
}

With Authentication

const authToken = 'your-auth-token';
const url = await client.sendPayload(payload, 86400, authToken);

Sharing Files

// Create payload with filename
const payload = client.createPayload('document.pdf');

// Set file content (as Uint8Array)
payload.setFromBytes(fileBytes);

const url = await client.sendPayload(payload, 86400);

Retrieving Secrets

// Parse URL to get ID and key
const secretUrl = 'https://hakanai.link/s/uuid#base64key';
const urlParts = new URL(secretUrl);
const id = urlParts.pathname.split('/').pop();
const key = urlParts.hash.substring(1);

// Retrieve and decrypt
const encryptedData = await client.retrieveSecret(id);
const decryptedPayload = await client.decryptPayload(encryptedData, key);

// Get the content
const text = decryptedPayload.decode(); // For text
const bytes = decryptedPayload.decodeBytes(); // For binary

API Reference

HakanaiClient

Constructor

new HakanaiClient(serverUrl: string)

Methods

  • createPayload(filename?: string): PayloadData - Create a new payload
  • sendPayload(payload: PayloadData, ttlSeconds: number, authToken?: string): Promise<string> - Encrypt and send payload
  • retrieveSecret(id: string): Promise<string> - Retrieve encrypted secret
  • decryptPayload(encryptedData: string, key: string): Promise<PayloadData> - Decrypt retrieved data

PayloadData

Properties

  • filename?: string - Optional filename for file uploads
  • data: string - Base64-encoded content (readonly)

Methods

  • setFromBytes(bytes: Uint8Array): void - Set content from raw bytes
  • decode(): string - Decode as UTF-8 text
  • decodeBytes(): Uint8Array - Get raw bytes

Browser Compatibility

The client uses Web Crypto API and requires:

  • Chrome 37+
  • Firefox 34+
  • Safari 10.1+
  • Edge 79+

Security Notes

  • All encryption happens client-side
  • Server never receives encryption keys
  • Uses AES-256-GCM for authenticated encryption
  • Secrets are automatically deleted after first access

License

Apache-2.0

Links