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

lignee

v0.2.0

Published

A library for parsing, editing, and writing GEDCOM files.

Readme

Lignée

Lignée is a library for parsing, editing, and writing GEDCOM files. It is designed to be fast, able to read files that don't totally respect the spec, and to have a nice serialized data representation.

Features

  • version independent parsing: supports GEDCOM 5.5 and 7.0+ files
  • parsing from text, binary, (async-)iterable binary streams
    • UTF-8 encoding required in binary mode
  • immutable objects used for records
  • typed interface to traverse and mutate records
  • no dependency on node or the browser, so both are supported
  • can parse many ill-written files
    • broken codepoints (in binary mode, UTF-8 sequences split with CONC)
    • usage of LF line breaks inside records for file with CRLF separators
    • usage of line breaks inside records (only when enabled in the reader settings)
    • reuse of cross-references (extra records are stored separately)

How to use

import {readTree, dumpTree, readRecord, produceRecord} from "lignee";
import {readFile, writeFile} from "node:fs/promises";

const fileData = await readFile("tree.ged");
const {tree, status} = readTree(fileData);

// display all warnings
console.log(JSON.stringify(status, null, 2));

// list all individuals
for (const xref of tree.byTag["INDI"]) {
	const r = readRecord(tree.byXref[xref]);
	const name = r.attr.NAME.first;
	console.log(`${xref} ${name.GIVN.first.value ?? "?"} ${name.SURN.first.value ?? "?"}`)
}

// change all last names to be uppercase
for (const xref of tree.byTag["INDI"]) {
	tree.byXref[xref] = produceRecord(tree.byXref[xref], r => {
		for (const name of r.attr.NAME) {
			for (const surn of name.attr.SURN) {
				if (surn.hasValue) surn.setValue(surn.value.toUpperCase());
			}
		}
	});
}

// write file
const updatedTree = dumpTree(tree);
await writeFile("tree.updated.ged", updatedTree, {encoding: "utf8"});