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

@jarenjs/studio

v0.56.0

Published

The jaren project IDE: a multi-file project (schema, view, actions, model, queries, flow) is one document; each file is validated against its own grammar, assembled into runnable artifacts, and edited/hosted by the studio widget. The engine is headless; t

Readme

@jarenjs/studio

The jaren project IDE — a jaren application as a multi-file project.

CodePen's model, for JSON-all-the-way-down: an application is a small tree of typed files (a view, the actions, the state, a schema, a data model, queries, a flow), each edited on its own, each validated against its own grammar, assembled into runnable artifacts, and — where the driver allows — run live. The same document the human edits is the document an AI authors; the studio is a controlled component whose value is that project.

This package ships in two layers, the suite's convention:

  • the engine (@jarenjs/studio) — headless: parse a jaren-project document, validate each file against its kind, assemble the runnable artifacts, and classify a change as structural vs. state-only. Knows the grammars, nothing of the DOM.
  • the component (@jarenjs/studio/component) — the IDE itself, a createStudioComponent() factory (like @jarenjs/calc): the shell is a JSLT view (file rail with add/delete, an editable file name, a template gallery, editor, docked coded-error strip, run stage, layout switcher) over a pure projectViewModel, plus the two hard-problem policies (hostPolicy reboot-vs-hot-update, reconcileBuffer). The chrome and its derivation render headlessly and are tested as such; the host registers the DOM-touching islands — the live nested-app stage (hot-update via app.setState) and the drag splitter — which are browser-verified. Mounted live at the website's #/project, where app files boot, jslt/query files run against a data file, contract files render their describe()/OpenAPI projections, and files are added, renamed, deleted and opened from templates.

The project document

A thin envelope over typed files — the full contract is PROJECT-FORMAT.md.

import { parseProject, validateFile, assembleArtifacts, classifyChange, describe }
  from '@jarenjs/studio';

const project = parseProject({
  project: '0.1',
  files: [
    { name: 'app.json',   kind: 'app',   text: '{ "view": [ … ], "state": { … } }' },
    { name: 'npv.query',  kind: 'query', text: '{ "$npv": ["$.rate", "$.cf[*]"] }' },
    { name: 'seed.data',  kind: 'data',  text: '{ "cf": [-1000, 300, 400] }' },
  ],
});

describe(project);            // per-file kind / validity / role — the file rail
validateFile(project.files[1]); // { valid, kind, total, errors: [{ code, message, docPath }] }
assembleArtifacts(project);   // the runnable set

Why per-file validation

The published jaren-query / jaren-jslt grammars are closed, so a data query using a host-registered operator ($npv, $sqrt) can't be checked against them. The studio validates each file on its own boundaryjslt/query files are compiled with the operator packs mounted, so registered operators pass and a real mistake surfaces as its own coded error with a JSON Pointer. There is deliberately no single composed mega-schema; that is what lets a project mix an app, a store and a data query at once. See PROJECT-FORMAT.md.

Install

npm install @jarenjs/studio

Zero third-party runtime dependencies — only other @jarenjs/* packages. Node ≥ 24, ESM.