After I built a proof of concept of using OPML to share and federate book lists yesterday (UPDATE: description of the data structure for booklists), Tom Chritchlow asked me about subscribing to OPML lists in the comments. I also reread Matt Webb’s earlier posting about using OPML and RSS for book lists.
That results in a few remarks and questions I’d like to make and ask:

  • OPML serves 2 purposes
    1. In the words of Dave Winer, opml’s creator, OPML is meant as a “transparently simple, self-documenting, extensible and human readable format that’s capable of representing a wide variety of data that’s easily browsed and edited” to create and manipulate outlines, i.e. content structured hiearchically / tree-like.
    2. the format is a way to exchange such outlines between outliner tools.
  • In other words OPML is great for making (nested) lists, and for exchanging them. I use outlines to build my talks and presentations. It could be shopping lists like in Doug Engelbart’s 1968 ‘mother of all demos’. And indeed it can be lists of books.
  • A list I regard as an artefact in itself. A list of something is not just iterating the somethings mentioned, the list itself has a purpose and meaning for its creator. It’s a result of some creative act, e.g. curation, planning, writing, or desk research.
  • A book list I regard as a library, of any size. The list can be as short as the stack on my night reading table is high, as long as a book shelf in my home is wide, or as enormous as the full catalogue of the Royal Library. Judging by Tom Critchlow’s name for his booklist data ‘library.json‘ he sees that similarly.
  • A book list, as I wrote in my posting about the proof of concept, can have books in them, and other book lists by myself or others. That is where the potential for federation lies. I can from a book point to Tom’s list as the source of inspiration. I could include one of Tom’s booklists into my own booklists.
  • A list of books is different from a group of individual postings about books as also e.g. presented on my blog’s reading category page. I blog about books I read, but not always. In fact I haven’t written any postings at all this year, but have read 25 books or so since January 1st. It is easier to keep a list of books, than to write postings about each of the books listed. This distinction is expressed too in Tom Macwright’s set-up. There’s a list of books he’s read, which points to pages with a posting about an entry in that list, but the list is useful without those postings.
  • The difference between booklists as artefacts and groups of postings about books that may also be listed has impact on what it means to ‘subscribe’ to them.
    • A book list, though it can change over time, is a steady artefact. Books may get added or removed just like in a library, but those changes are an expression of the will of its maker, not a direct function of time.
    • My list of blogsposts about books, in contrast is fully determined by time: new entries get added on top, older ones drop off the list because the list has a fixed length.
    • OPML is very suited for my lists as artefacts
    • RSS is very suited for lists as expression of time, providing the x most recent posts
    • Subscribing to RSS feeds is widely available
    • Subscription is not something that has a definition for OPML (that you can use OPML to list RSS subscriptions may be confusing though)
    • Inclusion however is a concept in OPML: I can add a list as a new branch in another list. If you do that once you only clone a list, and go your own seperate way again. You could also do it dynamically, where you always re-import the other list into your own. Doing it dynamically is a de-facto subscription. For both however, changes in the imported list are non-obvious.
    • If you keep a previously seen copy and compare it to the current one, you could monitor for changes over time in an OPML list (Inoreader did that in 2014 so you could see and subscribe to new RSS feeds in other people’s OPML feed lists, also see Marjolein Hoekstra’s posting on the functionality she created.).
  • I am interested in both book lists, i.e. libraries / bookshelves, the way I am interested in browsing a book case when I visit somebody’s home, and in reading people’s reviews of books in the form of postings. With OPML there is also a middle ground: a book list can for each book include a brief comment, without being a full review or opinion. In the shape of ‘I bought this because….’ this is useful input for social filtering for me.
  • While interested in both those types, libraries, and reviews, I think we need to treat them as completely different things, and separate them out. It is fine to have an OPML list of RSS feeds of reviews, but it’s not the same as having an OPML book list, I think.
  • I started at the top with quoting Dave Winer about OPML being a “simple, self-documenting, extensible and human readable format that’s capable of representing a wide variety of data that’s easily browsed and edited“. That is true, but needs some qualification:
    • While I can indeed add all kinds of data attributes, e.g. using namespaces and standardised vocabularies like schema.org, there’s no guarantee nor expectation that any OPML parser/reader/viewer would do anything with them.
    • This is the primary reason I used an XSL template for my OPML book lists, as it allows me to provide a working parser right along with the data itself. Next to looking at the raw file content itself, you can easily view in a browser what data is contained in it.
    • In fact I haven’t seen any regular outliner tool that does anything with imported OPML files beyond looking at the must have ‘text’ attribute for any outline node. Tinderbox, when importing OPML, does look also at URL attributes and a few specific others.
    • I know of no opml viewer that shows you which attributes are available in an OPML list, let alone one that asks you whether to do something with them or not. Yet exploring the data in an OPML file is a key part of discovery of other people’s lists, of the aim to federate booklists, and for adopting better or more widely shared conventions over time.
    • Are there generic OPML attribute explorers, which let you then configure what to pay attention to? Could you create something like an airtable on the fly from an OPML list?
    • Monitoring changes in OPML list you’re interested in is possible as such, but if OPML book lists you follow have different structures it quickly becomes a lot of work. That’s different from the mentioned Inoreader example because OPML lists of RSS feeds have a predefined expected structure and set of attributes right in the OPML specification.
    • Should it be the default to provide XSL templates with OPML files, so that parsing a list as intended by the creator of the list is built right into the OPML list itself?
    • Should we ‘dumb down’ lists by moving data attributes of an outline node to a sub-node each? You will reduce machine readability in favor of having basic OPML outliners show all information, because there are no machines reading everything yet anayway.

I think for the coming weeks I’ll be on the lookout for sites that have book lists and book posting feeds, to see what commonalities and differences I find.

After I wrote about federated bookshelves again two weeks ago, I decided to build a proof of concept. A proof of concept for providing an OPML file that contains a list of books, in a way that can be parsed by others. I roughly follow Tom Critchlow’s “spec”.
Because I am making up my own data attributes (although I follow schema.org where possible), I decided to not just create an OPML list, but also to add an XSL template so that OPML is not just machine readable but also human readable in a browser.

The general idea is I have a list that contains lists of books. A list of books can contain books directly, or only be a link to that list of books. A list of books can be one of my own lists on my own domain, or it can be a list published by someone else on a different web address. This allows me to point to other people’s lists when it is somehow relevant to me.

A book in a list I provided with data attributes like title, author and urls for the book and author, and again fields pointing to other people, like the url for the list I may have found the book, or the url for the person / review which was my recommendation.

This allows discovery for both you and me. It makes it work like social software: in triangles, where you can navigate from a person, to a piece of content (a book or list), and to a piece of metadata which is itself the url of another list, or the url of another person, that then have their own metadata pointing to others etc.

Because my lists are structured opml, I should be able to automatically create list files from my own book notes.

Let’s have a look at the proof of concept:
I have an OPML file, called ‘books.opml


At the top of that screenshot you can see the opml file calls a XSL stylesheet, named test. I created it by adapting the similar set-up I have for my OPML blogroll. Because of that stylesheet the book list is human readable in a browser and looks like this:


What you see is first some info about me as the creator of the list. It has a link to this list, which is my main list, and a link to my site.
Below it is a list of book lists.

  • The first of those book lists, called ‘Fiction I read in 2021’ doesn’t have its own url, and the books are shown directly. Those books may have a link to the book, to the author, some notes, or a link to who recommended it to me, or in which list I found it. It also has a short list description at the top.
  • Underneath it is another list by me, called ‘Current non-fiction anti-library’, that is just linked.
  • Underneath that are two lists, created by Tom Critchlow and Tom Macwright, both of which are just links. The list item in the outline has an author attribute, and if it’s not my name it gets shown as a ‘followed’ book list. Theoretically if an external link is an OPML file itself, I could include it and show it right here.

Now if you click my other book list, the anti-library list (read here what an anti-library is), that is another opml file.

It calls the same XSL stylesheet as the other list, and renders in the browser as

What you can see in this second list is that it starts with the same link to the main list and info about me, and then shows how the list itself has both a URL and a description. It contains books, and see how one of those books has a link to the book itself. (I don’t link to Amazon or Goodreads, so won’t have links for most books, only if there’s a link to the publisher’s or author’s page on that book)
In the description of the last book you also see how it has a link to the list (Tom Macwright’s) in which I found it, as well as a link to a posting that served as recommendation for me.

For now what I like is that these lists bring their own viewer with it (your browser using my stylesheet), and can point to other people’s lists both directly as a list in my own collection, or as a reference for one of the books. Without having to make assumptions about other people’s lists or parse them somehow, it still allows connecting to them (federating), and discovery. My own lists use schema.org terms for book lists (collection) and books (book). Three attributes I cannot place within schema.org terms, at least not without adding additional subnodes in the outline: author url, reference list (url of the list I found a book in), and reference url (the person or posting that recommended the book to me).

UPDATE: I described the data structure for booklists I used.

De allereerste Nederlandstalige meet-up van Obsidian.md gebruikers was interessant en leuk! We waren met z’n vieren, Sebastiaan, Wouter, Frank en ik, en spraken bijna 2 uur met elkaar. Leuk om te vergelijken waarom en hoe we notities maken in Obsidian, te horen over de (vaak lange) historie die iedereen heeft met notities schrijven, met de hand of in een reeks tools. Het gesprek ging vooral over onze werkwijzen bij het toevoegen van notities, en in mindere mate over het gebruik van die notities.

Dat gebruik is zeker iets om over door te praten een volgende keer, en voor mezelf om bewuster bij stil te staan. Ik merk dat ik nog vooral in de modus zit om mijn collectie voldoende te laten groeien, en minder in het bewust raadplegen van mijn materiaal als ik met een onderwerp aan de slag ga, of iets wil maken. Tegelijkertijd merk ik wel dat ik nieuwe verbindingen leg tussen notities, en (omdat ik mijn oude weblog postings tot notities verwerk) tussen oudere en nieuwere gedachten waarover ik heb geblogd. En dat ik in het afgelopen half jaar een paar blogpostings en twee presentaties heb gemaakt die direct voortkomen uit het samenbrengen van bestaande conceptuele notities. Dat soort productieve uitkomsten is al heel nuttig, maar ik ben nog op zoek naar het een grotere rol geven van mijn notities in het reflecteren op een onderwerp, in het nadenken over vragen etc. Dit allemaal ten aanzien van conceptuele dingen dan, want m.b.t. mijn uitvoerend werk zijn mijn notities het werk als het ware.

Daarvoor is in ieder geval regelmatige blootstelling aan mijn notities nodig denk ik. Enerzijds door beter te weten wat ik er in heb zitten, en anderzijds door me in mijn workflow vaker bezig te houden met wat ik over een thema al heb bedacht, verzameld en geschreven. In de afgelopen weken ben ik daarom meer index-achtige notities gaan maken, emergente outlines. Door anderen wel maps of content genoemd, ik noem ze olifantenpaadjes. Zo’n notitie verwijst vooral naar bestaande notities, met wat zinnen er bij waarom ik die links bij elkaar plaats. Zo’n verwijs-notitie helpt me makkelijker de weg te vinden in mijn digitale tuin. Ik maakte eerder al emergente outlines maar die waren niet op navigatie gericht maar op het samenbrengen van notities in een ruwe verhaallijn, dus meer op schrijven gericht.
Een andere manier van blootstelling is via spaced repetition de inhoud van mijn notities voorbij laten komen, in de vorm van Anki vragen bijvoorbeeld. Sebastiaan liet gisteren zien dat hij een plugin aan het maken is die dat binnen Obsidian zelf doet, niet gericht op vragen of onthouden, maar gericht op herlezen.

De belangrijkste ingang voor hergebruik van mijn eigen materiaal is vaker mijn notities raadplegen als ik met een vraag aan de slag ga. Te veel leun ik op mijn eigen actieve herinnering, en dat leidt vaak tot reconstructie van dingen terwijl ik die al keurig heb uitgewerkt in mijn notities.

Wouter schrijft veel met de hand, en liet zien hoe hij al die handgeschreven pagina’s scant en in zijn Obsidian vault opneemt. Op die manier kan hij ze raadplegen en er naar verwijzen als hij er dingen uit tilt en in een notitie opneemt. Dit is een interessante manier. Al schrijf ik veel direct digitaal, ik maak ook veel handmatige aantekeningen, en er ligt hier een stapel A5 notitieboekjes. Nu heb ik ook een staande scanner met voetpedaal van CZUR, en die leent zich goed om snel notitieboekjes te digitaliseren realiseerde ik me na de meet-up. Daar maar eens mee experimenteren.

Tot slot, was ik blij met hoe prettig mijn Jitsi server werkte zo met z’n vieren. Benieuwd hoe dat gaat als je met een grotere groep bent. Alleen het scherm delen had een rare bug waarbij de bovenste strook van een scherm bleef hangen op het eerste beeld.

Wil je ook met andere Obsidian gebruikers in het Nederlandse praten over je ervaringen? Kom dan naar het #nederlands kanaal op de Obsidian Discord server.

A year ago I blogged about federated bookshelves, in response to Tom Critchlow’s posting Library JSON, A Proposal for a Decentralized Goodreads.

As I reread both postings this morning as well as some of the links Tom points, specifically Phil Gyford’s posting as he starts from the reading experience, not from the tech, and Matt Webb’s for suggesting RSS/OPML, I jotted down a few additional notes.

  • Since the previous posting I stopped linking to Amazon and Goodreads, and having a way to point others to books and vice versa, for discovery is of more interest to me now
  • I envisage myself and others having multiple lists (by topic of interest, genre, language, year, author maybe)
  • I’d like to be able to point from one of my lists to another (from an author field in one list to an author centered list e.g.)
  • I care less about ‘factual’ reviews, more about reasons why people chose a book (‘the cover design jumped out at me in the store’ or ‘this book touches upon X connected to the topic Y that I’m currently exploring’, which goes back to my notions of social filtering
  • Similarly I don’t need images of book covers, which also potentially carry copyright issues, but links to author websites or their publisher would be useful, as is a link to a list sharer’s/reader’s blogpost
  • I’d like to be able to see/get/follow other people’s lists
  • I’d like sharing a list of other people’s lists I follow
  • I’d like to be able to adopt entries in other people’s lists into one of my lists (e.g. an authour, a book or thematic list
  • It would be great if such lists could be imported somehow into tools people might use, e.g. Calibre, Delicious Library, Zotero
  • I don’t think you need a unique ID for a book, like Tom originally suggested, if the aim is discovery. It’s enough to be able to build triangles that allow navigation and discovery, from me to a title or author, to another reader or more books by an author, or other books in lists where this one shows up
  • OPML with our without RSS seems the most simple approach here, as the type of info we’re talking about is very well suited to outliners. OPML outlines, and outlines of outlines, can be machine readable and human readable at the same time (case in point, my OPML list of blogs I follow, which is human readable as a blogroll and can also directly be imported into any feedreader
  • The first list I think I should make as an experiment, is the list of things I might read, my current non-fiction Anti-Library

That last point I’ve added to my things to do if I find some spare moments.

Book Case
The other side of a book case, image by Ton Zijlstra, license CC BY NC SA

My first reading of the yet to be published EU Regulation on the European Approach for Artificial Intelligence, based on a leaked version, I find pretty good. A logical approach, laid out in the 92 recitals preceding the articles, based on risk assessment, where erosion of human and citizen rights or risk to key infrastructure and services and product safety is deemed high risk by definition. High risk means more strict conditions, following some of the building blocks of the GDPR, also when it comes to governance and penalties. Those conditions are tied to being allowed to put a product on the market, and are tied to how they perform in practice (not just how they’re intended). I find that an elegant combination, risk assessment based on citizen rights and critical systems, and connected to well-worn mechanisms of market access and market monitoring. It places those conditions on both producers and users, as well as other parties involved along the supply chain. The EU approach to data and AI align well this way it seems, and express the European geopolitical proposition concerning data and AI, centered on civic rights, into codified law. That codification, like the GDPR, is how the EU exports its norms to elsewhere.

The text should be published soon by the EC, and I’ll try a write-up in more detail then.

Ik zat vanmiddag in een middagsessie van Geonovum rondom digitale tweelingen waarin geodata wordt gebruikt. Mooie voorbeelden en goede vragen en bedenkingen voorbij zien komen. Ook het Kadaster kwam veel voorbij uiteraard, als grote datahouder op dit vlak.

Daarbij werd ook de pagina Kadaster Labs genoemd, een interessant overzicht van diverse dingen die het Kadaster technisch heeft uitgeprobeerd rondom 3d, linked data en meer. Ter inspiratie en voor hergebruik.

Een ander mooi laagdrempelig voorbeeld dat werd genoemd is de 3d versie van Amsterdam en Utrecht in wording, gemaakt in de game engine Unity. Hiermee is een 3D versie van de stad gemaakt die gewoon in je browser werkt, en waarin je bestaande data kunt verkennen maar ook interventies kunt visualiseren. Mooi laagdrempelig door die browsertoegankelijkheid, maar vooral ook omdat je wat je in beeld brengt direct ook weer als geometrische data kunt downloaden en in je eigen software kunt hergebruiken. Inclusief informatie over de ondergrond zoals riolering. Amsterdam en Utrecht werken in één ontwikkelteam, en trekken dus echt gezamenlijk op.

Een screenshot van 3d.amsterdam.nl in mijn browser, kijkend op Amsterdam Centraal Station en over het IJ naar Noord, vanaf een paar honderd meter hoogte.

Niet alles wat digitale tweeling wordt genoemd is een digitale tweeling. Veelal ontbreekt nog de dynamische kant van data, de tijdsas, terwijl soms de visuele presentatie dat wel bij gebruikers suggereert. Dat is al een valkuil van veel dashboards, dat gebrekkige kwaliteit of bruikbaarheid van onderliggende data verbloemd wordt door de presentatie, laat staan als we ook nog onder de indruk raken van mooie 3d visualisaties en bewegende elementen. Dat iedereen volop aan het experimenteren is met digitale tweelingen rond publieke vraagstukken betekent ook dat er nog weinig aandacht is voor hoe je de verbinding legt tussen al die digitale versies van onze omgeving, en welke praktijken en standaarden je daarvoor nodig hebt.