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)
Auto-detection covers:
| 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
tags: string[]
folder: string | null
}
Convert to anything
import { toMarkdown, toCsv, toJson, toNetscapeHtml } from "parse-bookmarks"
toMarkdown(bookmarks)
toCsv(bookmarks)
toJson(bookmarks)
toNetscapeHtml(bookmarks)
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