Super lightweight bookmarks manager - dmenu bookmarks with bm.

Storing my internet bookmarks to disk in a non-proprietry way and making them easily accessible was my main goal in the research for this blog post.

A while back I decided that I wanted to TRY to break away from Google in as many ways as I could, not using Chrome as a web browser was one of the biggies. But one of the most convenient things about Chrome is the bookmark sync. The downside to Chrome, is they are tracking everything you do. Whether this is a bad thing or not I leave up to you.

I tried so many different bookmark managers, but so many of them use databases and require complex setup, or special syncing software running.

I wanted something that:

  • Stored to disk in a text file
  • Let me use my Dropbox / Nextcloud or normal Cloud sync software to take care of syncing between devices
  • Works in Chrome / Firefox / Surf / anything
  • Easily accessible
  • Super lightweight

I settled on an amazingly simple bookmark manager called bm, and using dmenu (which I was already using as my main menu bar).

Simply hitting Super + Shift + B brings up the bookmark manager

Final result:

dmenu bookmark gif

The plan

  1. What is bm?
  2. What is dmenu?
  3. My dmenu-bm script
  4. Link to the script on github
  5. Conclusion

1. What is bm?

Enter bm for “Simple Bash CLI bookmarks” https://github.com/tj/bm

Format of the bookmarks file

Each bookmark gets a single line in the text file, and is delimited by |

Example:

bd8b3eff7fa82a0382a3e7576c5363b6|2016-01-18T07:21:36Z|:1|https://github.com/tj/bm|bm a cool enhanced bookmark tool for your console|default,shell
  • First column is the GUID
  • Second column is the DateTime added
  • Third column… I’m not sure?
  • Fourth column is the URL link
  • Five column is the Description text
  • Sixth column are the tags comma delimited

CLI commands

You can access and manipulate your bookmarks from the CLI. Although I don’t feel this is the most useful way to access it.

Adding bookmarks

bm add https://www.duckduckgo.com "DuckDuckGo Search Engine" search privacy

Listing bookmarks

bm -l

Searching bookmarks

bm -s 'string'

Opening bookmarks

bm -o 'string'

The downside

It doesn’t make it very easily accessible, at least not enough for me. I want to be able to launch a webpage without having to go into a terminal.

2. What is dmenu?

dmenu is a super lightweight menu bar for linux.

dmenu was development by the guys at suckless. They build software “with a focus on simplicity, clarity and frugality.” Basically they create minimal software that is hyper-performant. Sounds cool eh?

https://tools.suckless.org/dmenu/

I love dmenu, it’s lightweight, and allows me to customise it with scripts. It’s become my main menu system on my Linux machine. I’m adding more and more scripts to it and optimising my workflow.

3. My dmenu bookmarks script

dmenu-bm.sh

#!/usr/bin/env bash

declare -A g bmarray;

while IFS=\| read -r guid date id url title tags;
do
  bookmark="$title "-" "$url" "-" "$tags"";
  bmarray["$bookmark"]="$url";
done < /home/owen/Nextcloud/bookmarks/bm.lnk

function load() {
  while IFS=\| read -r guid date id url title tags;
  do
    bookmark="$title "-" "$url" "-" "$tags"";
    printf "$bookmark\n";
  done < /home/owen/Nextcloud/bookmarks/bm.lnk
  printf
}

choice=$(load | dmenu -i -l 15 -p "Add/Open bookmark:")

case "$choice" in
  Add) dmenu-bm-add.sh ;;
  *) bm -o ${bmarray[$choice]} ;;
esac

dmenu-bm-add.sh

#!/bin/sh

result() {
  echo -n | dmenu -p "$1"
}

url="$result "URL:")"
title="$(result "Title:")"
tags="$(result "Tags (comma delimited):")"

bm -b '/home/owen/Nextcloud/bookmarks/bm.lnk' -a $url -T "$title" -t "$tags"

My shortcut in dwm

config.def.h

static const char *bookmarkscmd[] = { "dmenu-bm.sh", NULL };

TODO:

I still have some tidying of this up, some code duplication in the dmenu-bm.sh script. But for the most part this works, and I use this in my day to day workflow.

You can find the above files in my github at https://github.com/Owen-Davies/dmenu-bm/

5. Conclusion

There we have it, a very simple bookmark management solution that I use day to day.

I’m a big fan of dmenu, do you have any dmenu scripts that you use that you recommend?

Still a bit new to bash scripting, so please point me in the direction of any improvements, I will try to revisit this once I get better. But for now it works, so :-)

You can check out some other dmenu scripts on the subreddit https://www.reddit.com/r/dmenu/