Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

About

Zero-dependency library that parses browser bookmark exports and read-later CSVs into one JSON shape.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages