Para

Para Lib

Nine TypeScript libraries — signals, parallel, pipeline, arena, simd, csv, arrow, rtp, mcp — published as individual @para/* npm packages. Pure JS / Wasm. Install only what you use.

Runs on Node, Bun, Deno, browsers, Cloudflare Workers — anywhere V8 or JSC runs. No native dependencies. The optional .pts syntax compiles to JS calls into these libraries; the Para Runtime (ParaBun) bundles them and adds GPU / hardware modules.

Install

Each module is its own npm package. Install only the ones your code uses:

$npm install @para/signals @para/parallel @para/pipeline

Full per-bundler alias setup (Vite / esbuild / webpack) and the rest of the runtime + build instructions live in the install guide.

Libraries

Signals — reactive state

Cells, derived values, effects. Other libraries expose their state as signals, so reactive composition is uniform across the suite.

import { signal, derived, effect } from "@para/signals";

const count = signal(0);
const doubled = derived(() => count.get() * 2);

effect(() => console.log(count.get(), doubled.get())); // 0, 0

count.set(5);                  // logs: 5, 10
count.update(n => n + 1);      // logs: 6, 12

Parallel — work over a Worker pool

pmap / preduce ship pure functions to a persistent Worker pool via fn.toString(). Functions must be pure — no closures, no outer references.

import { pmap } from "@para/parallel";

function score(row) {
  let h = 0;
  for (let i = 0; i < row.length; i++) h = (h * 31 + row.charCodeAt(i)) | 0;
  return h * h;
}

const scores = await pmap(score, rows, { concurrency: 8 });

Pipeline — fused streaming combinators

Adjacent maps over Float32Array / Float64Array sources fuse into a single SIMD pass via @para/simd instead of allocating an intermediate per stage.

import { map, sum } from "@para/pipeline";

const arr = new Float32Array(1_000_000);
const total = await sum(map(x => x * 2)(map(x => x + 1)(arr)));
// One SIMD pass through @para/simd, not three.

SIMD — vector primitives over typed arrays

WebAssembly v128 kernels (simd.wasm) with a scalar JS fallback for hosts without v128.

import { add, dot, sum, mulScalar } from "@para/simd";

const a = new Float32Array([1, 2, 3, 4]);
const b = new Float32Array([5, 6, 7, 8]);

add(a, b);          // Float32Array([6, 8, 10, 12])
mulScalar(a, 3);    // Float32Array([3, 6, 9, 12])
dot(a, b);          // 70
sum(a);             // 10

Arrow — in-memory tables, IPC, Parquet

Columnar tables with vectorized computes, Arrow IPC streaming, Parquet read/write. Wire-compatible with apache-arrow 21.1.0.

import { fromRows, mean, toParquet } from "@para/arrow";

const t = fromRows([
  { id: 1, age: 30 },
  { id: 2, age: 25 },
]);

mean(t.column("age"));                                // 27.5
const buf = await toParquet(t, { compression: "snappy" });

The rest

Four more libraries with their own docs:

Para Lang is an optional .pts syntax that desugars to imports from these libraries. Use it when reactive code starts piling up parens; skip it if plain TS / JS works.

Para Runtime (ParaBun) is a Bun fork that bundles these libraries and adds native modules for GPU, camera, audio, GPIO/I²C/SPI, and on-device LLM. Reach for it when you need hardware that Node-class runtimes don't expose.