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

@orlyatomics/orly

v0.1.0

Published

TypeScript client for the Orly database (WebSocket + JSON protocol)

Readme

@orlyatomics/orly — TypeScript client

A typed client for the Orly database over its WebSocket + JSON protocol (see docs/PROTOCOL.md). Works in the browser (uses the global WebSocket) and in Node (dynamically imports ws). It owns the connection and session lifecycle, builds orlyscript statements safely (string escaping, argument literals, POV threading), and resolves the parsed JSON result.

Install

npm install @orlyatomics/orly     # plus `npm install ws` for Node

Requires a running orlyi (default ws://127.0.0.1:8082/).

(Inside this repo, packages and examples install the driver under the alias orly"orly": "file:../ts" — so their imports read from "orly"; the same alias is available to consumers as npm install orly@npm:@orlyatomics/orly.)

Use

import { connect } from "@orlyatomics/orly";

const c = await connect();                 // opens the WebSocket
await c.newSession();
await c.install("mypkg", 0);
const pov = await c.newPov();              // "new safe shared pov;"
await c.call(pov, "mypkg", "put", { k: 1, s: "hi" });
console.log(await c.call(pov, "mypkg", "get", { k: 1 }));
await c.exit();

call(pov, package, method, args) builds try {pov} package method <{.k: v}>;. Argument values are encoded by lit:

| JS | orlyscript | |---|---| | 1, 1.5 | 1, 1.5 | | true / false | true / false | | 'a"b' | "a\"b" (escaped) | | { k: 1 } | <{.k: 1}> (record) | | [1, 2] | [1, 2] (list) | | set([1, 2]) | {1, 2} (set) | | raw("now()") | now() (raw, un-encoded) |

Marshaling quirks (from the engine)

Results come back via the engine's JSON marshaling, so:

  • integers and floats are both JS numbers (JSON has no split);
  • sets are unordered arrays — compare as sets;
  • variants are { Tag: <payload> } ({ Tag: {} } for payload-less arms).

call resolves the parsed value as-is; handle these in your code. Non-ok replies reject with an OrlyError.