<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>hi, it&#39;s mike</title>
    <link>https://mike.puddingtime.org/tags/obsidian/</link>
    <description>Recent content on hi, it&#39;s mike</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>mike@puddingtime.org (mike)</managingEditor>
    <webMaster>mike@puddingtime.org (mike)</webMaster>
    <copyright>© 2026, mike</copyright>
    <lastBuildDate>Thu, 22 Feb 2024 18:26:57 -0800</lastBuildDate>
    <atom:link href="https://mike.puddingtime.org/tags/obsidian/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Daily notes for 2024-02-22</title>
      <link>https://mike.puddingtime.org/posts/2024-02-22-daily-notes/</link>
      <pubDate>Thu, 22 Feb 2024 18:26:57 -0800</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2024-02-22-daily-notes/</guid>
      <description>Brief attempt to get Tiddlywiki to parity with my Obsidian vault. The nut milk machine.</description>
      <content:encoded><![CDATA[<h2 id="return-to-tiddlywiki-briefly">Return to Tiddlywiki (briefly)</h2>
<p>I was very, deeply bothered by Tiddlywiki&rsquo;s failure to yield on a few points, so I took some time to work on them wondering how much of the Obsidian workflow I&rsquo;ve come up with could be repeated in the context of a single-file wiki. Mixed success, I suppose, that could be less mixed if I were less automation-oriented.</p>
<p>But basically:</p>
<h3 id="area-and-people-pages">Area and People pages</h3>
<p>I keep a standard page format for areas, people, and projects.  Areas are non-timebound, non-project areas of concern or relationships. The GRC org is an area, as are &ldquo;portfolio management,&rdquo; &ldquo;security engineering,&rdquo; and &ldquo;the people team.&rdquo; Projects, Areas and People use the same template because they need pretty much the same thing: A list of tasks, a list of related tasks from outside the page, and a simple log. I guess these are tickler files in some parlances.</p>
<p>In Obsidian, a standard page for these things has a &ldquo;tasks&rdquo; section, a &ldquo;related tasks&rdquo; section, and a &ldquo;log&rdquo; section; and it has a <code>primary_tag</code> property. &ldquo;Tasks&rdquo; are ad hoc, one-off things specific to each entity, while &ldquo;related tasks&rdquo; are any tasks anywhere else in the system bearing the area or person&rsquo;s <code>primary_tag.</code> The &ldquo;related tasks&rdquo; block just looks like this:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">tasks
</span></span><span class="line"><span class="cl">tags include grc</span></span></code></pre></div>
<p>So if I&rsquo;ve got a project somewhere else in the system, or drop a GRC-related task in some meeting notes, it gets sucked into that list.  By convention, my primary tags are terse abbreviations, always in lower case. I could drop that convention, but it&rsquo;s helpful for setting up pages in a standardized way that lets me just start using the page vs. modifying places where I want to pull in the primary tag. Turbo-laziness, basically.</p>
<p>The &ldquo;log&rdquo; section is nothing special. I do use the Quickadd plugin to make it easy to log something from anywhere by running a Quickadd <code>log anywhere</code> action from the command menu. So I invoke the keystroke, get a prompt for the file to append a log entry to, start typing &ldquo;Areas/&rdquo; or &ldquo;People/&rdquo; and pick the autocompletion, enter the log entry, and I&rsquo;m done. The snippet itself is <code>- {{DATE:HH:mm}} {{VALUE}}\n</code> and QuickAdd allows me to target the <code>## Log</code> heading to append the entry. I&rsquo;ve got a clone of it for my daily journal page, just to shave off selecting the page.</p>
<p>In Tiddlywiki, I cobbled together a few things to get this rough effect:</p>
<p>I use the <a href="https://kookma.github.io/TW-Todolist/">TodoList</a> plugin, which provides the ability to drop in a snippet that creates a little ad hoc log widget:</p>
<p><code>&lt;&lt;interstitial-ui caption:&quot;! Log&quot; width:&quot;&quot; base:&quot;$(currentTiddler)$_log&quot;&gt;&gt;</code></p>
<p>The <code>base</code> property gives the list a unique name, either to isolate the log entries to that page (with no base, all log items appear everywhere the snippet is used) or to allow reuse of the log elsewhere in the wiki.</p>
<p>The drawback of the log is that the widget stores everything in JSON, not as part of the page itself. Were one committed to using Tiddlywiki forever, that might not be so bad. I know myself better than that, and believe this pattern essentially recreates the drawbacks of any database-driven site. Maybe there&rsquo;s an export option, but it&rsquo;s also an impediment to simple search of the live wiki: You get back the associated lump of JSON, not the page that is presenting the lump of JSON.</p>
<p>The real answer is probably &ldquo;don&rsquo;t use that logging widget, figure out how to automate this some other way.&rdquo;</p>
<p>TodoList allows the use of a todo list widget as well, but I couldn&rsquo;t figure out how to surface its todos anywhere in the wiki. I am okay with violating Prot&rsquo;s advice about mixing ephemeral tasks with notes, but only if there is a way to sweep up todos in one place for review and safety. So instead I use TiddlyWiki&rsquo;s native task functionality, which involves a button that modifies the basic &ldquo;New Here&rdquo; functionality for a given Tiddler, but appends the primary tag of a given Area or Person page to a todo tiddler. When I click the task button, it makes a new tiddler with a <code>todo</code> tag and the current tiddler title as a second tag.</p>
<p>Then I have some template code to enumerate todos for a given Area or Person page:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">! Tasks
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;$list filter=&#34;[!has[draft.of]tag[todo]tag{!!title}!tag[done]sort[created]]&#34;&gt;
</span></span><span class="line"><span class="cl">  &lt;$checkbox tag=&#34;done&#34;&gt; &lt;$link to=&lt;&lt;currentTiddler&gt;&gt;/&gt;&lt;/$checkbox&gt;
</span></span><span class="line"><span class="cl">&lt;/$list&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">! Completed tasks
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;$list filter=&#34;[!has[draft.of]tag[todo]tag{!!title}tag[done]sort[created]]&#34;&gt;
</span></span><span class="line"><span class="cl">  &lt;$checkbox tag=&#34;done&#34; checked=&#34;yes&#34;/&gt;
</span></span><span class="line"><span class="cl">    &lt;$link to=&lt;&lt;currentTiddler&gt;&gt;/&gt;
</span></span><span class="line"><span class="cl">&lt;/$list&gt; </span></span></code></pre></div>
<p>I don&rsquo;t have enough Tiddly-fu to do in Tiddlywiki what I can do in Obsidian, which is drop in a task on any page from anywhere in a single keystroke.  Not the worst limitation, and the proximate workarounds aren&rsquo;t that bad.</p>
<p>What you end up with is that todos are just tiddlers with a <code>todo</code> tag. As opposed to the widget solution, they&rsquo;re more searchable, and you can add notes about a given task in the body. You can also make a big todo page that lists every single unclosed todo in the system for review. I like it as a concept, especially since you could associate a given task tiddler with a variety of pages by adding the right tags.</p>
<h3 id="projects">Projects</h3>
<p>In Obsidian, project pages are the same as area and people pages. In Tiddlywiki, the limitations of the native task management are such that I decided to get another plugin: <a href="https://thaddeusjiang.github.io/Projectify/">Projectify</a>.</p>
<p>It bolts a nicer GUI onto Tiddlywiki&rsquo;s native task management to provide some project structure around the tiddler-as-task pattern. It includes a global entry widget for an inbox you can invoke from anywhere in the system (maybe that code will help me understand how to get the logging I want).</p>
<p>It&rsquo;s a pretty nice plugin! I think I would be willing to use it full time, since it could even blow up but still leave me with data in files I could figure out how to migrate or continue to use. Unfortunately, development of the fork of the stalled original project seems to have stopped as well. I don&rsquo;t have enough of a sense of how the Tiddlyverse works to know how much that matters.</p>
<h3 id="bottom-line">Bottom line</h3>
<p>We&rsquo;re all spoiled for choice. With a few tweaks, I think I could make a go of Tiddlywiki. I just don&rsquo;t know how to get some of the automation/ease of data entry I can get with Obsidian. If I lifted my notes out of Obsidian I would lose a few things that currently connect notes via the tasks and dataview plugins, but I limit use of those things to nice-to-haves.</p>
<h2 id="other-obsidian-details">Other Obsidian details</h2>
<p>I&rsquo;ve got a smallish list of plugins holding my Obsidian stuff together, easing data entry, and making my templates smarter:</p>
<ul>
<li>Custom File Explorer Sorting: Just lets me put the file explorer sidebar in a better order (pushing utility folders to the bottom, raising my task list to the top)</li>
<li>Dataview: For pulling in related notes in my people, area, and project pages.</li>
<li>Front Matter Title: Lets me use Denote&rsquo;s &ldquo;metadata-in-filename&rdquo; convention but see the human-readable title of a note in tabs and the file explorer</li>
<li>QuickAdd: A way to add content to pages. I can pop open a dialog to select a page, type in some text, and it gets plopped at the bottom of a given heading.</li>
<li>Tasks: The standard Obsidian task management plugin</li>
<li>Templater: Lets you add JavaScript to your templates at initial render. It&rsquo;s how I enforce the Denote filenaming scheme.</li>
</ul>
<p>If pressed, just Tasks would be the must-have. QuickAdd would probably make the list. Templater and Front Matter Title mostly exist to enable the Denote file naming, which is on my &ldquo;nice to have&rdquo; list.</p>
<h2 id="the-milkmade">The Milkmade</h2>
<p>I got <a href="https://mychefwave.com/milkmade-milk-maker/">a nut milk maker</a>. It looks sort of like a Mr. Coffee, but instead of a coffee basket there is a nut/grain threshing chamber. You fill the reservoir, dump maybe a quarter cup of your preferred nut or grain into the threshing chamber, and press a button. 12 minutes later there&rsquo;s a 20 oz. carafe of nut milk.</p>
<p>It&rsquo;s a little grainier than what you get at the store, and a little less creamy. Letting it chill in the fridge (it comes out at 180F) and drinking a cup of it wasn&rsquo;t as good as store bought &ndash; maybe a little bitterness in comparison &ndash; but I did some reading and made another batch where I dropped in a pinch of salt, a splash of vanilla, and a teaspoon of monkfruit sweetener, and that was pretty good.</p>
<p>The CGM has taught me that cow milk in any quantity past &ldquo;a splash in my tea&rdquo; has a drastic effect on my blood sugar. It&rsquo;s the kind of spike I never would have noticed with finger stick testing &ndash; tends to be fast and well within the two-hour post-prandial window &ndash; but I couldn&rsquo;t unsee the spikes, and I don&rsquo;t <em>neeeeed</em> cow milk, but like it over my cereal or with protein powder. So if I&rsquo;m gonna be a nut milk lifer, I&rsquo;m glad I can make my own.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The notes bakeoff</title>
      <link>https://mike.puddingtime.org/posts/2024-02-21-the-notes-bakeoff/</link>
      <pubDate>Wed, 21 Feb 2024 12:28:55 -0800</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2024-02-21-the-notes-bakeoff/</guid>
      <description>The agonized ego is a ring of defense around nothing. And should not interfere with note tool selection.</description>
      <content:encoded><![CDATA[<p>I wrote a few days ago about impermanence and how it is, perhaps, desirable for our identities to be at least a bit ephemeral, the better to grow. There&rsquo;s gray in all that. We should always be clear on who we are, what matters to us, what our values are. But we should also be ready to let bits of our identities go.</p>
<p>I know that is easier said than done.</p>
<p>&ldquo;Bits of our identities&rdquo; are conversation starters, signifiers, hints, badges, clues to deeper things about us, personal reminders, and anchors.</p>
<p>&ldquo;Anchors.&rdquo;</p>
<p>&ldquo;That was a very anchoring conversation.&rdquo;</p>
<p>&ldquo;This is a real anchor around my neck.&rdquo;</p>
<p>Which is a weird way to start a post about note-taking apps, but here we are.</p>
<p>Like, Emacs is part of my &ldquo;Unix person&rdquo; origin story. I can&rsquo;t name another software tool I&rsquo;ve used as consistently for 33 years. I suppose the Unix paradigm itself edges Emacs out for personal longevity, but not by much.  And when I think about everything I was doing with that first Ultrix account in 1991, &ldquo;running Emacs&rdquo; is the only thing that remains from the list. No more Netrek, I don&rsquo;t use USENET in a way that would be recognizable to Past Me, and if the work I did on the Landsraad assembly hall for the DUNE MUD remains &ndash; getting cones of silence to work felt like a real triumph &ndash; I haven&rsquo;t been around to visit it for a few decades.</p>
<p>It is a bit of an anchor in the putatively good sense of the word &ldquo;anchor.&rdquo; Technological comfort food. One of the first things that goes on any new machine, and one of the first server-side things I test when I&rsquo;m trying out a new remote access tool. But also a bit of an anchor in the not-great sense of the word, in that I will pay the &ldquo;figure out how to express this in elisp&rdquo; tax for hours, well beyond practicality or reason.</p>
<p>Most recently, I was ignoring some excellent advice from Prot regarding people who want to use his excellent Denote for task tracking:</p>
<blockquote>
<p>“If you want my opinion though, be more forceful with the separation of concerns. Decouple your knowledge base from your ephemeral to-do list: Denote (and others) can be used for the former, while you let standard Org work splendidly for the latter—that is what I do, anyway. &hellip; “Do not mix your knowledge base with your to-do items.”</p>
</blockquote>
<p>&hellip; and the complexity was piling up and up, the tradeoffs were getting worse, and there was simply no joy in the experience because I had gotten myself into that bitter &ldquo;make this problem yield&rdquo; mindset that eventually leads to less understanding and more hacked-up, suboptimal stuff.</p>
<p>I just don&rsquo;t have time for it right now.</p>
<p>So it makes sense that my fallback position was &ldquo;maybe Logseq would be fine,&rdquo; because it&rsquo;s got the whole &ldquo;supports org-mode syntax&rdquo; thing going on &ndash; leave the door open for a return to Emacsland once I have more time &ndash; and perhaps because it is just odd enough to tickle another bit of my self-image. Mercifully, the second I tried to solve a problem of moderate complexity I realized how much time I&rsquo;d have to invest to do anything besides pick code samples up off the sidewalk and pop them in my mouth. So I backed away slowly.</p>
<p>And after that it makes sense that Tiddlywiki got a look because it has been around forever and there is a sort of cheerfully prosaic attitude among its users. But the plugins started creeping in and I was trying to get it to do stuff it doesn&rsquo;t really want to do without a lot of third party assistance, so the whole &ldquo;it&rsquo;s very simple&rdquo; thing was not allowed to find much expression.</p>
<p>So there I was, and I&rsquo;m sort of glad that I chased my tail over the past few weeks because it tired me out a little, but left me with an idea of what I wanted to do: Take notes in a connected manner, blend a little of PARA with space for a slipbox approach, and have inline todos, <em>and</em> I wanted it to sync across a few devices.</p>
<p>Obsidian does all that very well. There is always the risk of plugin creep, but in past Obsidian experiments that has been less about extending the core feature set and more about removing repetitive work. The simple mission of &ldquo;write notes, link between them, keep track of tasks&rdquo; doesn&rsquo;t take much, with mobile and sync managed competently. It runs on every platform I&rsquo;d care to run it on.</p>
<p>It&rsquo;s a little dull. But after a few days of &ldquo;just using it&rdquo; and adding little affordances here and there from past vaults as I&rsquo;ve remembered them, it has the benefit of just working in a non-dramatic, non-head-desking, simple way.  I haven&rsquo;t had to really think about it much. I haven&rsquo;t inadvertently broken it or misconfigured it in such a way that I&rsquo;m scrambling around a minute before a meeting trying to get back into my own notes.  It&rsquo;s of sufficient maturity that you can look up the answers to things and they are often in written form, which minimizes the whole &ldquo;if I see one more YouTube poster frame of a slack-jawed influencer taking 30 minutes to explain something I could have copied and pasted in ten seconds I&rsquo;m going to do a murder&rdquo; thing.</p>
<p>I was inclined to say &ldquo;and it says nothing about me, at all.&rdquo;</p>
<p>But it does say a few things: &ldquo;Doesn&rsquo;t want to think about this problem he created for himself in any more detail,&rdquo; &ldquo;will settle on Markdown even though it is inferior to org,&rdquo; &ldquo;can stand being associated with people who think a graph of their notes is interesting and useful if it means not having to think about this any longer,&rdquo; &ldquo;will pay for sync,&rdquo; &ldquo;considers seven plugins normal and reasonable, would not admit to nine,&rdquo; and &ndash; most likely and eventually &ndash; &ldquo;always seems to creep back to Emacs even though it seemed like he knew better last time he did this.&rdquo;</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily notes for 2023-07-11</title>
      <link>https://mike.puddingtime.org/posts/2023-07-11-daily-notes/</link>
      <pubDate>Tue, 11 Jul 2023 06:01:33 -0700</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-07-11-daily-notes/</guid>
      <description>Garmin GPS stuff, trying Wikiloc, calming down about notes, settling in at work.</description>
      <content:encoded><![CDATA[<h2 id="garmin-and-gps-stuff">Garmin and GPS stuff</h2>
<p>We took a weekend trip down to the Alsea Falls area, west of Corvallis. We camped in the federal campground there, and spent Saturday hiking up Marys Peak.</p>
<p>This is the second season we&rsquo;ve had our Garmin <a href="https://www.garmin.com/en-US/p/592606">inReach Mini</a>, a small GPS device that offers basic tracking plus emergency satellite communications (SOS and texting) and live weather. We got it after a small scare on our trip to the Redwoods last spring.</p>
<p>I&rsquo;m a hardware GPS holdout. I&rsquo;ve used a number of iPhone apps including Gaia GPS and AllTrails, but my issues with using an iPhone in the backcountry amount to the unpredictability of the devices: I&rsquo;d like better guarantees about the stability of the data I keep on them, I don&rsquo;t trust their power management over the course of a day on the trail, and I live in a biome that makes fussing with a touch screen in the field a nightmare six months out of the year.</p>
<p>Before we got the Mini we already had a <a href="https://www.garmin.com/en-US/p/669284">Garmin GPSMAP 64sx</a>. Even when I&rsquo;ve been experimenting with iPhone apps on the trail I&rsquo;ve preferred to download my routes to the 64sx, even if I&rsquo;m leaving it off and buried in my pack. It&rsquo;s a good insurance policy that paid off a few years ago when we were hiking through burned out areas in Central Oregon and lost the trail thanks to massive deadfalls: the extra topo layers I had loaded into it made it easy to look up the trail on the spot and figure out where to rejoin it.</p>
<p>I&rsquo;d like to shed the 64sx and I&rsquo;ve eyed the inReach-enabled handhelds Garmin&rsquo;s got on the market. They offer rechargeable or AA batteries, do all the handheld GPS stuff, and include the same emergency comms options. The Mini is so small, though, that it&rsquo;s not a huge burden to have two hardware devices. The Mini has a &lsquo;biner I clip to whatever pack strap is handy up near my shoulders and mostly stays out of the way. I just make sure to plug it into the car to recharge it whenever we set out on a trip. So I don&rsquo;t think a whole new device is necessary and I&rsquo;ll just live with the extra hardware.</p>
<p>This weekend convinced me I could probably loosen up a little on using an iPhone on hikes, though. Marys Peak isn&rsquo;t that remote, and there&rsquo;s even 5G cell coverage at the top, so the stakes were lower and made it easier to experiment.</p>
<p>People dis the company for limiting the connectivity of its devices to preserve a focus on hardware, but Garmin&rsquo;s Explore app does a decent job of turning your smartphone into an expensive dongle that offers better ergonomics if you&rsquo;re mostly sticking to easier dayhiking situations. Once paired, the Bluetooth sync between phone and GPS device is solid and fast, and Explore includes topo maps and the ability to add tracks and waypoints to your Garmin account. So you can download a GPX file before heading out, import it into Explore, and it will both sync to your Garmin account and &mdash; once paired up &mdash; your dedicated GPS devices. Any tracks you record on your hardware sync to Explore, where it&rsquo;s much easier to use the phone UI to rename, relabel, and organize once you&rsquo;re off the trail. It also offers a map on a larger, big screen you can consult in a pinch. It&rsquo;d still suck in the rain, but it&rsquo;s there for quick use.</p>
<p>This weekend I addressed a few of my hangups about how little I trust iPhones to behave when my back is turned by making a pair of shortcuts that alternately power down all the radios and put the phone in low power mode or bring the radios back up, and saved them to my homescreen. When we got to a point on the trail where we weren&rsquo;t sure what it would mean to take one route or the other, Explore&rsquo;s topo map made it easy to do a quick consult and make a decision. Having a bigger, brighter, faster screen to explore with was better than the slower, smaller, harder to read 64sx. Then the phone got put away and off we went.  For the kind of hiking we usually do, that seems like a workable use case. So I expect the 64sx will be spending more time at the bottom of a pack.</p>
<p>I did spend some time imagining an iPhone Ultra during the more boring part of the trail, though.</p>
<h2 id="wikiloc">Wikiloc</h2>
<p>Another iPhone GPS challenge involves downloading GPX files. Some apps make it pretty hard to do from mobile even if they do offer the option via a desktop interface, and you&rsquo;re sort of swimming upstream when you do anything on iOS that involves a data file.  I found Wikiloc, which has a reasonable $9.99/year subscription and a 14-day trial, so I&rsquo;m going to give it a try on our trips over the next few weeks. The subscription includes a simple interface to save GPX files to your phone&rsquo;s storage, send them to your Apple Watch, or share them to Garmin devices. I learned I can just use the share sheet to send them to the Explore app, where they sync to my Garmin account.  That&rsquo;s a big improvement over AllTrails&rsquo; mobile app.</p>
<p>Wikiloc is crowdsourced, so you&rsquo;re better off using it when you have time to vet the trails at home, or the connectivity to do so in camp. The ones I&rsquo;ve looked up so far seem fine based on past experience, you just have to choose between several for a few locations, and people don&rsquo;t always clean up the ten minutes they spent walking around the trailhead, visiting the toilet, and walking back and forth from car to picnic table from their GPX files.</p>
<p>We have a few guidebooks to Oregon trails we use to get ideas for hikes, then compare and contrast with the online tracks. It can make for some amusing triangulation: The books are a little dated and fusty, preferring trail names that don&rsquo;t always line up with the names the forest or park services use on the signage. The crowdsourced online trail resources sometimes feel like they were annotated by someone who thinks &ldquo;walk a mile or two and turn left where someone left a Snickers wrapper in the weeds&rdquo; counts as expert guidance.</p>
<p>Anyhow, we&rsquo;re headed to the Diamond Lake area in a few weeks and there are some trails to try it out on. I don&rsquo;t know if we&rsquo;ll make another run at Mt. Bailey this year, though.</p>
<h2 id="anchoring-on-the-denote-way">Anchoring on The Denote Way</h2>
<p>I&rsquo;m a month into &ldquo;Obsidian but with Denote file naming and frontmatter conventions&rdquo; and it&rsquo;s surprisingly calming.</p>
<p>I&rsquo;ve settled on 12 plugins, several of which are discretionary or just around to be used for the API they provide to another plugin, and I&rsquo;ve discarded the things in my setup that were sort of nice but unreliable for syncing. It&rsquo;s smooth, syncing is reliable, and 30+ days into a new job I&rsquo;m finding search works well.</p>
<p>I felt a little itchiness about the setup a few days ago, and the thing that kept me from doing anything about it was the sense that settling on the Denote formatting conventions for file names and frontmatter means the option&rsquo;s there to move between Obsidian and Emacs whenever, so why bother now? They&rsquo;re just Markdown notes. I will probably not revisit north of 75 percent of them ever for anything more than digging out a fact here or there. I can type them into anything. If I ever get to a point where org-mode&rsquo;s better syntax is called for, I&rsquo;ll just slip over to Emacs and carry on. Both formats work in Denote.</p>
<p>Def <a href="https://bear.app">curious about Bear 2</a> tho. It keeps the content in some sort of db though, right?</p>
<h2 id="belonging">Belonging</h2>
<p>I had a chat with a senior executive in my foodchain today. I found myself saying, &ldquo;there&rsquo;s some stuff that&rsquo;s a little messed up I have to deal with, but I belong here and I&rsquo;m the kind of person you need handling this stuff.&rdquo;</p>
<p>Little moments like that have been happening here and there, when I feel a little frustrated that something is just sorta dumb and dysfunctional or broken, then I pause for a moment and think &ldquo;Good. I&rsquo;m the right person to fix this. It&rsquo;s why I&rsquo;m here.&rdquo;</p>
<p>I love my Puppet friends dearly, wouldn&rsquo;t trade the experience for the world, and had the good fortune to go out with a great person to report to who did a lot to help me get back a sense of what I could do, but on balance the last few years of that place did me no favors, and I let a lot of self doubt seep in. It feels good to begin recovering a little more sense of what I&rsquo;m supposed to be about. I&rsquo;m so glad I got to take a break before I jumped back in.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily notes for 2023-06-29</title>
      <link>https://mike.puddingtime.org/posts/2023-06-29-daily-notes/</link>
      <pubDate>Thu, 29 Jun 2023 08:59:25 -0700</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-06-29-daily-notes/</guid>
      <description>RE Himalayan stuff. The hideousness of motorcycle marketing. Obsidian daily page automation with Shortcuts. Camera bags. Automation for slowness.</description>
      <content:encoded><![CDATA[<h2 id="more-himalayan">More Himalayan</h2>
<p>Evidently RE Himalayans have a widespread problem with parasitic drains owing to a few things, including weird wiring of the gear sensor. The net effect is batteries that get chewed through in a week of sitting. People do a bunch of things to address it, from finding third-party components to replace the factory stuff from RE, to rewiring the gear sensor, to even putting mechanical bypasses on the negative pole of their batteries. A battery tender is enough to help, too, though I sort of hate having one sitting out in the driveway.</p>
<p>There&rsquo;s also a cheap dongle you can order from Hitchcocks to do the rewiring for you. I ordered one hoping it&rsquo;ll address my Himalayan&rsquo;s particular issues. If I&rsquo;m to sell it, I&rsquo;d like to say &ldquo;no need for a constant tender!&rdquo;</p>
<p>I also ordered an Antigravity battery. Those things are cool: They keep some reserve power back. When they sense drain on the battery taking it below its ability to start the bike, the battery shuts down. Press a button and it recharges the main cells enough for a couple of starts.</p>
<p>There&rsquo;s a newer RE dealer up in St. John now, and I want to go up and talk to them. The service I got at the dealership I bought the bike from was pretty bad and sort of grudging. They had a real &ldquo;if you wanted it to all work perfectly, why didn&rsquo;t you spend more&rdquo; attitude, which helped me realize that what they <em>want</em> to do is sell you a Harley, but it&rsquo;s useful to them to have some RE&rsquo;s sitting on the floor for when people come in and can&rsquo;t countenance sixteen grand. There&rsquo;s the RE for less than $7000 out the door, and the way motorcycle fever works is that you&rsquo;ve rolled into that dealership ready buy <em>something</em> no matter what. (Well, not me &ndash; I got it all out of my system with my first 170cc scooter, and am probably on a local dealership blacklist for filling out quote forms then never returning calls.)</p>
<h2 id="the-h-is-for-hideous-or-horny-take-your-pick-on-what-the-d-is-for">The &ldquo;H&rdquo; is for &ldquo;Hideous.&rdquo; Or &ldquo;Horny.&rdquo; Take your pick on what the &ldquo;D&rdquo; is for.</h2>
<p>Trying to look up the price for a Harley Street Bob I ended up on <a href="https://www.harley-davidson.com/us/en/motorcycles/street-bob.html">the product page</a>. Jesus Christ.</p>
<p>Raising a kid I was sensitized to the aspirational nature of children&rsquo;s television/marketing. Like, was <em>iCarly</em> about teenage kids? Yes. But Nickelodeon didn&rsquo;t think fifteen-year-olds were watching. It knew eleven-year-olds were watching. The ads told you what the real viewer demographic was.</p>
<p>Harley is doing this in reverse: The male model is &ldquo;good-looking guy, a little salt and pepper in the beard.&rdquo; The female model is younger. Plausibly-deniably younger. Not enough to be lurid. Not enough, in a marriage where decisions about things like motorcycles are made jointly, to trigger too much anxiety, and possibly even aspirational for the spouse who&rsquo;s okay with a t-shirt that reads &ldquo;If you can read this, my old lady fell off.&rdquo;</p>
<p>It&rsquo;s not marketing for 30-year-olds who aspire to be 45-year-olds. It&rsquo;s marketing for 60-year-old men who aspire to much younger women. Wow it&rsquo;s a fine line between &ldquo;plausible deniability&rdquo; and &ldquo;feels icky.&rdquo; The local Harley dealership where I got the Himalayan picks up the slack with a &ldquo;Summer Solstice Bike Night&rdquo; that includes a bikini bike wash. I guess that&rsquo;s for the <em>very rare</em> instances where merely riding around atop your new Hog didn&rsquo;t magnetically lasso an old lady onto the pillion. And if all they&rsquo;re doing is rolling up to the bikini car wash a few times between June and August, <a href="https://www.washingtonpost.com/news/tripping/wp/2017/10/16/baby-boomers-who-made-motorcycles-cool-are-also-at-higher-risk-of-fatalities-aaa-says/">it&rsquo;s probably keeping the mortality rate down</a>.</p>
<h2 id="obsidian-actions-and-shortcuts">Obsidian Actions and Shortcuts</h2>
<p>You can do a lot with the Obsidian URL scheme and Apple&rsquo;s Shortcuts, but it&rsquo;s a little less fiddly with <a href="https://obsidian.actions.work">Actions for Obsidian</a>, which offers a bunch of Shortcuts actions that handle things like appending text to notes, making new notes, etc. I dusted off an old Shortcut I had that used the URL scheme and refactored it to work with Actions for Obsidian and it is much cleaner.</p>
<p>The workflow:</p>
<ul>
<li>Pops up a dialog with all my appointments for the day</li>
<li>I check the appointments I want an entry for in my daily page</li>
<li>If there&rsquo;s no daily page, the workflow creates it</li>
<li>Appends my appointments for the day to the Notes section of my daily page</li>
</ul>
<p>I currently just have a simple template for those meetings:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># Meeting Name 
</span></span></span><span class="line"><span class="cl">(attendees)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## What&#39;s the most important thing about this meeting?
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## How do you want to show up? </span></span></code></pre></div>
<p>It&rsquo;s at slight cross purposes with my static &ldquo;Today&rdquo; page, which I developed thinking I wasn&rsquo;t going to do daily pages. During my layoff, daily pages and journal entries were sort of the same thing, and I was doing all my journaling in encrypted org-journal files. I decided to keep my journal in org-journal, where I have a safe space for writing whatever I want. Daily pages are a little more &ldquo;look ahead and log things I don&rsquo;t care about other people reading (much).&rdquo; So, I think I&rsquo;ll move some of my Today page templating into my daily pages so they become a record of activity: Notes and tasks created on that day and that loose &ldquo;looking ahead&rdquo; calendar forecast I automated.</p>
<h2 id="camera-bags">Camera bags</h2>
<p><a href="https://www.kickstarter.com/projects/moment/the-everything-bags-cameras-tech-and-travel?ref=e5s4bv">Looks like Moment is coming for Peak Design.</a> The product names are pointedly similar. I was briefly confused by the promo mail.</p>
<h2 id="because-you-can">Because you can</h2>
<p>I had an item for today&rsquo;s post I decided wasn&rsquo;t quite ready. Using org-mode to blog, I would have done a quick <code>org-refile</code> to move the heading into a drafts section where I can work on it later. But I&rsquo;m writing in Markdown so that was off the table. I just made a file called <code>drafts.md</code> and committed it, then added the heading to it for later with good ol&rsquo; fashioned kill/yank.</p>
<p>But I did briefly think &ldquo;oh, see &hellip; good reason to go back to org-mode for blogging.&rdquo;</p>
<p>Except it&rsquo;s not. It&rsquo;s a terrible reason.  I just counted how many keystrokes it took me to collapse a heading, kill it, switch buffers, and yank it. It was &hellip; not a lot? 10? How about an org-refile operation? Yes. Fewer for sure. About half as many. The not-org-refile approach incurs some cognitive load, I suppose. When I was blogging in an org-file monolith my refile target was the only choice for that file. The Markdown version requires me to remember that I bookmarked my drafts.md file.</p>
<p>Probably seems like a weird thing to care about, but when I think about how ADHD shows up for me, it often takes the form of trying to do everything quickly to get on to the next thing. But I&rsquo;ve also got the hyperfocus thing going on, which finds a lot of expression in automation challenges I get lost in, trying to shave a few more seconds or keystrokes off a process.  When everything is wired up to drive down friction, I don&rsquo;t give myself time to think. I&rsquo;m just moving. I end up living in either a closed off, hyperfocused space where I&rsquo;m grinding out incremental improvements, or I&rsquo;m flying along the treetops.</p>
<p>It&rsquo;s about the thing I&rsquo;m doing with the Obsidian/Things division of labor. I wrote about this a few days ago when I mentioned the way I&rsquo;m <a href="/posts/2023-06-25-daily-notes/#mingling-notes-and-todos">blending todos into my note text</a>, but only long enough to leave a reminder to myself to go back and turn something into a real action in my system of record for todos. I think it&rsquo;s bad for me to have everything in the same system, because the less friction there is to record and remember, the more stuff just gets shoved into what eventually becomes an old shoebox full of receipts with purple crayon scribbles and grease stains.</p>
<p>Today, for instance, I had five meetings. Three of them produced things that I needed to remember to do later. I dropped todos into the text as I was taking notes. At the end of the day, I went to my <code>Today</code> page and looked at the Todo section, dynamically created from todos in any notes dated today.  A few were &ldquo;just do it now&rdquo; sorts of things that I knocked out before they could even hit Things. A few, it was helpful to jump back to the note to see things like &ldquo;why did he tell me to ping Felix?&rdquo; A few, it was helpful to write a more thoughtful plan in Things (and drop the Obsidian URL in to link back to the more complete notes).</p>
<p>There is some friction in that workflow. It does require a &ldquo;clear the decks&rdquo; item on my daily calendar at the end of the day so I can make sure to go back and consolidate. I feel a lot more composed and certain of the quality of the things I&rsquo;m actually putting into my todo system, though, when I have those liminal tasks to go back to, reconsider, and rewrite after revisiting their context.</p>
<p>This is not, I guess I should add, something unique to Obsidian. You could do this in any of the org-mode using tools, or any plaintext system where there&rsquo;s an easy way to create TODOs and find them later. Obsidian&rsquo;s dataviews and Tasks plugin makes it easy. org-mode similarly can do it with agenda views, Denote dynamic blocks, etc. The value is in slowing down, stopping the high-speed accumulation of <em>stuff</em> that&rsquo;s stripped of context and crammed into a digital shoebox, and providing pointers back to useful context for when the time comes to turn a quickly jotted todo into a meaningful action.</p>
<p>You don&rsquo;t even, I suppose, have to spread it out over multiple apps. But I do find that the act of putting Obsidian and Things side-by side and having to transpose prose to lists is a useful exercise. It&rsquo;s a bit of deliberation and rethinking that&rsquo;s clarifying.</p>
<h2 id="comments">Comments</h2>
<p>&hellip; I&rsquo;d love to add &rsquo;em, and I was looking at some recipes for doing it using Mastodon, but half the examples led to 404s, one of them swore to god it was working then said it wasn&rsquo;t and then said it was, and was also leading to 404s. Not enough time in the day. The ones that did work had a very awkward, high-friction energy to them.</p>
<p>Given that I push posts out over one channel, and that almost all my inbound traffic is coming in from Mastodon people, I&rsquo;d be happy for just the part where you can visit an announcement post. But that part seems to be harder than it needs to be given the federation stuff.</p>
<p>Not enough time in the day to worry about this stuff. Definitely do not want to pay anyone. Definitely not interested in sticking Disqus in there. Think I&rsquo;ll table it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily notes for 2023-06-27</title>
      <link>https://mike.puddingtime.org/posts/2023-06-27-daily-notes/</link>
      <pubDate>Tue, 27 Jun 2023 07:16:03 -0700</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-06-27-daily-notes/</guid>
      <description>Making Denote more legible in Obsidian. Ethical Uber reviews. The strangeness of being new somewhere.</description>
      <content:encoded><![CDATA[<h2 id="denote-conventions-and-obsidian-legibility">Denote conventions and Obsidian legibility</h2>
<p>I added the <a href="https://github.com/FlorianWoelki/obsidian-icon-folder">Icon Folder</a> plugin to Obsidian and it works really well with Denote-formatted notes thanks to the ability to use filename-based rules for icon assignments.</p>
<p>Denote&rsquo;s <code>_tag1_tag2_tag3</code> file naming convention makes it easy to make rules based on tags for assigning an icon and optional color to notes. That makes a list of notes a lot more scannable, and has an interesting additional effect of telling a little story about your day: 1:1s get an icon, regular meetings get an icon, RFCs get an icon, conceptual notes, etc. etc. so just scanning down the list of notes in the file explorer reflects a kind of rhythm. That makes it easier to keep a sort of noisy naming convention in place &mdash; things are just more scannable, and that reduces the temptation to do things that make the file names more human-readable at the expense of long-term portability.</p>
<p>I was feeling a little wobbly about keeping strict Denote compliance, but I&rsquo;ve got a <a href="https://github.com/SilentVoid13/Templater">Templater</a> template set up to rename files based on their YAML frontmatter, and I&rsquo;ve got that wired up to a <a href="https://github.com/platers/obsidian-linter">Linter</a> on-save action, so when I change the tags or name of an Obsidian note and save it, the Templater action updates the tags in the filename:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="o">&lt;%*</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">file</span> <span class="o">=</span> <span class="nx">tp</span><span class="p">.</span><span class="nx">file</span><span class="p">.</span><span class="nx">find_tfile</span><span class="p">(</span><span class="nx">tp</span><span class="p">.</span><span class="nx">file</span><span class="p">.</span><span class="nx">title</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">{</span><span class="nx">update</span><span class="p">}</span> <span class="o">=</span> <span class="nx">app</span><span class="p">.</span><span class="nx">plugins</span><span class="p">.</span><span class="nx">plugins</span><span class="p">[</span><span class="s2">&#34;metaedit&#34;</span><span class="p">].</span><span class="nx">api</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">identifier</span> <span class="o">=</span> <span class="s2">&#34;&#34;&#34; + tp.file.creation_date(&#34;</span><span class="nx">YYYYMMDDTHHmmss</span><span class="s2">&#34;) + &#34;&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">date</span> <span class="o">=</span> <span class="nx">tp</span><span class="p">.</span><span class="nx">file</span><span class="p">.</span><span class="nx">creation_date</span><span class="p">(</span><span class="s2">&#34;YYYY-MM-DDTHH:mm:ssZ&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">title</span> <span class="o">=</span> <span class="s2">&#34;&#34;&#34; + tp.frontmatter[&#34;</span><span class="nx">title</span><span class="s2">&#34;] + &#34;&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">await</span> <span class="nx">update</span><span class="p">(</span><span class="s2">&#34;date&#34;</span><span class="p">,</span> <span class="nx">date</span><span class="p">,</span> <span class="nx">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kr">await</span> <span class="nx">update</span><span class="p">(</span><span class="s2">&#34;identifier&#34;</span><span class="p">,</span> <span class="nx">identifier</span><span class="p">,</span> <span class="nx">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kr">await</span> <span class="nx">update</span><span class="p">(</span><span class="s2">&#34;title&#34;</span><span class="p">,</span> <span class="nx">title</span><span class="p">,</span> <span class="nx">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="o">-%&gt;</span></span></span></code></pre></div>
<p>The net effect is that my filenames stay Denote-compliant and reflect current note metadata in the frontmatter as I update them, and that supports the consistency of the icon assignment rules.</p>
<p>I&rsquo;m trying to keep an eye on my plugin and configuration budget for this stuff.  To maintain this level of automation I&rsquo;ve got:</p>
<ol>
<li>Quickadd (kicks off the templated note creation process)</li>
<li>Templater (lets me put logic in the note creation)</li>
<li>MetaEdit (around solely for its API: supports frontmatter hygiene)</li>
<li>Linter (cleans up notes &ndash; especially their frontmatter)</li>
<li>Icon Folder (assigns icons to notes based on rules around their filenames)</li>
</ol>
<p>When I think about what would happen to the workflow if I pulled any one of them out, three are essential; the bracketing ends of the workflow (note creation and icon labeling) are nice-to-haves that don&rsquo;t impact the future-proof-ness of the collection.</p>
<p>The one remaining thing about Obsidian that concerns me generally is the plugin ecosystem. I&rsquo;ve learned to click through to plugin repos, read the README for &ldquo;can&rsquo;t maintain this anymore&rdquo; messages, check the last commit date, and check the amount/age of issues. I&rsquo;ve seen a few where developers specifically mention Obsidian API changes affecting their ability to maintain their work.</p>
<p>I guess I feel about that the same way I feel about my web publishing toolchain: It was painful to go from WordPress to Jekyll. It was trivial to go from Jekyll to Hugo. It was painful to move my last Obsidian setup to org-mode, and from plain old org mode to Denote. It was trivial, given a simple Python script, to move from org-based Denote to Markdown-based Denote. And it has been trivial to configure Obsidian to maintain that corpus.  Tools are ephemeral, conventions are &hellip; not forever, but more durable. The simpler, the more robust and the more portable. Sure there&rsquo;s a lot of squabbling about how expressive Markdown should be, but the YAML-in-Markdown convention turns up in a bunch of tools. Key names change &mdash; Hugo developers don&rsquo;t coordinate on frontmatter keys that serve the same function &mdash; but you&rsquo;ve got a fighting chance to automate through change when you start from YAML (or TOML).</p>
<p>A lot of thought for note taking. I think it is a work-related habit I don&rsquo;t mind having. I&rsquo;ve noticed a shift in how I think about work that involves shrugging off a little of a sort of open-endedness that was very, very normal when I first joined Puppet, then became increasingly &hellip; quaint? &hellip; as the business changed around me.</p>
<p>The acquisition was a little disappointing because I&rsquo;d found myself getting better at weighing what needed reinvention vs. what simply needed to be decided and done. The job hunt and some good interview processes sharpened that further. Sort of the way muscle memory seems to consolidate after you take a break from something after intense learning. If Puppet was ten years of repeatedly beating my head against a boss round, then getting tossed out and having to make a case for myself to strangers was the surprising ease with which that boss goes down if you just set the controller down, get some sleep, and come at it the next morning.</p>
<h2 id="five-stars-or-bust">&ldquo;Five Stars or Bust&rdquo;</h2>
<p>Getting rid of Amazon Prime and hence disengaging from Amazon in general was surprisingly easy once I took the time to think it through. Dropping delivery services has been a harder habit to break. We&rsquo;ve made a lot of progress but sometimes we lapse. <a href="https://oversharing.substack.com/p/five-stars-or-bust">This post on Uber ratings</a> reminds me that it&rsquo;s about more than saving money. It&rsquo;s about disengaging from a sector of the economy that thrives on precarity, and whose management wants to take its not-employees-but-actually-employees back to 19th century labor practices so I can have treats delivered.</p>
<h2 id="strangeness-of-being-new-somewhere">Strangeness of being new somewhere</h2>
<p>When asked if I&rsquo;m a &ldquo;half empty or half full&rdquo; person, I get confused. That particular saw has never made a ton of sense to me for reasons I&rsquo;m not going to get into, but sometimes do in a way that probably causes people to wonder if there are any other parts of the social contract I&rsquo;m unable to understand.</p>
<p>I was nearly tossed out of the army for refusing to sound off to gruesome baby-killing cadences &mdash; cadences banned by name at Ft. Liberty (Ft. Bragg at the time) my last week in the service. But I&rsquo;ve got a taste for hyperbolic and violent metaphor that people have told me <em>becomes</em> charming <em>over time</em>.</p>
<p>I go into most interactions with as curious, trusting, and open-ended a mindset as I can manage; but when I&rsquo;m sending out a minion I&rsquo;ll brief them on misaligned incentives and wooden nickels.</p>
<p>Like everyone, I&rsquo;m a bundle of contradictions, inner monologue/outer affect mismatches, and blindspots.</p>
<p>With a few exceptions that I no longer allow to keep me up at night, I think most people get used to all that, same way I get used to all their weirdnesses.</p>
<p>But it is sort of strange to start fresh somewhere, knowing I&rsquo;m a way&rsquo;s away from &ldquo;oh, that&rsquo;s just Mike.&rdquo;</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily notes for 2023-06-25</title>
      <link>https://mike.puddingtime.org/posts/2023-06-25-daily-notes/</link>
      <pubDate>Sun, 25 Jun 2023 16:44:12 -0700</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-06-25-daily-notes/</guid>
      <description>How to mix todos and prose. An Obsidian Today page. Woeful MetaTalk. Getting ready to say goodbye to Apollo. Markdown blogging. BBEdit and LSP. Goodbye reMarkable.</description>
      <content:encoded><![CDATA[<h2 id="mingling-notes-and-todos">Mingling notes and todos</h2>
<p>Prot on the ways in which Denote (or any &ldquo;lots of little notes&rdquo; system) will eventually murder org-mode agenda generation times:</p>
<blockquote>
<p>&ldquo;If you want my opinion though, be more forceful with the separation of concerns. Decouple your knowledge base from your ephemeral to-do list: Denote (and others) can be used for the former, while you let standard Org work splendidly for the latter—that is what I do, anyway.
&hellip;
&ldquo;Do not mix your knowledge base with your to-do items.&rdquo;</p>
</blockquote>
<p>I appreciate that. I am on the record liking the ability to sprinkle todos into prose, or the way todos can be skeletal prose. But one thing I&rsquo;ve come to appreciate about <em>me</em> is that when I live in the same place for everything, I start feeling sort of tool-sick. I think that part of me that has a hard time resisting the urge to optimize reacts to Total environments by trying to totalize further.</p>
<p>With my Obsidian-by-way-of-Denote-conventions setup, I&rsquo;ve been thinking about that a little.</p>
<p>I once went through an Obsidian jag where I wanted it to handle all my todos, and it didn&rsquo;t take long to get to a state of config/plugin bankruptcy. I decided that it was a good idea to have todos be a thing handled by a dedicated tool, and notes to be handled by a good note taker.</p>
<p>During my most recent org kick, I let things intermingle more, and I really held on to org-mode as a backend for Denote because I had that total use case in the back of my head.</p>
<p>I do think there&rsquo;s some value in having todos as semantically distinct nuggets inside atomic notes. For instance, when I&rsquo;m on a call and taking notes, I don&rsquo;t want to context-switch to my todo app to make a todo, and that&rsquo;s not a good idea anyhow: You lose the context, or just make work for yourself going back to find the original note to get the context back.</p>
<p>One nice example of blending todos and some other text object comes from <a href="https://github.com/IvanMalison/org-projectile">org-projectile</a>, which lets you create TODOs in a code base that go into a central notes file with a link to the text hunk you can follow.</p>
<p>I borrowed that idea for Obsidian by using the Tasks plugin:</p>
<ul>
<li>Set Tasks to add creation dates to any todos you create</li>
<li>Use normal todos for most inline notes: Just drop one in when an action presents itself during a conversation, or comes up while writing.</li>
<li>Make a metanote page that lists notes created today, and also lists todos created today:</li>
</ul>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">tasks 
</span></span><span class="line"><span class="cl">not done 
</span></span><span class="line"><span class="cl">created today</span></span></code></pre></div>
<p>That makes a simple page that links back to the todo for when it&rsquo;s the right time of day to go through the day&rsquo;s notes and turn possible actions into actual tasks.</p>
<p>The Tasks plugin allows for a bunch of different kinds of tasks, so I&rsquo;ve repurposed the <code>- [*]</code> type as <code>oppty</code>. Starting out in a new job, a lot of stuff goes by that I think of as &ldquo;maybe nice for the backlog&rdquo; or &ldquo;should do some discovery on that,&rdquo; but I don&rsquo;t want to overwhelm myself by dropping it into my Inbox where it&rsquo;ll both sit for a while and have no context. So I made another metapage for opportunities:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">tasks
</span></span><span class="line"><span class="cl">status.name includes star
</span></span><span class="line"><span class="cl">not done </span></span></code></pre></div>
<p>They just sit there, available for periodic review, linked to their originating note so I can get the context back when I need it. If I decide it&rsquo;s not a thing after all, delete it or check it off. If I decide it&rsquo;s a thing, turn it into a project and check it off.  It&rsquo;s a little different from the org-projectile approach, to the extent it leaves a todo item in the source file instead of just logging it in an outside file and linking back to the right hunk. I think that&rsquo;s fine.</p>
<h2 id="obsidian-today-page">Obsidian Today Page</h2>
<p>I stumbled my way into a Today page figuring all that out. It&rsquo;s just a collection of Dataview and Task code blocks:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Tasks from Today
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```tasks 
</span></span><span class="line"><span class="cl">not done 
</span></span><span class="line"><span class="cl">created today
</span></span><span class="line"><span class="cl">\```
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Notes from today
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```dataview
</span></span><span class="line"><span class="cl">LIST FROM -&#34;templates&#34; WHERE file.path != this.file.path AND file.cday = date(today) 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">SORT file.mtime desc
</span></span><span class="line"><span class="cl">WHERE file.name != this.file.name
</span></span><span class="line"><span class="cl">\```
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Notes from yesterday
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```dataview
</span></span><span class="line"><span class="cl">table without id
</span></span><span class="line"><span class="cl">link(file.link, default(file.aliases[0], file.name)) AS &#34;File&#34;,
</span></span><span class="line"><span class="cl">file.ctime AS &#34;Date&#34;
</span></span><span class="line"><span class="cl">FROM -&#34;metanotes&#34; AND -&#34;templates&#34;
</span></span><span class="line"><span class="cl">WHERE file.path != this.file.path AND file.cday = date(yesterday) AND  !contains(file.path, &#34;templates&#34;)
</span></span><span class="line"><span class="cl">SORT file.mtime desc
</span></span><span class="line"><span class="cl">\```
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Notes from previous three days
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```dataview
</span></span><span class="line"><span class="cl">table without id
</span></span><span class="line"><span class="cl">link(file.link, default(file.aliases[0], file.name)) AS &#34;File&#34;,
</span></span><span class="line"><span class="cl">file.ctime AS &#34;Date&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">FROM -&#34;metanotes&#34; AND -&#34;templates&#34;
</span></span><span class="line"><span class="cl">where file.ctime &gt; (date(today) - dur(3 days)) AND file.ctime &lt; (date(today) - dur(1 days))
</span></span><span class="line"><span class="cl">sort file.ctime desc
</span></span><span class="line"><span class="cl">\```</span></span></code></pre></div>
<p>Basically, just &ldquo;Any tasks from notes made today, then &lsquo;all the notes from today,&rsquo; &lsquo;all the notes from yesterday,&rsquo; and &lsquo;all the notes from the prior 3 days,&rsquo;&rdquo; with a few filters to keep out metanotes and templates. It took a little fussing to get things to display in a way that shows my YAML metadata titles instead of the file names (which are Denote-formatted and a little cluttery), but that was an optional bit of prettying I undertook because I was curious.</p>
<h2 id="much-that-is-wrong-with-the-discourse-">Much that is wrong with &ldquo;the discourse&rdquo; &hellip;</h2>
<p>&hellip; can be found in <a href="https://metatalk.metafilter.com/26320/MetaFilter-has-a-real-problem-with-voicing-class-genocidal-attitudes">this MetaTalk thread wherein a user calls people out over their reaction to the submarine thing</a>.</p>
<p>Someone who knew one of the dead showed up:</p>
<blockquote>
<p>&ldquo;I&rsquo;ve met Shahzada several times &ndash; he was a significant backer of my work in carbon-free energy. He also personally paid for 5 million doses of Covid vaccine to be distributed in Pakistan during the pandemic, and set up a charity for helping people in Pakistan deal with the mental health consequences of the pandemic. He was a good person.</p>
</blockquote>
<blockquote>
<p>&ldquo;Reading some of the comments about him in the original thread was a gut punch. I was picturing (before we found out about the probable implosion) this person I know, this good guy, slowly suffocating underwater alongside his son, while Metafilter was making crass jokes about him.&rdquo;</p>
</blockquote>
<p>With each passing year it feels to me like an increasingly valuable piece of work to get better practiced at just not saying anything about an increasingly wide array of situations and topics. In a social media/web forum context, I can&rsquo;t think of anything I&rsquo;d say that would have a lot of leverage for good, and I can think of a lot of ways, like that right up there, that it can provide leverage for a lot of small but painful ills.</p>
<p>It&rsquo;s not that simple, right? It&rsquo;s a <em>good</em> thing that a lot of us have come to accept that people with power, privilege, access, resources, credibility, standing, platforms should <em>use them</em> to address injustice.  It&rsquo;s a <em>good</em> thing that we&rsquo;ve become more aware of the ways in which the urge to be more measured, or to make our words sweeter or easier to take, can cause us to mistake passivity or injustice for humility or modesty; or make it easier to tell other people suffering injustice to come back when they can &ldquo;put the message in a better envelope.&rdquo;</p>
<p>I think the thing that makes it hard to swallow is the way in which privileged, successful, wealthy people have steadily gentrified categories of oppression to rationalize their unwillingness to govern themselves, or to feel able act on the very human desire to participate in the conversation going on around them.</p>
<p>We each have to do our own math. There aren&rsquo;t any rules.</p>
<h2 id="twilight-apollo">Twilight Apollo</h2>
<p>I&rsquo;m very sorry <a href="https://apolloapp.io">Apollo</a> isn&rsquo;t long for this world. It&rsquo;s the best way to do Reddit under any circumstances, and really shines if you care about the distinct conversations under a post. It has helped me come to know individuals in a few communities over the years. I can&rsquo;t imagine reddit without it. So I&rsquo;m browsing the few subs I subscribe to these days with a sense of impending loss. Not too many more days and it will shut down; reddit will be much harder to keep up with, and a much worse experience in general.</p>
<h2 id="markdown-blogging">Markdown blogging</h2>
<p>A while back I wrote <a href="https://gist.github.com/pdxmph/9271cbb22d90f7e73a4b88664e0eaadd">a Ruby script to make it easier to do Hugo blogging</a>. It doesn&rsquo;t do a ton, but it does make it simple to enter title, tags, and category from the command line to make a Markdown file in the right place. It includes a switch for making daily posts with my house style.</p>
<p>I&rsquo;ve been blogging via <code>ox-hugo</code> since mid-April, so the script hasn&rsquo;t seen much use. Today I took another look at it, cleaned up one glitch in the way it does frontmatter, fixed up its daily post naming convention, and used it to make this post.</p>
<p>Gotta say, it just feels less fragile and less &hellip; think-y. There are some nice things about blogging with org-mode, for sure. I really like the document editing features. There are some things about blogging in a monolithic file that get sort of weird now and then. Sometimes it adds steps that feel needless. There are some things that are just clumsy or sort of a pain to remember. Every now and then you accidentally move a space in a previous entry and then you&rsquo;re left wondering why a post from two months ago suddenly regenerated its own Markdown.</p>
<p>Markdown, on the other hand, is good enough for blogging. I don&rsquo;t get any advantage from org-mode&rsquo;s syntax for most of what I&rsquo;m doing here, and Emacs&rsquo; markdown-mode does the same basic trick I like most from org-mode, which is tab-folding headings as I work through a post.</p>
<p>Like I said, when I decide I have another book in me I&rsquo;ll probably write it in org-mode. Until then, I&rsquo;m just going with the VHS of lightweight markup languages.</p>
<h2 id="bbedit-and-lsp">BBEdit and LSP</h2>
<p>I almost went full heretic and tried to see how I&rsquo;d feel about Markdown blogging with BBEdit. I was sort of excited about BBEdit&rsquo;s recent-ish support for <a href="https://en.wikipedia.org/wiki/Language_Server_Protocol">LSP</a>, and wanted to try out <a href="https://github.com/artempyanykh/marksman">Marksman</a>. Well, the two use cases I care most about for LSP &mdash; Ruby and Markdown &mdash; don&rsquo;t work. I managed to get the servers for YAML, JSON, CSS, HTML, and Python all working. Nothing doing for Marksman or <a href="https://solargraph.org">Solargraph</a>, the Ruby LSP server. They both work great under Doom Emacs, which also has great integration with Rubocop to make up for Solargraph&rsquo;s missing beautifying capabilities.</p>
<p>So, fine.</p>
<p>I&rsquo;ve got Emacs in a great place right now. I trimmed a lot of needless stuff from my configuration, it behaves just how I like, and it integrates well with Obsidian if I feel like doing more long-form writing and don&rsquo;t want to use Obsidian to do it. This miiiight be the first time I&rsquo;ve ever gone so completely Emacsimalist, then climbed back down from my worst excesses, but kept on using it for everyday stuff, too.</p>
<p>I even did a quick nostalgia tour of Sublime Text, VSCode, and Nova. Something about each of them irritated me.</p>
<h2 id="goodbye-remarkable">Goodbye, reMarkable</h2>
<p>As threatened, my reMarkable has a new home. Wow did I want to like that thing. I tried. In the end, I think it just came down to not being a handwritten notes kind of person at all. Or rather, if I am hand writing a note, it is just a small thing I am jotting down, or a way to fidget and stay a little engaged. I know what people say about recall and believe that is probably true, but that&rsquo;s just one dimension &mdash; there are also search, storage, portability, and just basic convenience.</p>
<p>If I had great handwriting I might have benefitted from the reMarkable, with its searchable handwritten text. But I don&rsquo;t have great handwriting. So it suffered from the same problem ebook editions of reference works suffer from: Paper notebooks have a certain spatial quality to them, and you can flip through them in lieu of being able to grep through them. My handwriting isn&rsquo;t good enough to be greppable by a machine, and the electronic &ldquo;notebook&rdquo; can&rsquo;t be thumbed through.</p>
<p>I guess, when I think back, that I imagined its more paper-like feel, its slimness, and its single-purpose nature were what would give it an edge over any number of iPad notebook apps. No. Turns out that I am just happier when I&rsquo;m typing notes.</p>
<p>As if to drive the lesson home, I shipped the reMarkable off yesterday and found myself downtown today at my favorite paper store. I briefly eyed a few nice notebooks and pens, thought to myself &ldquo;well, it was probably the <em>digital</em> stuff you didn&rsquo;t warm up to &hellip;&rdquo; then had a second thought and felt a little relieved that the paper coming out of the cognitive slot read in very plain, block lettering, &ldquo;YOU DON&rsquo;T ACTUALLY LIKE TRYING TO LIVE OUT OF A NOTEBOOK.&rdquo;</p>
<p>So I bought some shoes.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily Notes for 2023-06-22</title>
      <link>https://mike.puddingtime.org/posts/2023-06-22-daily-notes/</link>
      <pubDate>Thu, 22 Jun 2023 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-06-22-daily-notes/</guid>
      <description>Alright, sweethearts, you heard the man and you know the drill: Assholes and elbows!</description>
      <content:encoded><![CDATA[<h2 id="remarkable-sync-seems-faster">reMarkable sync seems faster</h2>
<p>It shows up as a thing in the latest release notes and it seemed to be true when I looked for it this morning: Sync on the reMarkable between desktop app and device is a lot faster. Not sure it&rsquo;s &ldquo;instantaneous,&rdquo; but it&rsquo;s in the range of &ldquo;wrote a note on the device downstairs, it was on my desktop by the time I got upstairs,&rdquo; which is a vast improvement. No idea if it will be consistent.</p>
<p>I sort of wonder about reMarkable, generally:</p>
<p>They just dropped 25 percent off the cost of their expensive keyboard accessory, and they&rsquo;re trying to herd users into annual plans. There are a lot of similar devices on the market, including stuff from Amazon and Kobo that combine note-taking with ebook reading. If I&rsquo;m doing the tradeoffs, the things that might count as &ldquo;nice&rdquo; on a reMarkable have to compete against the combined utility of a device that lets me read all my stuff from their respective stores, <em>and</em> take notes.</p>
<p>Personally, if I could make the thing go away and pocket $200 for it without dealing with assorted Craigslist randos who&rsquo;d try to trade me for a kayak with a hole in it and a moldy bag of weed I&rsquo;d take that deal. It has never really found a place in my workflow that has lasted. I won&rsquo;t say I <em>regret</em> it, but it just doesn&rsquo;t work for me.</p>
<h2 id="obsidian-again">Obsidian, again</h2>
<p>I knew that once I had a new job things would begin to change for me. Stuff I previously felt like messing around with would seem less fun to mess around with, and my assessment of a given tool would take a harder edge.</p>
<div style="text-align:center;">
<iframe width="560" height="315" src="https://www.youtube.com/embed/IUkKkWAREFg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div>
<p>This week was my first week at work where I was in &ldquo;full engagement&rdquo; mode for the balance of the week: Back-to-back days, ad hoc meetings, just needing to get stuff done quickly. I wanted to do stuff like &ldquo;take this free 15 minutes to go downstairs, drink a glass of water, and look at the four todos I just added to my list before starting the next call.&rdquo;</p>
<p>It was all very clarifying. For instance, these general things about writing notes all occurred to me:</p>
<ul>
<li>Mobile matters, both for writing and reading.</li>
<li>If I have a spare few minutes to hack in a feature, I&rsquo;d rather do it in JavaScript than elisp.</li>
<li>I prefer sync infrastructure be somebody else&rsquo;s problem.</li>
<li>It turns out that if life were a Richard Scarry book, for eight hours of the day I would be, like, a bear with spectacles and a neck tie who does business stuff. Markdown is sufficient for &ldquo;businessman notes.&rdquo;</li>
<li>Future-proofing matters to me.</li>
</ul>
<p>These things about Emacs occurred to me:</p>
<ul>
<li>I like sitting down and writing longer-form stuff with it.</li>
<li>I am grateful for it as my daily driver text editor for programming.</li>
<li>Given Doom and very modest customizations, Emacs &ldquo;just works&rdquo; for me.</li>
<li>I am better off as a &ldquo;slow Emacs&rdquo; person, not a &ldquo;fast Emacs&rdquo; person.</li>
</ul>
<p>On that last, it means that I do better with Emacs when I am doing things that I tend to configure once and never mess with again. Like, it&rsquo;s enough to have Rubocop and LSP working for my Ruby coding. Done. It&rsquo;s enough to know how to preview a Markdown file, and I don&rsquo;t care about any other stuff I could do with Markdown mode. Done. Electric modes for the things where I care? Great. Done and done. That&rsquo;s all &ldquo;slow Emacs.&rdquo; Figure it out once, take your time doing so, then never think about it again.</p>
<p><em>Fast</em> Emacs stuff tends to be whole workflows, and I am constantly tweaking those. I can&rsquo;t stop. I hate wasted motion, I hate having to remember three words separated by hyphens when I can remember two letters led by a spacebar. If I can turn on a preview server <em>and</em> open a tab to it in Safari in a single command, I&rsquo;ll figure out how to make that work. If I get an idea in my head about how to optimize something, or come to believe that something is taking more time than it absolutely should, I can&rsquo;t quit worrying at it. Fast Emacs. Constant, rapid iteration on little things meant to shave seconds or keystrokes or conserve brain storage.</p>
<p>When I am using Slow Emacs stuff, I am in a very focused, calm place. Emacs feels steady underfoot, stuff &ldquo;just works,&rdquo; I quit noticing the tool.</p>
<p>When I am using Fast Emacs stuff, it doesn&rsquo;t feel as steady. More stuff goes wrong. I end up dropping a paren and blowing everything up when I restart. Weird little things go wrong because I missed an edge case. It&rsquo;s over-automation, and I know something about that because I did two IT tours and one engineering services tour dealing with over-automated teams. I&rsquo;m not, like, Rock-Ribbed Business Guy on the job, but the waste of constantly getting bit in the ass by things someone made to make work easier and more efficient that become sources of mysterious failures and lost days of refactoring and debugging sort of grinds me. When I&rsquo;m doing Fast Emacs stuff, I&rsquo;m doing that to myself.</p>
<p>So that&rsquo;s Emacs. These things about Obsidian occurred to me:</p>
<ul>
<li>When I took away some things I liked about Denote and implemented them in Obsidian, it took very little time and four community plugins (one of which is just there to provide an API for another one).</li>
<li>Setting up capture templates for my common use cases involved 30 minutes of reading and poking and then maybe five minutes per use case.</li>
<li>When your plugin loadout is light, Obsidian feels very sturdy. With a decent theme, it feels pleasant.</li>
<li>Trying to do Fast Obsidian &mdash; heavily automated workflows &mdash; feels so self-evidently wrong that I don&rsquo;t even bother. I see people doing it, it seems janky.</li>
<li>Slow Obsidian &ndash; simple little keyboard shortcuts, macros, etc. is dead simple to do quickly. Those kinds of quality of life plugins are usually pretty good.</li>
<li>I cannot imagine writing long-form stuff in Obsidian. I&rsquo;m glad you wrote your book in it, but there is something about it &mdash; probably the busyness of the UI &mdash; that prevents me from considering it.</li>
</ul>
<p>And these things about my free time occurred to me:</p>
<ul>
<li>Tool-specific subreddits are Satanic. Obsidian and Emacs both invite an endless wander among the plugins and packages interspersed by the occasional dipshit trying to pick a fight by complaining about their inability to learn something new, triggering both the hardened Tool Warriors and the soft-hearted, enabling evangelists. You&rsquo;d think by now I&rsquo;d be resigned to the whole &ldquo;baby newbie with a broken wing&rdquo; cycle, but any kind of brand or consumer identification is grotesquely fascinating to me, and the ability of someone wandering in off the street crying about how hard elisp is to suck all the air out of the room never ceases to amaze.</li>
<li>I like my new job, but I knew going in that parts of it were going to be a challenge, and that&rsquo;s proving out. So during the day I want to do the easiest possible thing to do things that are helpful but are not the core value I provide (like taking notes, storing information for later, and connecting <em>this</em> thing over here to <em>that</em> task over there). I don&rsquo;t want to mess with those things. They need to just work. And at the end of the day, I want to be done with things that would remind me of work, which I am enjoying but want to keep in its place so I can keep enjoying it.</li>
</ul>
<p>So after a week of living the Obsidian-but-configured-to-make-files-like-Denote life, I got into my <code>config.org</code> file, disabled large swaths of the configuration that have to do with Fast Emacs, and reconfigured Denote to produce <code>markdown-yaml</code> files in my Obsidian vault, so if Obsidian ends up bothering me, my fallback position is already in place.</p>
<ul>
<li>Plain text</li>
<li>A little more future-proofed than Obsidian&rsquo;s loose default behavior thanks to Denote conventions</li>
<li>Solid mobile experience with reliable sync</li>
<li>Markdown&rsquo;s spare markup</li>
<li>Fewer moving pieces</li>
</ul>
<p>As long as a certain software company from Minneapolis doesn&rsquo;t come and buy this place, too, I&rsquo;ll reclaim my free time to screw around with something else.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Templating Denote-style naming in Obsidian</title>
      <link>https://mike.puddingtime.org/posts/2023-06-16-templating-denote-style-naming-in-obsidian/</link>
      <pubDate>Fri, 16 Jun 2023 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-06-16-templating-denote-style-naming-in-obsidian/</guid>
      <description>Still on the how-to-make-Denote-more-mobile kick from another direction.</description>
      <content:encoded><![CDATA[<p>I really do like the Denote file naming convention as a sort of future-proofed forever format, and I&rsquo;ve been fussing at this idea that Obsidian could make a good mobile Denote file browser. There are some things around how internal links work I haven&rsquo;t dug into yet, but it&rsquo;s something to play with.</p>
<p>This morning over tea I applied myself to learning how <a href="https://github.com/SilentVoid13/Templater">Templater</a> works. It&rsquo;s an Obsidian plugin that lets you run JavaScript on notes, with access to stuff like the data in the YAML frontmatter and the ability to build your own functions and make them globally reusable. With Templater, you can do the automation needed to produce Denote-style filenames with a very Denote-style &ldquo;name the directory, name the file, name the tags, start editing&rdquo; workflow. It sounds sort of Rube-Goldbergy, but if JavaScript is to Obsidian as elisp is to Emacs, it&rsquo;s just &ldquo;extensible tools require code.&rdquo;</p>
<p>So this is a Templater template to make a new note with YAML frontmatter and user-input tags. You can see that it&rsquo;s just template + a few strftime variations + a prompt:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="o">---</span>
</span></span><span class="line"><span class="cl"><span class="nx">title</span><span class="o">:</span> <span class="o">&lt;%</span> <span class="nx">tp</span><span class="p">.</span><span class="nx">file</span><span class="p">.</span><span class="nx">title</span> <span class="o">%&gt;</span> <span class="c1">// title comes from user input using the QuickAdd plugin
</span></span></span><span class="line"><span class="cl"><span class="nx">date</span><span class="o">:</span> <span class="o">&lt;%</span> <span class="nx">tp</span><span class="p">.</span><span class="nx">file</span><span class="p">.</span><span class="nx">creation_date</span><span class="p">(</span><span class="s2">&#34;YYYY-MM-DDTHH:mm:ssZ&#34;</span><span class="p">)</span> <span class="o">%&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nx">tags</span><span class="o">:</span> <span class="o">&lt;%*</span> <span class="kd">let</span> <span class="nx">tags</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">tp</span><span class="p">.</span><span class="nx">system</span><span class="p">.</span><span class="nx">prompt</span><span class="p">(</span><span class="s2">&#34;Enter tags, space delimited&#34;</span><span class="p">,</span> <span class="s2">&#34;&#34;</span><span class="p">)</span><span class="o">%&gt;&lt;%</span> <span class="nx">tags</span> <span class="o">%&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nx">identifier</span><span class="o">:</span> <span class="s2">&#34;&lt;% tp.file.creation_date(&#34;</span><span class="nx">YYYYMMDDTHHmmss</span><span class="s2">&#34;) %&gt;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">---</span></span></span></code></pre></div>
<p>(There&rsquo;s a small bootstrapping problem of how a new note can have a title to drop into the frontmatter &mdash; that&rsquo;s solved with a plugin that prompts for the title before creating the note.)</p>
<p>So &hellip; invoke that template and you get a note that has the characteristics of a Denote note with <code>markdown-yaml</code> content. Its actual filename, however, will be following Obsidian conventions: <code>Whatever the name is.md</code> on the filesystem.</p>
<p>That&rsquo;s not okay, because Denote&rsquo;s also a file-naming convention, and one I prefer because it includes tags in the filename along with date and title. If you just keep your filenames proper, <em>most</em> of what you care about for long-term portability is just sitting right there in the filename, easily extractable for export/migration/etc.</p>
<p>Templater is able to run scripts that suck in the data in the frontmatter, and it&rsquo;s able to manipulate filenames and locations. So, this is a user function that takes title, ident, and tags params and spits out a Denote-compatible filename:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">slugify</span><span class="p">(</span><span class="nx">title</span><span class="p">,</span><span class="nx">ident</span><span class="p">,</span><span class="nx">tags</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">title</span> <span class="o">=</span> <span class="nx">title</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/^\s+|\s+$/g</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">);</span> <span class="c1">// trim leading/trailing white space
</span></span></span><span class="line"><span class="cl">  <span class="nx">title</span> <span class="o">=</span> <span class="nx">title</span><span class="p">.</span><span class="nx">toLowerCase</span><span class="p">();</span> <span class="c1">// convert string to lowercase
</span></span></span><span class="line"><span class="cl">  <span class="nx">title</span> <span class="o">=</span> <span class="nx">title</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/[^a-z0-9 -]/g</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="c1">// remove any non-alphanumeric characters
</span></span></span><span class="line"><span class="cl">           <span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/\s+/g</span><span class="p">,</span> <span class="s1">&#39;-&#39;</span><span class="p">)</span> <span class="c1">// replace spaces with hyphens
</span></span></span><span class="line"><span class="cl">           <span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/-+/g</span><span class="p">,</span> <span class="s1">&#39;-&#39;</span><span class="p">);</span> <span class="c1">// remove consecutive hyphens
</span></span></span><span class="line"><span class="cl">  <span class="nx">tags</span> <span class="o">=</span> <span class="nx">tags</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/ /g</span><span class="p">,</span><span class="s2">&#34;_&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">ident</span> <span class="o">+</span> <span class="s2">&#34;--&#34;</span> <span class="o">+</span> <span class="nx">title</span> <span class="o">+</span> <span class="s2">&#34;__&#34;</span> <span class="o">+</span> <span class="nx">tags</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">slugify</span></span></span></code></pre></div>
<p>Once you know what the filename should be, you have to actually change it on the filesystem. This is a second Templater &ldquo;template&rdquo; of JavaScript you can run on a note once it has been created:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="o">&lt;%*</span>
</span></span><span class="line"><span class="cl">	<span class="nx">identifier</span> <span class="o">=</span>  <span class="nx">tp</span><span class="p">.</span><span class="nx">frontmatter</span><span class="p">[</span><span class="s2">&#34;identifier&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">	<span class="nx">title</span> <span class="o">=</span> <span class="nx">tp</span><span class="p">.</span><span class="nx">frontmatter</span><span class="p">[</span><span class="s2">&#34;title&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">	<span class="nx">tags</span> <span class="o">=</span> <span class="nx">tp</span><span class="p">.</span><span class="nx">frontmatter</span><span class="p">[</span><span class="s2">&#34;tags&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">	<span class="nx">slugged</span> <span class="o">=</span>  <span class="nx">tp</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">slugify</span><span class="p">(</span><span class="nx">title</span><span class="p">,</span> <span class="nx">identifier</span><span class="p">,</span> <span class="nx">tags</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nx">tp</span><span class="p">.</span><span class="nx">file</span><span class="p">.</span><span class="nx">rename</span><span class="p">(</span><span class="nx">slugged</span><span class="p">);</span> <span class="o">-%&gt;</span></span></span></code></pre></div>
<p>(Looking at the <code>slugify</code> function and that Templater code, I think you can just pass the <code>tp</code> object into the function to move some busy-ness into the function and away from your file template. I dunno. I&rsquo;m just trying to get ping right now.)</p>
<p>So at that point, you have a Markdown note sitting in your Obsidian vault with a filename that conforms to Denote&rsquo;s naming convention. If you visit your vault directory in Emacs using dired, the files are all fontified for Denote-browsing goodness.</p>
<p>And that&rsquo;s where I ran out of tea and needed to go do some paying work.</p>
<p>I don&rsquo;t yet know how to get that last function to run at the point of note creation. There&rsquo;s surely some way to get Templater code to hold off on firing the next step in a script until you can get all the data in place, but I don&rsquo;t know what it is. So I have the renaming template bound to a hotkey and just tap <code>Ctrl-Cmd-r</code> to trigger the rename once the note is ready. It&rsquo;s good to have it exposed as its own command, because part of the Denote workflow involves keeping good file naming hygiene when you change note metadata, I&rsquo;d just like to automate that part at time of creation, too.</p>
<p>The last ingredient I&rsquo;m using for all this is the Obsidian <a href="https://github.com/snezhig/obsidian-front-matter-title">front-matter title</a> plugin. It just consults the YAML frontmatter for the <code>title:</code> property and uses that to display note names instead of the filesystem name. That makes directories of files a little more legible, makes tab names less noisy, etc. It does for you in Obsidian some of what <a href="https://github.com/namilus/denote-menu">Denote Menu</a> and similar do in Emacs, pulling Denote&rsquo;s useful but visually cluttered naming convention more firmly in the &ldquo;human-readable&rdquo; direction. It&rsquo;s optional to this exercise, but preferred, especially when on mobile, where there&rsquo;s less real estate to burn on long filenames.</p>
<p>If you visit the file in Denote, you can mess with the frontmatter and use Denote&rsquo;s <code>denote-rename-file-using-front-matter</code> command to update the file name. If you mess around with it in Obsidian, you can run that Templater template to do the same.</p>
<p>If you run <a href="https://github.com/licht1stein/obsidian.el">obsidian.el</a> on top of all of this, it becomes possible to navigate your notes in Emacs, insert links from Emacs, etc. etc. You can&rsquo;t just tap a link from the keyboard &mdash; you have to use obsidian.el&rsquo;s navigation commands &mdash; but that&rsquo;s not terrible.</p>
<p>So to solve the mobile thing, you&rsquo;ve got this approach &mdash; customizing Obsidian with a few plugins and some light code to make your vault look like a Denote corpus &mdash; and you&rsquo;ve got <a href="/posts/2023-06-11-daily-notes/">the thing I did to provide a searchable web interface</a>.</p>
<p>The Obsidian route gives you a more complete mobile experience. You can make notes on the go, you have more flexibility for searching your notes, etc.</p>
<p>The web approach is more compact: Do some Emacs configuration, use some commodity infra with Tailscale and a Synology, then just use Denote in its native form, which is org- and desktop-centric.</p>
<p>Given my usage patterns, either seems fine?</p>
<p>Switching to Markdown for Denote satisfies a part of my brain that doesn&rsquo;t like trying to script org-mode migrations and that also understands &ldquo;org-mode vs. Markdown&rdquo; is another one of those &ldquo;Beta vs. VHS&rdquo; situations I need to just accept. Commensurately, it irritates the part of my brain that completely got it when my tech writing team told me they wanted to migrate from Markdown to <a href="https://en.wikipedia.org/wiki/Darwin_Information_Typing_Architecture">DITA</a>, maybe a little before we were really there on the maturity curve.</p>
<p>Anyhow, it&rsquo;s a hobby.</p>
<h2 id="espanso">espanso</h2>
<p>I don&rsquo;t know what on Earth happened to TextExpander but wow it isn&rsquo;t good.</p>
<p>Looking around for a text expansion tool of some kind I came across <a href="https://espanso.org">espanso</a>. It&rsquo;s a snippet tool. It behaves about like yasnippet or TextMate snippets: Start typing a trigger phrase and it expands it for you.</p>
<p>Most of these things are wrapped in a GUI. espanso is configurable with a YAML file. It also has some cool stuff for handling regexps that allow you to use variables to your snippets. For instance:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">- <span class="nt">regex</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;:tml\\((?P&lt;tag&gt;.*)\\)&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">replace</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;[Items tagged `{{tag}}` in Things](things:///search?query=%23{{tag}})&#34;</span></span></span></code></pre></div>
<p>If you type <code>:tml(foo)</code> it&rsquo;ll expand to a Markdown link using <code>foo</code>.</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">[<span class="nt">Items tagged `foo` in Things</span>](<span class="na">things:///search?query=%23foo</span>)</span></span></code></pre></div>
<p>(I&rsquo;m not sure, btw, how to do that in yasnippet and need to figure that out.)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily Notes for 2023-06-15</title>
      <link>https://mike.puddingtime.org/posts/2023-06-15-daily-notes/</link>
      <pubDate>Thu, 15 Jun 2023 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-06-15-daily-notes/</guid>
      <description>Excruciating Multiplicity of Approaches to Cat-Skinning. I slay me. Denote-org-to-Denote-Markdown. Golden Ratio window management.</description>
      <content:encoded><![CDATA[<h2 id="golden-ratio">Golden ratio</h2>
<p>This is kind of cool. The <a href="https://github.com/roman/golden-ratio.el">golden-ratio</a> package dynamically resizes Emacs windows within frames as they become the active window. It works <em>okay</em> on a desktop machine, and I really like it on my laptop. Opening up a window for LSP output, for instance, kept the code buffer at a better size while still being able to track the LSP to the side.</p>
<p>It doesn&rsquo;t work out of the box with Doom Emacs &mdash; it needs an incantation:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="line"><span class="cl"><span class="p">(</span><span class="nv">use-package!</span> <span class="nv">golden-ratio</span>
</span></span><span class="line"><span class="cl">  <span class="nb">:after-call</span> <span class="nv">pre-command-hook</span>
</span></span><span class="line"><span class="cl">  <span class="nb">:config</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nv">golden-ratio-mode</span> <span class="mi">+1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="c1">;; Using this hook for resizing windows is less precise than</span>
</span></span><span class="line"><span class="cl">  <span class="c1">;; `doom-switch-window-hook&#39;.</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nv">remove-hook</span> <span class="ss">&#39;window-configuration-change-hook</span> <span class="nf">#&#39;</span><span class="nv">golden-ratio</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">&#39;doom-switch-window-hook</span> <span class="nf">#&#39;</span><span class="nv">golden-ratio</span><span class="p">))</span></span></span></code></pre></div>
<p>Demo/tutorial video:</p>
<div style="text-align:center;">
  <iframe width="560" height="315" src="https://www.youtube.com/embed/k5Nwwo4QTmI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen>
  </iframe>
</div>
<p>I understand that Golden Ratio is no longer maintained. Some people say <a href="https://github.com/cyrus-and/zoom">Zoom</a> is as good, so maybe I&rsquo;ll try it if I hit any of those bugs people talk about.</p>
<h2 id="when-you-feel-the-heat-coming-around-the-corner-dot-dot-dot">&ldquo;When you feel the heat coming around the corner &hellip;&rdquo;</h2>
<p>I think I lost an hour to figuring out how to take a batch of existing Denote notes in org format and move them into Markdown, so I got very, very patient
with ChatGPT and together we came up with this:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">re</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">argparse</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pypandoc</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">shutil</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">org_dir</span> <span class="o">=</span> <span class="s1">&#39;/Users/mph/org/notes&#39;</span>  <span class="c1"># Replace with your directory path</span>
</span></span><span class="line"><span class="cl"><span class="n">md_dir</span> <span class="o">=</span> <span class="s1">&#39;/Users/mph/org/notes-md&#39;</span>  <span class="c1"># Replace with the desired directory path for markdown files</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">convert_org_to_md</span><span class="p">(</span><span class="n">org_file</span><span class="p">,</span> <span class="n">org_path</span><span class="p">,</span> <span class="n">md_dir</span><span class="p">,</span> <span class="n">with_hashtags</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Recreate the directory structure in the markdown directory</span>
</span></span><span class="line"><span class="cl">    <span class="n">org_relative_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="n">org_path</span><span class="p">,</span> <span class="n">org_dir</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">md_relative_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">org_relative_path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">md_output_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">md_dir</span><span class="p">,</span> <span class="n">md_relative_dir</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">md_output_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">md_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">org_file</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s1">&#39;.md&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="n">md_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">md_output_dir</span><span class="p">,</span> <span class="n">md_file</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Copy org file to markdown directory</span>
</span></span><span class="line"><span class="cl">    <span class="n">shutil</span><span class="o">.</span><span class="n">copy2</span><span class="p">(</span><span class="n">org_path</span><span class="p">,</span> <span class="n">md_path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">md_path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">org_content</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Extract frontmatter variables from org file</span>
</span></span><span class="line"><span class="cl">    <span class="n">title_match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;#\+title:\s+(.+)&#39;</span><span class="p">,</span> <span class="n">org_content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">identifier_match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;#\+identifier:\s+(.+)&#39;</span><span class="p">,</span> <span class="n">org_content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">tags_match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;#\+filetags:\s+(.+)&#39;</span><span class="p">,</span> <span class="n">org_content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">frontmatter</span> <span class="o">=</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">title_match</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">frontmatter</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">title_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">identifier_match</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">frontmatter</span><span class="p">[</span><span class="s1">&#39;identifier&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">identifier_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">tags_match</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">tags_string</span> <span class="o">=</span> <span class="n">tags_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">tags_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">tag</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">tags_string</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span> <span class="k">if</span> <span class="n">tag</span><span class="o">.</span><span class="n">strip</span><span class="p">()]</span>
</span></span><span class="line"><span class="cl">        <span class="n">frontmatter</span><span class="p">[</span><span class="s1">&#39;tags&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">tags_list</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Update date stamp format</span>
</span></span><span class="line"><span class="cl">    <span class="n">org_content</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;\[(\d</span><span class="si">{4}</span><span class="s1">-\d</span><span class="si">{2}</span><span class="s1">-\d</span><span class="si">{2}</span><span class="s1">) (\w</span><span class="si">{3}</span><span class="s1"> \d</span><span class="si">{2}</span><span class="s1">:\d</span><span class="si">{2}</span><span class="s1">)\]&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;\1T\2:00-07:00&#39;</span><span class="p">,</span> <span class="n">org_content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Convert org to markdown using Pandoc</span>
</span></span><span class="line"><span class="cl">    <span class="n">md_content</span> <span class="o">=</span> <span class="n">pypandoc</span><span class="o">.</span><span class="n">convert_text</span><span class="p">(</span><span class="n">org_content</span><span class="p">,</span> <span class="s1">&#39;gfm&#39;</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="s1">&#39;org&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Generate new frontmatter content</span>
</span></span><span class="line"><span class="cl">    <span class="n">updated_frontmatter</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s1">&#39;title&#39;</span><span class="p">:</span> <span class="n">frontmatter</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;title&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="s1">&#39;date&#39;</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">&#39;%Y-%m-</span><span class="si">%d</span><span class="s1">T%H:%M:%S-07:00&#39;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="s1">&#39;identifier&#39;</span><span class="p">:</span> <span class="n">frontmatter</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;identifier&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="s1">&#39;tags&#39;</span><span class="p">:</span> <span class="n">frontmatter</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;tags&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Generate the new frontmatter string</span>
</span></span><span class="line"><span class="cl">    <span class="n">frontmatter_string</span> <span class="o">=</span> <span class="s1">&#39;---</span><span class="se">\n</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">updated_frontmatter</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">        <span class="n">frontmatter_string</span> <span class="o">+=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s1">: </span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="se">\n</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="n">frontmatter_string</span> <span class="o">+=</span> <span class="s1">&#39;---</span><span class="se">\n</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Add updated frontmatter to the markdown content</span>
</span></span><span class="line"><span class="cl">    <span class="n">md_content</span> <span class="o">=</span> <span class="n">frontmatter_string</span> <span class="o">+</span> <span class="n">md_content</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Insert tags as hashtags on the last line if enabled</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">with_hashtags</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">tags_line</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="sa">f</span><span class="s1">&#39;#</span><span class="si">{</span><span class="n">tag</span><span class="si">}</span><span class="s1">&#39;</span> <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">frontmatter</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;tags&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">()])</span>
</span></span><span class="line"><span class="cl">        <span class="n">md_content</span> <span class="o">+=</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="n">tags_line</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Save the markdown file</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">md_path</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">md_content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">convert_directory</span><span class="p">(</span><span class="n">org_dir</span><span class="p">,</span> <span class="n">md_dir</span><span class="p">,</span> <span class="n">with_hashtags</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">org_files</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">root</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">files</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="n">org_dir</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">file</span> <span class="ow">in</span> <span class="n">files</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">file</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;.org&#39;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">                <span class="n">org_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">file</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">org_path</span> <span class="ow">in</span> <span class="n">org_files</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">org_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">org_path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">convert_org_to_md</span><span class="p">(</span><span class="n">org_file</span><span class="p">,</span> <span class="n">org_path</span><span class="p">,</span> <span class="n">md_dir</span><span class="p">,</span> <span class="n">with_hashtags</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Parse command-line arguments</span>
</span></span><span class="line"><span class="cl"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s1">&#39;Convert org files to markdown.&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--with-hashtags&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">&#39;store_true&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Insert tags as hashtags on the last line&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Convert org files to markdown</span>
</span></span><span class="line"><span class="cl"><span class="n">convert_directory</span><span class="p">(</span><span class="n">org_dir</span><span class="p">,</span> <span class="n">md_dir</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">with_hashtags</span><span class="p">)</span></span></span></code></pre></div>
<p>I thiiiink that&rsquo;s according to the Denote spec for Markdown, and I <em>think</em> that makes it good enough for Hugo, too, excepting links in the
<code>[[denote:12345678]]</code> format.</p>
<p>So, what is it good for? Mostly just getting from an org-mode-based Denote corpus to a Markdown-based one. At least, it seems to &ldquo;just work&rdquo; to do that.</p>
<p>If you&rsquo;re not heavily cross-linked and don&rsquo;t mind cleaning up <code>denote:</code>-style links I suppose you could drop the whole thing into Obsidian. In fact, I did. Works well minus, again, <code>denote:</code> links. I was also personally curious about whether the whole mess would work well with <a href="https://github.com/artempyanykh/marksman">Marksman</a> &mdash; an LSP server for Markdown that has some interesting &ldquo;make a wiki out of simple Markdown&rdquo; features &mdash; but I&rsquo;m missing something about Marksman. It doesn&rsquo;t work well with the stock LSP under Doom, and while it doesn&rsquo;t crash using Eglot, I&rsquo;m still not sure of its utility.</p>
<p>I also tossed in a command line switch that adds the tags as hashtags at the bottom of the file, which is where I tend to put them, and also what I thought I needed to do until I realized that Obsidian actually understands the <code>tags: [&quot;foo&quot;,&quot;bar&quot;,&quot;baz&quot;]</code> notation in YAML frontmatter if you do a <code>tag:#foo</code> search in its search tool. So &mdash; if you&rsquo;re a frontmatter person, just run it plain. If you&rsquo;re not then <code>--with-hashtags</code> is your friend.</p>
<h2 id="obsidian-dot-el">Obsidian.el</h2>
<p>Another option, I guess, is <a href="https://github.com/licht1stein/obsidian.el">obsidian.el</a>, which is meant to provide a way to get around an Obsidian vault within Emacs. You point it at your vault directory, designate an inbox folder, and it provides ways to search by tag, etc.</p>
<p>I dunno. At this point it&rsquo;s all just messing around and seeing how all this stuff hangs together (or doesn&rsquo;t.) Fun.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily Notes for 2023-06-11</title>
      <link>https://mike.puddingtime.org/posts/2023-06-11-daily-notes/</link>
      <pubDate>Sun, 11 Jun 2023 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-06-11-daily-notes/</guid>
      <description>First week at my new job. How I made a searchable web interface for my Denote notes with FuseJS, a Synology, and TailScale.</description>
      <content:encoded><![CDATA[<h2 id="first-week-at-iterable">First week at Iterable</h2>
<p>Well, after a lot of hinting and oblique mentions, it&rsquo;s okay to finally say I started a new job this week, as director of IT at Iterable, thus ending about seven months of rest and a relatively easy job search.</p>
<p>Here&rsquo;s the LinkedIn version:</p>
<blockquote>
<p>I remember being 1200 feet over a Ft. Benning drop zone: My parachute risers had twisted up, my helmet had fallen off, and I was airsick. I thought to myself, &ldquo;well, you brought this on yourself.&rdquo;</p>
<p>Years and years later, I read Pema Chödrön, who said, &ldquo;to be fully alive, fully human, and completely awake is to be continually thrown out of the nest.&rdquo;</p>
<p>I finished my first day at Iterable today. I&rsquo;m very happy to be starting this new role with a warm, welcoming team that includes a few familiar faces.</p>
<p>Reflecting on my time off after Puppet:</p>
<p>It is easier said than done to go still, rest, and find some quiet. I think I lost two months to assorted writing and photography projects and other busy-making stuff until someone close to me finally said, &ldquo;I thought you were supposed to be resting. This doesn&rsquo;t seem like resting.&rdquo;</p>
<p>I did finally manage to go still and rest. When I decided to start looking for work again, I knew I had to sift through 10 amazing years at Puppet and figure out when I was happiest and helping the most people. Having the time to discern meant I was able to set a few things aside I would have sworn I most wanted to do as I realized I was probably just trying to replace something I&rsquo;d lost. I felt more focused with each recruiter screen or interview, and my list of job alerts got shorter as I shifted from &ldquo;what can I do&rdquo; to &ldquo;what do I want to do.&rdquo;</p>
<p>It&rsquo;s easy to euphemize: During my time out I got a lot of really unfortunate advice about covering up gaps, and trying to talk around things, so I&rsquo;ll just say that yes, it sucked to get laid off — to get thrown out of the nest.</p>
<p>It wasn&rsquo;t a world-ending shock, I was treated with respect and generosity, and it was a genuine gift to know that I could spend a few months helping my team transition once I knew I wasn&rsquo;t going to continue. But it was still tough. So I&rsquo;m also grateful to friends I got to spend time with over the past several months. There were a few times I felt at sea and unsure of myself, and all the coffees, lunches, and texts helped so much. I had a lot more friends on this jump than I did over that drop zone, and I&rsquo;m very grateful for all of them.</p>
</blockquote>
<p>There is a ton more to say about the past seven months, and it feels like the right thing to do is to think more deeply about big themes. But there are some little things to say:</p>
<p>First, I caught a lot of great breaks going into my time off, and saw my layoff coming far enough out that I could prepare. I spent a lot of my early career under the shadow of layoffs, with a completely different mindset. I think the person who smiled and told his layer-offer that he hoped they had an okay time with all their other layoffs last August would be completely alien to the person who wouldn&rsquo;t take a weekend off for nine straight months in 2001.</p>
<p>There are lots of ways you can &ldquo;figure out what&rsquo;s next&rdquo; that don&rsquo;t have to involve getting laid off or quitting your job, but &ldquo;figuring out what&rsquo;s next&rdquo; takes work. It&rsquo;s probably <em>easiest</em> if you know and start acting on it while you have a job, but if you&rsquo;re in a place where you have a ton of things to sort out and you&rsquo;re just enervated from keeping the lights on wherever you are, it&rsquo;s still kind of hard. I&rsquo;m glad I had the resources, and hence the time, to take a break and be methodical. There was risk and some anxiety, but it got the best result.</p>
<p>Second, depending on how you want to manage the reckoning, this is my first new job in almost 11 years. I did so much growing during that time. There are some moments I wish I could go back to and get a do-over on, but that&rsquo;s part of the whole &ldquo;growth&rdquo; thing &hellip; not getting things quite right the first time you encounter them.</p>
<p>Third, I&rsquo;m glad I structured the job search the way I did. During the intense &ldquo;cold call&rdquo; period of February through April I had a loose routine of taking three days a week to just go through job listings and two days a week of applying for the listings I had saved the other three days of the week. Breaking it up like that gave me space to think about each listing.</p>
<p>I learned a practice years ago of pausing and asking if an opportunity or request elicits a &ldquo;whole body yes,&rdquo; &mdash; positive reactions from head, heart, and gut. I found that spending some time looking through job posts and quickly capturing the ones where my first response was &ldquo;sure, I could do that,&rdquo; then coming back to them a few days later to look a second time elicited a slightly different response. Sometimes it was &ldquo;wow, why am I delaying the application here?&rdquo; and other times it was &ldquo;I don&rsquo;t know why I thought that was a good idea.&rdquo; The third test was the actual application &mdash; filling out whatever forms and writing a cover letter, and that was when I could tell whether my heart was really in it. If I couldn&rsquo;t write a compelling cover letter &mdash; didn&rsquo;t feel sincere or engaged &mdash; it was a signal from head and heart.</p>
<p>I started out looking at several kinds of jobs &mdash; IT, engineering, operations &mdash; and then a few categories within each. I had some good early signal from the operational roles (chief of staff and similar), extremely positive signal on IT, and really uneven signal on engineering. I was also looking at organizational size/maturity.  Part of me went in thinking &ldquo;man, I wish I could do a &lsquo;Puppet in 2012, but everything I know now.&rsquo;&rdquo;</p>
<table>
  <thead>
      <tr>
          <th>Role</th>
          <th>Org maturity</th>
          <th>Feels</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Chief of staff</td>
          <td>low</td>
          <td>Exciting, frustrating.</td>
      </tr>
      <tr>
          <td>Chief of staff</td>
          <td>medium</td>
          <td>Sure, I could do that. I&rsquo;d have some growth opportunities, you&rsquo;d get some shit done better.</td>
      </tr>
      <tr>
          <td>Chief of staff</td>
          <td>high</td>
          <td>&ldquo;I would need to be this tall to ride and I&rsquo;m not there yet.&rdquo;</td>
      </tr>
      <tr>
          <td>Eng</td>
          <td>low</td>
          <td>Under certain, odd conditions; but your conception of &ldquo;my lane&rdquo; is too narrow.</td>
      </tr>
      <tr>
          <td>Eng</td>
          <td>medium/high</td>
          <td>North of &ldquo;zone of mediocrity&rdquo; or &ldquo;competence,&rdquo; nearing &ldquo;zone of excellence,&rdquo; but not &ldquo;zone of genius.&rdquo;</td>
      </tr>
      <tr>
          <td>IT</td>
          <td>low</td>
          <td>&ldquo;Well, you certainly have interesting notions; someone will enjoy disabusing you of them&rdquo;</td>
      </tr>
      <tr>
          <td>IT</td>
          <td>medium</td>
          <td>&ldquo;Yup. Put me in there. I have some lessons to apply.&rdquo;</td>
      </tr>
      <tr>
          <td>IT</td>
          <td>high</td>
          <td>&ldquo;Will you issue me a clipboard and legal pad or do I have to count all these beans on my fingers?&rdquo;</td>
      </tr>
  </tbody>
</table>
<p>Going in my enthusiasm and interest was highest around chief of staff roles. Over my time at Puppet I&rsquo;d been in and out of &ldquo;operational leader&rdquo; roles, and had to very disappointing experiences in that area. I wanted another bite at the apple. I got several interviews for that sort of thing, made it pretty far into a few processes, and came away with a few observations:</p>
<ul>
<li>The places where I would do the most good, that seemed the most exciting, and that were the most greenfield, were the worst conversations, and they happened early enough that my energy and patience for yet another baby CTO with a reflexive hatred for process were too low to even attempt to make a sale. <em>Or</em> they didn&rsquo;t actually want a chief of staff &mdash; they wanted an EA/office manager.</li>
<li>The places where I could be helpful and effective &mdash; the medium maturity organizations with enough introspection to know they needed help &mdash; were harder to find, and the few conversations I had there always left me uneasy. Like I was swapping the process resistance and insecurity of baby C-levels for the conditioned wariness of leadership teams that understand a chief of staff is a potential threat to the balance of power and their individual access and influence.</li>
<li>There was a third tier &ndash; medium or high maturity orgs who wanted someone very senior with much more hard-core business operations experience. Just isn&rsquo;t me, and I didn&rsquo;t bother.</li>
</ul>
<p>But I also had to come to grips with why I was looking at those roles to begin with, and it began to dawn on me that the things that made me a likely candidate to do that kind of thing at Puppet over the years involved a different mix of factors from what these places needed. I kept imagining doing these roles from the perspective of the person who&rsquo;d been at Puppet for ten years, had a solid network, had a basis for trust with people throughout the business, and an inventory of patterns we could pick up and dust off that had the ring of familiarity for the old-timers, but could be pivoted or spruced up a little for the skeptical newcomers.</p>
<p>I kept saving those roles when I got job alerts for them, though, kept applying, and kept tracking why I dropped out or decided not to finish the cover letters for everything, and finally formed a thought over my morning tea and listing review one morning:</p>
<p>&ldquo;You loved that place, loved being there, and loved even the people who drove you a little crazy. You wanted to make it better and knew how to get things unstuck. You understood what it needed on some emotional level. It&rsquo;s gone.&rdquo;</p>
<p>I quietly re-branded my LinkedIn page, turned off those job alerts, and narrowed my list to IT and engineering.</p>
<p>Engineering things weren&rsquo;t sparking much joy at any point in the process. One opportunity came along that seemed interesting, but in a very &ldquo;you&rsquo;ve got a very painful-sounding definition &lsquo;interesting&rsquo;&rdquo; sort of way. When you send your wife this gif to explain why you think you&rsquo;d be a good fit for a job:</p>
<figure><img src="/img/sith-speciality.gif"
    alt="Senator Palpatine, Sith Lords are our speciality ...">
</figure>

<p>&hellip; you should ask a second time if that&rsquo;s how you want to spend your days.</p>
<p>It kept coming back to <a href="https://themanagershandbook.com/coaching-and-feedback/zone-of-genius">which zone I&rsquo;m in</a> when I&rsquo;m leading in engineering, and I never really felt like I was in my &ldquo;Zone of Genius.&rdquo; I&rsquo;ve been around those people and know enough to understand the difference between us.</p>
<p>Ultimately the things that kept feeling the most right to me were the IT roles. I had a few processes go pretty far, so I had the chance to do a lot of personal writing and preparation, and I realized that the challenge I was having was less about thinking up a response, but organizing all the thoughts I had on any given part of the conversation. Over the course 30+ years in professional workplaces I held a lot of jobs in a lot of different kinds of businesses. I was never quite sure what skills would transfer in each role I held, but I knew that during my time in IT it felt I could tap the most of my experiences, and that my particular temperament worked the best.</p>
<p>By the time the Iterable opportunity presented itself, I felt primed and very clear.</p>
<p>I guess the last thing I want to say right now is that it was a pretty great couple of weeks of interviewing. I had no problem writing the customary followup note. The opportunity is at that intersection of &ldquo;oh, there&rsquo;s a lot to do&rdquo; and &ldquo;I know what I need to do.&rdquo; I want to be there.</p>
<h2 id="our-world-of-note-taking-compromises">Our world of note-taking compromises</h2>
<p>So part of Week One was having my new boss up from California for a kickoff and planning. We got a WeWork space. I didn&rsquo;t do anything to get a toolchain onto my new work laptop so I didn&rsquo;t have Emacs or any of my personal config stuff on it. It was a good opportunity to think about the compromises that have loomed the largest when it comes to living in the Emacs ecosystem but having the occasional mobile use case:</p>
<ul>
<li>Decent clients to read org-mode files.</li>
<li>Reliable sync.</li>
<li>Capture on the go.</li>
</ul>
<p>After a few days in a WeWork, seeing what would have been useful and how I was working by just putting stuff in native tools then moving them over, I realized I&rsquo;d be happiest working with these assumptions:</p>
<ul>
<li>Stick with Emacs/org-mode/Denote. They feel the best for just doing work on a laptop or desktop, and that&rsquo;s where I do most of my work.</li>
<li>Give up on any of the mobile options for managing org-mode. They&rsquo;re dancing bears. It&rsquo;s great that they can dance, and it feels uncharitable to complain that they don&rsquo;t dance well, but they&rsquo;re hindered by a lack of native sync. The best they can do is capture simple things and relate simple things. Put more weight on them and they&rsquo;ll frustrate me.</li>
<li>Make static notes available in a way that&rsquo;s easily readable by native tools and put extra effort into making sure that when the static notes are pushed out, they&rsquo;re truly pushed out.</li>
</ul>
<p>On that last point, the biggest pain point I&rsquo;ve come across using Denote/Emacs has been getting at stuff for reference when I&rsquo;m not near a real computer. One way tools like Obsidian and Things run rings around Emacs is in their native, bespoke, purpose-built sync capabilities. Capture is no big deal.</p>
<p>Yesterday I spent some time sussing out how org-publish works and:</p>
<ul>
<li>Got my notes set up to publish using <a href="https://simplecss.org">SimpleCSS</a>.</li>
<li>Connected the output directory to my Synology via SyncThing.</li>
<li>Set up the Synology&rsquo;s web server (it&rsquo;s just nginx).</li>
<li>I can connect to the saved notes via Tailscale, which is running on all my devices (and using NextDNS, which is sweet, since I was able to take out a whole layer of browser-based ad-blockers).</li>
<li>Set up an after-save-hook to kick off a publish whenever I save a file in the notes directory.</li>
<li>Set up a pre-save hook to update any Denote org-babel d-blocks, because I make meta note pages with those.</li>
</ul>
<p>I put SyncThing on an aggressive update schedule to make sure the HTML versions of notes will get pushed out after saves.</p>
<p>Today I started figuring out how to add search to my exported notes. <a href="https://fusejs.io">FuseJs</a> seems to be working fine for that. I  made a script that can walk the exported HTML notes and get them into a JSON index, and I added some HTML/JS to an <code>index.org</code> file in my notes directory. Here&rsquo;s a quick demo of a few searches on mobile:</p>
<p><video controls width="40%"><source src="/img/denote-fuse-search.mp4" type="video/mp4">
Your browser does not support the video tag.</video></p>
<p>For now the notes indexing script is just running from the Synology&rsquo;s Task Scheduler.</p>
<p>So, net:</p>
<ul>
<li>When I write or edit a note in Denote, save-hooks publish all my notes as HTML.</li>
<li>SyncThing makes sure the HTML is pushed over to my Synology.</li>
<li>The Synology periodically indexes the HTML for search.</li>
<li>nginx running on the Synology serves the notes.</li>
<li>Everything is happening over Tailscale.</li>
</ul>
<p>There&rsquo;s a very fair question, which is &ldquo;why on Earth do all this when Obsidian, Logseq, or a few other mobile-capable PKMs are sitting right there?&rdquo;</p>
<p>I guess the answer is, &ldquo;I don&rsquo;t like them as much.&rdquo;</p>
<p>I mean, they&rsquo;re fine and all &mdash; I would use Obsidian if there were no Emacs &mdash; but if I line up what they excel at with what Emacs/org-mode/Denote excel at, and ask myself &ldquo;how do I most often use these tools,&rdquo; the mobile access use case is relatively rare and mainly amounts to a question of access and very simple capture. I just want to know that if I save a piece of information on a laptop or desktop, it&rsquo;ll be there for review on a tablet or phone not long after.</p>
<p>For a few hours of work configuring some off-the-shelf tools and a little bit of fine-tuning of the underlying sync engine, all my notes are securely available to me with super-fast search, and I can author them in a decent environment to begin with, not some Electron-based Markdown editor</p>
<p>I&rsquo;m happy to share what I came up with but avoided my customary &ldquo;here&rsquo;s a few snippets.&rdquo; The stuff I have going right now feels alpha. It&rsquo;s working, but it&rsquo;s in that realm of &ldquo;I just got ping.&rdquo; The HTML output needs some polishing, I&rsquo;m not sure the search stuff is configured as well as it could, and it remains to be seen how it all works as I just get on with my day. I did as much as I could over a few sessions on the weekend so I could just get back to work tomorrow without any lingering &ldquo;just one more thing&rdquo; desire to fiddle.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
