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

@leolin310148/n8n-nodes-borz

v0.3.0

Published

n8n community node for borz (control Chrome via CDP over HTTP).

Readme

n8n-nodes-borz

n8n community node for borz. Drive a real Chromium instance from an n8n workflow by talking to a running borz server over its /v1/* HTTP API.

Renamed from @leolin310148/n8n-nodes-bb-browser. Existing workflows continue to work — internal node and credential identifiers are unchanged. See RENAME_PLAN.md for the full migration story.

Shape

  • Declarative node (one file, pure routing) — every operation is a 1:1 map to a /v1/* endpoint, so new server endpoints can be added with a few lines.
  • One credential type (borz API): base URL + optional bearer token. Credentials test hits /healthz.
  • Script resource gives two escape hatches:
    • Execute JavaScript — raw /v1/eval pass-through.
    • Run Inline Adapter — paste an arrow function + JSON args; the node wraps it as (fn)(args) (same convention as borz's on-disk site adapters) before sending to /v1/eval.

Resources / Operations

| Resource | Operations | |-------------|------------| | Page | Open URL, Snapshot, Screenshot, Refresh, Back, Forward, Close Page, Scroll, Wait | | Element | Click, Fill, Type, Hover, Check, Uncheck, Select Option | | Input | Press Key, Key Event, Mouse Event, Read Clipboard | | Observation | Get Attribute, Fetch, Network Requests, Console Messages, JavaScript Errors | | Tab | List, New, Select, Close | | Site | List, Info, Run | | Script | Execute JavaScript, Run Inline Adapter | | Daemon | Health, Status, Doctor, Shutdown |

Every operation maps 1:1 to a /v1/* (or /healthz, /status, /shutdown) endpoint on the borz server. The raw /command escape hatch is intentionally omitted — use Script → Execute JavaScript or Run Inline Adapter for one-offs.

Every action that mutates the page (Open, Back, Forward, Refresh, Scroll, all Element ops, Press Key, Execute JavaScript, Run Inline Adapter) accepts the shared Wait For (CSS selector) and Timeout (ms) fields — the daemon polls document.querySelector(waitFor) after the action until it resolves or the timeout elapses. Page → Snapshot has a Mode field with a Text (reader mode) option for an LLM-friendly visible-text dump (no refs).

Build & install locally

cd borz-n8n-node
npm install
npm run build

# Link into an n8n custom nodes dir
mkdir -p ~/.n8n/custom
npm link
cd ~/.n8n/custom
npm link @leolin310148/n8n-nodes-borz

# Start (or restart) n8n
n8n start

Then in n8n: Credentials → New → borz API, set your base URL (e.g. http://127.0.0.1:19824) and token if required. Add a borz node to a workflow.

Typical flow

  1. Page → Open URL https://example.com

  2. Page → Snapshot (interactive + compact) — gives you ref numbers

  3. Element → Fill with ref and text from step 2 via expressions

  4. Element → Click the submit ref

  5. Script → Execute JavaScript to pull a value out, or Script → Run Inline Adapter for a self-contained scraper:

    async ({ query }) => {
      const el = [...document.querySelectorAll('h3')].find(h => h.textContent.includes(query));
      return el?.closest('a')?.href ?? null;
    }

Design notes

  • Auth header is only attached when the token is non-empty, so the same credential works against a loopback server (no token) and a remote one (token required).
  • tab is a shared field on Page/Element/Input/Observation/Script ops, mapping to the optional tab? field the server accepts on those /v1/* endpoints. Site → Run exposes its own Target Tab field.
  • Run Inline Adapter uses routing.send.preSend to build the body — the only place this node needs imperative logic. Everything else is pure routing JSON.
  • No persisted adapter upload endpoint yet. If you add one server-side (e.g. POST /v1/sites), a new Adapter resource with Create/List/Run/Delete ops drops in cleanly alongside the existing four resources.