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

kontxt

v0.4.1

Published

Minimal multi-state (context) management tool

Readme

kontxt

Minimal multi-state (context) management tool.

Motivation


The main idea behind kontxt is to provide some simple state management for lit-html between renders. All kontxt updates are executed on the same execution frame but listener invokation is scheduled to the next available execution frame thus preventing unnecessary re-renders. You can update as many contexts as many times you like within an execution frame.

This way lit-html & kontxt can provide a React Function Component/Hooks-like development experience but in a simpler, cleaner way (no context providers/consumers, reducers, etc...).

However, kontxt isn't bound to the DOM or lit-html so it can be used for anything.

Example


Template (or function component if you will)

Counter.ts

import { html } from 'lit-html';
import { createContext } from 'kontxt';

const Count = createContext<number>(0);

export function Counter() {
  const count: number = Count(); // read value

  return html`
    <span>${count}</span>
    <button @click=${() => Count.set(Count() + 1) /* set value */}></button>
  `;
}

index.ts

import { html, render } from 'lit-html';
import Counter from './Counter';

const $root: Element = document.getElementById('root');

const updateDOM = addListener(function () {
  render(Counter(), $root)
});
updateDOM();

Creating a context


Value of a context can be of any data type.

// create context with default value
const Hello = createContext('World');

Using a context


Contexts are simple functions, no dark-magic, just call them when you want to retrieve the latest value.

console.log(Hello());

Subscribing and Unsusbscribing to/from context changes


Any context update will update the listeners

import { addListener, removeListener } from 'kontxt';

// adding a listener
const listener = addListener(() => {
  // TODO something
});

// removing the listener
removeListener(listener);

Updating a context


Simple update:

You can update the context by passing the desired value as the argument. The internal value will be updated immediately and listener invokaction will be scheduled to the next available execution frame.

Hello('World!');

You may also want to use objects as context values and update their property individually - you can do that with updater functions:

const User = createContext({
  firstName: 'John',
  lastName: 'Doe',
})

// set user details - replace/set value
User.set({
  firstName: 'Jane',
});

// merge user details - partial update value - only for objects!
User.merge({
  firstName: 'Jane',
});

async / await - context updates are treaded as non-async functions. Do not do asynchronous operations from a context updater function - do it before updating.