Nicole van der Hoeven published one of her videos on using Obsidian on the topic of the ExcaliBrain plugin. The plugin is made by Zsolt Viczián, the same creator as the Excalidraw plugin which brings easy visualisation to Obsidian. I use Excalidraw within Obsidian with some regularity (I’m mostly text oriented).

It’s not mentioned in the video, but the ExcaliBrain plugin is clearly inspired by The Brain software, both in terms of types of links between notes, and how it shows them (even the placement of the little circles where links attach). The name suggests so too, and the plugin author names The Brain as source of inspiration in the github reposository. I used The Brain as desktop interface from 1997 until 2004-ish, and this plugin seems to bring The Brain as a visualisation layer to my notes. That alone is enough to try it out.

The plugin can both infer relationships between notes, through existing links, much as the general graph view in Obsidian does, but does so in a more navigable style. This I hope allows it to be used as a visual navigation interface to notes, something the graph view does not meaningfully, as The Brain so usefully did for me for a number of years.

You can also set explicit relationships by adding named links to your notes, for which it uses the inline data fields (yourfieldname::) that the DataView plugin makes possible. I already use that plugin so that’s not an extra step for me.
I disagree with Nicole van der Hoeven on her suggestion to comment out explicit relationships so that the plugin will visualise them but the note won’t show the links, except in edit mode.
The notes should always show all links I explicitly set, that’s the whole point of links.
Machine inferred links are a different matter, which deserve a toggle as they are suggestions made to me.
Links are my own and real work in my notes.

Setting explicit links (parent, child, friends ExcaliBrain calls them) is similar to how I already create links. When I write a new note I aim to link other notes in the way Soren Bjornstadt describes in a video of his touring his Zettelkasten. I make three links, if possible, from a new note. One to a higher level of abstraction note, one to a lower level of abstraction but more concrete note, and one to a related note at the same level. This creates ‘chains’ of 4 notes with a content-based implied order.

For example: a note on the role of public transport might link to urban mobility and the liveability of car-free city centers as higher abstration concepts, to a note on urban rail systems or bus networks as a lower abstraction level, to the German 2022 summer reduced fare scheme as an example, and to another communal public service like urban public internet as a same level but different type of note.

I strongly dislike the parent-child-sibling(-friend) vocabulary Excalibrain introduces though, as it implies an order of creation. Parents exist first, children from parents. This means for the way I described creating links in notes that abstract concepts come first. This is not how it mostly works for me. Abstract notions are often created from, intuited from, less abstratct ones. The scaffolding created by less abstract notes and concrete examples is what leads to them. Overarching concepts and insights emerge from linking lower level items. Thankfully the terms you actually use to denote such connections between notes can be freely chosen in the plugin settings. That is a design choice by Zsolt Viczián I greatly appreciate.

Nicole van der Hoeven in her run-through of ExcaliBrain also talks about this implied hierarchy, and mentions a higher level type of use, which is adding more semantics to links using the renaming options in the plugin settings. For instance to express lines of argumentation, and how material reflects on eachother (e.g. Note A reinforces / contradicts Note B). This is the type of linking that Tinderbox allows you to do visually too, which I’ve used a lot. She hasn’t used it that way herself yet she says, but suggests it’s likely the most valuable use case. I think that rings true. It’s where linking becomes the work you have to do yourself again, as opposed to lazy or automatic linking between notes.

I very much want to experiment with the ExcaliBrain plugin.


A screenshot after activating ExcaliBrain of the vicinity of a single note

Here are some impressions of my increased usage of Hypothes.is, a social annotation tool, in the past few days.
I follow Chris Aldrich his Hypothes.is RSS feed, and his usage has been both a good example and source of learning in the past months, as well as a nudge to experiment and adopt Hypothes.is myself.

What follows is a list of some early impressions that I formulated earlier today in an email. I thought I might as well post them here.

  • I played with the API to get a grip of how I might interact with the annotations I make, and with those of others I’m interested in. Added the existence of annotations to my blogposts in WordPress through the API too.
  • The Obsidian plugin to get annotations into my notes is an absolute prerequisite, because I need those notes in my own workflow.
  • I find working in browser for annotations somewhat distracting and uncomfortable (and I need to remind myself that they will end up in my notes, I feel the urge to also download it directly to my notes.)
  • I try to add an Archive link to the annotated article as the first link. It is slowly becoming habitual.
  • I mention existing notes in my annotations when I make them in Obsidian. Because it is one context that is a matter of starting a link [[ and I have forward search through all note titles. In hypothes.is being browser based this is a bit harder, as it means switching tools to retrieve the correct note titles. They do then work when they end up in Obsidian of course. At the same time, in my earlier use of a markdown downloader I would just mention those associations in the motivation to save a link, which is worse. Hypothes.is sits in the middle of saving a bookmark with motivation and annotating in Obsidian itself.
  • I do have some performative urges when annotating publicly. Maybe they will disappear over time.
  • The firefox hypothes.is bookmarklet I use doesn’t seem to play nice with archive.org. There’s another I haven’t tested yet.
  • I notice that any public annotations are licensed CC0 (public domain). Not sure what I think about that yet. It’s a logical step as such, but I don’t fully see yet what it may mean for subseqeunt learning processes internally and further down the process of creating insights or outputs. Is CC0 also applied to closed groups (educational settings e.g.)? Private annotations are just that, and don’t have CC0, but then you miss out on the social aspects of annotation.
  • My thoughts keep wandering to interacting with hypothes.is without using it directly to annotate webarticles through the browser. Are there any tools or people who build on or share with hypothes.is using the W3C standards / API, but don’t necessarily use hypothes.is themselves? Or run their own instance, which should be possible? I suspect that would open opportunities for a more liquid experience between this blog, my notes, and annotated articles.

In reply to Publish Obsidian Documents to WordPress by Curtis McHale

I didn’t come across this posting at the time. As you say, having to log in every single time as well as having to send it already formatted raw HTML (and not the markdown one writes in in Obsidian), are drawbacks. XMLRPC is blocked by my hoster (part of their security decisions), and I have disabled it within WP therefore. I went with Micropub to publish from Obsidian to WordPress, around the same time as this posting. As notes in Obsidian are plain text files in the local filesystem, I run a local script outside Obsidian periodically checking for files marked for publishing. Using Micropub it can post such files, while turning markdown into html, to several of my WP-run sites, both as post and as a page. The latter allows me to add them to my wiki-like section of my blog. Just posting at the moment though, not updating.

To publish click the WordPress icon in your sidebar which will reveal a panel in the sidebar with a Publish button for you to click. Once you click the Publish button a window opens up with your username prefilled and asks you to fill in your password. The plugin … publishes RAW HTML on your site. … While this does work, it feels far from optimal to me. I’d love to see the option of pushing straight markdown to the editor.

Curtis McHale

For two years now I’ve read all my previous postings on a day, every day. Early next week I will start my third round through the archives. Today it is also two years since I started using Obsidian.md for my notes. All my little lists as E sometimes likes to joke about them (while increasingly making her own also in Obsidian btw). This morning I was reading a blogpost from a few years ago, and immediately two things stood out as concepts. They were just mentioned passingly in the blogpost, but this time they seemed more meaningful than their place in the original text suggested. Off I went down a little rabbithole, writing both notions up and connecting them to the current things that make them stand out to me now, and incorporating other references.

I find it rather amazing and awesome that I can return to my plain blogposts of old and have a new conversation with myself that way.

It also points to the importance of finding better bridges and connections between my personal notes and my blog in both directions. A more fluent going back and forth, while respecting the different spaces they form. For writing to my blog from my notes I have things well arranged now I think, but the other way and linking between them, less so. Something to think about.

I extended the capabilities of my microsub feed reader with the option to save web articles directly from the reader to my Obsidian notes in markdown format.

Until now if I wanted to save an entire article I found in my feed reader, I would open it in the browser and then use the markdownclipper browser add-on to add some context and then save the article in markdown in my notes. I wanted to cut out that step of opening it in the feed reader, by saving it directly to my markdown notes. In my feedreader I already have a response form to e.g. post a reply to a posting on my own site. Posting it to my notes means adding a path to how I process that form.

I had to find a suitable script for converting HTML to MarkDown first. Which I found in PHP League’s HTML-to-Markdown, as suggested by Jan Boddez. It requires Composer which I already had installed on my laptop.

I tweaked my feed reader’s response form to also (as a hidden field) include the original HTML of a posting (using htmlentities to stuff it into a form field value). The script that processes the form I altered to both have a path for posting to websites (using micropub) and a new path to make a note in Obsidian, which is then saved as a .md file to the folder I store all clipped articles in.
To make a note I shape the available input the same way I template clipping things from the browser. At the top is my rationale for clipping something and reference to the source, followed by the original posting after which I add some keywords as tags and again the reference to the source.

In the images below you see the corresponding elements marked both as they appear in the reader as well as the resulting note.

The article as shown in my feed reader:

1: the original HTML content from a feed
2: title of the article (prefilled by my feed reader)
3: name of the author (prefilled by my feed reader)
4: original article’s URL (prefilled by my feed reader)
5: the reason and context why I am saving this to notes (also used to write a reply to a post, or the reason for bookmarking something if it will be posted on my site)
6: a quote I want to highlight
7: keywords that will become tags or categories on my site, and tags in my notes
8: selector for which site to post to (zyl is my blog), or ‘obs’ for making a note in Obsidian

Except for that last one those numbers are marked on the image of the resulting markdown note.

The resulting note in Obsidian:

1: the original HTML content from a feed shown in Markdown as the main body of the note
2: title of the article, both shown as part of the content of the note, as well as the title of the note (where a timestamp is added)
3: name of the author (mentioned with the source both at the top and bottom)
4: original article’s URL (mentioned with the author both at the top and bottom)
5: the reason and context why I am saving this, always at the top as it helps me process the content better
6: a quote I wanted to highlight
7: keywords that have become hashtags

(This posting was also written in my notes and, except for the images, posted directly from Obsidian to my site. Meaning I can both automatically move material into Obsidian, as well as automatically move material out of Obsidian. I quite enjoy the feeling of using that ‘magic’.)

I have a working proof of concept to take individual book notes from Obsidian, turn them into an OPML list of books, and publish them on this webserver. As I had time off these past days I’ve allowed myself to do some code tinkering, resulting in the set-up shown in the image below.


A sketch of my set-up, made in Excalidraw within Obsidian. The blue items now exist, the grey items are still to be done.

The workflow is now as follows:

  • Within Obsidian I have made a template for book notes, which has a number of inline data fields (shaped ‘field:: value’). These fields contain the same attributes that I use in my OPML files, using the data structure I made earlier. It also contains one additional field, the booklist it is part of.
  • When I first create a new book note I use the template and fill out the inline data fields. If it changes status (to read, reading, read) I update the attributes if needed. Next to those data fields it can contain anything else (e.g. my Kindle hihglights and remarks end up in those book notes too.)
  • I can create lists of books in Obsidian using the Dataview plugin, which can find and interpret the inline data fields.
  • I can run a PHP script, on my laptop, that iterates through all the files in the folder that contains my book notes. It reads the inline data fields and turns them into OPML lines with the same attributes. It saves it in the correct OPML file using the booklist field. This means that when I move a book in Obsidian from my “anti-library” to the “currently reading” list and then to the “non-fiction 2021” or “fiction 2021” list by changing that single booklist data field, that will get reflected in the OPML as well. The OPML files are saved in a folder, and both human and machine readable.
  • I have a second PHP script that also runs locally on my laptop, that iterates through the files in the folder. For each of the .opml files it finds that have changed in the past week, it will get the filename and the file content. It then sends those two data fields (and an access code) to a script on my web server as POST form data.
  • The script on my web server accepts POST form data and if the access code is ok, will save the submitted file content using the submitted file name. After that the OPML files on my webserver have the same content as my Dataview overviews within Obsidian, and are fully based on the inline data fields in my individual book notes.

I’ve tested this flow and it works correctly. There’s one important improvement to still make. It currently goes through all my book notes and creates all opml files anew. I want to change that to start from the recently changed book notes and then generate the corresponding opml files. For now it is fast enough locally to not be an issue though that it iterates through the entire folder of book notes.
A second step to take is an addition: to render the same information as JSON files. Dave Winer’s OPMLpackage is likely useful here. Early on there was some discussion on which format to use, and I don’t see a need to choose. I’ve created it using my preference, but the same information can be formatted differently in parallel if it aids usage and federation.
To fully automate this, I still need to set a cron job that calls the first and second local script in turn, every other week or so.

Now that it all works, I will need to see how it goes in practice when I pick a new book, or finish one.
I also need to clean up the code (removing the tests I added in various steps) and translate some of the comments in English. Then I can share I’ve shared the scripts on GitHub, so others can use it for inspiration.

Future steps may include generating book postings in my blog here, directly based on Obsidian notes as well.