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

afferent

v0.1.0

Published

Sensory 2D spatial layout and perceptual engine for documents, tables, and visual structures

Readme

afferent

af·fer·ent (adj. /ˈæf.ər.ənt/) — Carrying sensory signals inward toward the central nervous system.

npm version docs license

afferent is a sensory layout engine for 2D documents. It reconstructs columns, horizontal baselines, line-item pairs, and reading order from raw OCR bounding boxes before downstream models or business logic touch them.

Deterministic 2D geometry handles 90%+ of layout recovery at sub-millisecond speeds. For ambiguous page breaks, afferent integrates with System 1 models like Jev to evaluate semantic continuations through micro-judgments.

  • Zero dependencies — pure TypeScript, no native bindings.
  • Coordinate agnostic — works with normalized (0..1) or pixel coordinates.
  • Domain presets — built-in configurations for price lists, spec sheets, and inventory manifests.
  • System 1 native — implements noul, choice, and score primitives.

Install

npm install afferent

Quick Start

import { processPageLayout, type OcrLine } from "afferent";

const lines: OcrLine[] = [
  { id: 1, text: "Platform License (Annual)", x: 0.08, y: 0.22, width: 0.45, height: 0.02 },
  { id: 2, text: "$12,000", x: 0.82, y: 0.221, width: 0.1, height: 0.02 },
  {
    id: 3,
    text: "Includes unlimited seats and priority support.",
    x: 0.08,
    y: 0.245,
    width: 0.55,
    height: 0.02,
  },
];

const page = await processPageLayout(lines);

console.log(page.itemBlocks);
// [
//   {
//     id: 'item_1',
//     title: 'Platform License (Annual)',
//     description: 'Includes unlimited seats and priority support.',
//     value: 12000,
//     box: { x: 0.08, y: 0.22, width: 0.84, height: 0.045 },
//     lines: [...]
//   }
// ]

How It Works

OCR engines return an unordered bag of bounding boxes: [x, y, width, height, text]. Reading them in naive stream order scrambles columns, detaches prices from titles, and cuts descriptions in half at page boundaries.

afferent recovers the layout in four passes:

  1. Split columns. Horizontal projection histograms detect gutters to separate multi-column text from spanning headers and banners. Text from column A never bleeds into column B.
  2. Lock baselines. Titles pair with right-aligned values (prices, SKUs, dates) that share the same horizontal baseline, regardless of whitespace width.
  3. Stitch blocks. Wrapped titles, narrative paragraphs, and sub-bullets merge into unified item blocks with exact mathematical bounding boxes.
  4. Bridge page breaks. Items split across pages are detected using dangling punctuation, lowercase starts, and layout continuity. Ambiguous boundaries query a System 1 model (such as Jev) to confirm semantic continuation.

Documentation

For guides, presets, and full API documentation, visit afferent.dev:

License

MIT © Cody Bromley