Last week at the 3rd Dutch language Obsidian meet-up one of the participants showed Excalidraw. This is a browser based sketching tool, that was created early last year (so about as old as Obsidian itself). There is an Obsidian plugin for it, which I first assumed would allow you to embed images made in the browser tool, but I was wrong.
- The plugin allows you to create sketches with Excalidraw inside Obsidian. Using command+P and typing create, you can select to create a sketch in various ways
- The sketching is done inside an Obsidian pane
- You can link text in a sketch to any other note simply by adding a markdown style link [[note name]]
- You can even embed another note in the sketch by adding the markdown, using ![[note name]]
The files with the sketches are saved inside your Obsidian vault. I took a look in one of the files, and they are JSON descriptions of the sketches. They’re not images, they’re text descriptions and as such small flat text files just like the notes themselves.
I’m impressed. I could even see myself sketchnoting on a tablet right in Obsidian with this.

Exalidraw living inside an Obsidian note, through a plugin. I made a basic sketch, with a link to a note at the red pin.

Opening a sketch in a text editor shows it to be JSON
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 shareI’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.
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