<rss version="2.0">
  <channel>
    <title>Microblog on Hey Loura!</title>
    <link>https://heyloura.com/categories/microblog/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Wed, 27 Aug 2025 12:30:55 -0400</lastBuildDate>
    
    <item>
      <title>Micro.blog Discovery Ideas</title>
      <link>https://heyloura.com/2025/08/27/microblog-discovery-ideas.html</link>
      <pubDate>Wed, 27 Aug 2025 12:30:55 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/08/27/microblog-discovery-ideas.html</guid>
      <description>&lt;p&gt;I wrote this draft on 7/28/2025 when I wanted to expand a reply into a full post but then shelved it. Now, almost one month later there is another post complaining about the Micro.blog discover feed. Anyway, I thought it might be nice to gather all of my ideas on the subject in one place.&lt;/p&gt;
&lt;h1 id=&#34;my-ideas&#34;&gt;My Ideas&lt;/h1&gt;
&lt;p&gt;When I first started, I found the account &lt;a href=&#34;https://monday.micro.blog/&#34;&gt;Micro Monday&lt;/a&gt; very helpful to find people around Micro.blog. It was an account that posted occasional roll calls about common topics and people could reply with links to other accounts (or their own) if it fit the topic. There was also a weekly Monday post that people could use to recommend other users or link to an interesting post. I found quite a few of the people I initially followed through that account.&lt;/p&gt;
&lt;h2 id=&#34;automated-accounts&#34;&gt;Automated accounts&lt;/h2&gt;
&lt;h3 id=&#34;a-roll-call-account&#34;&gt;A roll call account:&lt;/h3&gt;
&lt;p&gt;What if we brought an account like Micro Monday back? We could crowd source a list of topics for roll calls and automate that account posting a roll call every two weeks. It could be listed on the sign up page as a good account to follow.&lt;/p&gt;
&lt;h3 id=&#34;a-weekly-or-daily-recommendation-account&#34;&gt;A weekly or daily recommendation account:&lt;/h3&gt;
&lt;p&gt;An automated account that creates a post prompting for this weeks or today&amp;rsquo;s interesting posts. People could reply and list their recommendations.&lt;/p&gt;
&lt;h3 id=&#34;potential-cons-of-this-approach&#34;&gt;Potential cons of this approach&lt;/h3&gt;
&lt;p&gt;Since both of those would be standard Micro.blog accounts the report/block/mute functionality should work as well as respecting any muted keywords (I&amp;rsquo;m assuming this works in quoted content, haven&amp;rsquo;t checked). While this would help ease the burden of discovery, it may increase the burden on Micro.blog with more &amp;ldquo;report user&amp;rdquo; requests. It could also lead to fractured conversations if people replied to the automated account instead of following the thread back to the original user. Also the weekly or daily recommendation account would be prone to self-promotion and spamming&amp;hellip; so idk.&lt;/p&gt;
&lt;h2 id=&#34;follow-actions-in-the-timeline&#34;&gt;Follow actions in the timeline&lt;/h2&gt;
&lt;p&gt;I did this on my own little client which showed the parent conversation first with the replies below it. I had a quick button next to the user I wasn&amp;rsquo;t following that let me follow them. I was able to quickly expand my follow list, which made my timeline nice and lively. When &amp;ldquo;seeing replies on the timeline&amp;rdquo; is enabled for an account, what if there was an indicator that a reply post was to someone you&amp;rsquo;re not following? And then maybe in the conversation view a follow button next to usernames you aren&amp;rsquo;t following (like on the &amp;ldquo;following # users you aren&amp;rsquo;t following&amp;rdquo; page)?&lt;/p&gt;
&lt;h2 id=&#34;sorting-the-following--users-you-arent-following&#34;&gt;Sorting the &amp;ldquo;following # users you aren&amp;rsquo;t following&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;I would add a last posted timestamp here and sort the list according to that, with the most recently active on top. It can be a burden to open each persons account page to see when they last posted.&lt;/p&gt;
&lt;h2 id=&#34;remove-non-microblog-accounts-from-the-tagmoji-feeds&#34;&gt;Remove non Micro.blog accounts from the tagmoji feeds.&lt;/h2&gt;
&lt;p&gt;I think if these feeds were cleaned up and made more prominent on the discover UI it would be a nice place to find accounts to follow.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Anyway, these are wish list items and Micro.blog is a very small team. So when I see posts on my timeline complaining about the discover feed I try to think of solutions that don&amp;rsquo;t require constant attention to curate. But it is a delicate balance to strike, between features that allow discovery and keeping the more toxic nature of social media at bay.&lt;/p&gt;
&lt;p&gt;In my personal opinion I like that Micro.blog has erred on the side manual curation for its discovery feed. Yes it is more cumbersome to find people to follow&amp;hellip; but I like that? It has made me follow a larger variety of people on Micro.blog than I think I would if not constrained by a limited discovery feature. I also don&amp;rsquo;t mind the infrequent updates. Once or twice a week is fine by me. I have no urge to visit Discover all that often (which is nice given all the push for services to have you attention 100% of the time)&lt;/p&gt;
&lt;p&gt;Just my 2 cents and I&amp;rsquo;m going to keep thinking on it. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Backlinks on a Micro.blog hosted website</title>
      <link>https://heyloura.com/2025/04/05/backlinks-on-a-microblog-hosted.html</link>
      <pubDate>Sat, 05 Apr 2025 14:54:26 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/04/05/backlinks-on-a-microblog-hosted.html</guid>
      <description>&lt;p&gt;One of my goals when transforming my website into a digital garden was to include backlinks on my posts. A backlink is a link to a post that refers to the current post that you are viewing. There are several blog posts out there that explain how enable this for Hugo blogs that I used for inspiration. Here are the steps I used to get this functionality on my blog.&lt;/p&gt;
&lt;p&gt;You will need to edit your theme for single blog posts which is located at &lt;code&gt;layouts/posts/single.html&lt;/code&gt; (or if using a theme that supports &lt;a href=&#34;https://www.mattlangford.com/&#34;&gt;Matt Langford’s&lt;/a&gt; &lt;a href=&#34;https://tiny.micro.blog/microhooks/&#34;&gt;microhooks&lt;/a&gt;, add/edit one for &lt;code&gt;microhook-after-post.html&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;The first thing that needs to happen is to grab the url of the page (in this case the relative permalink) and create a variable to store the matches you come across. That’s the &lt;code&gt;{{ $pages := slice }}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You then iterate through all the blog pages… &lt;code&gt;{{- range .Site.Pages -}}&lt;/code&gt; and store &lt;code&gt;{{ $pages = $pages | append . }}&lt;/code&gt; any that contain the text of the relative permalink &lt;code&gt;{{- if strings.Contains .Content $relpermalink -}}&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;language-hugo&#34;&gt;&lt;code class=&#34;language-hugo&#34; data-lang=&#34;hugo&#34;&gt;	{{ $relpermalink := .RelPermalink }}
	{{ $pages := slice }}
	{{- range .Site.Pages -}}
		{{- if strings.Contains .Content $relpermalink -}}
			{{ $pages = $pages | append . }}
		{{- end -}}
	{{- end -}}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Next you’ll want to iterate through those pages and display them. For simplicity of this post I’m just using a basic HTML list. If the backlinking post has a title, let’s display that, otherwise just take the summary or truncate it.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;language-hugo&#34;&gt;&lt;code class=&#34;language-hugo&#34; data-lang=&#34;hugo&#34;&gt;{{ with $pages }}
	  &lt;ul class=&#34;backlinks&#34;&gt;
			  {{ range $pages }}
				{{- if .Title -}}
				&lt;li&gt;
				  &lt;a class=&#34;p-url&#34; href=&#34;&amp;#123;&amp;#123; .Permalink%20}}&#34;&gt;{{ .Title }}&lt;/a&gt;
				&lt;/li&gt;
				{{- else -}}
				&lt;li&gt;
				  &lt;a class=&#34;p-url&#34; href=&#34;&amp;#123;&amp;#123; .Permalink%20}}&#34;&gt;{{ .Summary | truncate 150 }}&lt;/a&gt;
				&lt;/li&gt;
				{{- end -}}
			  {{ end }}
			&lt;/ul&gt;
	{{ end }}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Result on my website after some extra styling&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/61ff836cee.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;You can checkout the full code snippet here:&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Updated 4 Apr 2025 based on a &lt;a href=&#34;https://heyloura.com/2025/04/05/im-not-finished-but-i.html#conversation&#34;&gt;comment&lt;/a&gt; by &lt;a href=&#34;https://lmika.org/&#34;&gt;Leon Mika&lt;/a&gt; to stop backlinks to newsletter pages.&lt;/small&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;language-hugo&#34;&gt;&lt;code class=&#34;language-hugo&#34; data-lang=&#34;hugo&#34;&gt;	{{ $relpermalink := .RelPermalink }}
	{{ $pages := slice }}
	{{- range .Site.Pages -}}
		{{- if strings.Contains .Content $relpermalink -}}
		  {{- if not (strings.HasPrefix .RelPermalink &#34;/newsletters&#34;) -}}
			  {{ $pages = $pages | append . }}
			{{- end -}}
		{{- end -}}
	{{- end -}}
&lt;pre&gt;&lt;code&gt;{{ with $pages }}
  &amp;lt;ul class=&amp;quot;backlinks&amp;quot;&amp;gt;
		  {{ range $pages }}
			{{- if .Title -}}
			&amp;lt;li&amp;gt;
			  &amp;lt;a class=&amp;quot;p-url&amp;quot; href=&amp;quot;&amp;amp;#123;&amp;amp;#123; .Permalink%20}}&amp;quot;&amp;gt;{{ .Title }}&amp;lt;/a&amp;gt;
			&amp;lt;/li&amp;gt;
			{{- else -}}
			&amp;lt;li&amp;gt;
			  &amp;lt;a class=&amp;quot;p-url&amp;quot; href=&amp;quot;&amp;amp;#123;&amp;amp;#123; .Permalink%20}}&amp;quot;&amp;gt;{{ .Summary | truncate 150 }}&amp;lt;/a&amp;gt;
			&amp;lt;/li&amp;gt;
			{{- end -}}
		  {{ end }}
		&amp;lt;/ul&amp;gt;
{{ end }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://heyloura.com/2025/04/03/so-i-made-a-new.html</link>
      <pubDate>Thu, 03 Apr 2025 14:56:55 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/04/03/so-i-made-a-new.html</guid>
      <description>&lt;p&gt;So I made a new category for my blog and noticed this new error message coming up under the Micro.blog -&gt; Account Logs area&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Error: Error building site: failed to render pages: open _site/categories/micro.blog-tips-and-tricks/page/1/index.html: not a directory&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The name of the category was &lt;code&gt;Micro.blog-tips-and-tricks&lt;/code&gt; and after it was generated the path was &lt;code&gt;/categories/micro.blog-tips-and-tricks&lt;/code&gt;. This caused that strange error. Renaming the path to &lt;code&gt;/categories/micro-blog-tips-and-tricks&lt;/code&gt; fixed the issue.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Micro.blog Private Notes &#43; 7.css Fun</title>
      <link>https://heyloura.com/2025/02/11/microblog-private-notes-css-fun.html</link>
      <pubDate>Tue, 11 Feb 2025 19:48:00 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/02/11/microblog-private-notes-css-fun.html</guid>
      <description>&lt;p&gt;Back in October &lt;a href=&#34;https://heyloura.com/2024/10/23/got-a-little.html&#34;&gt;I posted a bit&lt;/a&gt; about using YAML front-matter with Micro.blog private notes to extend it’s functionally. I ended up &lt;a href=&#34;https://heyloura.com/2025/01/31/lillihub-update-besides-bug-fixes.html&#34;&gt;releasing that to Lillihub&lt;/a&gt; users earlier this year.&lt;/p&gt;
&lt;p&gt;I’ve moved over to &lt;a href=&#34;https://heyloura.com/2025/01/14/my-productivity-system.html&#34;&gt;using analog index cards&lt;/a&gt; for most of my daily note taking but I still have several collections of notes I’m growing. And I needed a place for them. Why not use Micro.blog? Is what I asked myself. Now that Manton has built out a versioning system that saves note changes for 60 days I feel more confident using the service with a larger volume of notes. But what I’ve built out so far in Lillihub (tagging and having titles) is not quite enough.&lt;/p&gt;
&lt;h2 id=&#34;a-fetch-quest---getting-my-notes&#34;&gt;A Fetch Quest - Getting my notes&lt;/h2&gt;
&lt;p&gt;Just like my last coding adventure, first I needed to authenticate. I’m not going to write that up again. But do not fear fellow adventurer. &lt;a href=&#34;https://heyloura.com/2024/08/14/coding-adventure-microblog.html#getting-started&#34;&gt;I have a map with the secrets of Micro.blog’s indieauth spelled out&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So now that I have the magical token, I need only ask the API nicely for what I need.&lt;/p&gt;
&lt;p&gt;Firstly, my notebooks&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; fetching &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;https://micro.blog/notes/notebooks&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;GET&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token string-property property&#34;&gt;&#34;Authorization&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Bearer &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; token &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; results &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; fetching&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then upon choosing a notebook and divining its id, I can get all my lovely notes…&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; fetching &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;https://micro.blog/notes/notebooks/&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;id&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;GET&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token string-property property&#34;&gt;&#34;Authorization&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Bearer &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; token &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; eNotes &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; fetching&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But wait! I cannot read my lovely notes! They are garbled and undecipherable to my eye.&lt;/p&gt;
&lt;h2 id=&#34;a-wizards-secret---decrypt-and-encrypt-my-notes-&#34;&gt;A Wizards Secret - Decrypt and encrypt my notes 🧙‍♀️&lt;/h2&gt;
&lt;p&gt;Luckily some &lt;a href=&#34;https://help.micro.blog/t/notes-api-and-encryption/2564&#34;&gt;documentation&lt;/a&gt; lights the way.&lt;/p&gt;
&lt;p&gt;The end. 🤣&lt;/p&gt;
&lt;p&gt;Okay, kidding! I’ll share (some of) my secrets.&lt;/p&gt;
&lt;p&gt;Behold!&lt;/p&gt;
&lt;h3 id=&#34;the-first-of-three-spells---creating-a-key-&#34;&gt;The first of three spells - creating a key 🔑&lt;/h3&gt;
&lt;p&gt;The first spell component needed is the private note key from Micro.blog. This I saved in &lt;code&gt;localStorage&lt;/code&gt; so I could access when needed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; imported_key &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; localStorage&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getItem&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;notes_key&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;?&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; crypto&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;subtle&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;importKey&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;
    &lt;span class=&#34;token string&#34;&gt;&#39;raw&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token function&#34;&gt;hexStringToArrayBuffer&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;localStorage&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getItem&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;notes_key&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;substr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;AES-GCM&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;256&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;encrypt&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;decrypt&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;p&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;hexStringToArrayBuffer&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;hexString&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; length &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; hexString&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; array_buffer &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;ArrayBuffer&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;length&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; uint8_array &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;Uint8Array&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;array_buffer&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;for&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;let&amp;lt;/span&amp;gt; i &amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token number&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt; i &amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;&amp;lt;&amp;lt;/span&amp;gt; length&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt; i&amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;++&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;const&amp;lt;/span&amp;gt; byte &amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token function&amp;quot;&amp;gt;parseInt&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;hexString&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token function&amp;quot;&amp;gt;substr&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;i &amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token number&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token number&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token number&amp;quot;&amp;gt;16&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;
    uint8_array&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;i&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; byte&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;

&amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; array_buffer&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;the-second-of-three-spells---decrypting-&#34;&gt;The second of three spells - decrypting 🧩&lt;/h3&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;decryptWithKey&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;encryptedText&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; imported_key&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; encrypted_data &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;Uint8Array&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;atob&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;encryptedText&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; char&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;charCodeAt&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; iv &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; encrypted_data&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;slice&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; ciphertext &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; encrypted_data&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;slice&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;const&amp;lt;/span&amp;gt; decrypted_buffer &amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;await&amp;lt;/span&amp;gt; crypto&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;subtle&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token function&amp;quot;&amp;gt;decrypt&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;
    &amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token literal-property property&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token string&amp;quot;&amp;gt;&#39;AES-GCM&#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt; iv &amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;
    imported_key&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;
    ciphertext
&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;

&amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;const&amp;lt;/span&amp;gt; decoder &amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;new&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token class-name&amp;quot;&amp;gt;TextDecoder&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;const&amp;lt;/span&amp;gt; decrypted_text &amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; decoder&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token function&amp;quot;&amp;gt;decode&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;decrypted_buffer&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; decrypted_text&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;the-third-of-three-spells---encrypting-&#34;&gt;The third of three spells - encrypting 🪄&lt;/h3&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encryptWithKey&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;text&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;  imported_key&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; iv &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; crypto&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getRandomValues&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;Uint8Array&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; encoder &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;TextEncoder&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; plaintext_buffer &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; encoder&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;encode&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;text&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;const&amp;lt;/span&amp;gt; ciphertext_buffer &amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;await&amp;lt;/span&amp;gt; crypto&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;subtle&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token function&amp;quot;&amp;gt;encrypt&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;
    &amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token literal-property property&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token string&amp;quot;&amp;gt;&#39;AES-GCM&#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt; iv &amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;
    imported_key&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt;
    plaintext_buffer
&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;

&amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;const&amp;lt;/span&amp;gt; encrypted_data &amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;new&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token class-name&amp;quot;&amp;gt;Uint8Array&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;...&amp;lt;/span&amp;gt;iv&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;...&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;new&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token class-name&amp;quot;&amp;gt;Uint8Array&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;ciphertext_buffer&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;]&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;const&amp;lt;/span&amp;gt; base64_encoded &amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;token function&amp;quot;&amp;gt;btoa&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;String&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token function&amp;quot;&amp;gt;fromCharCode&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token operator&amp;quot;&amp;gt;...&amp;lt;/span&amp;gt;encrypted_data&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;token keyword&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; base64_encoded&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With these spells in our arsenal we can decrypt any of our notes and then save them again by re-encrypting them.&lt;/p&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; markdown &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;decryptWithKey&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;note&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; imported_key&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; eNote &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encryptWithKey&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;markdown&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; imported_key&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With that out of the way, let’s see what we can can do 🫠&lt;/p&gt;
&lt;h2 id=&#34;i-can-never-make-up-my-mind-&#34;&gt;I Can Never Make Up My Mind 🫥&lt;/h2&gt;
&lt;p&gt;I’ll admit it. I change up how I save my data regularly. No structure is safe for more than a couple of months. Maybe I’m strange. I find it soooooo soooothing to rename and reorganize digital files.&lt;/p&gt;
&lt;p&gt;Not being able to move notes around in notebooks started to drive me insane.&lt;/p&gt;
&lt;p&gt;Nor did the documentation hand me a simple endpoint to get it done either. Oh well. I’m sure I’ll think of something.&lt;/p&gt;
&lt;p&gt;What about…. copy and delete? As in copy the note into a new notebook and then delete the original.&lt;/p&gt;
&lt;p&gt;So with a little HTML, CSS, and JS I have lovely modal I can use to select a notebook and thus send my note along to it’s new home… Oh yeah, I better put up a warning for other users.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/154c3a59ad.png&#34; alt=&#34;A digital note displays various categorized emoji-labeled lists and options to move a notebook.&#34;&gt;&lt;/p&gt;
&lt;p&gt;The code isn’t that complicated and there is no need to decrypt anything.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; fetching &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;https://micro.blog/notes/&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;id&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;GET&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token string-property property&#34;&gt;&#34;Authorization&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Bearer &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; accessTokenValue &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; eNote &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; fetching&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;p&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; formBody &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;URLSearchParams&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
formBody&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&amp;ldquo;notebook_id&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; notebook&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
formBody&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&amp;ldquo;text&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; eNote&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;content_text&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; posting &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&amp;lsquo;&lt;a href=&#34;https://micro.blog/notes&#39;&#34;&gt;https://micro.blog/notes&#39;&lt;/a&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;POST&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; formBody&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token string-property property&#34;&gt;&amp;ldquo;Content-Type&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;application/x-www-form-urlencoded; charset=utf-8&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token string-property property&#34;&gt;&amp;ldquo;Authorization&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;Bearer &amp;ldquo;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; accessTokenValue
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;posting&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ok&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
posting &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;&lt;code&gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token string&amp;quot;&amp;gt;https://micro.blog/notes/&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token interpolation&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;token interpolation-punctuation punctuation&amp;quot;&amp;gt;${&amp;lt;/span&amp;gt;id&amp;lt;span class=&amp;quot;token interpolation-punctuation punctuation&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token template-punctuation string&amp;quot;&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;DELETE&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token string-property property&#34;&gt;&amp;ldquo;Authorization&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;Bearer &amp;ldquo;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; accessTokenValue
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sweet.&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I also added in the ability to rename a notebook and delete a notebook. I won’t go into details since those are just endpoint you call and they are in the documentation.&lt;/p&gt;
&lt;h2 id=&#34;danger--loura-lost-10-hp&#34;&gt;Danger! ☠️ Loura lost 10 HP!&lt;/h2&gt;
&lt;p&gt;So while writing the first draft of this blog post, I stepped away from my desk and didn’t lock my computer. The cat took advantage of this and decided to step all over my keyboard. I lost the first draft 😢&lt;/p&gt;
&lt;p&gt;Okay, that sucked. Maybe I should do something about that…&lt;/p&gt;
&lt;p&gt;I know! auto save!&lt;/p&gt;
&lt;p&gt;This was pretty easy. The editor I’m using is &lt;a href=&#34;https://github.com/Ionaru/easy-markdown-editor&#34;&gt;EasyMDE&lt;/a&gt; and it includes it out of the box. Sweet! Just pass it the right configuration &lt;code&gt;autosave:{enabled:true} &lt;/code&gt; and….&lt;/p&gt;
&lt;p&gt;Uh oh…..&lt;/p&gt;
&lt;p&gt;Did you spot it?&lt;/p&gt;
&lt;p&gt;Maybe I should let people know I’m saving a copy of the decrypted note in localStorage.&lt;/p&gt;
&lt;p&gt;And thus a toggle was born.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/b41b49ba37.png&#34; alt=&#34;A dark themed interface is displayed showing a note-taking application with options for creating and managing various subjects such as Index, Meals &amp; Recipes, Money, and others on the left sidebar.&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;side-quest---storing-other-one-off-project-data&#34;&gt;Side Quest - Storing other one-off project data.&lt;/h2&gt;
&lt;p&gt;One other fun thing I started doing, was using using private notes to hold other small amounts of data for my growing collection of personal PWA’s.  Remeber &lt;a href=&#34;https://heyloura.com/2023/07/14/coding-a-framed.html&#34;&gt;this project with the iframes&lt;/a&gt;? I did end up finishing that (though not the blog posts), turned it into a PWA and hooked it up to a private note. I just serialize the data and store it.&lt;/p&gt;
&lt;p&gt;It’s my personal todo list calendar hybrid on my phone.&lt;/p&gt;
&lt;h2 id=&#34;a-dragons-hoard-must-be-shiny-&#34;&gt;A Dragon’s Hoard Must Be Shiny! 🪙&lt;/h2&gt;
&lt;p&gt;Okay, okay. I made &lt;a href=&#34;https://heyloura.com/2025/01/15/im-having-way-too-much.html&#34;&gt;a micro post on January 15th&lt;/a&gt; when I discovered 7.css.&lt;/p&gt;
&lt;p&gt;And I uh….&lt;/p&gt;
&lt;p&gt;had a bit too much fun.&lt;/p&gt;
&lt;p&gt;🤣😅🤣😅🤣&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/72b1308bfa.png&#34; alt=&#34;A colorful, patterned desktop displays multiple open windows, showing a Twitter feed, chatting, and an image of muffins.&#34;&gt;&lt;/p&gt;
&lt;p&gt;What I love about it? opening up all my notes in different windows! I can even drag the windows around and resize them.&lt;/p&gt;
&lt;p&gt;Yep… 😅&lt;/p&gt;
&lt;h2 id=&#34;the-end&#34;&gt;The End&lt;/h2&gt;
&lt;p&gt;♥️ Loura&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Micro.blog hosted blog - List only titled posts on homepage</title>
      <link>https://heyloura.com/2024/11/18/microblog-hosted-blog-list-only.html</link>
      <pubDate>Mon, 18 Nov 2024 18:07:00 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/11/18/microblog-hosted-blog-list-only.html</guid>
      <description>&lt;p&gt;Here are the steps I used to make my Micro.blog hosted blog list only the titled posts on my homepage and still paginate correctly. Note: This does require editing your blog theme.&lt;/p&gt;
&lt;p&gt;1.) The file you need to edit is: &lt;code&gt;layouts/index.html&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;2.) The line you are replacing should look something like this: &lt;code&gt;{{- $paginator := .Paginate (where .Site.Pages.ByDate.Reverse “Type” “post”) (index .Site.Params “archive-paginate” | default 20) }}&lt;/code&gt; (assuming you and/or your theme haven’t already customized this)&lt;/p&gt;
&lt;p&gt;3.) You are going to need to replace it with the following:&lt;/p&gt;
&lt;pre lang=&#34;hugo&#34; class=&#34;language-html&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;{{ $pages := where .Site.Pages.ByDate.Reverse &#34;Type&#34; &#34;post&#34; }}
{{ $pages = where $pages &#34;Params.title&#34; &#34;ne&#34; nil }}
{{- $paginator := .Paginate $pages (index .Site.Params &#34;archive-paginate&#34; | default 20) }}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then save your changes.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Micro.blog Bookmarks &amp; Highlights</title>
      <link>https://heyloura.com/2024/08/14/coding-adventure-microblog.html</link>
      <pubDate>Wed, 14 Aug 2024 12:15:00 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/08/14/coding-adventure-microblog.html</guid>
      <description>&lt;p&gt;Life has been way too much lately and most of my hobbies were put on pause while I dealt with keeping up with the unexpected. One of those that was dropped was writing down weekly notes that focused on my development side projects (and honestly, even coding side-projects took a nose-dive). My last post was on March 1st 😱&lt;/p&gt;
&lt;p&gt;So I’m doing a little reframing to make it feel a bit easier to write, thus the “Coding Adventure”. I want to keep these posts more along the line of “Hey, here’s something fun I played around with and it might still be mostly broken 🤪”&lt;/p&gt;
&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;I use Micro.blog, I know…. you’re shocked 😝 and one of the things I love, is how open they are with their API. It’s a fun playground of potential side-projects just waiting to be explored. One piece that I’ve dabbled with is the bookmarks feature. Basically you can save URLs as bookmarks and if you are a premium member, organize them with tags and add highlights. Manton, the creator of Micro.blog, rolled out a feature to bookmarks including having AI summarize the link (only if you’ve enabled AI on your account and, important to me, if the robots.txt of the bookmarked link allows it).&lt;/p&gt;
&lt;p&gt;But it’s not a feature I use all that much and I wanted to see if I could change that with a few of my own touches.&lt;/p&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;Like most of my recent side-projects, I’ve been using Deno. Its quick to get started with a Github repo and they have hard free tier limits so I feel safe playing around.&lt;/p&gt;
&lt;p&gt;The first thing I needed was a valid authorization token from micro.blog. I got this using indieauth and saving the resulting token in a http-only cookie. That way I’ll have the token with each page request. To make things easier in this proof of concept, I hard-coded values inside the server generated HTML form I was using. For instance the form action, the scope and response type. On the server I generated a random string for the state (the &lt;code&gt;${}&lt;/code&gt; notation is a &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals&#34;&gt;JavaScript template literal&lt;/a&gt;) and I also included the state as a session cookie when the page is rendered.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-html&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;https://micro.blog/indieauth/auth&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;get&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;url&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;placeholder&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;https://username.micro.blog&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;me&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;hidden&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;client_id&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;https://my-demo.com&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;hidden&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;redirect_uri&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;https://my-demo.com/auth&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;hidden&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;state&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;${uuid}&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;hidden&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;scope&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;create&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;hidden&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;response_type&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;code&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;submit&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Sign In&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&lt;/span&gt;button&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&lt;/span&gt;form&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Submitting this form creates a get request to Mico.blog’s indieauth endpoint which redirects me to approve the login. Once I approve it, it sends a request back to my &lt;code&gt;/auth&lt;/code&gt; endpoint with a code and state in the query string of a URL. I check that the state matches the state inside the cookie and then I make a POST request to Micro.blog’s token endpoint, &lt;code&gt;https://micro.blog/indieauth/token&lt;/code&gt;, using the code. If everything was wired up correctly I get back my lovey authorization token. Here is a code snippet of the token portion:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; formBody &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;URLSearchParams&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
formBody&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;code&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; code&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
formBody&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;client_id&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;https://my-demo.com&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
formBody&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;grant_type&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;authorization_code&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;p&gt;&lt;span class=&#34;token comment&#34;&gt;// request access_token&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; fetching &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&amp;lsquo;&lt;a href=&#34;https://micro.blog/indieauth/token&#39;&#34;&gt;https://micro.blog/indieauth/token&#39;&lt;/a&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;POST&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; formBody&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token string-property property&#34;&gt;&amp;ldquo;Content-Type&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;application/x-www-form-urlencoded; charset=utf-8&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token string-property property&#34;&gt;&amp;ldquo;Accept&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;application/json&amp;rdquo;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;br&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; response &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; fetching&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;a-fetch-quest-getting-my-bookmarks&#34;&gt;A Fetch Quest: Getting My Bookmarks&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Okay, let’s get some bookmarks. Micro.blog has &lt;a href=&#34;https://help.micro.blog/t/json-api-bookmarks/110&#34;&gt;documentation on its bookmarks&lt;/a&gt; endpoints in its help center, so that’s the first place to go diving. This was all familiar to me since I put bookmarks in my side project Lillihub a while back.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; fetching &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;https://micro.blog/posts/bookmarks&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; 
    &lt;span class=&#34;token literal-property property&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;GET&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; 
    &lt;span class=&#34;token literal-property property&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token string-property property&#34;&gt;&#34;Authorization&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Bearer &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; access_token &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; 
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; results &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; fetching&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This returns twenty-five of my most recent bookmarks. Nice. There was some trial and error but I figured out that you can use query parameter &lt;code&gt;before_id&lt;/code&gt; to enable getting more bookmarks. For example, if the last bookmark id was &lt;code&gt;123123&lt;/code&gt; then I could call &lt;code&gt;https://micro.blog/posts/bookmarks?before_id=123123&lt;/code&gt; and get the twenty-five after that last bookmark.&lt;/p&gt;
&lt;p&gt;If you have tags you can get the by adding the &lt;code&gt;tag&lt;/code&gt; with the name of the tag, like this: &lt;code&gt;https://micro.blog/posts/bookmarks?tag=code&lt;/code&gt; and you will get the first 25 bookmarks with that tag.&lt;/p&gt;
&lt;h2 id=&#34;lost-in-the-woods-bookmarks-and-what-i-couldnt-figure-out&#34;&gt;Lost in the Woods: Bookmarks and What I Couldn’t Figure Out&lt;/h2&gt;
&lt;p&gt;What I couldn’t figure out is how to go backwards. The Micro.blog post API supports a &lt;code&gt;since_id&lt;/code&gt; parameter and a &lt;code&gt;count&lt;/code&gt; parameter allowing for a full paging experience. Those don’t seem to work on bookmarks endpoint. I tried grabbing the bookmarks via the micropub endpoint but I had no luck there, just getting the posts on my blog.&lt;/p&gt;
&lt;p&gt;Nor could I figure out how to search for a bookmark. I figured this would be handy with the AI summarization or even to search part of the bookmark title. There is limited support for searching on the Micro.blog website but it mixes results together from the other related sections of links and highlights.&lt;/p&gt;
&lt;p&gt;So two paths then. Load all the bookmarks on the HTML page and then use JavaScript to search OR load all the bookmarks on the server, search it, and then return the results.&lt;/p&gt;
&lt;p&gt;Since I don’t have thousands of bookmarks… yet. I’m going with the quick and easy client side solution.&lt;/p&gt;
&lt;h2 id=&#34;search-for-treasure-enabling-search&#34;&gt;Search For Treasure: Enabling Search&lt;/h2&gt;
&lt;p&gt;The while loop was my weapon of choice for this part of the adventure. I iterated calling the bookmarks API and gathered the results. And I kept doing that until the request returned less than 25 results… signaling the end.&lt;/p&gt;
&lt;p&gt;Then I put those bookmarks in a table with some styling and….&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/screenshot-2024-08-13-114248.png&#34;&gt;
&lt;p&gt;Nice.&lt;/p&gt;
&lt;p&gt;The search box runs a little bit of JavaScript that hides table rows if they don’t contain the search term. Clicking on a tag, whether at the top or on a bookmark fills the textbox and retriggers the search.&lt;/p&gt;
&lt;p&gt;One strange thing with the Micro.blog bookmark API is that it doesn’t have separate properties for things like title or reader link. It jumbles them all together in the content_html field.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-json&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;{
    ...,
    &#34;content_html&#34;: &#34;&lt;p&gt;Homemade Oreos &lt;a href=&#34;https://sallysbakingaddiction.com/homemade-oreos/&#34;&gt;sallysbakingaddiction.com&lt;/a&gt;&lt;/p&gt;
&lt;p class=&#34;post_archived_links&#34;&gt;Reader: &lt;a href=&#34;https://micro.blog/bookmarks/6888713\&#34;&gt;sallysbakingaddiction.com&lt;/a&gt; &lt;/p&gt;&#34;,
    ...
},
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So I’m displaying the bookmark title as what’s in the first paragraph tag and removing everything else.&lt;/p&gt;
&lt;h2 id=&#34;side-quest-adding-bookmarks&#34;&gt;Side Quest: Adding Bookmarks&lt;/h2&gt;
&lt;p&gt;This was actually something &lt;a href=&#34;https://heyloura.com/2023/10/16/dev-diary-week.html#bookmarks&#34;&gt;I figured out a while back&lt;/a&gt;, but I figured I’d actually list the code sample here for a more complete picture.&lt;/p&gt;
&lt;p&gt;First you need to create the bookmark using micropub:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; formBody &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;URLSearchParams&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
formBody&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;h&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;entry&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
formBody&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;bookmark-of&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; url&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;p&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; posting &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;&lt;code&gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token string&amp;quot;&amp;gt;https://micro.blog/micropub&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token template-punctuation string&amp;quot;&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;POST&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; formBody&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token string-property property&#34;&gt;&amp;ldquo;Content-Type&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;application/x-www-form-urlencoded; charset=utf-8&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token string-property property&#34;&gt;&amp;ldquo;Authorization&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;Bearer &amp;ldquo;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; accessTokenValue
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and then you need to add the tags using the Micro.blog bookmarks API.&lt;/p&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Get the bookmarks&lt;/li&gt;
&lt;li&gt;The new one should be first one returned, grab it’s &lt;code&gt;id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add the tags (comma-separated list)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; formBodyTags &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;URLSearchParams&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
formBodyTags&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;tags&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; tags&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;p&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; postingTags &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;&lt;code&gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token string&amp;quot;&amp;gt;https://micro.blog/posts/bookmarks/&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token interpolation&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;token interpolation-punctuation punctuation&amp;quot;&amp;gt;${&amp;lt;/span&amp;gt;bookmark&amp;lt;span class=&amp;quot;token punctuation&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;id&amp;lt;span class=&amp;quot;token interpolation-punctuation punctuation&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token template-punctuation string&amp;quot;&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;POST&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; formBodyTags&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token string-property property&#34;&gt;&amp;ldquo;Content-Type&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;application/x-www-form-urlencoded; charset=utf-8&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token string-property property&#34;&gt;&amp;ldquo;Authorization&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;Bearer &amp;ldquo;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; accessTokenValue
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; responseTags &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; postingTags&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;exploring-the-dungeon-highlights&#34;&gt;Exploring the Dungeon: Highlights&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Let’s circle back to that reader link in the content_html property. Micro.blog premium users can make highlights on bookmarks, assuming the website’s robot.txt doesn’t prohibit it being crawled and the content isn’t dynamic. A copy of the content is provided along with an interface to make highlights. &lt;a href=&#34;https://youtu.be/nwekF1H87WM?t=173&#34;&gt;This video at the 2:52 mark&lt;/a&gt; by &lt;a href=&#34;https://micro.blog/manton&#34;&gt;[@manton](https://micro.blog/manton)&lt;/a&gt; shows the functionality I’m talking about.&lt;/p&gt;
&lt;p&gt;First thing I wanted to change, I want the number of highlights displayed in-line with my bookmarks. So I fire off the request to get my highlights and the first problem becomes apparent. There is no &lt;code&gt;id&lt;/code&gt; link between a bookmark and a highlight, or at least one that I could spot.&lt;/p&gt;
&lt;p&gt;So…. what matches? The url of the bookmark and the url of the highlight. So I can match them up with that. Downside? I’ll need to get all the highlights and loop through to find matches on the bookmarks. That’ll work for my small collection, but probably not for someone with a lot of bookmarks/highlights.&lt;/p&gt;
&lt;p&gt;With that I was able to add a little marker to tell me when I have highlights. 🥳… one monster down 🧟‍♀️⚔️&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/screenshot-2024-08-13-155106.png&#34;&gt;
&lt;p&gt;Now I’m getting to the tricky part.&lt;/p&gt;
&lt;p&gt;One thing I don’t like with the highlights… is that you can’t highlight the underlying HTML. Which means that if you highlight some text with an anchor tag, you get the text of the anchor, but not the anchor link itself. Which means the handy web reader you can get from Micro.blog won’t work out of the book. First, here is a look at a different part of the JSON returned for a bookmark:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-json&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;   {
      ...
      &#34;_microblog&#34;: {
        &#34;links&#34;: [
          {
            &#34;id&#34;: 6888713,
            ....,
          }
        ],
      }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can’t use the id of the bookmark to get the Micro.blog reader. The endpoint is &lt;code&gt;https://micro.blog/hybrid/bookmarks/123&lt;/code&gt;
, with the &lt;code&gt;123&lt;/code&gt; being the id of the first object under the &lt;code&gt;_microblog.links&lt;/code&gt; property in a bookmark response. This returns a text response that is an HTML page. Sweet.&lt;/p&gt;
&lt;p&gt;Now I can start dissecting it!&lt;/p&gt;
&lt;h2 id=&#34;in-which-i-spend-way-too-much-time-staring-at-source-code&#34;&gt;In Which I Spend Way Too Much Time Staring At Source Code&lt;/h2&gt;
&lt;p&gt;This was the tedious part of the adventure. I needed to parse out what was being returned, rip it apart and then rebuild it. I’m on a personal mission to not use any JavaScript libraries, so….&lt;/p&gt;
&lt;h3 id=&#34;step-one-bye-bye-jquery-&#34;&gt;Step one: Bye bye JQuery 👻⚔️&lt;/h3&gt;
&lt;p&gt;Luckily the contents of the web reader page has a div around it with an id &lt;code&gt;&lt;div id=&#34;content&#34;&gt;. This means I can get the content of the bookmark. A point in my favor, the inline JQuery script is outside that div. But by removing JQuery the two helpful script tags included by Micro.blog aren’t going to work anymore.
&lt;h3 id=&#34;step-two-fix-the-broken-images-&#34;&gt;Step two: Fix the broken images 🧪🔨&lt;/h3&gt;
&lt;p&gt;So if the bookmark had images in it… they are all broken. Why? because where my app is running is not where the images are. Thankfully I have a base url to work with. It was included in the head of the HTML returned by Micro.blog. I grabbed the &lt;code&gt;&lt;base href=&#34;&#34;&gt;&lt;/code&gt;
extracted the value and then prepended it to all the image src’s.&lt;/p&gt;
&lt;h3 id=&#34;step-three-mark-up-the-existing-highlights-&#34;&gt;Step Three: Mark up the existing highlights 🖊️🧝🏻‍♀️&lt;/h3&gt;
&lt;p&gt;Another downside, using just the reader page I don’t have the highlighted text… or title. Micro.blog seems, I’m not sure on this since I can’t see their code, to generate the highlight inside a script, marking the start and end range of the highlight… like this &lt;code&gt;restoreHighlight(0, 1132, 1225);&lt;/code&gt; with restoreHighlight being a custom function included on the page.&lt;/p&gt;
&lt;p&gt;For now I’m to loop through my highlights and find the ones I need. But this a place where I may need to rethink my approach. Now that have the text of the highlight, I loop through each one and add a &lt;code&gt;&lt;mark&gt;&lt;/mark&gt;&lt;/code&gt; tag around the matching text of the content. This very neatly adds a highlight, no additional CSS needed.&lt;/p&gt;
&lt;h3 id=&#34;step-four-write-new-javascript-to-capture-highlighted-text-&#34;&gt;Step Four: Write new JavaScript to capture highlighted text 🐲🔥&lt;/h3&gt;
&lt;p&gt;Note: I’ve only tested this on browsers I use…&lt;/p&gt;
&lt;p&gt;Okay, let’s get technical. I need to listen for a text selection event and then get what was selected. Plus I really only need to care if something was actually selected.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addEventListener&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;selectionchange&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; selection &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; window&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getSelection&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;     
    &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;selection&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;rangeCount &lt;span class=&#34;token operator&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token function&#34;&gt;getSelectionHtml&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;the &lt;code&gt;getSelectionHtml()&lt;/code&gt; function I wrote does all the nitty gritty calculating and saves the information in a hidden form on the page. This form appears in a dialog modal after a one second delay. If the submit button is hit, it posts the form and I save the highlight. This Micro.blog endpoint wasn’t actually included in the documentation… but it works:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; form &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;URLSearchParams&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
form&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;text&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; text&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
form&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;start&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; start&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
form&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;end&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; end&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;p&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; posting &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;&lt;code&gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token string&amp;quot;&amp;gt;https://micro.blog/bookmarks/&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token interpolation&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;token interpolation-punctuation punctuation&amp;quot;&amp;gt;${&amp;lt;/span&amp;gt;id&amp;lt;span class=&amp;quot;token interpolation-punctuation punctuation&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token string&amp;quot;&amp;gt;/highlights&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;token template-punctuation string&amp;quot;&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;POST&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; form&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token literal-property property&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token string-property property&#34;&gt;&amp;ldquo;Content-Type&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;application/x-www-form-urlencoded; charset=utf-8&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;token string-property property&#34;&gt;&amp;ldquo;Authorization&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&amp;ldquo;Bearer &amp;ldquo;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; mbToken
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Note, the &lt;code&gt;id&lt;/code&gt; is the id of the reader, not the bookmark.&lt;/p&gt;
&lt;p&gt;Okay, so the &lt;code&gt;getSelectionHtml()&lt;/code&gt; is a bit of a beast. I haven’t really played around with widow.getSelection() before and I wanted to remove the JQuery dependency with the original code. Luckily it didn’t need too much tweaking to make it work.&lt;/p&gt;
&lt;p&gt;First we want to make sure our selection isn’t undefined. Then we want to create a container (in this case a div) to hold our HTML selection. I then iterate through and clone the nodes into that container. Then I can get the innerHTML of the container and that holds the user selected HTML. For brevity I took out the calculateOffset portion and left comments where that code would go.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;getSelectionHtml&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; html &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;typeof&lt;/span&gt; window&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;getSelection &lt;span class=&#34;token operator&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;undefined&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; sel &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; window&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getSelection&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;sel&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;rangeCount&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; container &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;createElement&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;div&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; len &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; sel&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;rangeCount&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&lt;&lt;/span&gt; len&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;i&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
                container&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;appendChild&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;sel&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getRangeAt&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;i&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;cloneContents&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
            html &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; container&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;innerHTML&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;sel&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;isCollapsed&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
                &lt;span class=&#34;token comment&#34;&gt;//save the HTML to the form&lt;/span&gt;
                &lt;span class=&#34;token comment&#34;&gt;//calculate the offsets and save values to form&lt;/span&gt;
                &lt;span class=&#34;token comment&#34;&gt;//trigger the 1 second delay&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;typeof&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;selection &lt;span class=&#34;token operator&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;undefined&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;selection&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;type &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Text&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
            html &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;selection&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;createRange&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;htmlText&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token comment&#34;&gt;//save the HTML to the form&lt;/span&gt;
            &lt;span class=&#34;token comment&#34;&gt;//calculate the offsets and save values to form&lt;/span&gt;
            &lt;span class=&#34;token comment&#34;&gt;//trigger the 1 second delay&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To calculate the offset you need to gather up all the child nodes. Luckily this code was already included in the page. I just needed to remove the JQuery portion and port it over to vanillaJS.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34; class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;gatherNodes&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;startElement&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; results&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    results&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;startElement&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    startElement&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;childNodes&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token function&#34;&gt;gatherNodes&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;e&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; results&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;p&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;calculateContentOffset&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;findNode&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; offset&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; e &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&amp;ldquo;content&amp;rdquo;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; results &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token function&#34;&gt;gatherNodes&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;e&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; results&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; current_pos &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;laquo;/span&amp;gt; results&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; node &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; results&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;i&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;node&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;isSameNode&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;findNode&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; current_pos &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; offset&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;node&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length &lt;span class=&#34;token operator&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;undefined&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
current_pos &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; current_pos &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; node&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Whew….&lt;/p&gt;
&lt;p&gt;It works!&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/screenshot-2024-08-14-080112.png&#34;&gt;
&lt;p&gt;And if I double check it on Micro.blog, I can see the link is saved. Yep!&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/screenshot-2024-08-14-080344.png&#34;&gt;
&lt;p&gt;Or maybe not…. 😱
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/screenshot-2024-08-14-081102.png&#34;&gt;
As you can see, there is a mismatch between what’s in my UI and on the Micro.blog website. I wonder if the offset I’m calculating is different somehow… 🤔&lt;/p&gt;
&lt;h2 id=&#34;there-are-monsters-yet-to-slay&#34;&gt;There Are Monsters Yet To Slay🦇&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Highlights saved with my app that have HTML in them… aren’t visible or in the wrong position in the Micro.blog reader on the Micro.blog website. They do show up correctly in the highlight list and &lt;em&gt;when hitting the “New Post” button&lt;/em&gt;. Which was one of the reasons I started this adventure.&lt;/li&gt;
&lt;li&gt;Highlights saved with the Micro.blog website that cover HTML elements (like anchors) don’t show in my reader.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So this isn’t ready for prime-time.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I now have my own little web reader for my bookmarks and I can mark up highlights. It has its drawbacks, but I’m going to use it for a bit and see how it holds up.&lt;/p&gt;
&lt;p&gt;I think that’s all the adventuring I’m up for this week. I’m going home and having a nice cup of peppermint tea.&lt;/p&gt;
  &lt;/div&gt;&lt;/code&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>