<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Taking Notes on Nicole van der Hoeven</title><link>https://nicolevanderhoeven.com/tags/taking-notes/</link><description>Recent content in Taking Notes on Nicole van der Hoeven</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>Nicole van der Hoeven</copyright><lastBuildDate>Thu, 30 Sep 2021 16:29:54 +0200</lastBuildDate><atom:link href="https://nicolevanderhoeven.com/tags/taking-notes/index.xml" rel="self" type="application/rss+xml"/><item><title>Non-Lazy DMs use Obsidian for D&amp;D</title><link>https://nicolevanderhoeven.com/blog/20210930-non-lazy-dms-use-obsidian-for-dnd/</link><pubDate>Thu, 30 Sep 2021 16:29:54 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210930-non-lazy-dms-use-obsidian-for-dnd/</guid><description>&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/non-lazy-dms.PNG" alt="Graph view in Obsidian of my three D&amp;amp;D campaigns" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Last month, I wrote about how I use &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt; for &lt;a href="https://nicolevanderhoeven.com/blog/20210809-dnd-obsidian-player/"&gt;D&amp;amp;D as a player&lt;/a&gt; in a 4e campaign (I play a half-elf hybrid wizard/cleric). This is about my second weekly game, in which I am the Dungeon Master for a 5e campaign. I&amp;rsquo;m a relatively new DM (I&amp;rsquo;ve got &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/World"&gt;39 games&lt;/a&gt; under my belt at the time this writing, and Obsidian is at the center of my workflow for improving my DMing skills, getting inspiration, preparing for a game, running the game, and making sure my players are having fun.&lt;/p&gt;
&lt;p&gt;In many ways, my setup is the Non-Lazy DM&amp;rsquo;s approach to preparing for D&amp;amp;D games: high-effort, high-touch, and high-return. But I only do it because I enjoy it!&lt;/p&gt;
&lt;h2 id="plugins-i-use"&gt;Plugins I use&lt;/h2&gt;
&lt;p&gt;This is going to be a long article, so if you&amp;rsquo;re just after the plugins I use, here they are up front!&lt;/p&gt;
&lt;p&gt;I go into detail for some, but not all of these, in the article below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jeremy Valentine&amp;rsquo;s stuff
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/valentine195/obsidian-5e-statblocks"&gt;5e statblocks plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/valentine195/obsidian-initiative-tracker"&gt;Initiative tracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/valentine195/obsidian-dice-roller"&gt;Obsidian Dice Roller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/valentine195/obsidian-admonition"&gt;Obsidian Admonition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/valentine195/obsidian-leaflet-plugin"&gt;Obsidian Leaflet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tgrosinger/advanced-tables-obsidian"&gt;Advanced Tables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Darakah/obsidian-gallery"&gt;Gallery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vslinko/obsidian-outliner"&gt;Outliner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/blacksmithgu/obsidian-dataview"&gt;Dataview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Darakah/obsidian-timelines"&gt;Obsidian Timelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, feel free to skip around to different sections by clicking on the hamburger menu on the upper right-hand corner and selecting the session that interests you.&lt;/p&gt;
&lt;h2 id="outside-the-game"&gt;Outside the game&lt;/h2&gt;
&lt;p&gt;Although I use Obsidian &lt;em&gt;while&lt;/em&gt; playing D&amp;amp;D, I use it most for D&amp;amp;D between games: fleshing out the world, getting inspiration for new adventures, or preparing for specific sessions.&lt;/p&gt;
&lt;h3 id="world-building"&gt;World-building&lt;/h3&gt;
&lt;p&gt;Many DMs run published campaigns, but I&amp;rsquo;m not one of them. I don&amp;rsquo;t think there&amp;rsquo;s anything wrong with running published campaigns; I just personally enjoy world-building and being able to tailor the environment to what I know my specific players will like. However, I still do read campaign books, for D&amp;amp;D as well as for other systems, for inspiration. I am also a voracious fantasy reader, and consider everything fair game for &amp;ldquo;stealing&amp;rdquo; for my games.&lt;/p&gt;
&lt;p&gt;One thing I&amp;rsquo;ve begun experimenting with is processing my fiction reads the way I do my nonfiction reads. What better place to look for inspiration about creating a fantasy world than other fantasy worlds? How could I use a &lt;em&gt;Bene Gesserit&lt;/em&gt;-like faction in my campaign?&lt;/p&gt;
&lt;p&gt;I recently reread the first &lt;em&gt;Dune&lt;/em&gt; book in preparation for the movie coming out later this year, but while I was reading it, I remembered how much I love the world it&amp;rsquo;s set in. I read books on Kindle, either on my actual physical Kindle ereader or on the Kindle app on my mobile, and I took highlights while I was reading &lt;em&gt;Dune&lt;/em&gt;. You can see my full highlights &lt;a href="https://notes.nicolevanderhoeven.com/Readwise/Books/Dune"&gt;here&lt;/a&gt;, synced &lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/"&gt;via Readwise&lt;/a&gt;. I highlight turns of phrases I like, character descriptions that sounded cool, or passages that are particularly revealing of the type of world the story of Dune is set in. Below is an example of a quote I highlighted:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Schools were started to train human talents.” “Bene Gesserit schools?” She nodded. “We have two chief survivors of those ancient schools: the Bene Gesserit and the Spacing Guild. The Guild, so we think, emphasizes almost pure mathematics. Bene Gesserit performs another function.” “Politics,” he said. (&lt;a href="https://readwise.io/to_kindle?action=open&amp;amp;asin=B001F0WXY0&amp;amp;location=248"&gt;Location 248&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It really resonated with me as a good characterization of two important factions in the Dune universe.&lt;/p&gt;
&lt;p&gt;Then, just as I do with nonfiction books, I create a separate note about the book itself, attempting to summarize the parts of it that might be interesting or useful to me in the future. Below is a screenshot of my page on the first book of Dune. I identify &amp;ldquo;Key truths&amp;rdquo; about the world, because I also like to use that terminology when creating secrets or themes for a fantasy world or city I&amp;rsquo;ve created.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/dune-processed.png" alt="My notes on the book Dune" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Book/Dune"&gt;Here are my full notes on Dune&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then, I also think about tropes or patterns of character, plot, or setting present in the book. I&amp;rsquo;ve started collecting these in a a page called &lt;a href="https://notes.nicolevanderhoeven.com/Forms"&gt;Forms&lt;/a&gt; in my vault. I think it&amp;rsquo;s useful to spot things that occur again and again in fantasy fiction, whether they&amp;rsquo;re overused or not. If they&amp;rsquo;re tropes that I&amp;rsquo;d rather not repeat, having a &amp;ldquo;formula&amp;rdquo; of the trope helps me either avoid it or consciously subvert it in my games. Sometimes, I just take a form wholesale and incorporate it as is.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Form/Nuns+who+think+and+fight"&gt;Here&amp;rsquo;s an example of a page&lt;/a&gt; I created that was inspired by the Bene Gesserit&amp;ndash; a short note about &amp;ldquo;Nuns who think and fight&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t been doing it for very long, but it&amp;rsquo;s already come in useful when thinking of major events and players in my world.&lt;/p&gt;
&lt;h3 id="adventure-creation"&gt;Adventure creation&lt;/h3&gt;
&lt;p&gt;Adventures are smaller-scale and higher-resolution than campaigns or worlds, so I often need more specific notes than forms.&lt;/p&gt;
&lt;p&gt;I read and highlight adventure blog posts and articles using &lt;a href="https://blog.readwise.io/readwise-reading-app/"&gt;Readwise&amp;rsquo;s recently announced Reader app&lt;/a&gt;, and then they, along with tweets, books, and PDFs, get sent to Readwise and then Obsidian using the &lt;a href="https://help.readwise.io/article/125-how-does-the-readwise-to-obsidian-export-integration-work"&gt;Official Readwise plugin for Obsidian&lt;/a&gt;. I&amp;rsquo;ve &lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/"&gt;written about this process in depth&lt;/a&gt;, but here&amp;rsquo;s what that looks like for Mike Shea&amp;rsquo;s &lt;em&gt;Return of the Lazy Dungeon Master&lt;/em&gt; - &lt;a href="https://amzn.to/2X93rvX"&gt;affiliate link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/return_of_the_lazy_dm.png" alt="My notes on Return of the Lazy Dungeon Master" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;An advantage of using Reader (which is currently in a private beta, so I&amp;rsquo;m not allowed to share screenshots of it) is that I can even highlight text locked behind a paywall. For example, I have a D&amp;amp;D Beyond subscription and I&amp;rsquo;ve bought all the books available on their store, but most reading apps don&amp;rsquo;t know that, so it&amp;rsquo;s been hard to find one that will let me highlight text from one of the WotC sourcebooks. Not so with Reader. Here&amp;rsquo;s what my highlights from the first chapter of &lt;em&gt;Volo&amp;rsquo;s Guide to Monsters&lt;/em&gt; looks like in my Obsidian vault after it&amp;rsquo;s synced from Reader:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/volos_guide-chapter1.png" alt="My highlights from Volo’s Guide to Monsters" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Readwise is great because I can highlight something on my Kindle and worry about processing it later in Obsidian. I process incoming Obsidian notes daily from 9-10pm&amp;ndash; that doesn&amp;rsquo;t mean I get through them all, just that I have a scheduled time to go through highlights and notes every day.&lt;/p&gt;
&lt;p&gt;For D&amp;amp;D-specific notes, that also involves summarizing what I&amp;rsquo;ve learned into the notes I already have on how to be a dungeon master:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/dm_session_prep.png" alt="My notes on session prep as a DM" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The referencing feature on Obsidian lets me confidently paraphrase without stealing. All I need to do is put a &lt;code&gt;[^lazydm]&lt;/code&gt; where I want the superscript to be within the text, and then at the end of the note, I put something like:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[^lazydm]: Shea, M. (2018). _Return of the lazy dungeon master_. [[Return of the Lazy Dungeon Master|My highlights]].&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;That gets parsed as a footnote by Obsidian and lets me properly credit authors.&lt;/p&gt;
&lt;p&gt;When I find good tools that help me flesh out adventures, I try to update &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/DM+Tools+and+Inspiration"&gt;my page on DM tools and inspiration&lt;/a&gt;, so they&amp;rsquo;re all in one place.&lt;/p&gt;
&lt;p&gt;While creating adventures, I like to use &lt;a href="https://github.com/valentine195/obsidian-admonition"&gt;Obsidian Admonition&lt;/a&gt; to call out specific parts of the text for me as I&amp;rsquo;m running the adventure, like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-admonition-example.png" alt="Sample of how I use Obsidian Admonition" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h4 id="random-tables"&gt;Random tables&lt;/h4&gt;
&lt;p&gt;I definitely have overarching plans about the wider plot in the world at large, but I also like to be surprised. Throwing random elements into games is one of the ways that I can keep myself on my toes and remind myself that I&amp;rsquo;m not the only one making the story.&lt;/p&gt;
&lt;p&gt;There are many random tables in both official and unofficial D&amp;amp;D sourcebooks, but I only use those as starting points. For me, creating random tables that are tailored to my characters and to the things they care about is where it&amp;rsquo;s at!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve experimented with creating my own random generators for various things, as well as using existing ones like &lt;a href="https://donjon.bin.sh/"&gt;Donjon&lt;/a&gt;, but it&amp;rsquo;s an Obsidian plugin, Jeremy Valentine&amp;rsquo;s &lt;a href="https://github.com/valentine195/obsidian-dice-roller"&gt;Dice Roller&lt;/a&gt;, that I have settled on.&lt;/p&gt;
&lt;p&gt;The name &amp;ldquo;Dice Roller&amp;rdquo; makes you think it&amp;rsquo;s only for rolling dice, but it&amp;rsquo;s much more than that. Its REAL value, in my opinion, is in how it lets me create tables for ANYTHING, and then randomly pull one row out of it. Here&amp;rsquo;s how it works.&lt;/p&gt;
&lt;p&gt;First, you create a table. I had a session where my players discovered a place I called &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/Shipwreck+Beach"&gt;Shipwreck Beach&lt;/a&gt;, and had a lot of fun going through several of the ships that were there. Here&amp;rsquo;s a table of &amp;ldquo;encounters&amp;rdquo; I put together for that session.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;### Ship encounters
| Roll | Encounter |
| ---- | --------------------------------------------------------------------- |
| 1 | Carnivorous Ship, ToB II p. 56 |
| 2 | Map Mimic: https://www.dndbeyond.com/monsters/1624929-map-mimic |
| 3 | Random curse: p.249 of GM&amp;#39;s Book of Random Encounters - d100 |
| 4 | Clockwork weaving spider (1, ToB p. 66) |
| 5 | 1d6 Cobbleswarm (2, ToB p. 68) |
| 6 | a feral little girl wearing a periapt of proof against poison |
| 7 | A large gold coin bearing the crest of the Kryn Dynasty and the queen |
| 8 | Book about the Arms of the Betrayer Gods |
^ship
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note the &lt;code&gt;^ship&lt;/code&gt; identifier at the bottom there&amp;ndash; it can be called whatever you want, but you&amp;rsquo;ll use that identifier when rolling on that table. I also included the &lt;code&gt;Roll&lt;/code&gt; column, in case I decided on the spot to let players roll instead of doing it myself.&lt;/p&gt;
&lt;p&gt;Next, in another note (or the same one, if you want), include this line:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Shipwreck encounter: `dice: [[Shipwreck Beach#^ship]]`
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When you flip to Preview mode, you&amp;rsquo;ll see this in the place of the line above:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/shipwreck_encounter-example.png" alt="Random Shipwreck encounter using Obsidian Dice Roller" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it!! This has made a HUGE impact on my games, because it&amp;rsquo;s so easy to create or modify tables. I use random encounter tables sparingly &lt;em&gt;during&lt;/em&gt; the game, but often use it &lt;em&gt;before&lt;/em&gt; a game, to introduce something fresh that I hadn&amp;rsquo;t thought of.&lt;/p&gt;
&lt;h3 id="session-prep"&gt;Session prep&lt;/h3&gt;
&lt;p&gt;As you might have guessed, I mostly use Sly Flourish&amp;rsquo;s Lazy DM steps for encounter creation, saved as an Obsidian template:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
type: session
world: Exandria
campaign: &amp;#34;The Slayers Five&amp;#34;
date: {{date}}
game_date: 836-03-
location: Rumblecusp
characters: [Boris, Lira, Ora, Jamedi, Flint]
tags: [TVZ]
---
## [[Session Summary]]:
^summary
---
## Housekeeping
## Recap
![[^summary]]
## Strong start
&amp;gt;
## Scenes
- [ ]
- [ ]
- [ ]
- [ ]
## Secrets and Clues
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
## [[Loot]]
- [ ]
---
## Log
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Before each session, I&amp;rsquo;ll go through each of these sections.&lt;/p&gt;
&lt;p&gt;I add &lt;em&gt;metadata&lt;/em&gt; to every session for use with the &lt;a href="https://github.com/blacksmithgu/obsidian-dataview"&gt;Dataview&lt;/a&gt; plugin later, in case I want to do a search for all sessions that involved a particular NPC or that took place in a certain location, for example.&lt;/p&gt;
&lt;p&gt;I fill out the &lt;em&gt;Session Summary&lt;/em&gt; section &lt;em&gt;after&lt;/em&gt; the game, but I put it at the top so I can immediately see what happened in the session in case I need to refresh my memory on it in the future. I also identify this section with a &lt;code&gt;^summary&lt;/code&gt; so that I can embed it in the next session, as a recap - more on that below.&lt;/p&gt;
&lt;p&gt;In the &lt;em&gt;Housekeeping&lt;/em&gt; section, I write down things I want to mention before we dive into the narrative of the session. Usually, these topics are scheduling- or rules-related. For example, if my players have just levelled up and I see that one of them has chosen a feat, I might make a note of it here to make sure that they know what it means. My players are pretty new, so I think it&amp;rsquo;s better to err on the side of more communication rather than less.&lt;/p&gt;
&lt;p&gt;In the &lt;em&gt;Recap&lt;/em&gt; section, I call the sumary from the previous session and embed it into the current session using something like &lt;code&gt;![[38_8360310-8360311 Seduction at the Moonlight Chateau#^summary]]&lt;/code&gt;. When in preview mode, Obsidian shows just that section labelled with &lt;code&gt;^summary&lt;/code&gt; from the previous game. I like to start the game by either reading out the summary myself, or asking one of the players to recount what they remember. That way we&amp;rsquo;re all on the same page when we begin.&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;Strong start&lt;/em&gt;, I write a paragraph or two of prepared text that I use to kick off the story. This is usually the only text I&amp;rsquo;ll read out word for word during the game.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Scenes&lt;/em&gt; are a list of events that I THINK will happen. My players frequently surprise me, which I welcome, so I also list these with checkboxes so that I can keep track of where the story deviated from the plan.&lt;/p&gt;
&lt;p&gt;Sly Flourish does recommend a separate section for Fantastic Locations, but I tend to prepare these as separate pages. For example, here are my notes on a possible location, &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/The+Charred+Circus"&gt;The Charred Circus&lt;/a&gt;. I don&amp;rsquo;t include them within the session note itself, but I do make sure I have a few that characters could go to. Then, I link to all of them from the note I have for the city they&amp;rsquo;re in, &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/Port+Damali#Geography+and+Map"&gt;like this one for Port Damali&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Secrets and Clues&lt;/em&gt; is where I put a list of 10 things that players MIGHT find out somehow. This is where I look when a player rolls a natural 20 on a Perception check. The idea is to describe &lt;em&gt;what&lt;/em&gt; the secrets are, but not get too caught up in trying to plan &lt;em&gt;when&lt;/em&gt; or &lt;em&gt;how&lt;/em&gt; the players will find out those secrets. I try to include things that might be interesting for the players, as well as a few potential adventure hooks. &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/38_8360310-8360311+Seduction+at+the+Moonlight+Chateau#Secrets+and+Clues"&gt;Here&amp;rsquo;s a list that I made for a previous game&lt;/a&gt;. I have never used all 10 up in one game, but I like having more than I need.&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;Loot&lt;/em&gt;, I put in any items I know the party will likely get to. If they&amp;rsquo;re in a boss fight, I usually save in this section all the things I&amp;rsquo;ve decided beforehand they&amp;rsquo;ll get. If I don&amp;rsquo;t have something specific like that in mind, I sometimes randomize a bunch of non-magical trinkets. The &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/Loot"&gt;Loot page&lt;/a&gt; contains items I&amp;rsquo;ve picked out for specific characters.&lt;/p&gt;
&lt;h3 id="post-session-processing"&gt;Post-session processing&lt;/h3&gt;
&lt;p&gt;If your players are anything like mine, you&amp;rsquo;ll often find yourself with a bunch of unused material and a lot of stuff you still had to improvise on the spot, despite adequate preparation. That&amp;rsquo;s okay! I actually enjoy when my players do something unexpected. I encourage and reward creative play&amp;hellip; but it does mean that I have to do a bit of a debrief after each session.&lt;/p&gt;
&lt;p&gt;I try not to prepare things that may really be &amp;ldquo;wasted&amp;rdquo;. Things like locations, NPCs, or general plot hooks can usually be recycled. After games, I spend some time tying off loose ends, noting down decisions the party made and the reasoning behind those decisions, and tweaking connections between NPCs or places based on how the party reacted.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fleshing out bits of the world, with each city or NPC getting a page&lt;/li&gt;
&lt;li&gt;Tagging cities and NPCs with Location or NPC, and then within the city, doing a query for NPC and &lt;code&gt;city name&lt;/code&gt; to get everyone living in that city.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I use metadata for every page in my campaign so that I can use the excellent &lt;a href="https://github.com/blacksmithgu/obsidian-dataview/"&gt;Dataview plugin&lt;/a&gt; later to find whatever I want. You already saw my session template, but here&amp;rsquo;s an NPC template that I use:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;NPC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;faction&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;location&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;world&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Exandria&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;campaign&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;The Slayers Five&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;date&lt;/span&gt;: [{{&lt;span style="color:#ae81ff"&gt;date}}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;description&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;race&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;gender&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;class&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I insert this template for every single NPC in my world, whether my players get to it or not. Because I use it so often, I&amp;rsquo;ve set up a hotkey for inserting templates in the Obsidian settings:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-inserting_template.png" alt="Setting a hotkey for template insertion" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;That way, all I have to do is hit &lt;code&gt;CMD + ;&lt;/code&gt; and select the right template from the list, and the text above is inserted at the beginning of the note as frontmatter, with all the fields I need to fill out. The date is also automatically generated.&lt;/p&gt;
&lt;p&gt;Using the Dataview plugin, I can then embed queries on location pages so that I can see NPCs in that place at a glance. For example, here&amp;rsquo;s the snippet I put under the &lt;code&gt;People&lt;/code&gt; section in my Port Damali page:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#f92672"&gt;```&lt;/span&gt;dataview
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; shop &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; Shop, faction &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; Faction, description &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; Description &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Exandria&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;contains&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;NPC&amp;#34;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;and&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;contains&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;location&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Port Damali&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SORT file.name &lt;span style="color:#66d9ef"&gt;ASC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#f92672"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(If you try this, remove the backticks &lt;code&gt;\&lt;/code&gt; in the snippet above&amp;ndash; those are just to show you the syntax for a dataview query.)&lt;/p&gt;
&lt;p&gt;That query, when rendered in Preview mode in Obsidian, looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-dataview-port_damali.png" alt="Rendered Dataview query in Obsidian Preview mode" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Having the metadata for every NPC, monster, item, and place in my world is essential for creating queries like this. I&amp;rsquo;ve also found it useful to maintain a model of the metadata I use:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- `type`
- `NPC`
- `PC`
- `shop`
- `place`
- `item`
- `session` for D&amp;amp;D play sessions
- `quest`
- `race`
- `faction`
- `family`
- `monster`
- `condition`
- `deity`
- `other` for anything else
- `characters` (for sessions): characters involved in this session
- `deceased`
- `true`
- `false`
- `family`
- `faction`
- `race`
- `gender`
- `class`
- `description`
- `date`
- `game_date`
- `world`
- `Exandria`
- `Forgotten Realms`
- `Exandya`
- `campaign`
- `Order of the Wandering Mind`
- `The Slayers Five`
- `Die vergessene Schwester`
- `Temporary White Circle`
- `shop` (for proprietors)
- `shop_type` (for shops)
- `general` : general goods store
- `alchemy`: potions
- `magical items`: sells magical items
- `services`: magical spells, messaging, brothel
- `tavern`: food and drink
- `inn`: lodging
- `herbalism`
- `smithy`
- `location`: city of residence
- `origin`: city of origin
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="during-the-game"&gt;During the game&lt;/h2&gt;
&lt;p&gt;I keep a &amp;ldquo;World&amp;rdquo; page for each of my D&amp;amp;D campaigns, including a list of sessions:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/campaign-page.png" alt="Campaign Page with list of sessions" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;During the game, I use the session page that I mentioned above, and start filling in the &lt;em&gt;Log&lt;/em&gt; section. I tend to take way fewer notes as a DM than as a player, just because I&amp;rsquo;m busy doing other things, but I do always write down things that the players do that I might need to remember later.&lt;/p&gt;
&lt;p&gt;One thing that comes up frequently in my games is the need to improvise encounters, NPCs, or locations. I&amp;rsquo;ve had great success in creating a &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/Random+Rolls"&gt;Random Rolls&lt;/a&gt; page that collates many of these random tables in one note. If you click on that link, you unfortunately won&amp;rsquo;t be able to see the results rendered, because the Dice Roller plugin isn&amp;rsquo;t available for Obsidian Publish, but maybe you&amp;rsquo;ll get an idea of things I&amp;rsquo;m rolling on. Most of the tables referred to are from &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/Random+Tables"&gt;this Random Tables note&lt;/a&gt;, but every now and then I&amp;rsquo;ll include tables in location notes instead.&lt;/p&gt;
&lt;p&gt;I always have this Random Rolls page up as part of my DM workspace, in case I need to quickly improvise something. Here&amp;rsquo;s what the NPC section looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/npc_dice_roller-example.png" alt="Random rolls on the NPC random tables" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I can use any or all of those things that I want, or use them as inspiration for something else I make up on the spot. Either way, it means I&amp;rsquo;ll never be completely at a loss for the name of an NPC. ;)&lt;/p&gt;
&lt;h3 id="initiative-tracker"&gt;Initiative Tracker&lt;/h3&gt;
&lt;p&gt;I use D&amp;amp;D Beyond for character sheets, but I use &lt;a href="https://github.com/valentine195/obsidian-initiative-tracker"&gt;Jeremy Valentine&amp;rsquo;s initiative tracker&lt;/a&gt; to handle combat because there are a few critical features that D&amp;amp;D Beyond&amp;rsquo;s Encounter Tracker doesn&amp;rsquo;t yet support:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Status conditions&lt;/li&gt;
&lt;li&gt;(Easy to tweak) homebrew monsters&lt;/li&gt;
&lt;li&gt;Hiding monsters&amp;rsquo; names from the players&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Initiative Tracker plugin supports all of these. When activated, it appears as a side panel in Obsidian:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/initiative_tracker_plugin.png" alt="Jeremy Valentine’s initiative tracker for Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I can easily see everyone&amp;rsquo;s HP and AC at a glance, and also apply special status conditions when necessary. My players don&amp;rsquo;t have to know whose turn it is&amp;ndash; they just have to know when their turn is. I warn them verbally when they&amp;rsquo;re &amp;ldquo;on deck&amp;rdquo;, and they haven&amp;rsquo;t had an issue with that.&lt;/p&gt;
&lt;p&gt;D&amp;amp;D Beyond does allow you to create homebrew monsters, but the only real benefit to doing so is to be able to use it in their Combat Tracker, so I&amp;rsquo;ve been using another plugin by Jeremy Valentine, the author of this one, to create monster statblocks&lt;/p&gt;
&lt;h3 id="statblocks"&gt;Statblocks&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/valentine195/obsidian-5e-statblocks"&gt;The 5e statblocks plugin&lt;/a&gt; lets me easily create homebrew creatures just by using this format:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;\```statblock
name: string
size: string
type: string
subtype: string
alignment: string
ac: number
hp: number
hit_dice: string
speed: string
stats: [number, number, number, number, number, number]
fage_stats: [number, number, number, number, number, number, number, number, number]
saves:
- &amp;lt;ability-score&amp;gt;: number
skillsaves:
- &amp;lt;skill-name&amp;gt;: number
damage_vulnerabilities: string
damage_resistances: string
damage_immunities: string
condition_immunities: string
senses: string
languages: string
cr: number
spells:
- &amp;lt;description&amp;gt;
- &amp;lt;spell level&amp;gt;: &amp;lt;spell-list&amp;gt;
traits:
- [&amp;lt;trait-name&amp;gt;, &amp;lt;trait-description&amp;gt;]
- ...
actions:
- [&amp;lt;trait-name&amp;gt;, &amp;lt;trait-description&amp;gt;]
- ...
legendary_actions:
- [&amp;lt;legendary_actions-name&amp;gt;, &amp;lt;legendary_actions-description&amp;gt;]
- ...
reactions:
- [&amp;lt;reaction-name&amp;gt;, &amp;lt;reaction-description&amp;gt;]
- ...
\```
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;(Again, remove the backticks &lt;code&gt;\&lt;/code&gt; at the starting and ending lines of the snippet above if you copy and paste this into your vault.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I usually start with a &amp;ldquo;real&amp;rdquo; monster from official or unofficial sourcebooks, then tweak it from there. For example, here&amp;rsquo;s a sample one that I tweaked from &lt;a href="https://koboldpress.com/tome-of-beasts/"&gt;Tome of Beasts&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-statblocks-example.png" alt="Sample of 5e statblock plugin in action" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The best part about this plugin is that it integrates with the Initiative Tracker. When you create a statblock and save it, that monster then becomes available for use within the Initiative Tracker, as you can see from the screenshot above.&lt;/p&gt;
&lt;h2 id="publishing"&gt;Publishing&lt;/h2&gt;
&lt;p&gt;I subscribe to &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/World"&gt;Obsidian Publish&lt;/a&gt;, partly to give back to the fine Obsidian developers who&amp;rsquo;ve made a tool I use daily and partly because I&amp;rsquo;ve found that it&amp;rsquo;s reduced friction in publishing. I use it primarily for non-D&amp;amp;D-related things, but D&amp;amp;D is part of my life, so it&amp;rsquo;s there as well. &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/World"&gt;You can find my notes on the D&amp;amp;D campaign I DM here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some of the plugins that I use unfortunately don&amp;rsquo;t render correctly when Published, but the developers are working on that.&lt;/p&gt;
&lt;p&gt;I publish my campaign notes mainly because I love seeing other DM&amp;rsquo;s thought processes and systems, so I thought I&amp;rsquo;d return the favour by sharing mine as well. In case you were wondering, my players don&amp;rsquo;t know I publish these notes&amp;ndash; or, at least, I hope they don&amp;rsquo;t!&lt;/p&gt;
&lt;h2 id="player-facing-campaign-vault"&gt;Player-facing campaign vault&lt;/h2&gt;
&lt;p&gt;I used to drop handouts into a WhatsApp group with my players, but it became increasingly unwieldy to look for something. We switched to Slack, but that had the same problem of needing to scroll back through lots of photos before finding the right one. Photos aren&amp;rsquo;t very searchable in those apps.&lt;/p&gt;
&lt;p&gt;A few months ago, I switched to Obsidian for handouts. I created a separate vault for the campaign and shared it with my players via Dropbox. I did have to talk them through the setup, but it&amp;rsquo;s worked out very well for us as a free alternative.&lt;/p&gt;
&lt;p&gt;In the vault, I put things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pictures and other handouts&lt;/li&gt;
&lt;li&gt;Session videos and summaries&lt;/li&gt;
&lt;li&gt;Links for everything we use as a group&lt;/li&gt;
&lt;li&gt;House rules&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="session-page"&gt;Session page&lt;/h3&gt;
&lt;p&gt;I create a page for every session we have, which has a section for the video recording of that session (unlisted and just for us, sorry), a player-friendly summary, and a log. The log is where I dump photos I give them during the session. Here&amp;rsquo;s what that looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-player-vault-session.png" alt="Session page for my player-facing vault" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t put any other notes in the log; that&amp;rsquo;s the players&amp;rsquo; jobs (if they want to).&lt;/p&gt;
&lt;p&gt;I like to have a &amp;ldquo;Story Thus Far&amp;rdquo; page that embeds the video and summary sections of all the sessions, so any of us can read through it to remember what&amp;rsquo;s happened. It&amp;rsquo;s fun to see how far we&amp;rsquo;ve come as a group.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-player_vault-story-thus-far.png" alt="Story Thus Far page in my player-facing vault" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="about-our-game"&gt;About our game&lt;/h3&gt;
&lt;p&gt;The About our game page has a list of links to all the tools we use, our schedule, and a few things about the campaign and the world.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-player_vault-about_our_game.png" alt="About our game page in my player-facing vault" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="rules"&gt;Rules&lt;/h3&gt;
&lt;p&gt;I keep a house rules page that shows all the extra rules I&amp;rsquo;ve put into the game. I mostly play with all the WoTC-produced sourcebooks, but I&amp;rsquo;ve added some extra rules about things that my players are interested in, such as strongholds (for which I use &lt;a href="https://shop.mcdmproductions.com/collections/strongholds-followers-books"&gt;Matt Colville&amp;rsquo;s Strongholds &amp;amp; Followers book&lt;/a&gt;) and smith&amp;rsquo;s tools.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-player_vault-rules.png" alt="Rules page in my player-facing vault" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I also have some other pages on rules that come up often, such as Ship statblocks (since the campaign is set on a coast) and suggested downtime activities.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I call my approach to game preparation the Non-Lazy DM&amp;rsquo;s approach as a tongue-in-cheek nod to &lt;a href="https://slyflourish.com"&gt;Mike Shea&amp;rsquo;s&lt;/a&gt; content, but there&amp;rsquo;s truth to the moniker, too. My setup is extremely detail-oriented, time-consuming, and &lt;em&gt;fun&lt;/em&gt;&amp;hellip; at least for me! And that&amp;rsquo;s the key: I wouldn&amp;rsquo;t be doing any of this if I didn&amp;rsquo;t find it truly enjoyable to world-build to this level of detail.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a non-lazy DM too, thanks for sticking around! I hope this has given you some ideas for how you could use Obsidian to run your games and stimulate your imagination, too.&lt;/p&gt;</description></item><item><title>How to import Shortform highlights to Obsidian via Readwise</title><link>https://nicolevanderhoeven.com/blog/20210815-shortform-to-readwise/</link><pubDate>Mon, 16 Aug 2021 21:40:16 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210815-shortform-to-readwise/</guid><description>
&lt;meta property=“og:image” content="/assets/20210816-shortform-to-readwise-title.png.png" /&gt;
&lt;meta property=”og:image:width” content=”1200″ /&gt;
&lt;meta property=”og:image:height” content=”628″ /&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210816-shortform-to-readwise-title.png" alt="Shortform to Readwise hero photo" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve always been dubious of those book summary apps. You know the ones&amp;ndash; they tend to have obnoxious ads that promise to help you &amp;ldquo;read 5 books a day&amp;rdquo; or learn the world&amp;rsquo;s secrets in 15 minutes. Having tried a few of them, I&amp;rsquo;ve been disappointed with the quality of their summaries (or lack thereof). They attempt to distill the message of a 300+ page book into a handful of bullet points, which I&amp;rsquo;ve found neither accurate nor useful. Recently, though, I found myself happily subscribing to one, and here&amp;rsquo;s why.&lt;/p&gt;
&lt;h2 id="whats-shortform-and-why-is-it-awesome"&gt;What&amp;rsquo;s Shortform and why is it awesome?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://shortform.com/nicole"&gt;Shortform&lt;/a&gt; really took me aback because it isn&amp;rsquo;t just a book summary. I should mention here that I&amp;rsquo;m not affiliated with Shortform and gain nothing by recommending them. I&amp;rsquo;m just a happy subscriber.&lt;/p&gt;
&lt;p&gt;When I read their guide for the book &lt;em&gt;Why We Sleep&lt;/em&gt;, I was pleasantly surprised to find that Shortform not only summarized it succinctly, but they also added intelligent counterarguments to the author&amp;rsquo;s points. In some cases, when the author made a false claim, there were Shortform notes that linked to studies that showed &lt;em&gt;why&lt;/em&gt; the claim was false. In other cases, Shortform mentioned related concepts proposed in other books that strengthened the author&amp;rsquo;s viewpoint. I found myself looking up their guides of books I&amp;rsquo;d already read, just because I was curious to see if I had missed anything. And I had!&lt;/p&gt;
&lt;p&gt;In short, Shortform is the only book summary reader I&amp;rsquo;ve found that goes beyond summarizing and actually &lt;em&gt;adds value&lt;/em&gt; to the reading experience, &lt;em&gt;even if you&amp;rsquo;ve read the book.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;They also have a one-page summary of the book AND a summary per chapter, so information is presented at different levels of detail. In my time with it, my most frequent workflow with it has involved reading the one-page summary of a book, buying it if it was interestering enough, reading the book, and then going back to Shortform to go read the chapter summaries. And both the one-page and detailed chapter summaries, including Shortform notes, can be highlighted!&lt;/p&gt;
&lt;p&gt;Naturally I wanted to take it further than that. I already &lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux"&gt;sync my Kindle highlights to Obsidian&lt;/a&gt; automatically and incrementally process them in Obsidian, so I wrote a script to have my Shortform highlights going to &lt;a href="https://readwise.io"&gt;Readwise&lt;/a&gt; as well.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210816-shortform-01.png" alt="Shortform highlights in my Obsidian vault" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My Shortform highlights for the book Mindset, in my Obsidian vault.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The screenshot above shows the final result: highlights I made in the Shortform web or mobile app that have been synced to a page in my Obsidian vault. Here&amp;rsquo;s how I did that.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: Since this article was published, Shortform and Readwise have created an integration, so the script I mention here is no longer necessary. Click &lt;a href="https://nicolevanderhoeven.com/blog/20221021-obsidian-for-non-coders"&gt;here&lt;/a&gt; to see what I&amp;rsquo;d recommend doing today.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="what-you-need"&gt;What you need&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;a href="https://shortform.com/nicole"&gt;Shortform&lt;/a&gt; account. &lt;em&gt;(affiliate link)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt; account. &lt;em&gt;(This is an affiliate link. If you sign up with this link, you&amp;rsquo;ll get a two-month free trial instead of one, and I get a small percentage if you sign up for a plan.)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;A tool that Readwise can export to, such as &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;, &lt;a href="https://roamresearch.com"&gt;Roam Research&lt;/a&gt;, &lt;a href="https://notion.so"&gt;Notion&lt;/a&gt;, or &lt;a href="https://evernote.com"&gt;Evernote&lt;/a&gt;. You can also use their CSV and Markdown exports.&lt;/li&gt;
&lt;li&gt;A local installation of Python 3, which you can &lt;a href="https://www.python.org/downloads/"&gt;download here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obsidian is my Personal Knowledge Management tool of choice, and I use the &lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/"&gt;Readwise Official community plugin&lt;/a&gt; to get Readwise to send highlights to Obsidian. However, using Obsidian is not necessary as my script connects only Shortform to Readwise.&lt;/p&gt;
&lt;h2 id="the-setup"&gt;The setup&lt;/h2&gt;
&lt;p&gt;Clone &lt;a href="https://github.com/nicolevanderhoeven/shortform-to-readwise"&gt;my Shortform-to-Readwise repository on GitHub&lt;/a&gt; or download it to your computer.&lt;/p&gt;
&lt;h3 id="enter-your-tokens"&gt;Enter your tokens&lt;/h3&gt;
&lt;p&gt;The file &lt;code&gt;variables.py&lt;/code&gt; requires two tokens: one from your Shortform account and another from your Readwise account:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Your authorization token for Shortform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;authToken &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Your Readwise API token&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Retrieve this token from https://readwise.io/access_token&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;readwiseToken &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="getting-your-shortform-token"&gt;Getting your Shortform token&lt;/h4&gt;
&lt;p&gt;This is a little hacky, because Shortform doesn&amp;rsquo;t expose an API token in their web app. So you&amp;rsquo;ll need to log in to your Shortform account and open up DevTools in your browser. In Chrome, go to Options &amp;gt; More Tools &amp;gt; Developer Tools (or, on Mac, hit CMD+OPTION+I). Click on the Network panel.&lt;/p&gt;
&lt;p&gt;You should now see Shortform on one side, and DevTools on another in the same browser window.&lt;/p&gt;
&lt;p&gt;Then, go to &lt;a href="https://www.shortform.com/app/highlights"&gt;your Highlights page&lt;/a&gt;. Doing so will populate the Network panel with a bunch of requests that look like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210816-shortform-02.png" alt="DevTools open in Chrome, showing requests from Shortform" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;DevTools open in Chrome, showing requests from Shortform.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Click on the request with the name &lt;code&gt;?sort=date&lt;/code&gt;, highlighted above. That&amp;rsquo;ll open another side panel that will show Headers. Scroll down to the section marked &amp;ldquo;Request Headers&amp;rdquo;, and look for where it says &lt;code&gt;Authorization: Basic &lt;/code&gt; followed by a bunch of characters.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210816-shortform-03.png" alt="Authorization headers for Shortform, in DevTools" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Authorization headers for Shortform, in DevTools.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve removed my personal authorization token from the screenshot above, but it&amp;rsquo;s a long series of characters that comes after &lt;code&gt;Authorization: Basic &lt;/code&gt;. Go ahead and right click on it and click Copy Value. Paste it into &lt;code&gt;variables.py&lt;/code&gt; as the value for &lt;code&gt;authToken&lt;/code&gt;, and then _remove &lt;code&gt;Basic &lt;/code&gt; (including the space after it) so that you&amp;rsquo;re saving only everything that comes afterwards.&lt;/p&gt;
&lt;h4 id="getting-your-readwise-token"&gt;Getting your Readwise token&lt;/h4&gt;
&lt;p&gt;Thankfully, this one&amp;rsquo;s a little easier. Go to &lt;a href="https://readwise.io/access_token"&gt;this page on Readwise&lt;/a&gt; after logging in. Click &amp;ldquo;Get Token&amp;rdquo;, click &amp;ldquo;Copy to clipboard&amp;rdquo;, and then paste it into &lt;code&gt;variables.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Save &lt;code&gt;variables.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Note: Don&amp;rsquo;t share either of these tokens with anyone else, as they will then be able to access your Shortform or Readwise accounts.&lt;/p&gt;
&lt;h3 id="run-the-script"&gt;Run the script&lt;/h3&gt;
&lt;p&gt;Open up your terminal, and &lt;code&gt;cd&lt;/code&gt; into the &lt;code&gt;/shortform-to-readwise&lt;/code&gt; repository. Then, run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python3 getHighlights.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It should finish in a few seconds (depending on how many Shortform highlights you have), and then you can verify that it worked by going to &lt;a href="https://readwise.io/books"&gt;your Readwise library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210816-shortform-04.png" alt="Shortform exports showing up in your Readwise library" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Shortform exports showing up in your Readwise library.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You should see books that have the &lt;code&gt;Shortform-&lt;/code&gt; prefix. If you do, then you&amp;rsquo;re done! If you&amp;rsquo;ve got your Readwise account set up to push your highlights elsewhere (such as Obsidian), then you&amp;rsquo;re all set!&lt;/p&gt;
&lt;p&gt;In case you&amp;rsquo;re wondering why I added the &lt;code&gt;Shortform-&lt;/code&gt; prefix, it&amp;rsquo;s because I often read the Shortform guide, and then read the book itself. Rather than end up in a sticky situation where the Shortform guide highlights might override the actual book highlights, I titled it differently so that I get two pages for the two sets of highlights.&lt;/p&gt;
&lt;h2 id="what-about-running-the-script-regularly"&gt;What about running the script regularly?&lt;/h2&gt;
&lt;p&gt;The whole point of this, at least for me, was to set it up so that I&amp;rsquo;ve got highlights going to Obsidian &lt;em&gt;automatically&lt;/em&gt;, without needing my intervention. What I did was to use &lt;code&gt;crontab&lt;/code&gt; on macOS to run the script every 30 minutes, but you can set up your own schedule.&lt;/p&gt;
&lt;h3 id="give-cron-full-system-access"&gt;Give cron full system access&lt;/h3&gt;
&lt;p&gt;Cron needs to have the right permissions to run scripts on your behalf, so you may have to go to System Preferences &amp;gt; Security &amp;amp; Privacy &amp;gt; Privacy &amp;gt; Full Disk Access on your laptop and add &lt;code&gt;/usr/bin/cron&lt;/code&gt; to the &amp;ldquo;allowed&amp;rdquo; list.&lt;/p&gt;
&lt;h3 id="find-the-path-for-your-python3-installation"&gt;Find the path for your python3 installation&lt;/h3&gt;
&lt;p&gt;In your terminal, run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;which python3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will give you a path. For me, it was &lt;code&gt;/Library/Frameworks/Python.framework/Versions/3.9/bin/python3&lt;/code&gt;. Copy this.&lt;/p&gt;
&lt;h3 id="open-crontab"&gt;Open crontab&lt;/h3&gt;
&lt;p&gt;Then, from your terminal, run the command &lt;code&gt;env EDITOR=nano crontab -e&lt;/code&gt; to open up a list of cronjobs. If you don&amp;rsquo;t have any other jobs, this will be blank.&lt;/p&gt;
&lt;h3 id="set-a-schedule"&gt;Set a schedule&lt;/h3&gt;
&lt;p&gt;Add a line to crontab for the schedule you want to create. This line has to be in the format&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* * * * * command
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;where the five asterisks correspond to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;minute&lt;/li&gt;
&lt;li&gt;hour&lt;/li&gt;
&lt;li&gt;day of the month&lt;/li&gt;
&lt;li&gt;month&lt;/li&gt;
&lt;li&gt;day of the week&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my case, I wanted it to run every 30 minutes, so here&amp;rsquo;s what my schedule looks like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*/30 * * * * /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 /Users/nic/python/shortform-to-readwise/gethighlights.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make sure you change &lt;code&gt;/Users/nic/python/&lt;/code&gt; to the path where you put the repository and your python3 path instead of &lt;code&gt;/Library/Frameworks/Python.framework/Versions/3.9/bin/python3&lt;/code&gt;. Now exit out of it and save it (CTRL+X, and yes). The Python script should automatically run every 30 minutes.&lt;/p&gt;
&lt;h2 id="thats-it"&gt;That&amp;rsquo;s it!&lt;/h2&gt;
&lt;p&gt;I consume a lot of content daily, but without systems in place to capture insights from that content and process it, it all just gets forgotten eventually. That&amp;rsquo;s why I love services like Shortform and Readwise&amp;ndash; they let me get what I&amp;rsquo;ve read/watched/heard out of my head and into Obsidian, where I can review them more critically and truly learn the important parts.&lt;/p&gt;
&lt;p&gt;Both are paid services (which I paid for out of my own money), but I really think they&amp;rsquo;re worth it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: This post contains affiliate links. Check out &lt;a href="https://nicolevanderhoeven.com/ethics/"&gt;My Ethics Statement&lt;/a&gt; to see my standards for promotions.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>The easiest way to sync Kindle highlights to Obsidian: Readwise to Obsidian Redux</title><link>https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/</link><pubDate>Tue, 10 Aug 2021 19:50:40 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/</guid><description>
&lt;meta property=“og:image” content="/assets/readwise-official-plugin.png" /&gt;
&lt;meta property=”og:image:width” content=”1200″ /&gt;
&lt;meta property=”og:image:height” content=”628″ /&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-official-plugin.png" alt="Readwise to Obsidian workflow" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Almost exactly six months ago, I &lt;a href="https://nicolevanderhoeven.com/blog/20210206-readwise-to-obsidian/"&gt;wrote a blog post&lt;/a&gt; detailing my workflow for processing content. Specifically, I wrote about how I used a python script to take my highlights from Instapaper, Kindle, Twitter, and Airr and automatically put them into Obsidian.&lt;/p&gt;
&lt;p&gt;That method worked, and you can read the original article in the link above. However, today, &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt; announced that they now have &lt;a href="https://help.readwise.io/article/125-how-does-the-readwise-to-obsidian-export-integration-work"&gt;an official Obsidian community plugin&lt;/a&gt;, and I disabled my trusty old python script for good.&lt;/p&gt;
&lt;p&gt;You see, although my old script worked, there were quirks&amp;ndash; not the least of which was that making changes to it meant programming in Python. I&amp;rsquo;m not a developer, so while I made do, it was never a painless experience. I also ran into issues with time zones and invalid characters being used in titles. So I&amp;rsquo;m thrilled to have something significantly better from Readwise itself! Here&amp;rsquo;s a video from the Readwise team, or read on for instructions on how to get started.&lt;/p&gt;
&lt;p&gt;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/DOYwwdDC9LQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;em&gt;From &lt;a href="https://www.youtube.com/watch?v=DOYwwdDC9LQ"&gt;Readwise on YouTube&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="install-the-obsidian-plugin"&gt;Install the Obsidian plugin.&lt;/h2&gt;
&lt;p&gt;In your Obsidian vault, go to Settings &amp;gt; Community plugins. You&amp;rsquo;ll need to turn Safe mode off for community plugins if you haven&amp;rsquo;t already.&lt;/p&gt;
&lt;p&gt;Then, click Browse and search for Readwise Official.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-official.png" alt="Screenshot of the Readwise Official plugin within Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Install it, and then enable it.&lt;/p&gt;
&lt;h2 id="connect-your-readwise-account-to-the-obsidian-plugin"&gt;Connect your Readwise account to the Obsidian plugin&lt;/h2&gt;
&lt;p&gt;Head back to the Settings menu and scroll down to the &amp;ldquo;Plugin Options&amp;rdquo; section, and then click Readwise Official.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-official-connect.png" alt="Screenshot of the initial screen of the Readwise Official plugin" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Click connect as highlighted in orange above, and a browser window will open, showing the &lt;a href="https://readwise.io/export/obsidian/preferences"&gt;Obsidian Export&lt;/a&gt; options. You&amp;rsquo;ll need to sign into your Readwise account if you haven&amp;rsquo;t already.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-export.png" alt="Obsidian export page" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;At this point, your Readwise account will have been connected to the Readwise Official plugin, but you won&amp;rsquo;t have triggered any syncs yet. If you don&amp;rsquo;t want to change any of the configuration settings, you can then skip ahead to triggering the sync on Obsidian, but let&amp;rsquo;s run through the options anyway.&lt;/p&gt;
&lt;h2 id="modifying-configuration-settings"&gt;Modifying configuration settings&lt;/h2&gt;
&lt;p&gt;On the Obsidian Exports page, you&amp;rsquo;ll be presented with a few options.&lt;/p&gt;
&lt;h3 id="group-files-in-category-folders"&gt;Group Files in Category Folders&lt;/h3&gt;
&lt;p&gt;By default, this will be enabled. When enabled, Readwise will put your highlights in different folders depending on its source. For example, Kindle highlights will appear in the folder &lt;code&gt;Books&lt;/code&gt;. Disabling this option means all new notes will be created in the directory specified in the Obsidian plugin settings, which we&amp;rsquo;ll cover later. I left this enabled in case I read a book that has the same name as a blog post about the book, for example.&lt;/p&gt;
&lt;h3 id="use-custom-formatting"&gt;Use Custom Formatting&lt;/h3&gt;
&lt;p&gt;Custom formatting is disabled by default, and lets you choose how the final note looks. Here are the things you can change in this section&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Page title&lt;/li&gt;
&lt;li&gt;Page metadata&lt;/li&gt;
&lt;li&gt;Highlights header&lt;/li&gt;
&lt;li&gt;Highlight&lt;/li&gt;
&lt;li&gt;YAML front matter&lt;/li&gt;
&lt;li&gt;Sync notification&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I did make some changes in this section just to tweak how I want information to be displayed.&lt;/p&gt;
&lt;h4 id="page-metadata"&gt;Page metadata&lt;/h4&gt;
&lt;p&gt;I don&amp;rsquo;t see the need for Page metadata since this is what I use YAML front matter for, so I removed the matadata section and the document tags (I never use those either). So my Page metadata section looks like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{% if image_url -%}
![rw-book-cover]({{image_url}})
{% endif -%}
{% if url -%}
URL: {{url}}
{% endif -%}
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="highlight"&gt;Highlight&lt;/h4&gt;
&lt;p&gt;By default, highlights are entered in bullet-point form. That&amp;rsquo;s fine when &lt;em&gt;I&amp;rsquo;m&lt;/em&gt; taking notes, but when I&amp;rsquo;m highlighting someone else&amp;rsquo;s words, I like to be very careful to use blockquotes. I frequently do block searches in Obsidian, and I do NOT want to accidentally pass off a quote as something I said.&lt;/p&gt;
&lt;p&gt;To this end, I added a &lt;code&gt;&amp;gt;&lt;/code&gt; before each highlight and two newlines (carriage returns) at the end to delineate each highlight. That way, I can quote just one highlight at a time.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt; {{ highlight_text }}{% if highlight_location and highlight_location_url %} ([{{highlight_location}}]({{highlight_location_url}})){% elif highlight_location %} ({{highlight_location}}){% endif %}{% if highlight_note %}
- Note: {{ highlight_note }}{% endif %}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you can see above, I also removed highlight tags, which I never use.&lt;/p&gt;
&lt;h4 id="yaml-front-matter"&gt;YAML front matter&lt;/h4&gt;
&lt;p&gt;Metadata has to be quite specific, so I added parameters I already use for other notes in this section. The &lt;code&gt;TVZ&lt;/code&gt; is a tag I use that means &amp;ldquo;To Verzettelen&amp;rdquo;, meaning pages that I need to process further.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Title: {{full_title}}
Author: {{author}}
Tags: TVZ, readwise, {{category}}
date: {{date}}
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="sync-notification"&gt;Sync notification&lt;/h4&gt;
&lt;p&gt;As someone who has worked on a syncing plugin for Readwise to Obsidian, I know that things go wrong sometimes. Enabling this outputs a synchronization log to a note, which has come in handy MANY times in the past. &lt;em&gt;Has that book been synced, or did something go wrong?&lt;/em&gt; So I copied what the Readwise team suggested:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- [[{{date|date(&amp;#39;Y-m-d&amp;#39;)}}]] {{time}} — Synced {{num_highlights}} highlight{{num_highlights|pluralize}} from {{num_books}} document{{num_books|pluralize}}.
{% for book in books %} - {{ book.num_highlights_added}} highlights from {{ book.title }}
{%endfor %}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="select-items-to-be-exported"&gt;Select Items to be Exported&lt;/h3&gt;
&lt;p&gt;In this section, you can choose which books/podcasts/other content in Readwise you want to export. It is disabled by default. If you haven&amp;rsquo;t synced Readwise to Obsidian before, and you just want to pull in everything, leave it disabled.&lt;/p&gt;
&lt;p&gt;In my case, I have already synchronized everything using the plugin I mentioned, and didn&amp;rsquo;t want to create another few hundred duplicate notes in my vault. So I enabled it and selected a few more recent books.&lt;/p&gt;
&lt;p&gt;A weird thing about this Export settings page is that there is no saving&amp;ndash; it just automatically saves it. Just a note, because I was scrolling up and down that page looking for an indication that it had been saved before I realized it is done automatically.&lt;/p&gt;
&lt;h2 id="initiate-sync-from-obsidian"&gt;Initiate Sync from Obsidian&lt;/h2&gt;
&lt;p&gt;Head back to Obsidian and to the Readwise Official plugin options page. You should see a &amp;ldquo;Initiate Sync&amp;rdquo; button where the &amp;ldquo;Connect&amp;rdquo; one was before.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-official-initiate.png" alt="Screenshot of Initiate Sync button" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s a good sign - that means your Readwise account has been connected, and your configuration settings from the previous step will be fetched.&lt;/p&gt;
&lt;p&gt;Before you click the button, note that the &lt;em&gt;Customize base folder&lt;/em&gt; option is set to &lt;code&gt;Readwise&lt;/code&gt;. This is the directory that all your Readwise notes will be created. So if you enabled &lt;em&gt;Group Files in Category Folders&lt;/em&gt; earlier, your Kindle highlights will be saved in &lt;code&gt;Readwise/Books/booktitle.md&lt;/code&gt;. You can change the base folder if you prefer, but I just kept the default.&lt;/p&gt;
&lt;p&gt;Time to click the button!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-synced.png" alt="Screenshot of synced status from Readwise plugin" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll see a few messages popping up on the upper right corner of your screen, and you&amp;rsquo;ll also see a &lt;em&gt;Synced!&lt;/em&gt; message appear next to the button you just clicked.&lt;/p&gt;
&lt;h2 id="verifying-results"&gt;Verifying results&lt;/h2&gt;
&lt;p&gt;In your Obsidian vault, search for one of the items you synced. Here&amp;rsquo;s what my note for Pat Flynn&amp;rsquo;s &lt;em&gt;Superfans&lt;/em&gt; looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-obsidian-kindle.png" alt="An example of Kindle highlights imported to Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Great! It looks exactly how I want it to look.&lt;/p&gt;
&lt;h2 id="set-up-automatic-sync"&gt;Set up automatic sync&lt;/h2&gt;
&lt;p&gt;If you leave it there, the plugin will only sync when you tell it to, so you&amp;rsquo;d need to go into the plugin options each time. That&amp;rsquo;s not particularly useful for me, because I want it to just happen.&lt;/p&gt;
&lt;p&gt;If you feel similarly, head back into Plugin Options one more time and select your desired frequency in the &lt;em&gt;Configure resync frequency&lt;/em&gt; dropdown menu. I chose 1 hour, the minimum. I also enabled the automatic sync when Obsidian opens.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-official-auto-sync.png" alt="Screenshot of auto sync options for Readwise Official plugin" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I love this new plugin! It was very much needed, because existing options for accomplishing the same thing were flawed in some way, mainly because they were community-driven&amp;ndash; meaning the people who created these workarounds (myself included) were &amp;ldquo;just&amp;rdquo; users who had other jobs. I&amp;rsquo;m grateful that the Readwise team has acknowledged the popularity of Obsidian and taken on the maintenance burden. I&amp;rsquo;ve experimented with the plugin quite a bit and haven&amp;rsquo;t found any major issues so far. It is a seamless way to get the best of the content I&amp;rsquo;ve consumed from various sources into one single source of truth: Obsidian. I highly recommend it to anyone looking to streamline content processing and creation processes.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: This post contains an affiliate link for &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt;. Clicking on that link will give you a two-month trial of Readwise, double the usual amount, and they give me a small percentage if you sign up for a plan. Check out &lt;a href="https://nicolevanderhoeven.com/ethics/"&gt;My Ethics Statement&lt;/a&gt; to see my standards for promotions.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Downloading files uploaded to Roam Research for use with Obsidian</title><link>https://nicolevanderhoeven.com/blog/20210602-downloading-files-from-roam/</link><pubDate>Wed, 02 Jun 2021 00:27:59 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210602-downloading-files-from-roam/</guid><description>&lt;p&gt;If you&amp;rsquo;ve recently transitioned from &lt;a href="https://roamresearch.com"&gt;Roam Research&lt;/a&gt; to &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;, you might run into a few issues, even after you&amp;rsquo;ve run the &amp;ldquo;Markdown format importer&amp;rdquo; core plugin. One of the most annoying ones that I ran into was that files uploaded to Roam (images, pdfs, etc.) are automatically uploaded to &lt;a href="https://firebase.google.com/"&gt;Google Firebase&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Roam assets are linked to in the Markdown files like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;![](https://firebasestorage.googleapis.com/v0/b/firescript-471a1.appspot.com/o/imgs%2Fapp%2FMyNotes%2FxRFXx7l-ZK.png?alt=media&amp;amp;token=1e03b680-5472-33dc-9b06-a127301af37f)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, since Roam relies on security by obscurity on this front, the links to your assets will still be accessible in your Obsidian vault, and they&amp;rsquo;ll still render correctly. However, I still think it&amp;rsquo;s worth downloading the files for three reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you don&amp;rsquo;t intend to use Roam anymore and cancel your subscription, they will likely delete those assets at some point, leaving you with a lot of broken links in Obsidian.&lt;/li&gt;
&lt;li&gt;Part of Obsidian&amp;rsquo;s appeal is that you own your assets. Not so if they&amp;rsquo;re on someone else&amp;rsquo;s server.&lt;/li&gt;
&lt;li&gt;You can&amp;rsquo;t access Firebase files without an internet connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, instead, you want to download the contents of that link and replace it in your notes with something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;![](assets/newfile.png)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That way, you&amp;rsquo;ll have full control over all your assets, and you won&amp;rsquo;t be dependent on those assets being stored on Firebase by Roam.&lt;/p&gt;
&lt;p&gt;To fix this, I wrote a Python script that will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go through every file and every folder within a specified root vault directory&lt;/li&gt;
&lt;li&gt;Look for links to Google Firebase&lt;/li&gt;
&lt;li&gt;Download all assets from Firebase to a local folder (&lt;code&gt;/assets&lt;/code&gt; by default), using the timestamp and index number as a filename&lt;/li&gt;
&lt;li&gt;Replace the Firebase links in your vault with links to the newly downloaded files, accounting for PDFs, whose links are formatted differently in Roam as &lt;code&gt;{{ pdf: ... }}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before you run this script, I highly recommend backing up your vault or trying this out on a dummy vault.&lt;/p&gt;
&lt;script src="https://gist.github.com/nicolevanderhoeven/b25c97a8a68ea97e7bdf5ee674fdaec4.js"&gt;&lt;/script&gt;
&lt;p&gt;After downloading and saving the script, run &lt;code&gt;python3 downloadfirebase.py&lt;/code&gt; on your terminal.&lt;/p&gt;
&lt;p&gt;This worked really well for me, and I can breathe a little more easily now that my vault is self-contained.&lt;/p&gt;</description></item><item><title>Readwise to Obsidian</title><link>https://nicolevanderhoeven.com/blog/20210206-readwise-to-obsidian/</link><pubDate>Sat, 06 Feb 2021 09:55:36 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210206-readwise-to-obsidian/</guid><description>
&lt;meta property=“og:image” content="/assets/20210206-06-readwise-to-obsidian.png" /&gt;
&lt;meta property=”og:image:width” content=”1200″ /&gt;
&lt;meta property=”og:image:height” content=”628″ /&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210206-06-readwise-to-obsidian.png" alt="Readwise to Obsidian workflow" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;August 10th, 2021: Readwise just released their own Obsidian plugin, &lt;a href="https://help.readwise.io/article/125-how-does-the-readwise-to-obsidian-export-integration-work"&gt;Readwise Official&lt;/a&gt;, which is available now! I now recommend &lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/"&gt;this method&lt;/a&gt; over the one outlined in this article.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m about 9 months into heavily using &lt;a href="https://roamresearch.com"&gt;Roam Research&lt;/a&gt; as my primary note-taking, task management, capture-everything system, and for the most part, that&amp;rsquo;s gone very well. &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt; is another excellent personal knowledge management (PKM) system, though, and I&amp;rsquo;ve been curious about it for almost as long as I&amp;rsquo;ve been using Roam. I&amp;rsquo;ve had it installed for a while, but I never really &lt;em&gt;seriously&lt;/em&gt; attempted to make the switch. Until now. I&amp;rsquo;ve decided to use Obsidian as my primary PKM and zettelkasten for the next month, to see if it&amp;rsquo;s something I can switch to.&lt;/p&gt;
&lt;p&gt;Why I&amp;rsquo;m considering switching from Roam to Obsidian is another post, probably one I&amp;rsquo;ll write at the end of this experiment, when my thoughts and opinions are more solidified. For now, I want to address one of the things I struggled with when switching over: Readwise integration.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt; is an app that&amp;rsquo;s all about importing notes and highlights you&amp;rsquo;ve made from all over the internet and exporting them all into a single format. Readwise supports far more import sources than I use, but here are the ones I&amp;rsquo;ve got hooked up to it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instapaper (for highlights and notes on online articles)&lt;/li&gt;
&lt;li&gt;Amazon Kindle (for highlights on ebooks)&lt;/li&gt;
&lt;li&gt;Twitter (for interesting tweets)&lt;/li&gt;
&lt;li&gt;(Readwise) Web highlighter (for straight highlights off any webpage)&lt;/li&gt;
&lt;li&gt;Airr (for quotes and notes from audio podcasts)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Readwise collates my activity in all of these input sources and automatically sends them to my Roam Research account. Here&amp;rsquo;s what that looks like when it gets pulled into my Daily Note:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210206-01-readwiseimportsinroam.png" alt="Tweet, podcast, and book notes pulled into Roam Research via Readwise" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Readwise also pulls metadata into Roam, depending on the source. Here&amp;rsquo;s what the page for the book &amp;ldquo;Ready Player Two&amp;rdquo; looks like in Roam:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210206-02-readyplayertwo.png" alt="Ready Player Two book notes in Roam, imported via Readwise" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Readwise integration is an &lt;em&gt;essential&lt;/em&gt; feature for me in any PKM, because I can take notes wherever I&amp;rsquo;m consuming my content and just have it automagically appear in my notes, tagged and ready for processing. So it&amp;rsquo;s absolutely something I need to have in my Obsidian workflow.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s where things get tricky, because Readwise doesn&amp;rsquo;t &lt;em&gt;have&lt;/em&gt; an Obsidian integration.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210206-03-readwise-export-options.png" alt="Readwise doesn’t automatically export to Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Source: &lt;a href="https://readwise.io/export"&gt;Readwise Exports&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The closest thing is the Markdown export, but that&amp;rsquo;s not automatic. You can manually trigger an export, and then copy those exports over into your Obsidian vault, and thne make sure they&amp;rsquo;re in the right format with the right tags. I knew I was never going to do that, so I found a way to automate it.&lt;/p&gt;
&lt;h2 id="readwise2directory"&gt;readwise2directory&lt;/h2&gt;
&lt;p&gt;I discovered that Readwise has an API, and briefly thought about building my own integration. Happily, I found &lt;a href="https://github.com/nicrivard/readwise2directory"&gt;this Python project on GitHub&lt;/a&gt; by &lt;a href="https://github.com/nicrivard"&gt;nicrivard&lt;/a&gt;, who had already done that! Why rebuild the wheel? His solution already did what I needed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It connects to Readwise via your Readwise access token&lt;/li&gt;
&lt;li&gt;Checks for new highlights or updated ones&lt;/li&gt;
&lt;li&gt;Exports the new/updated highlights to a local folder of your choosing (presumably your Obsidian vault)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It even pulls in highlight tags from Readwise, if you&amp;rsquo;ve created any (which I haven&amp;rsquo;t).&lt;/p&gt;
&lt;p&gt;I &lt;a href="https://github.com/nicolevanderhoeven/readwise2directory"&gt;forked the project here&lt;/a&gt; to add just a few minor touches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changed date format of imported notes&lt;/li&gt;
&lt;li&gt;Added a section to output the import date to a comment block (an &lt;a href="https://forum.obsidian.md/t/obsidian-release-v0-10-12-insider-build/12295"&gt;Obsidian Insider build feature&lt;/a&gt;) rather than YAML frontmatter, so that the date would actually be linked and backlinked.&lt;/li&gt;
&lt;li&gt;Customized tags and filename for my use&lt;/li&gt;
&lt;li&gt;Sort imports into folders within my Obsidian vault depending on source (&lt;code&gt;Article/&lt;/code&gt;, &lt;code&gt;Tweet/&lt;/code&gt;, and so on).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This works out pretty well. Here&amp;rsquo;s an example of an import from the podcast app &lt;a href="https://airr.io"&gt;Airr&lt;/a&gt; into Obsidian, in Edit mode.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210206-04-airrtoobsidian.png" alt="readwise2directory import from Airr into Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s placed within my &lt;code&gt;Podcast&lt;/code&gt; folder inside my value, is tagged appropriately, and contains links to the source. Switching to Preview mode shows an imported cover photo and even a playable recorder for the part of the podcast that I snipped on Airr:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210206-05-airrinobsidian_preview.png" alt="Preview mode of imported Airr quote in Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;So that works out well, except for one thing: firing off the script that does all this is still manual.&lt;/p&gt;
&lt;h2 id="scheduling-the-script"&gt;Scheduling the script&lt;/h2&gt;
&lt;p&gt;Luckily, it&amp;rsquo;s pretty easy to schedule a Python script to run at certain intervals. I&amp;rsquo;m on macOS, so I used a built-in utility called &lt;code&gt;cron&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="give-cron-full-system-access"&gt;Give cron full system access&lt;/h3&gt;
&lt;p&gt;Cron needs to have the right permissions to run scripts on my behalf, so I had to go to System Preferences &amp;gt; Security &amp;amp; Privacy &amp;gt; Privacy &amp;gt; Full Disk Access on my laptop and add &lt;code&gt;/usr/bin/cron&lt;/code&gt; to the &amp;ldquo;allowed&amp;rdquo; list.&lt;/p&gt;
&lt;h3 id="open-crontab"&gt;Open crontab&lt;/h3&gt;
&lt;p&gt;Then, from my terminal, I ran the command &lt;code&gt;env EDITOR=nano crontab -e&lt;/code&gt; to open up the list of cronjobs I had currently.&lt;/p&gt;
&lt;h3 id="set-a-schedule"&gt;Set a schedule&lt;/h3&gt;
&lt;p&gt;I added a line to crontab for the schedule I wanted to create. This line has to be in the format&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* * * * * command
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;where the five asterisks correspond to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;minute&lt;/li&gt;
&lt;li&gt;hour&lt;/li&gt;
&lt;li&gt;day of the month&lt;/li&gt;
&lt;li&gt;month&lt;/li&gt;
&lt;li&gt;day of the week&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my case, I wanted it to run every hour, so here&amp;rsquo;s what my schedule looks like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; * * * * cd /Users/nic/git/readwise2directory/ &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 /Users/nic/git/readwise2directory/readwise-GET.py &amp;gt;&amp;gt; /Users/nic/git/readwise2directory/readwiseGET.log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="python-issues"&gt;Python issues&lt;/h4&gt;
&lt;p&gt;I had some trouble getting cron to work until I realized it was because I had multiple versions of Python installed. I ran a &lt;code&gt;which python3&lt;/code&gt; to find the path to the version I wanted to use and added that path to the command. I also had to &lt;code&gt;cd&lt;/code&gt; to the project directory, for some reason.&lt;/p&gt;
&lt;p&gt;While I was troubleshooting, I found it really useful to output to a log so I could see what had gone wrong.&lt;/p&gt;
&lt;p&gt;Once I added the schedule as in the example above, though, it worked a treat!&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This solution did require some setup at the beginning, but doesn&amp;rsquo;t need any maintenance once it&amp;rsquo;s going. I&amp;rsquo;m pretty happy with it as it means I can keep taking notes on various places from anywhere, and it&amp;rsquo;ll all be waiting for me in my Obsidian vault whenever I&amp;rsquo;m ready to sit down and process them into my system. Thanks to nicrivard for the repo that made it possible!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: This post contains an affiliate link for &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt;. Clicking on that link will give you a two-month trial of Readwise, double the usual amount, and they give me a small percentage if you sign up for a plan. Check out &lt;a href="https://nicolevanderhoeven.com/ethics/"&gt;My Ethics Statement&lt;/a&gt; to see my standards for promotions.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Taking Notes on a Video: my YiNote to Roam Research Workflow</title><link>https://nicolevanderhoeven.com/blog/20201215-yinote-to-roam/</link><pubDate>Tue, 15 Dec 2020 22:00:34 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201215-yinote-to-roam/</guid><description>&lt;p&gt;Listen to the audio version of this blog post here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/2TzFxvI8tLNUb3yubhdYvP" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;I was working on an article yesterday comparing the performance of k6 with JMeter, and I had a chat to Mihail, one of the devs of k6. He mentioned that a large part of why k6 is so performant compared to other tools (particularly Java-based ones) is that it&amp;rsquo;s written in Go. He talked a bit about Goroutines, and when I told him I was a Go noob, he recommended &lt;a href="https://www.youtube.com/watch?v=YHRO5WQGh0k&amp;amp;ab_channel=GopherAcademy"&gt;this very excellent video&lt;/a&gt; by Kavya Joshi, which explains a bit more about the Go Scheduler and how it manages to achieve performance for Go apps that exceeds the typical 1 Virtual User: 1 kernel thread paradigm that many load testing tools (like JMeter) use.&lt;/p&gt;
&lt;p&gt;Anyway, I got around to watching the video today, and because it was a video I knew I&amp;rsquo;d learn from, I took notes - and ended up improving part of the workflow (more on that later). Other people have commented on my notes before, so I thought I&amp;rsquo;d share how I process videos into my personal wiki, currently held in &lt;a href="https://roamresearch.com"&gt;Roam Research&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="install-yinote-chrome-extension"&gt;Install YiNote Chrome extension&lt;/h2&gt;
&lt;p&gt;I use a free app called &lt;a href="https://yinote.co/"&gt;YiNote&lt;/a&gt; to take video notes in particular. I use &lt;a href="https://chrome.google.com/webstore/detail/yinote/fhpgggnmdlmekfdpkdgeiccfkignhkdf"&gt;their Chrome extension&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="take-notes"&gt;Take Notes&lt;/h2&gt;
&lt;p&gt;I was pretty dubious about using an app just to take notes for video specifically, but there were a few things that sold me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;When you click on the text field to take notes in the extension, YiNote automatically pauses the video so that you can type without missing what&amp;rsquo;s being said.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;YiNote also automatically saves the timestamps associated with notes you create, so that you can click on it afterwards to jump to the specific section that you wrote a note on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;YiNote has an export to Markdown option - great compatibility with Roam or &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can also export your notes to a PDF, which is great for sharing. It saves screenshots of the presentation and puts your notes next to the relevant screenshot.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s what it looks like while taking notes:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201215-01.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="export-yinote-notes"&gt;Export YiNote notes&lt;/h2&gt;
&lt;p&gt;After watching the video, I click the Settings wheel from the Chrome extension panel.&lt;/p&gt;
&lt;p&gt;I click the Export as Markdown button.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201215-02.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;That lets me save a &lt;code&gt;.md&lt;/code&gt; file to my local drive. I always save YiNote files in the same folder as the script below.&lt;/p&gt;
&lt;h2 id="run-reformatter-script"&gt;Run reformatter script&lt;/h2&gt;
&lt;p&gt;This is the part that I tweaked today. YiNote&amp;rsquo;s exported Markdown file is formatted in a way that doesn&amp;rsquo;t really play well with Roam. Here&amp;rsquo;s what it looks like, fresh from YiNote:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- Generated by &amp;lt;a href=&amp;#34;https://www.yinote.co/#installation&amp;#34;&amp;gt;YiNote&amp;lt;/a&amp;gt; --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- # [GopherCon 2018: Kavya Joshi - The Scheduler Saga](https://www.youtube.com/watch?v=YHRO5WQGh0k) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- ## [1:19](https://www.youtube.com/watch?v=YHRO5WQGh0k&amp;amp;t=79) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The scheduler is what makes sure the Goroutines run concurrently.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- ## [1:29](https://www.youtube.com/watch?v=YHRO5WQGh0k&amp;amp;t=89) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All the information is there, but importing that to Roam, with the comments, isn&amp;rsquo;t really useful. I want to see those timestamps as clickable links, and I want my notes to be nested underneath the corresponding timestamp so I know what belongs where.&lt;/p&gt;
&lt;p&gt;So I dusted off my Python skills tonight and wrote up this little script to do just that. Warning: I am not a developer; I just occasionally code. So I&amp;rsquo;m sure that this isn&amp;rsquo;t the most concise way to do it (contact me and let me know how it could have been better if you have any ideas). But it&amp;rsquo;s functional. And, in the spirit of learning in public, here it is:&lt;/p&gt;
&lt;script src="https://gist.github.com/nicolevanderhoeven/8d089da1617cdbce13dcd406d1d0b960.js"&gt;&lt;/script&gt;
&lt;p&gt;The script results in an output file that is better formatted for Roam.&lt;/p&gt;
&lt;h2 id="import-resulting-file-to-roam"&gt;Import resulting file to Roam&lt;/h2&gt;
&lt;p&gt;On Roam, I hit Options &amp;gt; Import Files, select the output file, hit OK, and that creates a new page in a way better format than the one directly from YiNote. After adding the date, author, and &amp;ldquo;Recommended By&amp;rdquo; fields, this is what it looks like in Roam:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201215-03.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="thats-it"&gt;That&amp;rsquo;s it!&lt;/h2&gt;
&lt;p&gt;I don&amp;rsquo;t do this for every video I watch, but I find this process useful for more technical videos that I really want to learn from. It&amp;rsquo;s really important to me to get all my notes from disparate sources into Roam, so that they then get processed like any other note into my Zettelkasten - but that&amp;rsquo;s a process for another day.&lt;/p&gt;</description></item><item><title>How I use Roam Research for D&amp;D: Session Notes</title><link>https://nicolevanderhoeven.com/blog/20201214-roam-for-dnd/</link><pubDate>Mon, 14 Dec 2020 20:13:13 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201214-roam-for-dnd/</guid><description>&lt;p&gt;In case you thought this site was all about performance and load testing, surprise! It&amp;rsquo;s not.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve talked to me personally for longer than ten minutes in the last year, there&amp;rsquo;s a pretty good chance I&amp;rsquo;ve mentioned &lt;a href="https://roamresearch.com/"&gt;Roam Research&lt;/a&gt;, or the note-taking and learning methodology called &lt;a href="https://en.wikipedia.org/wiki/Zettelkasten"&gt;Zettelkasten&lt;/a&gt;. Sorrynotsorry. I&amp;rsquo;ve been obsessed since I discovered it.&lt;/p&gt;
&lt;p&gt;To say Roam Research is a note-taking device is like saying Bitcoin is currency: yes, it IS that, but also so much more. To me, it&amp;rsquo;s my second brain. It&amp;rsquo;s a record of what I know and what I want to know, and sometimes even things I don&amp;rsquo;t know yet. The real reason that Roam and the Zettelkasten idea resonated with me so much is that I can use it a lot for my work. But I&amp;rsquo;ve discovered another use case that Roam is perfect for: Dungeons &amp;amp; Dragons.&lt;/p&gt;
&lt;p&gt;This became longer than I thought it would be, so I&amp;rsquo;ll just talk about how I handle Session Notes in particular.&lt;/p&gt;
&lt;h2 id="starting-a-new-session"&gt;Starting a new session&lt;/h2&gt;
&lt;p&gt;Everything starts with sitting down to play D&amp;amp;D. I write a log of events and information that comes out while I&amp;rsquo;m playing. Here&amp;rsquo;s what a new session log looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-03.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I preface pages in this campaign with &lt;code&gt;D&amp;amp;D/&lt;/code&gt; to make it a separate &lt;a href="https://forum.roamresearch.com/t/namespaces-how-do-they-work/276"&gt;namespace&lt;/a&gt;. A namespace is like a folder, and I use it mainly because I have two D&amp;amp;D campaigns, both of which would have the page &lt;code&gt;Campaign&lt;/code&gt;, &lt;code&gt;Characters&lt;/code&gt;, &lt;code&gt;Locations&lt;/code&gt;, etc, even though the two campaigns are on different worlds. To keep them separate, and to keep from getting mixed up (&lt;em&gt;Was Gloomtoes an NPC in this campaign or that one?&lt;/em&gt;) I use different namespaces for each campaign.&lt;/p&gt;
&lt;p&gt;I add the real-world date in the page name, and then an in-game date reference. The in-game date reference is useful for keeping track of time since I might go a couple weeks (okay, maybe &lt;em&gt;one&lt;/em&gt; week; let&amp;rsquo;s not get too crazy) without playing this campaign, but no time in the in-game world has elapsed. Then, I end the page name with a descriptive title, which I always end up changing after the session. Sometimes I&amp;rsquo;ll title a page &lt;code&gt;Exploring Castle Never&lt;/code&gt;, but then we end up getting carried away in another part of the city instead. That&amp;rsquo;s okay - when I change a page name, Roam then updates all references to that page that I&amp;rsquo;ve made from other pages.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t type all this out manually - I use a &lt;a href="https://textexpander.com/"&gt;TextExpander&lt;/a&gt; template so that to start a new session, all I have to do is create a page in Roam, type &lt;code&gt;;s.dnd&lt;/code&gt; and that is automatically replaced with prompts for a few fields.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Date&lt;/code&gt;: This is the real-world date of when I played this particular session.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Tags&lt;/code&gt;: When I first create session notes, this is prepopulated with &lt;code&gt;#TVZ&lt;/code&gt;, which stands for &lt;em&gt;To Verzettelen&lt;/em&gt;. It&amp;rsquo;s just my personal way of marking a note as one that needs to be processed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Location&lt;/code&gt;: Here I note down the in-game places that my character visited this session. Usually I&amp;rsquo;ll just put city names, but I sometimes also split locations up into districts within a city or rooms within a dungeon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Characters&lt;/code&gt;: I&amp;rsquo;ve found it helpful to keep track of which characters (players and NPCs) I&amp;rsquo;ve come across in this session.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Session Summary&lt;/code&gt;: This is a section I leave blank when the session is initially created.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="filling-in-the-session-log"&gt;Filling in the session log&lt;/h2&gt;
&lt;p&gt;The rest of the page, after &lt;code&gt;Session Summary&lt;/code&gt;, is where I&amp;rsquo;ll spend most of the time writing. I just write whatever comes to mind and whatever I have time to write, in bullet form. I don&amp;rsquo;t worry about formatting or grammar or linking to other pages. I just type all my thoughts out in plain text.&lt;/p&gt;
&lt;h3 id="hp"&gt;HP&lt;/h3&gt;
&lt;p&gt;I like to play healers, which means I care a lot about how everyone in the party is doing so that I can figure out who best needs healing. &lt;code&gt;{{[[table]]}}&lt;/code&gt; in Roam lets me create a custom table, and I have a &lt;code&gt;;hp&lt;/code&gt; snippet in TextExpander that recreates this table, with all the names of the people currently in my party, so that I just worry about filling in the values. Sometimes I still get it wrong, or miss a bit of damage that the DM calls out, but it&amp;rsquo;s enough to give me an idea of who needs heals.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-04.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I also write down initiative orders, the defenses/vulnerabilities/immunities of monsters we face, descriptions of NPCs we meet, suspicions or questions I might have&amp;hellip; basically anything and everything that comes to mind. Session time is pretty much a brain dump, with no formatting.&lt;/p&gt;
&lt;h3 id="equipment"&gt;Equipment&lt;/h3&gt;
&lt;p&gt;If I acquire a new item during a session, I&amp;rsquo;ll tag that line with &lt;code&gt;#[[D&amp;amp;D/Carrying]]&lt;/code&gt;. This lets me stay on the Session Notes page while still maintaining an up-to-date record of what I&amp;rsquo;m carrying.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-05.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;A tag in Roam is the same as a page, so when I click on that link, it takes me to the &lt;code&gt;D&amp;amp;D/Carrying&lt;/code&gt; page, which conveniently also shows me all the references to that page from other pages.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-06.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Roam shows me not just the page, but the exact block where I made the reference to &lt;code&gt;D&amp;amp;D/Carrying&lt;/code&gt;, so it&amp;rsquo;s easy to see at a glance what I have and where I got it.&lt;/p&gt;
&lt;h3 id="next-actions-and-waiting-for"&gt;Next Actions and Waiting For&lt;/h3&gt;
&lt;p&gt;I use David Allen&amp;rsquo;s &lt;a href="https://gettingthingsdone.com/"&gt;GTD&lt;/a&gt; methodology in D&amp;amp;D too. When I want to remember to do something later, I tag it with &lt;code&gt;#[[D&amp;amp;D/Agenda]]&lt;/code&gt; and &lt;code&gt;#[[Next Actions]]&lt;/code&gt; or &lt;code&gt;#[[Waiting For]]&lt;/code&gt;. This presents me with the same opportunities as &lt;code&gt;D&amp;amp;D/Carrying&lt;/code&gt;, where I can see references to those pages later as well.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-07.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="processing-the-session"&gt;Processing the session&lt;/h2&gt;
&lt;p&gt;Sometime after the session, I&amp;rsquo;ll go and fill in the metadata from my template, including the session summary, which is just a paragraph or two describing what happened in the session at a high level. This is mainly to jog my memory in the next session, when I&amp;rsquo;ve already forgotten what we did in the previous one.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what it looks like, all filled in:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-02.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="adding-links-and-fleshing-out-pages"&gt;Adding links and fleshing out pages&lt;/h3&gt;
&lt;p&gt;I then go back through the notes themselves and add turn any people, places, or interesting objects that I mention into links. In Roam, that&amp;rsquo;s a matter of highlighting them and hitting &lt;code&gt;[[&lt;/code&gt;. Then, I click on the page I&amp;rsquo;ve just created and try to add information that I&amp;rsquo;ve learned. This isn&amp;rsquo;t strictly necessary, since all mentions of that page will show up as a linked reference, but it&amp;rsquo;s an opportunity to consolidate my information on that subject and see how it fits into what else I&amp;rsquo;ve written there.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a page for an NPC:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-09.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Having these links means that when an NPC says &amp;ldquo;I&amp;rsquo;m from Leilon&amp;rdquo;, I can type &lt;code&gt;Leilon&lt;/code&gt; into Roam:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-08.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&amp;hellip; and say, &amp;ldquo;Oh, Leilon. I heard you had a dragon problem there recently. Did your family get out okay?&amp;rdquo; Boom! Instant advantage on a Diplomacy check.&lt;/p&gt;
&lt;p&gt;Sometimes we&amp;rsquo;re in a dungeon with many rooms, and this is the point where I draw a quick map on my iPad Pro and Apple Pencil using &lt;a href="https://www.gingerlabs.com/"&gt;Notability&lt;/a&gt;, and then I upload it right from my iPad to Roam.&lt;/p&gt;
&lt;p&gt;This map is in my page for Castle Never:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-10.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The little blue &amp;ldquo;8&amp;rdquo; on the upper left of the map is versions. Information rarely comes all at once in D&amp;amp;D; it usually comes in trickles. As I learned more about the castle, I revised the map and added a new version to it, so that I can still see previous versions and what I thought the map was like when we first explored it.&lt;/p&gt;
&lt;p&gt;At this stage, I also add any tags I forgot to add during the session.&lt;/p&gt;
&lt;h3 id="reviewing-quests-and-questions"&gt;Reviewing quests and questions&lt;/h3&gt;
&lt;p&gt;After I go through the session notes, I go to the page called &lt;code&gt;D&amp;amp;D/Quests and Questions&lt;/code&gt;, where I keep a running list of all the open quest hooks and any unanswered questions I might have.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-11.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Not everything on this page is meant to be resolved, but I find it comforting to track everything anyway, in case I happen to find myself in a city with nothing in particular to do. I mark these with a checkbox (&lt;code&gt;{{[[TODO]]}})&lt;/code&gt; in Roam) and tick the box when one is resolved. Roam lets me filter out the resolved quests so I only see things that are outstanding.&lt;/p&gt;
&lt;p&gt;This is where I get the most value out of taking notes. It&amp;rsquo;s at this point where I&amp;rsquo;ll add our progress towards quests, make connections between two seemingly disconnected quests, and situate what I&amp;rsquo;ve just learned in the session within the broader context of the world and the campaign. I also review and update items on the Next Actions and Waiting For.&lt;/p&gt;
&lt;p&gt;This is the part that takes the longest, but it&amp;rsquo;s also what most prepares me for when I get to the table again next week.&lt;/p&gt;
&lt;h2 id="tying-it-all-together"&gt;Tying it all together&lt;/h2&gt;
&lt;p&gt;I use a &lt;code&gt;D&amp;amp;D/Campaign&lt;/code&gt; page as my landing page for this campaign. It includes &lt;code&gt;D&amp;amp;D/Quests and Questions&lt;/code&gt; as well as a list of all sessions to date, so that I always know what happened and when.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-01.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="why-do-i-take-notes-for-a-game"&gt;Why do I take notes for a game?&lt;/h2&gt;
&lt;p&gt;You might be wondering why I go to so much trouble. Why do I take complicated notes about something I do &amp;ldquo;just&amp;rdquo; for fun?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Taking notes helps me offload this all safely from my brain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I take my fun as seriously as I take my work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>