Bookmarks Suck

Bookmarks, which should be such a fundamental and powerful part of browsing the web, has got to be one of the most poorly executed parts of our modern browsing experience.

While browsers focus on developing more spyware bloat and UI features few users will ever see, there’s not an easy native way I have found to successfully collect, organize and be able to use a large personal collection of links.

It’s especially confusing to me since we have all gotten used to wading through giant lists of well curated and organized media links on YouTube or Netflix or Spotify or Plex – Yet bookmarks seem almost as forgotten as poor RSS (but at least that one has a clear $$$$ reason).

Why Native Bookmarks Suck:

  • Folders mean a bookmark can only have 1 ‘tag’
  • No real way to search, annotate, etc
  • Large collections quickly become unnavigable

I already use LogSeq, similar to Obsidian, for my daily notes, todo lists, etc and have been using Raindrop.io to make a really nice bookmark experience without reinventing the wheel.

A Worse way

AI seems poised to help solve a lot of the automation problems with bookmarks, but so far I have not found anything really appealing. I just don’t want a new ‘mega dashboard’ with cool flashy UIs that stores my links.

I tried using https://memex.garden/ for a few months but ultimately had the same problem I do with all bookmark managers – I did not use it. If you’re looking for something with AI automation through a dashboard, I would recommend it.

While Raindrop.io is essentially this too (without the AI summary piece), I won’t be using Raindrop’s interface or webapp in my workflow.

A Better Way

The idea is we will use Raindrop and its chrome extension to save and tag our bookmarks, port them into Logseq via an extension, and build dynamic queries to create LogSeq templates for all of our bookmark tags.

This has quite a few benefits:

  • Raindrop’s Chrome extension will add whatever is highlighted under your cursor to the bookmark as a note
  • Search your bookmarks when you search LogSeq
  • Every tag we give a bookmark will have a LogSeq page which could also contain other notes/link/references to a subject not related to bookmarks. This will work automatically.
  • Embed bookmarks on other pages/notes
  • Set LogSeq TODOs against bookmarks, schedule them, etc
  • We can use LogSeq’s advanced queries (horribly documented btw) to do more analysis on large collections or build more segmentation than Raindrop supports out of the box. (I could have a work bookmark page where the work tag must be found, for example)

Obsidian Alternatives

I moved to LogSeq from Obsidian a while ago and don’t know how difficult this will be to setup in Obsidian. You may take a look at this repo

Setup and Queries

If you want to setup the same workflow, here’s what you’ll need:

I’m just using the default settings for Logseq plugin which pushes bookmarks to a page called ‘Bookmarks’

In addition to “Bookmarks” that stores all the actual bookmarks, you’ll want another page that holds the bookmark queries. Mine is called “Bookmark Table”

Bookmark Table has 2 queries on it. One shows us a 4 column list of all of our bookmark tags and can be used to navigate to pages of bookmarks. The other is a table of all of our bookmarks.

These could be refined further I’m sure so you could sort/filter on the table. I’ll wait for advanced queries to have more docs I understand before I go that route.

Bookmark Tags Query

#+BEGIN_QUERY
{:title [:h2 "Bookmark Tags"]
 :query [:find (pull ?b [:block/properties])
         :where
         [?b :block/properties ?props]
         [(get ?props :tags) _]]
 :result-transform (fn [results]
                     (let [tags (->> results
                                     (mapcat (fn [result] 
                                               (-> result 
                                                   :block/properties 
                                                   :tags 
                                                   seq)))
                                     (remove empty?)
                                     distinct
                                     (sort))]
                       tags))
 :view (fn [tags]
         [:div {:style {:display "grid"
                        :grid-template-columns "repeat(4, 1fr)"
                        :gap "10px"}}
          (for [tag tags]
            [:div 
             [:a {:href (str "#/page/" (clojure.string/replace tag " " "_"))} 
              (str "#" tag)]])])}
#+END_QUERY

Bookmark Table Query

#+BEGIN_QUERY
{:title [:h2 "Bookmarks"]
 :query [:find (pull ?b [:block/properties])
         :where
         [?b :block/properties ?props]
         [(get ?props :tags) _]]
 :view table}
#+END_QUERY

And that’s it – Now we have a much more powerful bookmark process that doesn’t make us login to another webapp!