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

parse-bookmarks

v0.1.0

Published

Parse any bookmark export into clean JSON — browser bookmark HTML, Pocket, Instapaper, Raindrop CSV — and convert between formats. Zero dependencies, zero build.

Readme

parse-bookmarks

Parse any bookmark export into clean JSON, and convert between formats.

Every browser and read-later app exports bookmarks in a different shape: the ancient Netscape HTML file (Chrome, Firefox, Safari, Edge — with unclosed tags, because 1996), Pocket's CSV, Instapaper's CSV, Raindrop's CSV. If you build anything that touches saved links, you end up writing these parsers yourself. This is that code, written once, tested, with zero dependencies and zero build step.

npm install parse-bookmarks

Parse anything

import { parse } from "parse-bookmarks"

const { format, bookmarks, warnings } = parse(fileContents)
// format   → "netscape-html" | "pocket-csv" | "instapaper-csv" | "raindrop-csv" | "url-list"
// bookmarks→ [{ title, url, addedAt, tags, folder }, ...]

Auto-detection covers:

| Source | Format | Notes | |---|---|---| | Chrome / Firefox / Safari / Edge / Vivaldi export | Netscape bookmark HTML | folders (nested), ADD_DATE, Firefox TAGS | | Pocket CSV export | pocket-csv | pipe-separated tags, archive status | | Instapaper CSV export | instapaper-csv | folders, timestamps | | Raindrop.io CSV export | raindrop-csv | comma tags, ISO dates | | A pasted list of URLs | url-list | URL, Title \| URL, Title - URL, [Title](URL) |

Every parser returns the same unified shape:

interface Bookmark {
  title: string
  url: string
  addedAt: string | null // ISO 8601
  tags: string[]
  folder: string | null  // "Work/Reading"
}

Convert to anything

import { toMarkdown, toCsv, toJson, toNetscapeHtml } from "parse-bookmarks"

toMarkdown(bookmarks)     // - [Title](url), grouped by folder
toCsv(bookmarks)          // title,url,addedAt,tags,folder
toJson(bookmarks)         // pretty JSON
toNetscapeHtml(bookmarks) // HTML file every browser can import

The last one is the escape hatch people ask for the most: Pocket CSV in, browser-importable HTML out — your saved list back in a place that will outlive any single app.

import { parse, toNetscapeHtml } from "parse-bookmarks"
toNetscapeHtml(parse(pocketCsv).bookmarks)

Design constraints

  • Zero dependencies, zero build. Plain ES modules + JSDoc + hand-written .d.ts. node --test for tests. Works in Node ≥18 and modern browsers.
  • Never throws on dirty rows. Bad rows are skipped and reported in warnings, because real exports are messy.
  • No network, no telemetry. It's a parser.

Who makes this

Built by the team behind Burn 451, a read-later app where every save gets 24 hours before it burns. This library is deliberately neutral — use it to build a Burn competitor if you like.

Pairs well with bookmarks-mcp, which uses it to make your live browser bookmarks readable by AI assistants.

License

MIT