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

krestianstvo-renkon

v0.1.5

Published

Croquet-TeaTime-inspired, Renkon-driven collaborative computational engine

Readme

Krestianstvo - Renkon | Pure FRP Croquet VM

Introducing the Croquet-TeaTime-inspired, Renkon-driven collaborative computational engine (WIP)

Live demo (https://renkon.krestianstvo.org)

  • Overall all parts of the classic Croquet VM are implemented, including Reflector server, Virtual Time, Recursive Future Messages, Portals etc. all in Renkon FRP architecture.
  • Internal dispatcher of messages queue of the VM is implemented with recursive causality drain, that properly handles nested message future sends.
  • Portals, Recursive spawning and Parallelising "sheaf of sheaves of VMs" running in form of Renkon signals
  • No dependencies - works directly in browser or NodeJS
  • Snapshot/Restoring logic - late joiners get full state + history replay
  • Krestianify compiller converts a unified Renkon app (single source string) into the model/view split that KrestianstvoVM.start() expects.
  • Distributing as an ES6 module

Source files

Pure FRP Croquet VM

The Recursive Causality Engine is the implmentation in Renkon of the Croquet VM's core in pure FRP.

worldState is a Behaviors.collect node that is both accumulator and its own trigger:

const worldState = Behaviors.collect(
    { ...initialState },
    Events.or(incoming, Events.change($worldState)),
    (state, ev) => {
        // ev is either a new incoming message (enqueue path)
        // or a self-triggered drain signal (drain path)
        if (ev.time !== undefined && ev.queue !== undefined) {
            const drained = _drain(state);
            return drained === state ? state : drained;  // same ref = stop
        }
        return _enqueue(state, ev);
    }
);

The self-referential loop drives drain recursion without any explicit JS loop:

  1. Heartbeat arrives → _enqueue advances worldState.time
  2. Events.change($worldState) fires → _drain checks the queue
  3. A message is ready at current virtual time → applyAction runs → new worldState
  4. The new worldState triggers itself again → _drain recurses
  5. Queue empty → _drain returns same reference → loop breaks

This gives sub-tick ordering — multiple messages at the same virtual time are processed in sequence within a single real-time frame.


Documentation

Learn more about


Simple app

Import Krestianstvo VM as ES6 Module. No build step. No npm install.

<!DOCTYPE html>
<div id="root"></div>

<script type="module">
import { selo } from 'https://cdn.jsdelivr.net/npm/krestianstvo-renkon@latest/public/index.js';

const APP = `
// ── MODEL ──
const counter = Behaviors.collect(0, click, 
                    (prev, _) => prev + 1);

// ── VIEW ───
const click = Events.listener(rootEl.querySelector('#btn'), 'click', 
                    () => 1);

const _render = (()=>{
  rootEl.querySelector('#count').textContent = counter;
})();
`;

const buildUI = (rootEl, label) => {
    rootEl.innerHTML = `
        <div>${label}</div>
        <div id="count">0</div>
        <button id="btn">Click me</button>
    `;
};

selo({
    app:        APP,
    modelNodes: ['counter'],
    seloId:     'my-app',
    reflector:  'ws://localhost:3000',
    rootEl:     document.getElementById('root'),
    buildUI,
});
</script>

To run reflector localy

npm install
npm start

Open web browser:
http://localhost:3000 - list demo apps.

URL params for demo page:

  • ?k=seloName — selo id
  • ?r=http://host:port — reflector base url