Your Firefox bookmarks,
under control

Single-file Python CLI. Audit duplicates, diff exports, merge collections, generate a self-hosted dashboard. No install, no server.

Python 3 single file Firefox JSON no server
$ python bmctl.py audit -i bookmarks.json ====================================================================== GLOBAL AUDIT REPORT ====================================================================== Total bookmarks found : 3110 Folders scanned : 244 Unique links : 3059 Duplicates detected : 51 (1.6%) ====================================================================== [!] Top 10 most duplicated links: - GitHub URL : https://github.com Found 3 times: * Folder: Dev * Folder: CTI, OSINT & SocMint > Code Search

Five commands

Full lifecycle of a Firefox bookmark collection from the command line.

audit
Inspect a single export. Duplicate detection, global stats, folder tree with counts.
-i / --inputFirefox JSON (required) --top NTop N duplicated URLs --show-shortStats only --show-treeFull folder hierarchy
$ python bmctl.py audit -i bookmarks.json --top 3 [!] Top 3 most duplicated links: - GitHub URL : https://github.com Found 3 times: * Folder: Dev > Python * Folder: Tools - HackTricks URL : https://book.hacktricks.xyz Found 2 times: * Folder: Cybersecurity & CTI > Exploitation * Folder: Documentation & References > Cheatsheets
compare
Diff two exports. What was added, what was removed, net delta between collections.
-o / --oldOld JSON export -n / --newNew JSON export --show-fullFull added/removed lists --show-shortStats only
$ python bmctl.py compare -o old.json -n new.json ========================================== COMPARISON REPORT ========================================== Unique bookmarks V1 (old) : 2980 Unique bookmarks V2 (new) : 3059 Net delta : +79 ========================================== [+] New bookmarks added : 102 [-] Old bookmarks removed : 23 [+] PREVIEW OF NEW ENTRIES: + HackTricks https://book.hacktricks.xyz
merge
Takes the union of two collections. Same URL, same folder: keeps most recent, merges tags. Same URL, different folders: prompts which folder to keep (or --no-confirm to auto-resolve). No entry is silently deleted. Output is a Netscape HTML file importable by any browser.
-b / --baseBase JSON -n / --newJSON to merge in -o / --outputOutput HTML --no-confirmAuto-resolve conflicts
$ python bmctl.py merge -b base.json -n new.json -o merged.html [?] FOLDER CONFLICT DETECTED FOR: URL : https://example.com In which folder(s) do you want to keep it? 1) [Keep] -> Dev > Tools 2) [Keep] -> Misc. 3) Skip / Keep most recent version Your choice :
export
Export to CSV, Excel or Markdown. All formats include title, URL, folder path, tags, date added.
-i / --inputFirefox JSON --formatcsv / xlsx / md -o / --outputOutput file
$ python bmctl.py export -i bookmarks.json \ --format csv -o bookmarks.csv $ python bmctl.py export -i bookmarks.json \ --format md -o bookmarks.md
dashboard
Self-contained single-file HTML dashboard. Collapsible folder tree, three views (grid / cards / table), global search, recent additions. Open directly in a browser, no server needed.
-i / --inputFirefox JSON -o / --outputOutput HTML (default: dashboard.html)
$ python bmctl.py dashboard -i bookmarks.json \ -o dashboard.html [*] Loading bookmarks for dashboard... [*] Generating bmctl dashboard: dashboard.html [*] bmctl dashboard successfully generated: dashboard.html

Get it

No package manager needed. Clone the repo, run the script. pandas and openpyxl are optional, only required for Excel export.

$ git clone https://github.com/franckferman/bmctl.git $ cd bmctl # Optional — Excel export only $ pip install -r requirements.txt # Export your bookmarks first: # Bookmarks > Show All > Import and Backup > Backup... $ python bmctl.py audit -i bookmarks.json