<rss version="2.0">
  <channel>
    <title>Longform on Hey Loura!</title>
    <link>https://heyloura.com/categories/longform/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Wed, 20 May 2026 09:53:09 -0400</lastBuildDate>
    
    <item>
      <title>Taijiquan - Ji</title>
      <link>https://heyloura.com/2026/05/20/taijiquan-ji.html</link>
      <pubDate>Wed, 20 May 2026 09:53:09 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2026/05/20/taijiquan-ji.html</guid>
      <description>&lt;p&gt;Continuing on with my &lt;a href=&#34;https://heyloura.com/2026/05/04/taijiquan-peng.html&#34;&gt;haiku series&lt;/a&gt; around “Songs of The Eight Postures” attributed to T’an Meng-hsien and translated by Lee N. Scheele here is my third entry, Ji.&lt;/p&gt;
&lt;p&gt;Ji or Chi gave me a lot of trouble when trying to put it to words and I&amp;rsquo;ll probably need to update it at some point. I don&amp;rsquo;t think the second half, that speaks to the external is quite what I want. Nor do I feel like it captures the indirect, a rebound, so it&amp;rsquo;ll have to marinate in my head a bit.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s often referred to as a &amp;ldquo;press&amp;rdquo;. With this one I veered off the imagery used in the song. The &amp;ldquo;six joints&amp;rdquo; is a reference to the &amp;ldquo;six harmonies&amp;rdquo; which in taijiquan mean the pairs of joints that should be connected. Shoulders and hips, elbows and knees, wrists and ankles. For the press they all need to be stacked and working together in unison.&lt;/p&gt;
&lt;h1 id=&#34;my-version---jichi&#34;&gt;My Version - Ji/Chi&lt;/h1&gt;
&lt;p&gt;six joints move as one&lt;br/&gt;
a sealed touch with no gaps&lt;br/&gt;
leads compressed wave forth&lt;/p&gt;
&lt;p&gt;a confident strike&lt;br/&gt;
finds their form an inward path&lt;br/&gt;
itself made hollow&lt;/p&gt;
&lt;h1 id=&#34;songs-of-the-eight-postures---chi&#34;&gt;Songs of The Eight Postures - Chi&lt;/h1&gt;
&lt;p&gt;What is the meaning of Chi energy?&lt;br/&gt;
There are two aspects to its functional use:&lt;br/&gt;
The direct way is to go to meet the opponent&lt;br/&gt;
and attach gently in one movement.&lt;br/&gt;
The indirect way is to use the reaction force&lt;br/&gt;
like the rebound of a ball bouncing off a wall, or&lt;br/&gt;
a coin thrown on a drumhead,&lt;br/&gt;
bouncing off with a ringing sound.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Other Haiku&amp;rsquo;s in the series&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2026/05/04/taijiquan-peng.html&#34;&gt;Peng&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2026/05/06/taijiquan-lu.html&#34;&gt;Lu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&#34;&gt;Ji&lt;/a&gt; * this one&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Taijiquan - Lu</title>
      <link>https://heyloura.com/2026/05/06/taijiquan-lu.html</link>
      <pubDate>Wed, 06 May 2026 10:27:30 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2026/05/06/taijiquan-lu.html</guid>
      <description>&lt;p&gt;Continuing on with my &lt;a href=&#34;https://heyloura.com/2026/05/04/taijiquan-peng.html&#34;&gt;haiku series&lt;/a&gt; around “Songs of The Eight Postures” attributed to T’an Meng-hsien and translated by Lee N. Scheele here is my second entry, Lu.&lt;/p&gt;
&lt;p&gt;Lu is often associated with the &amp;ldquo;rollback&amp;rdquo; technique. It&amp;rsquo;s a yielding and redirecting&amp;hellip; force. The reason I hesitate to put the word &amp;ldquo;force&amp;rdquo; is that when force (external) is applied, it&amp;rsquo;s already changed into a different energy/technique. It&amp;rsquo;s one of the most internal and in my mind, transient, of the eight.&lt;/p&gt;
&lt;h1 id=&#34;my-version---lu&#34;&gt;My Version - Lu&lt;/h1&gt;
&lt;p&gt;the water wheel coils&lt;br/&gt;
lithely adhering, yielding&lt;br/&gt;
directing from center&lt;/p&gt;
&lt;p&gt;their reach at its peak&lt;br/&gt;
enters an open eddy&lt;br/&gt;
itself finds empty&lt;/p&gt;
&lt;h1 id=&#34;songs-of-the-eight-postures---lu&#34;&gt;Songs of The Eight Postures - Lu&lt;/h1&gt;
&lt;p&gt;What is the meaning of Lu energy?&lt;br/&gt;
Entice the opponent toward you by allowing him to advance,&lt;br/&gt;
lightly and nimbly follow his incoming force&lt;br/&gt;
without disconnecting and without resisting.&lt;br/&gt;
When his force reaches its farthest extent,&lt;br/&gt;
it will naturally become empty.&lt;br/&gt;
The opponent can then be let go or countered at will.&lt;br/&gt;
Maintain your central equilibrium&lt;br/&gt;
and your opponent cannot gain an advantage.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Other Haiku&amp;rsquo;s in the series&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2026/05/04/taijiquan-peng.html&#34;&gt;Peng&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2026/05/06/taijiquan-lu.html&#34;&gt;Lu&lt;/a&gt; * this one&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2026/05/20/taijiquan-ji.html&#34;&gt;Ji&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Taijiquan - Peng</title>
      <link>https://heyloura.com/2026/05/04/taijiquan-peng.html</link>
      <pubDate>Mon, 04 May 2026 14:41:56 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2026/05/04/taijiquan-peng.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been diving deeper into taijiquan and re-reading the classics. It&amp;rsquo;s been so long I&amp;rsquo;ve forgotten most of what I read. One reason being I&amp;rsquo;m coming at them from a translation, in a different time period and culture. So the meaning doesn&amp;rsquo;t stay with me.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s one in particular that I was reading over the weekend, &amp;ldquo;Songs of The Eight Postures&amp;rdquo; attributed to T&amp;rsquo;an Meng-hsien and translated by Lee N. Scheele. It&amp;rsquo;s a series of short instructional poems on the eight energies. I was inspired to try my hand at making some myself, that are more intuitive to me personally so they might stick with me a bit longer.&lt;/p&gt;
&lt;p&gt;I decided the series would be in pairs haikus. One speaking to the internal/personal feel and one speaking to the external/opponents perspective. I want to keep the meaning of classics apparent (as my understanding of them allows) while adding in my own imagery. I hope to revisit these haiku&amp;rsquo;s as I progress, making changes as needed. My poem is in no way meant to speak like the classics or be authoritative.&lt;/p&gt;
&lt;p&gt;This is the first of the set&lt;/p&gt;
&lt;h1 id=&#34;my-version---peng&#34;&gt;My Version - Peng&lt;/h1&gt;
&lt;p&gt;spine long and crown high &lt;br&gt;
sunk deep buoyant chi fills &lt;br&gt;
surging spring, root fed&lt;/p&gt;
&lt;p&gt;a thousand pound press &lt;br&gt;
finds a ball on water - &lt;br&gt;
itself floats away &lt;/p&gt;
&lt;h1 id=&#34;songs-of-the-eight-postures---peng&#34;&gt;Songs of The Eight Postures - Peng&lt;/h1&gt;
&lt;p&gt;What is the meaning of Peng energy?&lt;br&gt;
It is like the water supporting a moving boat.&lt;br&gt;
First sink the ch&#39;i to the tan-t&#39;ien,&lt;br&gt;
then hold the head as if suspended from above.&lt;br&gt;
The entire body is filled with springlike energy,&lt;br&gt;
opening and closing in a very quick moment.&lt;br&gt;
Even if the opponent uses a thousand pounds of force,&lt;br&gt;
he can be uprooted and made to float without difficulty.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Other Haiku&amp;rsquo;s in the series&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2026/05/04/taijiquan-peng.html&#34;&gt;Peng&lt;/a&gt; * this one&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2026/05/06/taijiquan-lu.html&#34;&gt;Lu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2026/05/20/taijiquan-ji.html&#34;&gt;Ji&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>March 8th - April 4th Practice Log</title>
      <link>https://heyloura.com/2026/04/07/march-th-april-th-practice.html</link>
      <pubDate>Tue, 07 Apr 2026 09:06:23 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2026/04/07/march-th-april-th-practice.html</guid>
      <description>&lt;h1 id=&#34;tai-chi&#34;&gt;&lt;a href=&#34;https://heyloura.com/tai-chi&#34;&gt;Tai Chi&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&#34;tai-chi-and-kung-fu-practice-log&#34;&gt;&lt;em&gt;Tai Chi and Kung Fu Practice Log&lt;/em&gt;&lt;/h2&gt;
&lt;h3 id=&#34;march-8th---april-4th&#34;&gt;March 8th - April 4th&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Stats&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;28 days&lt;/strong&gt; logged&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;approx. 42 hours&lt;/strong&gt; practiced (class + personal)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;approx. 4.1 hours&lt;/strong&gt; standing meditation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;20 forms&lt;/strong&gt; tai chi &amp;amp; kung fu&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;When the opponent does not move, you will not move; when the opponent slightly moves, you move first.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;— Yáng Bān-Hóu · on Pushing Hands&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;personal-practice-focus&#34;&gt;Personal Practice Focus&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;01: Opening the Hip Joint&lt;/strong&gt;
I included daily kua opening exercises, researched the anatomy of the hip, and explored releasing into the hip socket during move transitions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;02: Standing Meditation&lt;/strong&gt;
I worked up from 6-8 minute sessions to 20 min sessions over the month. By April I needed to do less posture corrections.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;03: Explosive Power&lt;/strong&gt;
Most moves in Taijiquan have an element of explosive power to them. I drilled silk reeling and fajin expression in my weekly rotation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;04: Sensitivity and Structure&lt;/strong&gt;
Regular weekly pushing hands practice in class and deep form corrections in 64 Guan Ping Yang Form.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Handwriting a blog</title>
      <link>https://heyloura.com/2026/03/01/handwriting-a-blog.html</link>
      <pubDate>Sun, 01 Mar 2026 22:15:00 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2026/03/01/handwriting-a-blog.html</guid>
      <description>&lt;map name=&#34;map1&#34;&gt;
  &lt;area shape=&#34;rect&#34; coords=&#34;200,30,900,175&#34; href=&#34;https://heyloura.com/2026/03/01/handwriting-a-blog.html&#34; alt=&#34;Handwriting a blog – March 1st 2026&#34;&gt;
  &lt;area shape=&#34;rect&#34; coords=&#34;175,190,880,880&#34; href=&#34;https://web.archive.org/web/20250227184810/https://www.handwritten.blog&#34; alt=&#34;Link reference [1]: handwritten.blog on the Internet Archive&#34;&gt;
  &lt;area shape=&#34;rect&#34; coords=&#34;940,180,990,880&#34; href=&#34;https://web.archive.org/web/20250227184810/https://www.handwritten.blog&#34; alt=&#34;Link reference [1]: handwritten.blog on the Internet Archive&#34;&gt;
&lt;/map&gt;
&lt;div class=&#34;handwritten-post-wrap&#34;&gt;
&lt;img usemap=&#34;#map1&#34; src=&#34;https://cdn.uploads.micro.blog/88328/2026/4ec2861eb2.webp&#34; class=&#34;overflow handwritten-post&#34; alt=&#34;Handwritten blog post — transcript below. Decorative doodles: Left margin: a vertical trail of blue teardrop/raindrop shapes, and a blue swirl/spiral shape Inline after mind wander.: a small drawing of a swimmer with a red cap and goggles, with blue splashes Bottom of page: a row of colorful triangular bunting/pennant flags in red, yellow, and blue&#34;&gt;
&lt;/div&gt;
&lt;div class=&#34;handwritten-post-wrap&#34;&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2026/1a95339342.webp&#34; class=&#34;overflow handwritten-post&#34; alt=&#34;Handwritten blog post — transcript below. Decorative doodles: Upper left: a blue flower with petals splayed in two directions, like a snowflake or asterisk shape. Between paragraphs: a horizontal divider made of small blue leaf/teardrop shapes in a row. Left of second paragraph: a stick figure mermaid with a yellow hair and a curvy green tail&#34;&gt;
&lt;/div&gt;
&lt;details&gt;
  &lt;summary&gt;Read as text&lt;/summary&gt;
  &lt;p&gt;One of the nice things about going to my kids swim meet is that I have time to let my mind wander.&lt;/p&gt;
&lt;p&gt;A few years ago, I came across a website called &#34;Handwritten. blog.&#34; Sadly, it is no longer hosted but you can still see some of it on the internet archive [1].&lt;/p&gt;
&lt;p&gt;Maybe it was because I was reading on my e-ink tablet. Or perhaps I&#39;m just tired of my current blog design again. But why not give it a shot?&lt;/p&gt;
&lt;p&gt;One thing is obvious, editing posts will be a nightmare. Usually I take my time and will rewrite a blog post a few times. Not gonna happen if I&#39;m writing these out long hand. So yeah… a little unpolished it is.&lt;/p&gt;
&lt;p&gt;♥ Loura&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;br&gt;
[1] &lt;a href=&#34;https://web.archive.org/web/20250227184810/https://www.handwritten.blog&#34;&gt;Internet Archive&lt;/a&gt;
&lt;/p&gt;
&lt;/details&gt;
</description>
    </item>
    
    <item>
      <title>App Defaults 2026</title>
      <link>https://heyloura.com/2026/01/30/app-defaults.html</link>
      <pubDate>Fri, 30 Jan 2026 09:46:42 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2026/01/30/app-defaults.html</guid>
      <description>&lt;p&gt;Quite a few changes from my last update in &lt;a href=&#34;https://heyloura.com/2023/12/07/my-app-defaults.html&#34;&gt;2023&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;📧 Email Client (Web): Fastmail&lt;/p&gt;
&lt;p&gt;📧 Email Client (Android): e/os default mail app (K-9 Mail fork)&lt;/p&gt;
&lt;p&gt;🕸️ Website: Micro.blog &amp; Namecheap&lt;/p&gt;
&lt;p&gt;📝✅ Notes + Todos: Index cards, Micro.blog private notes (both notes and todos), and Logseq (for work notes)&lt;/p&gt;
&lt;p&gt;📔 Journal: Hobonichi 5 year, trying out Day one&lt;/p&gt;
&lt;p&gt;📸 Photo Management: Ente&lt;/p&gt;
&lt;p&gt;🗓️ Calendar (Web): Fastmail&lt;/p&gt;
&lt;p&gt;🗓️ Calendar (Android): e/os default calendar app&lt;/p&gt;
&lt;p&gt;🎁 Cloud file storage (unencrypted): Fastmail&lt;/p&gt;
&lt;p&gt;🎁 Cloud file storage (encrypted): 1password&lt;/p&gt;
&lt;p&gt;👽 Contacts: e/os default Android app&lt;/p&gt;
&lt;p&gt;🌐 Browser: Brave (hoping for Kagi browser soon)&lt;/p&gt;
&lt;p&gt;🔎 Search Engine: Kagi&lt;/p&gt;
&lt;p&gt;💬 Chat: e/os default + Signal&lt;/p&gt;
&lt;p&gt;🔖 Bookmarks: Micro.blog&lt;/p&gt;
&lt;p&gt;💵 Budgeting: self-hosted dumb budget app&lt;/p&gt;
&lt;p&gt;💵 Personal Finance: Micro.blog private notes (self aggregated data)&lt;/p&gt;
&lt;p&gt;📰 News: Allsides&lt;/p&gt;
&lt;p&gt;🔐 Password Management: 1password&lt;/p&gt;
&lt;p&gt;🎨 Photo Editing: Paint.Net&lt;/p&gt;
&lt;p&gt;👩‍💻 Code Editor: Visual Studio Code or Visual Studio&lt;/p&gt;
&lt;p&gt;📚 Books: Self-hosted - audiobookshelf + physical copies&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Supabase, Deno and Server Side Rendering</title>
      <link>https://heyloura.com/2025/12/22/supabase-deno-and-server-side.html</link>
      <pubDate>Mon, 22 Dec 2025 11:16:37 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/12/22/supabase-deno-and-server-side.html</guid>
      <description>&lt;p&gt;A project I&amp;rsquo;m currently working on is using &lt;a href=&#34;https://supabase.com/&#34;&gt;Supabase&lt;/a&gt; for its database and authentication layer. And so far so good. That is until I wanted to move all the calls to the Supabase API server side for server side rendering (SSR). Now, they do have lots of documentation and tutorials out there and a bunch of third party tutorials all over the web. But nothing quite fit what I was trying to do. I&amp;rsquo;m using &lt;a href=&#34;https://deno.com/&#34;&gt;Deno&lt;/a&gt;, for server side JavaScript, and I figured with Supabase&amp;rsquo;s SSR package it would be a pretty easy to implement. You know what they say about assumptions 😆&lt;/p&gt;
&lt;p&gt;Since I&amp;rsquo;m not using any additional framework, their tutorial documentation wasn&amp;rsquo;t all that helpful. But it did give me enough of a sense of what I needed to do. Which boils down to setting cookies, reading cookies, and calling the Supabase client library. Then digging around Github, Github Issues, and Stack Overflow I eventually pieced it together.&lt;/p&gt;
&lt;p&gt;So, to maybe save someone else (or an AI scraper) some time in the future. Here is I tied up Supabase SSR with Deno and no additional framework:&lt;/p&gt;
&lt;h1 id=&#34;putting-it-all-together&#34;&gt;Putting it all together&lt;/h1&gt;
&lt;h2 id=&#34;logging-in-a-user&#34;&gt;Logging in a user&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve saved some key info in enviromental variables, namely &lt;code&gt;Deno.env.get(&amp;quot;SUPABASE_URL&amp;quot;)&lt;/code&gt; and &lt;code&gt;Deno.env.get(&amp;quot;SUPABASE_ANON_KEY&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m importing the supabase client with the following statement at the top of my main.js file: &lt;code&gt;import { createClient } from &amp;quot;jsr:@supabase/supabase-js@2&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have a login page with a simple HTML form that does a &lt;code&gt;POST&lt;/code&gt; request to an endpoint and then calls the &lt;code&gt;createClient&lt;/code&gt; to determine if the credentials are correct and we have a valid user logging in. This method also creates three cookies with the request. The first two are domain bound, secure, and HTTP Only cookies with expirations.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;auth-token&lt;/code&gt; this is returned from the successful createClient call with an accompyining expiration which is 1 hour after issue.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;refresh-token&lt;/code&gt; is needed to refresh the session without having the user log back into the application with credentials. If you need it to stick around longer, adjust the &lt;code&gt;MaxAge&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;auth-issued-at&lt;/code&gt; is needed for the client to calculate when to prompt the user if they want to continue with their session (for my use case, 5 minutes before the auth-token expires). A lot of modern apps skip this and would just grab the refresh-token for a more seamless experience, but I&amp;rsquo;m going to need it. Also this cookie is not HTTP only, since I need to access the value on the client.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here is the code so far (simplified)&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;createClient&lt;/span&gt; } &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;jsr:@supabase/supabase-js@2&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_domain&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;my-awesome-app.com&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;serve&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;URLPattern&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;pathname&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/sign-in&amp;#34;&lt;/span&gt; }).&lt;span style=&#34;color:#a6e22e&#34;&gt;exec&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;formData&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;email&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;password&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;supabase&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createClient&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SUPABASE_URL&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SUPABASE_ANON_KEY&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt; } &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;supabase&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;auth&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;signInWithPassword&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;email&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;password&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;session&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;We could not log you into our application&amp;#34;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;403&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content-type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text/plain&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;`&amp;lt;h1&amp;gt;Yay! Go to your &amp;lt;a href=&amp;#34;/dashboard&amp;#34;&amp;gt;dashboard&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;`&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;200&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content-type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;append&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;set-cookie&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;`auth-token=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;session&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;access_token&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;domain:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_domain&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;SameSite=Lax;Path=/;Secure;HttpOnly;MaxAge=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;session&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;expires_in&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;append&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;set-cookie&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;`refresh-token=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;session&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;refresh_token&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;domain:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_domain&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;SameSite=Lax;Path=/;Secure;HttpOnly;MaxAge=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;session&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;expires_in&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;append&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;set-cookie&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;`auth-issued-at=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;Date.&lt;span style=&#34;color:#a6e22e&#34;&gt;now&lt;/span&gt;()&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;domain:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_domain&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;SameSite=Lax;Path=/;Secure;MaxAge=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;24&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;180&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;signInTemplate&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TextDecoder&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;decode&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;readFile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;layouts/sign-in.html&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;signInTemplate&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;200&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content-type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; is not supported`&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;405&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;reading-the-saved-cookies-on-the-server&#34;&gt;Reading the saved cookies on the server&lt;/h2&gt;
&lt;p&gt;Cookies are passed along with each request from the browser. I use a simple function that takes in the request, finds the cookie I ask for and then passes back the value.&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// req is the request object from Deno.serve
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// name is the name of the cookie to find
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getCookieValue&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cookies&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cookie&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cookie&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;; &amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cookieValue&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cookies&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;cookie&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cookie&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;includes&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;=`&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;cookieValue&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cookieValue&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cookieValue&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;=&amp;#39;&lt;/span&gt;)[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cookieValue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;protecting-endpoints&#34;&gt;Protecting endpoints&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Create a user-aware Supabase client. The one we&amp;rsquo;ve been using up until now has just been using the anonymous keys which aren&amp;rsquo;t tied to a particular user. However, the database has been set up with a bunch of Row-Level Security (RLS) Policies that do care who the user is. From this &lt;a href=&#34;&#34;&gt;Github issue&lt;/a&gt; I put together a function that takes in the user&amp;rsquo;s auth token from supabase and then creates a user aware client. I don&amp;rsquo;t have &lt;code&gt;persistSession&lt;/code&gt; or &lt;code&gt;autoResfreshSession&lt;/code&gt; set, since I will be handling those myself.&lt;/li&gt;
&lt;li&gt;Every protected route calls my verify user function that takes a users auth token, verifys the token with a call to the unauthenticated Supabase client and if it looks good, creates and sets the user-aware Supabase client that the rest of the code for that endpoint will use.&lt;/li&gt;
&lt;li&gt;If the auth token is expired or bad, send that information back with the request so my webpage can redirect the user to a login page. (NOTE, some may just grab the refresh token now and use it, depends on business requirements)&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_supabase&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//https://github.com/supabase/supabase/issues/8490#issuecomment-1219766620
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createServerDbClient&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;accessToken&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createClient&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SUPABASE_URL&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SUPABASE_ANON_KEY&amp;#34;&lt;/span&gt;), {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;db&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;public&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;auth&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;persistSession&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;autoRefreshToken&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;global&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;accessToken&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;Authorization&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`Bearer &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;accessToken&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// called before any protected endpoint and result checked.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// req is the request object from Deno.serve
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;VerifyUser&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getCookieValue&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;auth-token&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;token&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;verified&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`No token found`&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// unauthenticated supabase client
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;supabaseClient&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createClient&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SUPABASE_URL&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SUPABASE_ANON_KEY&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// check what supabase says,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// getClaims throws exception with expired token
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt; } &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;supabaseClient&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;auth&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getClaims&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;token&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;verified&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;verified&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Supabase client exception thrown&amp;#39;&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// looks good, let the user through and set the supabase client for use
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;_supabase&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createServerDbClient&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;token&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;verified&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;this-will-work-for-an-hour&#34;&gt;This will work&amp;hellip; for an hour&lt;/h2&gt;
&lt;p&gt;Calls to my protected endpoint will work for an hour before that auth token expires. So, I needed to check on the webpage when the token is going to expire so I can alert the user. That&amp;rsquo;s why I set the &lt;code&gt;auth-issued-at&lt;/code&gt; cookie to be readable by JavaScript on the webpage. The basic plan is to figure out the current time, the time the auth code was issued and how long it has left. For my purposes, I do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Longer that 5 minutes left? Create a call to &lt;code&gt;setTimeout&lt;/code&gt; that will alert the user when they have five minutes left.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Less than 5 minutes? Alert the user.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Expired? Send the user to the login page.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The alert is a modal that lets the user choose to continue working (i.e. refresh the session) or to log them out. Assuming they want to continue then I call the endpoint to refresh the session. But there is the case to consider that the alert was up and received no input for longer than the time to expire. In that case I show another alert on any interaction that the session expired and kick them back to the login page.&lt;/p&gt;
&lt;h2 id=&#34;using-the-refresh-token&#34;&gt;Using the refresh token&lt;/h2&gt;
&lt;p&gt;I protect the refresh endpoint just like I do other protected endpoints, I make sure the user has a valid and unexpired token before letting a call go through. This is a business requirement I have, others for a more seamless workflow may allow a refresh token to be used after a session has already expired.&lt;/p&gt;
&lt;p&gt;The trickest part was figuring out what endpoint to call. There doesn&amp;rsquo;t seem to be any good documentation around it so I needed to dig around a bunch to find what other libraries were doing in their code. But once the sleuthing was done it was pretty straight forward.&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// verify the user can access restricted content
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;verify&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;VerifyUser&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;verify&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;verified&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;`Please log back in: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;verify&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;404&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content-type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// user requested to refresh the session
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;URLPattern&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;pathname&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/refresh_session&amp;#34;&lt;/span&gt; }).&lt;span style=&#34;color:#a6e22e&#34;&gt;exec&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;refreshToken&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getCookieValue&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;refresh-token&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;// send the token to supabase
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetching&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetch&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SUPABASE_URL&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/auth/v1/token?grant_type=refresh_token`&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;apikey&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SUPABASE_ANON_KEY&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;JSON&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;stringify&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;refresh_token&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;refreshToken&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetching&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// if we don&amp;#39;t get a new token, then the refresh failed
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;access_token&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Refresh failed&amp;#39;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;403&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content-type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// everything worked, refresh the cookies
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Processed&amp;#39;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;200&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content-type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;append&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;set-cookie&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`auth-token=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;access_token&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;domain:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_domain&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;SameSite=Lax;Path=/;Secure;HttpOnly;MaxAge=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;expires_in&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;append&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;set-cookie&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`refresh-token=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;refresh_token&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;domain:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_domain&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;SameSite=Lax;Path=/;Secure;HttpOnly;MaxAge=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;expires_in&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;append&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;set-cookie&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;`auth-issued-at=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;Date.&lt;span style=&#34;color:#a6e22e&#34;&gt;now&lt;/span&gt;()&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;domain:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_domain&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;;SameSite=Lax;Path=/;Secure;MaxAge=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;180&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Response&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; is not supported`&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;405&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;and-done&#34;&gt;And done!&lt;/h2&gt;
&lt;p&gt;Now I have a blueprint on how to log users in, save the needed cookies, and how to use the refresh token to get another auth token when needed.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The search for link colors that are equally readable both black and white website backgrounds</title>
      <link>https://heyloura.com/2025/09/29/the-search-for-link-colors.html</link>
      <pubDate>Mon, 29 Sep 2025 15:37:12 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/09/29/the-search-for-link-colors.html</guid>
      <description>&lt;p&gt;One trick I&amp;rsquo;ve been using a bunch is a one rule CSS dark theme for simple projects.&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;color-scheme&lt;/span&gt;:light dark;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;background-color&lt;/span&gt;:canvas;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;color&lt;/span&gt;:canvastext;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This uses the built in browser system colors. When a user has a preference for a dark theme set at the browser level, then &lt;code&gt;canvas&lt;/code&gt; is very close to black, otherwise it is white. &lt;code&gt;canvastext&lt;/code&gt; is similar. You can see what they look like on your browser here: &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/system-color&#34;&gt;https://developer.mozilla.org/en-US/docs/Web/CSS/system-color&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;why&#34;&gt;Why?&lt;/h2&gt;
&lt;p&gt;Bytes matter&amp;hellip; and once in a while, more then design considerations. This adds very little overhead in a CSS file while respecting and user dark theme preferences. So if you are building a quick personal side project, it&amp;rsquo;s good. If you are building a website meant for low powered devices with abysmal data connections&amp;hellip; it&amp;rsquo;s a fine tool to have. If you are lazy and only want to write down one CSS rule and be done&amp;hellip; perfect 😆&lt;/p&gt;
&lt;h2 id=&#34;but-its-ugly&#34;&gt;But&amp;hellip; it&amp;rsquo;s ugly?&lt;/h2&gt;
&lt;p&gt;Yeah, on its own it can be a bit ugly. I&amp;rsquo;m not a fan of the default link colors (i.e. the default system colors for links) on the browsers I use. So I set out on a quest to find some colors to use instead. Ideally a blueish color for unvisited links and a purplish color for visited ones. I also wanted to keep in mind accessibility considerations. Some color combinations are hard on the eyes and render a website unusable in other cases.&lt;/p&gt;
&lt;p&gt;So, high contrast is the name of the game. One tool I use is the &lt;a href=&#34;https://webaim.org/resources/contrastchecker/&#34;&gt;webaim contrast checker&lt;/a&gt;. But there are a &lt;strong&gt;lot&lt;/strong&gt; of colors and I&amp;rsquo;m not doing that check manually. JavaScript and Stack Overflow to the rescue! I&amp;rsquo;m looking for colors that rank equally well on black and white with the highest contrast score possible.&lt;/p&gt;
&lt;h2 id=&#34;results&#34;&gt;Results&lt;/h2&gt;
&lt;p&gt;After some trial and error I discovered that you can&amp;rsquo;t get a contrast score of above 4.58 for a color on both black and white backgrounds. Which only meets AA standards for normal sized text. But they do meet AAA standards for large text. Here were the top 9 results I found:&lt;/p&gt;
&lt;table id=&#34;AAA&#34;&gt;
        &lt;tbody&gt;&lt;tr&gt;&lt;th&gt;RGB color&lt;/th&gt;&lt;th&gt;White contrast value&lt;/th&gt;&lt;th&gt;Black contrast value&lt;/th&gt;&lt;/tr&gt;
    &lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;
                &lt;td style=&#34;background-color:rgb(3, 137, 1);color:canvastext&#34;&gt;rgb(3, 137, 1)&lt;/td&gt;
                &lt;td style=&#34;background-color:white;color:rgb(3, 137, 1)&#34;&gt;4.582577201968528&lt;/td&gt;
                &lt;td style=&#34;background-color:black;color:rgb(3, 137, 1)&#34;&gt;4.5825741879436475&lt;/td&gt;
                &lt;/tr&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;
                &lt;td style=&#34;background-color:rgb(194, 83, 53);color:canvastext&#34;&gt;rgb(194, 83, 53)&lt;/td&gt;
                &lt;td style=&#34;background-color:white;color:rgb(194, 83, 53)&#34;&gt;4.582573694982736&lt;/td&gt;
                &lt;td style=&#34;background-color:black;color:rgb(194, 83, 53)&#34;&gt;4.5825776949298165&lt;/td&gt;
                &lt;/tr&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;
                &lt;td style=&#34;background-color:rgb(226, 14, 123);color:canvastext&#34;&gt;rgb(226, 14, 123)&lt;/td&gt;
                &lt;td style=&#34;background-color:white;color:rgb(226, 14, 123)&#34;&gt;4.582573911685348&lt;/td&gt;
                &lt;td style=&#34;background-color:black;color:rgb(226, 14, 123)&#34;&gt;4.5825774782270265&lt;/td&gt;
                &lt;/tr&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;
                &lt;td style=&#34;background-color:rgb(207, 57, 134);color:canvastext&#34;&gt;rgb(207, 57, 134)&lt;/td&gt;
                &lt;td style=&#34;background-color:white;color:rgb(207, 57, 134)&#34;&gt;4.582574731368912&lt;/td&gt;
                &lt;td style=&#34;background-color:black;color:rgb(207, 57, 134)&#34;&gt;4.58257665854297&lt;/td&gt;
                &lt;/tr&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;
                &lt;td style=&#34;background-color:rgb(169, 89, 154);color:canvastext&#34;&gt;rgb(169, 89, 154)&lt;/td&gt;
                &lt;td style=&#34;background-color:white;color:rgb(169, 89, 154)&#34;&gt;4.582577946061603&lt;/td&gt;
                &lt;td style=&#34;background-color:black;color:rgb(169, 89, 154)&#34;&gt;4.582573443851183&lt;/td&gt;
                &lt;/tr&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;
                &lt;td style=&#34;background-color:rgb(118, 108, 181);color:canvastext&#34;&gt;rgb(118, 108, 181)&lt;/td&gt;
                &lt;td style=&#34;background-color:white;color:rgb(118, 108, 181)&#34;&gt;4.58257700240974&lt;/td&gt;
                &lt;td style=&#34;background-color:black;color:rgb(118, 108, 181)&#34;&gt;4.582574387502314&lt;/td&gt;
                &lt;/tr&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;
                &lt;td style=&#34;background-color:rgb(214, 11, 182);color:canvastext&#34;&gt;rgb(214, 11, 182)&lt;/td&gt;
                &lt;td style=&#34;background-color:white;color:rgb(214, 11, 182)&#34;&gt;4.5825744373751665&lt;/td&gt;
                &lt;td style=&#34;background-color:black;color:rgb(214, 11, 182)&#34;&gt;4.582576952536859&lt;/td&gt;
                &lt;/tr&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;
                &lt;td style=&#34;background-color:rgb(207, 13, 204);color:canvastext&#34;&gt;rgb(207, 13, 204)&lt;/td&gt;
                &lt;td style=&#34;background-color:white;color:rgb(207, 13, 204)&#34;&gt;4.582575574969581&lt;/td&gt;
                &lt;td style=&#34;background-color:black;color:rgb(207, 13, 204)&#34;&gt;4.5825758149421025&lt;/td&gt;
                &lt;/tr&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;
                &lt;td style=&#34;background-color:rgb(101, 98, 242);color:canvastext&#34;&gt;rgb(101, 98, 242)&lt;/td&gt;
                &lt;td style=&#34;background-color:white;color:rgb(101, 98, 242)&#34;&gt;4.582577110830905&lt;/td&gt;
                &lt;td style=&#34;background-color:black;color:rgb(101, 98, 242)&#34;&gt;4.5825742790812125&lt;/td&gt;
                &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Another consideration is color blindness. Here are the colors using a &lt;a href=&#34;https://davidmathlogic.com/colorblind/#%23038901-%23C25335-%23E20E7B-%23CF3986-%23A9599A-%23766CB5-%23D60BB6-%23CF0DCC-%236562F2&#34;&gt;color blindness tool&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So for me, some of the obvious color combinations would have been awful for someone with color blindness. This is the full list:&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/screenshot-2025-09-29-114946.png&#34; width=&#34;600&#34; height=&#34;985&#34; alt=&#34;grid of colors with columns for each type of common color blindness&#34;&gt;
&lt;p&gt;And here is what I would have picked without checking first:&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/screenshot-2025-09-29-115439.png&#34; width=&#34;600&#34; height=&#34;340&#34; alt=&#34;&#34;&gt;
&lt;p&gt;Which for those with protanopia or deuteranopia those colors would be hard to distinguish. So in the end I decided my quick side projects would use these colors:&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/screenshot-2025-09-29-121126.png&#34; width=&#34;600&#34; height=&#34;357&#34; alt=&#34;&#34;&gt;
&lt;p&gt;Which look visually different across the three common color blindness types.&lt;/p&gt;
&lt;p&gt;That makes my new side project default css the following:&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;color-scheme&lt;/span&gt;:light dark;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;background-color&lt;/span&gt;:canvas;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;color&lt;/span&gt;:canvastext;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;color&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;#6562F2&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;:&lt;span style=&#34;color:#a6e22e&#34;&gt;visited&lt;/span&gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;color&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;#E20E7B&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Since &lt;strong&gt;Color&lt;/strong&gt; was a prompt for the 2024 Weird Web October challenge and I&amp;rsquo;m still trying to catch up on that challenge a year later I &lt;a href=&#34;https://weirdweboctober.heyloura.com/2024-03-color.html&#34;&gt;added it to my collection&lt;/a&gt;. Besides list the colors above, it lists 9 additional colors that the contrast on black and white are as far apart as they can be while still retaining a minimum contrast ratio of 3.&lt;/p&gt;
&lt;h2 id=&#34;interactive-example&#34;&gt;Interactive Example&lt;/h2&gt;
&lt;p&gt;Here is an interactive example that calculates the contrast values on two different background colors. The &amp;ldquo;JS&amp;rdquo; tab holds the logic and the &amp;ldquo;Results&amp;rdquo; shows the results. Try selecting some different colors on the results tab. A contrast rating above 3.0 is considered AA on large text. If you want to see the calculation I did for the table earlier in the post you can &lt;a href=&#34;https://code.heyloura.com/color-contrast-on-black-white-backgrounds.html&#34;&gt;check it out here&lt;/a&gt;. I didn&amp;rsquo;t include it because it iterates over every color combination and it can be a bit slow to load the results tab.&lt;/p&gt;
&lt;iframe style=&#34;width:100%&#34; src=&#34;https://code.heyloura.com/color-contrast-on-choose-your-own-backgrounds.html&#34;&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m not sure how practical this is for anything other than a quick side project. It doesn&amp;rsquo;t take to many extra bytes to add in some media queries in CSS to pick separate colors with better contrast for dark and light backgrounds. But I always like to see how simple you can push things so I&amp;rsquo;m happy to have found some sort of answer.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>End of September Blog Updates</title>
      <link>https://heyloura.com/2025/09/28/end-of-september-blog-updates.html</link>
      <pubDate>Sun, 28 Sep 2025 11:29:08 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/09/28/end-of-september-blog-updates.html</guid>
      <description>&lt;h2 id=&#34;blog-theme&#34;&gt;Blog Theme&lt;/h2&gt;
&lt;p&gt;Despite how busy everything has been, I&amp;rsquo;ve managed to squeeze in a couple of updates to my blog. The first one is a bit of a redesign. I&amp;rsquo;ve toned down the RPG vibe and moved it to a dark mode color scheme and since Halloween is right around the corner I added a little holiday decoration to the top. I love the cute dancing skeleton. I did take a screen shot of the last design and I&amp;rsquo;ll add it to my &lt;a href=&#34;https://heyloura.com/categories/change-log/&#34;&gt;change log&lt;/a&gt; category soon.&lt;/p&gt;
&lt;p&gt;The biggest change is the structure. I decided to de-emphasize the short posts for the time being. They will appear at the top section (one at a time) for a bit and will remain on category pages but I&amp;rsquo;ve removed them from the archive list.&lt;/p&gt;
&lt;p&gt;The second largest change was that I built this theme to be more general, most of my others have been so highly customized that I couldn&amp;rsquo;t really share the theme. I would tie parts directly to how I named categories or hard-code links. This time I built it with the intent to share, meaning all my personal customizations are in the Custom CSS and Custom footer part of Micro.blog. Now, I do have quite a few updates I want to do before releasing it as a public Micro.blog theme, but I&amp;rsquo;m happy with the progress I made this weekend. And just to set expectations, I would like to share it before the new year, but&amp;hellip; I do have two tai chi and kung fu tournaments I&amp;rsquo;m prepping for so I won&amp;rsquo;t have much time to work on it until December.&lt;/p&gt;
&lt;h2 id=&#34;code-editor&#34;&gt;Code Editor&lt;/h2&gt;
&lt;p&gt;It has also been on my radar that Glitch shutdown and I had a couple of older blog posts that linked to little projects I had hosted on them. Which is one more reason to host my own code samples. So, I built my own little &amp;ldquo;lite&amp;rdquo; code editor this weekend. It can only handle HTML, CSS, and JavaScript and then output the result in a iframe. Using my Fastmail storage I set up a folder to host these code samples as little websites so I can embed them in blog posts. Though I only have one up at the moment for an upcoming blog post you can check them out at &lt;a href=&#34;https://code.heyloura.com/&#34;&gt;code.heyloura.com&lt;/a&gt; (Note, this one loops through all RGB color values&amp;hellip; so 256 * 256 * 256, which means the result tab takes a couple of seconds to load). It is also interactive so if you make changes to the CSS, HTML, or JS you&amp;rsquo;ll see updated changes in the &amp;ldquo;Result&amp;rdquo; tab.&lt;/p&gt;
&lt;p&gt;Now that I have this built out I can create more samples and go back to replace my broken Glitch ones when I have some time. Yay!&lt;/p&gt;
&lt;h2 id=&#34;weird-web-october&#34;&gt;Weird Web October&lt;/h2&gt;
&lt;p&gt;Last year I started strong&amp;hellip; for all of two days 😜. My goal is a least three submissions this time around. So to begin prepping I moved my prior submissions off of Micro.blog which I had been building with my theme. They now have a spot here at &lt;a href=&#34;https://weirdweboctober.heyloura.com/&#34;&gt;&lt;a href=&#34;https://weirdweboctober.heyloura.com/&#34;&gt;https://weirdweboctober.heyloura.com/&lt;/a&gt;&lt;/a&gt;. Then! as an added bonus I completed one more submission for last year&amp;rsquo;s Day 3 prompt &lt;a href=&#34;https://weirdweboctober.heyloura.com/2024-03-color.html&#34;&gt;Color&lt;/a&gt;. Hence my one current code sample, which I used to do the calculations :)&lt;/p&gt;
&lt;p&gt;If I have time, I&amp;rsquo;d like to fill up all the prompts for last year and this year&amp;hellip; but I&amp;rsquo;m giving myself an unlimited deadline to get it done.&lt;/p&gt;
&lt;h2 id=&#34;october-plans&#34;&gt;October plans&lt;/h2&gt;
&lt;p&gt;This is more of a personal todo list to remind me, but I need to go through and&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update my broken Glitch code samples on blog posts&lt;/li&gt;
&lt;li&gt;Update any Weird Web October links in blog posts&lt;/li&gt;
&lt;li&gt;Write a post on &amp;ldquo;What colors on a webpage work equally as well on white and black backgrounds while maintaining Web Content Accessibility Guidelines?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Write a post about building my little code editor&lt;/li&gt;
&lt;li&gt;Have fun with at least three Weird Web October submissions!&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <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>An ICRPG Hard Suit campaign - Session 0 Prep</title>
      <link>https://heyloura.com/2025/08/05/an-icrpg-hard-suit-campaign.html</link>
      <pubDate>Tue, 05 Aug 2025 09:07:13 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/08/05/an-icrpg-hard-suit-campaign.html</guid>
      <description>&lt;p&gt;So for the last few years I&amp;rsquo;ve been doing a Dungeon Crawl Classics, DCC, game in my dining room while the kids play their own game upstairs. But schedules being what they are, it has been increasingly difficult to find a time slot that worked for everyone. So playing once every six to eight weeks was common and now that their characters have gone up several levels in DCC&amp;hellip; The amount of flipping through books to find rules or even just remember character abilities takes up a lot of our play time.&lt;/p&gt;
&lt;p&gt;Thankfully we found time on Saturday to play. The only catch was that most of the kids couldn&amp;rsquo;t make it. So I floated the idea of trying a new system with a one-shot game and have my son and his friend join us.&lt;/p&gt;
&lt;p&gt;I geeked out all last week trying to figure out what systems were out there and what sounded fun and easy to prep and teach. I thought of &lt;a href=&#34;https://www.runehammer.online/index-card-rpg&#34;&gt;Index Card RPG&lt;/a&gt; which us a rules-light system that I explored when I was tinkering with &lt;a href=&#34;https://heyloura.com/2025/04/21/to-relax-ive-been-reading.html&#34;&gt;a solo hex-flower dungeon&lt;/a&gt;. They have a hex-crawl world that looked interesting and bonus! You don&amp;rsquo;t need to prep characters beforehand. You discover them as you play. Sold! It&amp;rsquo;s called &lt;a href=&#34;https://www.runehammer.online/online-store/ICRPG-Hard-Suit-PDF-p495682013&#34;&gt;Hard Suit&lt;/a&gt;. Absolute blast. Now I&amp;rsquo;m going to show pictures of some of the prep I did, which will contain spoilers to the discovery nature of the play. If you think you might play this system as a player I suggest you enjoy the cute picture of my cat Fuzzyboots being a Game Master and then stop reading.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250310-124731.jpg&#34; width=&#34;600&#34; height=&#34;599&#34; alt=&#34;Auto-generated description: A cat sits on a table behind a Dungeon Master&#39;s screen in a room with a patterned chair.&#34;&gt;
&lt;h2 id=&#34;prepping-the-game&#34;&gt;Prepping the game&lt;/h2&gt;
&lt;p&gt;I love the discovery aspect of character creation. You play as characters that have been in suspended animation and upon awakening they  have no memories of what is going on. One part of discovering themselves is catching a reflection in a mirror, glancing at their hands, and recovering a small fragment of a memory. There are helpful tables in the PDF to roll&amp;hellip; but I didn&amp;rsquo;t want the rolling to slow down the game. So I wrote all the pieces of information out on little index cards and grabbed a cute pouch so they could draw one at random when the time was right. This was a big hit.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250802-154219.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: A yellow bag with How Are You? written on it is next to several cards with handwritten messages and a paper fortune.&#34;&gt;
&lt;p&gt;You might have noticed the &amp;ldquo;fortune cookie&amp;rdquo; looking paper. The players discover lockers with their name on them and inside they have four items. Things like clothing, weapons, utilities and something personal. Four things to roll on the random table and six players? No thank you. As I said I wanted easy and fast. So I whipped up a random &amp;ldquo;personal locker&amp;rdquo; generator and cut out the results. It was so much faster during play time. Plus a couple of the players liked that they could be secretive about what they found instead of me announcing everything. It made for some interesting role-playing.&lt;/p&gt;
&lt;p&gt;Next they discovered these strange hard suits. And&amp;hellip; there is a lot to roll to generate them. Which needed to be done beforehand so I could describe them when they were discovered. Guess what? I made a generator 🤣&lt;/p&gt;
&lt;p&gt;Here you go: &lt;a href=&#34;https://heyloura.com/blank-icrpg-hs-generator/&#34;&gt;A personal locker and hard suit generator of Hard Suit ICRPG&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also created a little book, by pasting an image from the pdf on a dollar store kraft notebook, so they could keep track of any suits they managed to find (and keep 😉). The bottom slip of paper is an included character sheet for the hard suits, I just resized it.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250802-153939.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: A tabletop RPG character sheet with a robot design, including game stats and properties, is arranged on a wooden surface.&#34;&gt;
&lt;h2 id=&#34;tracking-things&#34;&gt;Tracking Things&lt;/h2&gt;
&lt;p&gt;Another interesting part of discovery play is that you don&amp;rsquo;t roll character stats or look through the book for abilities and classes. Those things are all granted by me, as the GM, as play happens. But there is no easy way in the PDF to track them. [dramatic voice]&amp;hellip;Oh no&amp;hellip; I&amp;rsquo;ll need to make something in my GM notebook [end dramatic voice].&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250805-081807.jpg&#34; width=&#34;600&#34; height=&#34;800&#34; alt=&#34;Auto-generated description: A journal page showcases a game layout with titled sections for Mastery Pts, Hero, Abilities, Effort, Stats, and notes all organized in a grid format.&#34;&gt;
&lt;p&gt;There is also a large table in the PDF for abilities that the characters can discover they have. They&amp;rsquo;re listed in alphabetical order, with fun names, which makes sense but I thought it might make it hard during play to note who was role-playing something I could assign an ability to. So I grouped them by &amp;ldquo;category&amp;rdquo;, simplified the names and put it into my GM notebook.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250805-082442.jpg&#34; width=&#34;600&#34; height=&#34;800&#34; alt=&#34;Auto-generated description: A notebook page outlines various abilities categorized into sections, including Build + Fix, Fight, Defend, Magic, Survival, Knowledge, Profession, Social, and Location Sense.&#34;&gt;
&lt;h2 id=&#34;battlemaps-versus-art-cards&#34;&gt;Battlemaps versus Art Cards&lt;/h2&gt;
&lt;p&gt;Battlemaps? No thank you. Maybe I&amp;rsquo;m just a bit exhausted but the idea of finding the perfect tiles or sketching out several large dry erase maps for the game. It just seemed like too much work.&lt;/p&gt;
&lt;p&gt;I really love the art cards that were created for Index Card RPG. So I downloaded the bundle of all four sets, printed them out to approximately playing card size and got paper cutting. Then I tossed them into some clear sleeves to make them a bit more durable. It was fun and the cats loved making a mess of the paper clippings 😻&lt;/p&gt;
&lt;p&gt;This is the first scene my players find themselves.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250802-154525.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: A series of cards featuring black-and-white illustrations of robots and various mechanical equipment are laid out on a wooden surface.&#34;&gt;
&lt;p&gt;For movement, I think I&amp;rsquo;m going to take inspiration from this reddit thread: &lt;a href=&#34;https://www.reddit.com/r/rpg/comments/xr3wj2/a_complete_guide_for_zone_based_index_card_combat/&#34;&gt;A complete guide for zone based index cards&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;end-notes&#34;&gt;End Notes&lt;/h2&gt;
&lt;p&gt;And that&amp;rsquo;s it for prep. Instead of character sheets, I&amp;rsquo;m giving out dollar store notebooks. Instead of prepping every detail in the scenario I&amp;rsquo;m going to &lt;a href=&#34;https://www.enworld.org/threads/why-im-introducing-the-oracle-to-my-d-d-game-and-reducing-my-own-dm-authority.695320/&#34;&gt;let an oracle decide most things&lt;/a&gt;. I want a more collaborative role-playing experience this time around :)&lt;/p&gt;
&lt;p&gt;P.S. The first session was an absolute blast 🥰&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Blaugust 2025</title>
      <link>https://heyloura.com/2025/08/01/blaugust.html</link>
      <pubDate>Fri, 01 Aug 2025 18:55:02 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/08/01/blaugust.html</guid>
      <description>&lt;p&gt;I think I might try and post more this month and so are some others with &lt;a href=&#34;https://nerdgirlthoughts.game.blog/2025/07/10/blaugust-2025-is-coming/&#34;&gt;Blaugust 2025&lt;/a&gt;. This is a collection post to gather up any posts I make this month. I have a personal goal of 15 posts this month across the normal things I post about: life, coding projects, and homeschooling. Let&amp;rsquo;s see what happens 🤣&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2025/08/01/seventh-grade-for.html&#34;&gt;🐲 Seventh Grade for 2024/2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2025/08/05/an-icrpg-hard-suit-campaign.html&#34;&gt;An ICRPG Hard Suit campaign - Session 0 Prep&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>🐲 Seventh Grade for 2024/2025</title>
      <link>https://heyloura.com/2025/08/01/seventh-grade-for.html</link>
      <pubDate>Fri, 01 Aug 2025 11:48:45 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/08/01/seventh-grade-for.html</guid>
      <description>&lt;style&gt;
.book { 
width: 190px !important;
height: 290px !important;
}
h3 { border-bottom: 1px solid var(--Subtext0); }
&lt;/style&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#writing&#34;&gt;Writing, Spelling, Grammar, and Literature&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#science&#34;&gt;Science and Mathematics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#inter&#34;&gt;Interdisciplinary Studies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#art&#34;&gt;Art, Physical Education, and Health&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So last year and this year so far have been intense. And not in a good way. Which is why it&amp;rsquo;s taken me so long to write down what my kids have been doing for homeschooling. But better late than never 😅&lt;/p&gt;
&lt;p&gt;I did make some micro posts about the school year. You can check them out if you&amp;rsquo;d like&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2024/12/30/its-that-time-of-the.html&#34;&gt;Homeschooling costs for the 24/25 school year&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2024/09/27/seventh-grade-homeschool.html&#34;&gt;Homeschooling 7th Grade Schedule&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My child decided that they would not set foot back in public school until high school. So unlike other years where I approached homeschooling with a (mostly) rosy attitude, this year I felt I was between a rock and a hard place. Nevertheless, after weighing the options I decided homeschooling, at least for now, was the better option. They had a strong and fond memories of a twice-a-week homeschooling group they could attend and I knew that group would be supportive. Plus academics suffered last year and I felt that taking time to re-solidify the material (especially in math) was important.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/20240903t095524.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: A person sitting at a desk is petting a cat that is walking across it, with shelves, a lamp, and a map in the background.&#34;/&gt;
&lt;h1 id=&#34;course-of-study&#34;&gt;Course of Study&lt;/h1&gt;
&lt;h2 id=&#34;writing&#34;&gt;Writing, Spelling, Grammar and Literature&lt;/h2&gt;
&lt;h3 id=&#34;writing-spelling-and-grammar&#34;&gt;Writing, Spelling and Grammar&lt;/h3&gt;
&lt;p&gt;Writing and grammar this year were covered by a fun set of books I found that I thought were right up my child&amp;rsquo;s alley. They are the type of kid who memorizes Edgar Allen Poe poetry in their free time. This was a hit. I never had any issues with getting them to complete their lessons using &lt;a href=&#34;https://mintandbloomlearning.com/store/p/melancholy-grammar-workbooks-complete-bundle?rq=grammar&#34;&gt;Melancholy Grammar&lt;/a&gt;. They loved listening to the recommended podcasts and crafting stories from random prompts.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/41.png&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
&lt;p&gt;They also had writing sprinkled in from their Falcons class (more on that below) and for the last half of the school year I found a creative writing class on Outschool from a published young adult author who taught about structuring fiction stories and gave one-on-one feedback. Spelling was more, grit your teeth and get it done&amp;hellip; We used &lt;a href=&#34;https://spellingyousee.com/&#34;&gt;Spelling You See&lt;/a&gt; this year because I was hoping a more visual approach would help. By the end of this year I think the issue is less with the mechanics of spelling and more with the lack of attention for spelling. Sigh. I&amp;rsquo;ve also noticed they tend to spell things correctly if someone other than me is going to be reading it. So, I might let this subject go next year and reassess mid-year.&lt;/p&gt;
&lt;h3 id=&#34;literature&#34;&gt;Literature&lt;/h3&gt;
&lt;p&gt;I just let them pick a bunch of books to read in the first half of the year to get the joy back. Then for the second half of the year I found a cool Outschool class on banned books. This class assigned a book to read without letting the kids know why it was banned. Then they&amp;rsquo;d meet and discuss it over zoom and see if they could figure it out. Having to puzzle out the &amp;ldquo;why&amp;rdquo; kept my kid really engaged in the book.&lt;/p&gt;







&lt;ul class=&#34;bookshelf bookshelf--variant-grid&#34;&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;In the House of the Seven Librarians by Ellen Klages&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/1933500980&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fheyloura.com%2Fuploads%2F2024%2F51leu-ezzal.-uf10001000-ql80-.jpg&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/1933500980&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;In the House of the Seven Librarians&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Ellen Klages&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Artemis Fowl by Eoin Colfer&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781423132172&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DD9TKSKS74MwC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781423132172&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Artemis Fowl&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Eoin Colfer&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Spinning Silver: A Novel by Naomi Novik&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780399181009&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DoF1BDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780399181009&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Spinning Silver: A Novel&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Naomi Novik&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Howl&amp;#39;s Moving Castle by Diana Wynne Jones&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780064410342&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Df3RHPfF7uCwC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780064410342&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Howl&amp;#39;s Moving Castle&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Diana Wynne Jones&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Among the Impostors by Margaret Peterson Haddix&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780689848087&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DBlAE8ssxPv0C%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780689848087&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Among the Impostors&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Margaret Peterson Haddix&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Over Sea, Under Stone by Susan Cooper&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781442458956&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D_QUoMfnzCPsC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781442458956&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Over Sea, Under Stone&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Susan Cooper&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Ocean: A Visual Encyclopedia by DK&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781465436641&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D6Y-PEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781465436641&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Ocean: A Visual Encyclopedia&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;DK&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Nature&amp;#39;s Best Hope by Douglas W. Tallamy&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781604699005&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DFDqRDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781604699005&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Nature&amp;#39;s Best Hope&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Douglas W. Tallamy&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Absolutely True Diary of a Part-Time Indian (National Book Award Winner) by Sherman Alexie&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780316219303&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DcgVmAgAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780316219303&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Absolutely True Diary of a Part-Time Indian (National Book Award Winner)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Sherman Alexie&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Ocean Anatomy by Julia Rothman&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781635863482&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DswbdDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781635863482&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Ocean Anatomy&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Julia Rothman&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Nimona by Noelle Stevenson&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780062278227&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DMXizoQEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780062278227&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Nimona&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Noelle Stevenson&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Left-Handed Fate by Kate Milford&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780805098006&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dy9mkDAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780805098006&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Left-Handed Fate&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Kate Milford&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Girl Who Drank the Moon (Winner of the 2017 Newbery Medal) by Kelly Barnhill&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781616206567&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DaF93CwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781616206567&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Girl Who Drank the Moon (Winner of the 2017 Newbery Medal)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Kelly Barnhill&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Facemaker by Lindsey Fitzharris&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780374719661&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D5ao9EAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780374719661&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Facemaker&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Lindsey Fitzharris&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Will My Cat Eat My Eyeballs? by Caitlin Doughty&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781432872274&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DVt-yyAEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781432872274&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Will My Cat Eat My Eyeballs?&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Caitlin Doughty&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
&lt;/ul&gt;

&lt;hr/&gt;
&lt;h2 id=&#34;science&#34;&gt;Science and Mathematics&lt;/h2&gt;
&lt;h3 id=&#34;microbiology-and-genetics&#34;&gt;Microbiology and Genetics&lt;/h3&gt;
&lt;p&gt;Anything with a microscope tends to be a hit with this kid. So once again I pulled out the &lt;a href=&#34;https://sciencemom.teachable.com/p/biology-bundle&#34;&gt;Science Mom Microbiology and Genetics&lt;/a&gt; course. Both my kids have loved these courses. And I find it charming that while doing art projects my kid just re-listens to the lectures. She must have listened to the one on smallpox a dozen times by now.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/signal-2024-12-26-16-19-25-573.jpg&#34; width=&#34;600&#34; height=&#34;800&#34; alt=&#34;Auto-generated description: A person dressed in winter clothing and gloves is posing energetically on a snowy path in a forested area.&#34;&gt;
&lt;h3 id=&#34;astronomy&#34;&gt;Astronomy&lt;/h3&gt;
&lt;p&gt;Science mom also released a course on &lt;a href=&#34;https://sciencemom.teachable.com/p/astronomy&#34;&gt;Astronomy&lt;/a&gt; during the spring and my kids &lt;strong&gt;love&lt;/strong&gt; joining the classes while they are &amp;ldquo;live&amp;rdquo; so they can answer polls and ask questions and might get a shout-out. So even though it doubled up the science my kid was 100% game.&lt;/p&gt;
&lt;h3 id=&#34;pre-algebra&#34;&gt;Pre-algebra&lt;/h3&gt;
&lt;p&gt;Math&amp;hellip;. yikes&amp;hellip;. math. Okay so this was soooo rusty.&lt;/p&gt;
&lt;p&gt;The goal was to get them caught back up so they could do Algebra I next year. Now this was a personal goal of theirs. They have many talents and loves and one of those is science. And they know science builds upon math and in high school they want to be on the STEM track.Guys&amp;hellip; math almost killed me this year (and them I assume 😆). We started with &lt;a href=&#34;https://www.derekowens.com/course_info_prealgebra.php&#34;&gt;Derek Owens&lt;/a&gt; which has worked perfectly for my other child. This one, not so much. So then we tried &lt;a href=&#34;https://www.mathmammoth.com/complete/grade_7&#34;&gt;Math Mammoth&lt;/a&gt;. Utter disaster. Then I tried &lt;a href=&#34;https://www.criticalthinking.com/understanding-pre-algebra.html&#34;&gt;Understanding Pre-algebra&lt;/a&gt;. I got nowhere. Finally I got an adaptive math program, &lt;a href=&#34;https://www.aleks.com/&#34;&gt;ALEKS&lt;/a&gt;, online, because I could not figure out what else to do and just made them do an hour a day (jumping in to help when they didn&amp;rsquo;t understand a topic).&lt;/p&gt;
&lt;p&gt;Somehow they aced the math portion of the end of the year standardized test I give them. And I also found some potential Algebra classes for next year, contacted the teachers, and had them give her a readiness assessment. Not stellar, but they did indicate readiness for Algebra next year.&lt;/p&gt;
&lt;p&gt;Whew&amp;hellip;&lt;/p&gt;
&lt;p&gt;And I learned an important lesson. When my kids become pre-teens I need to back off teaching math. It hasn&amp;rsquo;t worked for either of them. 🤣&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id=&#34;inter&#34;&gt;Interdisciplinary Studies&lt;/h2&gt;
&lt;p&gt;Back to the online Falcon&amp;rsquo;s group with the occasional in person meet-up.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250420-102554.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;p&gt;They contributed pieces to the weekly newsletter/paper and performed in the annual Halloween play. Once again they covered a wide variety of topics (that I&amp;rsquo;m not doing justice) that included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the People&amp;rsquo;s Puppet Parade and Purim&lt;/li&gt;
&lt;li&gt;Nationalism and World Wars&lt;/li&gt;
&lt;li&gt;Ledgers and formatting financial transactions&lt;/li&gt;
&lt;li&gt;Repercussions of extended space visits on Astronauts bodies&lt;/li&gt;
&lt;li&gt;Endangered species, adaptations, and neoteny&lt;/li&gt;
&lt;li&gt;Persian new year, Nowruz&lt;/li&gt;
&lt;li&gt;The crafting of Roman coins and the history of money&lt;/li&gt;
&lt;li&gt;Symbolism in the book “Spinning Silver” by Naomi Novik&lt;/li&gt;
&lt;li&gt;Holi the festival of color&lt;/li&gt;
&lt;li&gt;How molds were made before 3d printing, metal casting&lt;/li&gt;
&lt;li&gt;Samoa and fa&amp;rsquo;afafine, studying history through the lens of different cosmologies, gender stereotypes of different cultures.&lt;/li&gt;
&lt;li&gt;Cultural stereotypes around gendered clothing and hair.&lt;/li&gt;
&lt;li&gt;Liminal Space&lt;/li&gt;
&lt;li&gt;Late We&amp;rsquo;wha from the Zuni tribe&lt;/li&gt;
&lt;li&gt;Why do the money systems of different countries have different values?&lt;/li&gt;
&lt;li&gt;Spreading information or disinformation&lt;/li&gt;
&lt;li&gt;What it means to be open minded and the difference between how people think, versus what they think.&lt;/li&gt;
&lt;li&gt;The Black Death, rats, and leftover resources leading to cheap paper&lt;/li&gt;
&lt;li&gt;Currency, counterfeiting and prevention.&lt;/li&gt;
&lt;li&gt;Developing a money system for use in class and hosting a makers fairs with a base 5 money system, ledger, taxes, and paying civic “employees”&lt;/li&gt;
&lt;li&gt;Decomposition, death, and cultural burial traditions.&lt;/li&gt;
&lt;li&gt;Ellis island and immigration&lt;/li&gt;
&lt;li&gt;Factories, products, and planned obsolescence. Environmental and economical impacts&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id=&#34;art&#34;&gt;Art, Physical Education, and Health&lt;/h2&gt;
&lt;p&gt;Art was a free for all. They would tell me what they were interested in and I&amp;rsquo;d get them supplies and find teachers on Outschool. The top mediums were clay, painting, and digital animation.&lt;/p&gt;
&lt;p&gt;P.E. was the swim team at the local YMCA. Besides swimming six hours a week and then attending multiple swim meets a month, the coaches reviewed healthy eating and how to take care of the body as an athlete. They even won &amp;ldquo;Most Improved Swimmer&amp;rdquo; at the end of the year banquet 🥰&lt;/p&gt;
&lt;p&gt;For health we attended &lt;a href=&#34;https://www.stanfordchildrens.org/en/classes/class-detail?evt=EB210077025037&amp;amp;id=219597992507&amp;amp;title=the-chat-a-5-part-series-on-puberty-and-growing-up&#34;&gt;the chat form Stanford Medicine&lt;/a&gt;&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;Whew. This year was a lot. And even now in August I&amp;rsquo;m not recovered from it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mini Coding Adventure: a personal web desktop</title>
      <link>https://heyloura.com/2025/07/08/mini-coding-adventure-a-personal.html</link>
      <pubDate>Tue, 08 Jul 2025 16:34:29 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/07/08/mini-coding-adventure-a-personal.html</guid>
      <description>&lt;p&gt;So last night when I was sitting down and watching an episode of &amp;ldquo;The Mole&amp;rdquo; on Netflix, inspiration struck and dusted off one of my old web projects that I had kicking around. At one point in time, my blog had a desktop theme. I really enjoyed it but then I went back to my old standby of an RPG look. It&amp;rsquo;s been in the back of my mind to revive the desktop theme, but I&amp;rsquo;m not sure it&amp;rsquo;s suited for a blog. When I found 7.css I had some fun &lt;a href=&#34;https://heyloura.com/2025/02/11/coding-adventure-microblog-private-notes.html#a-dragons-hoard-must-be-shiny-&#34;&gt;envisioning the desktop look as a Micro.blog client&lt;/a&gt; but then set it aside.&lt;/p&gt;
&lt;p&gt;What I&amp;rsquo;m thinking is to build a personal web desktop, for all the various services I use online that offer API&amp;rsquo;s I can play with. I&amp;rsquo;ll start with Micro.blog since I&amp;rsquo;ve got quite a bit of experience building little side projects with it and using it&amp;rsquo;s private notes as data storage.&lt;/p&gt;
&lt;p&gt;As you can see from the screenshot, it&amp;rsquo;s the windowing I&amp;rsquo;m most enamored with.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/screenshot-from-2025-02-11-14-42-22.png&#34; width=&#34;600&#34; height=&#34;288&#34; alt=&#34;Auto-generated description: Several overlapping windows on a computer screen display a chat conversation, a photograph of a botanical garden, and other desktop icons set against a colorful, checkered background.&#34;&gt;
&lt;p&gt;I&amp;rsquo;m thinking it could be a good project for small web July.&lt;/p&gt;
&lt;p&gt;My rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No CSS framework outside of 7.css.&lt;/li&gt;
&lt;li&gt;No JavaScript frameworks. I&amp;rsquo;ll write it all from scratch using plain old JavaScript.&lt;/li&gt;
&lt;li&gt;No build step. Just a single HTML page.&lt;/li&gt;
&lt;li&gt;A little Deno server for API calls&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ll probably do quick little updates instead of waiting around to finish and then doing a larger writeup.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s where I&amp;rsquo;m at after two episodes. I&amp;rsquo;ve cleaned up the UI around the notebook list and added in the buttons/radios for the actions I want to do. But I haven&amp;rsquo;t actually coded the interactions yet.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/desktop-notes-ui-updates.png&#34; width=&#34;600&#34; height=&#34;317&#34; alt=&#34;Auto-generated description: A comparison between old and new notebook interfaces is shown, with the new version offering options for editing, deleting, and restoring entries.&#34;&gt;
&lt;p&gt;Today I fixed the window resize function. Before I was using getComputedStyle to find the width and height and then using the mouse coordinates to calculate the resize from the top-left of the window. Now I&amp;rsquo;m doing the calculations from the center of the window.&lt;/p&gt;
&lt;p&gt;(I&amp;rsquo;m not sure why the cursor is so big when I did the screen record 😂)&lt;/p&gt;
&lt;p&gt;&lt;video style=&#34;width:100%;max-width:100%&#34; src=&#34;https://cdn.uploads.micro.blog/88328/2025/untitled-videomade-with-clipchamp.mp4&#34; poster=&#34;https://heyloura.com/uploads/2025/29d9efda89.png&#34; controls=&#34;controls&#34; preload=&#34;metadata&#34;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Upcoming for this week (hopefully, no promises):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Table sort when clicking on column header&lt;/li&gt;
&lt;li&gt;Radio select to enable edit, delete, import, export&lt;/li&gt;
&lt;li&gt;Add new notebook&lt;/li&gt;
&lt;li&gt;Help modal&lt;/li&gt;
&lt;li&gt;Refresh table&lt;/li&gt;
&lt;li&gt;Search the table&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>A Small Web July</title>
      <link>https://heyloura.com/2025/07/03/a-small-web-july.html</link>
      <pubDate>Thu, 03 Jul 2025 15:27:47 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/07/03/a-small-web-july.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://smallcypress.bearblog.dev/a-small-web-july/&#34;&gt;A Small Web July&lt;/a&gt; is a challenge started by &lt;a href=&#34;small_cypress@indieweb.social&#34;&gt;SmallCypress&lt;/a&gt; that inspires a break from big social media to work on personal projects. I really resonated with the &amp;ldquo;Replace scrolling with building&amp;rdquo; goal being set. I&amp;rsquo;m not one for big social media in general, preferring to spend my time on Micro.blog&amp;hellip; which i can typically get through my entire timeline in about 15 minutes with taking some extra time to dive into interesting links that were shared.&lt;/p&gt;
&lt;p&gt;I have gotten into some bad idle game habits  on my phone leaving my potential project list to grow and grow. So that&amp;rsquo;s what I&amp;rsquo;m going to focus on replacing.&lt;/p&gt;
&lt;p&gt;In Loura fashion, I whipped up an index card to track my progress. This list is meant more to inspire me and not a &amp;ldquo;must do&amp;rdquo; list. I hope to get a little progress on some if them if I can.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250703-171944.jpg&#34; alt=&#34;A planner page lists July’s goals and tasks, including competitions, projects, and various personal activities.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;I have some tai chi competitions coming up that I need to prep for, so that will be my disconnect from electronics goal. I have a couple of blog posts I&amp;rsquo;ve been meaning to get around to. And as always a bunch of ideas of things to code and play around with.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Micro.blog Photo Challenge June 2025</title>
      <link>https://heyloura.com/2025/06/30/microblog-photo-challenge-june.html</link>
      <pubDate>Mon, 30 Jun 2025 15:58:39 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/06/30/microblog-photo-challenge-june.html</guid>
      <description>&lt;p&gt;I did it! I completed all 30 prompts for the &lt;a href=&#34;https://challenges.micro.blog/2025/05/31/june-photo-challenge.html&#34;&gt;Micro.blog Photo Challenge June 2025&lt;/a&gt; and I almost did it daily.&lt;/p&gt;
&lt;div class=&#34;microblog_collection&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/compress-20230901-100446-6266.jpg&#34; alt=&#34;A person stands on the beach while others play in the surf, with sunlight casting a warm glow on the waves and distant trees.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2023/compress-20230901-100446-6266.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250601-150113-m.jpg&#34; alt=&#34;Looking up, a tall tree with a thick trunk is surrounded by lush green leaves and branches stretching outwards.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250601-150113.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/158666447f-m.jpg&#34; alt=&#34;A person is driving a go-kart on an indoor track with neon signs and lights in the background.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/158666447f.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/bf6a46637e-m.jpg&#34; alt=&#34;Two cats sit together on a sunlit wooden floor, near a window.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/bf6a46637e.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/a0da5688c2-m.jpg&#34; alt=&#34;A young child in a green shirt is attentively playing a handheld game console while sitting on a purple couch.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/a0da5688c2.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/749ca6b834-m.jpg&#34; alt=&#34;A serene lakeside scene features calm water reflecting the sky and trees, with some branches and foliage in the foreground.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/749ca6b834.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250606-121950-m.jpg&#34; alt=&#34;A frog is perched on the edge of a blue bucket outdoors, with greenery and rocks in the background.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250606-121950.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/20240711t180720-m.jpg&#34; alt=&#34;A person is holding a Nintendo Switch with Animal Crossing: New Horizons displayed on the screen while sitting with crossed legs.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/20240711t180720.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/f6a6c7d0-4579-11f0-9fd0-9f90082eece6-m.jpg&#34; alt=&#34;Tall, straight trees rise from a forest floor covered in a lush carpet of green moss.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/f6a6c7d0-4579-11f0-9fd0-9f90082eece6.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/6b6054b0-463d-11f0-9192-a346470f7f3f-m.jpg&#34; alt=&#34;A black steam locomotive with the number 220 is displayed under a covered structure near a train station.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/6b6054b0-463d-11f0-9192-a346470f7f3f.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/86b9a0a0-46e6-11f0-9841-63218fdbdcf0-m.jpg&#34; alt=&#34;A square outline and some formations made of stones and bricks are displayed on a sandy surface.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/86b9a0a0-46e6-11f0-9841-63218fdbdcf0.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/20150704t113329-m.jpg&#34; alt=&#34;A narrow crevice or gap between two rough, rocky surfaces is visible.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/20150704t113329.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/ca025bc0-486e-11f0-aa92-89b3c27e45bb-m.jpg&#34; alt=&#34;A wooden boardwalk leads into a dense, green forest surrounded by lush vegetation.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/ca025bc0-486e-11f0-aa92-89b3c27e45bb.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/00afcd70-42c4-11f0-9982-bd9b1696e226-m.jpg&#34; alt=&#34;Pink and purple flowers are silhouetted against a vibrant sunset sky with wispy clouds and a dark tree line.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/00afcd70-42c4-11f0-9982-bd9b1696e226.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/a0f42260-4a3d-11f0-ab88-551199a7712b-m.jpg&#34; alt=&#34;A unique ceramic vase with blue patterns and intertwined orange coils holds a bouquet of red tulips with yellow edges.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/a0f42260-4a3d-11f0-ab88-551199a7712b.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250616-170248-m.jpg&#34; alt=&#34;Ripples and reflections create intricate patterns on the surface of a blue pool of water.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250616-170248.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/4a9624d0-4bab-11f0-9641-355ebd114c3a-m.jpg&#34; alt=&#34;A cat is comfortably lying on someone&#39;s lap in front of a warm fireplace.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/4a9624d0-4bab-11f0-9641-355ebd114c3a.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250616-142157-m.jpg&#34; alt=&#34;Lush green and purple ferns grow out of a rocky surface.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250616-142157.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/39359a123e-m.jpg&#34; alt=&#34;A picturesque coastal landscape features a lush green hillside, a rocky shoreline, and a small village by the ocean under a partly cloudy sky.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/39359a123e.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/71b87b3d03-m.jpg&#34; alt=&#34;A traditional lion dance performance is happening in front of an outdoor wedding audience.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/71b87b3d03.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/3db2a520-4fb8-11f0-855c-a7df05e0e27c-m.jpg&#34; alt=&#34;A vibrant sunset with orange and pink hues illuminates a busy street lined with traffic lights and numerous vehicles.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/3db2a520-4fb8-11f0-855c-a7df05e0e27c.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/1000002486-m.jpg&#34; alt=&#34;A group of black crows interacts with a complex red glass sculpture, surrounded by scattered glass fragments on a white surface.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/1000002486.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250622-185932-m.jpg&#34; alt=&#34;Purple flowers grow against a stone wall with a view of the ocean in the background.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250622-185932.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/f638e050-55cb-11f0-bc4c-15b35ae62f29-m.jpg&#34; alt=&#34;Bright yellow coral-like fungi are growing among leaves and twigs on the forest floor.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/f638e050-55cb-11f0-bc4c-15b35ae62f29.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/b2e11470-55cc-11f0-a80e-0502cccc862e-m.jpg&#34; alt=&#34;A child is walking on a wooden path surrounded by lush greenery.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/b2e11470-55cc-11f0-a80e-0502cccc862e.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/f78ff9f0-55cd-11f0-a80e-0502cccc862e-m.jpg&#34; alt=&#34;Various metal sculptures resembling birds and animals are displayed on a brick pavement, along with unique decorative designs.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/f78ff9f0-55cd-11f0-a80e-0502cccc862e.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/6eab9d50-55ce-11f0-9b4c-1708190183e8-m.jpg&#34; alt=&#34;A small arrangement of pale green and purple flowers is placed on a textured gray rock surface.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/6eab9d50-55ce-11f0-9b4c-1708190183e8.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250630-163537-m.jpg&#34; alt=&#34;A person in a red cardigan and patterned dress is holding a mop over a colorful spiral-patterned rug.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250630-163537.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250626-213909-m.jpg&#34; alt=&#34;A serene ocean scene at dusk features gentle waves, a darkened beach, and silhouetted rocks against a cloudy sky.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250626-213909.jpg&#34;&gt;&lt;/div&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;https://unpkg.com/flexmasonry/dist/flexmasonry.css&#34;&gt;
&lt;script src=&#34;https://unpkg.com/flexmasonry/dist/flexmasonry.js&#34;&gt;&lt;/script&gt;
&lt;script&gt;FlexMasonry.init(&#39;.microblog_collection&#39;);&lt;/script&gt;
</description>
    </item>
    
    <item>
      <title>🐯 Ninth Grade for 2024/2025</title>
      <link>https://heyloura.com/2025/06/03/ninth-grade-for.html</link>
      <pubDate>Tue, 03 Jun 2025 20:44:21 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/06/03/ninth-grade-for.html</guid>
      <description>&lt;style&gt;
.book { 
width: 190px !important;
height: 290px !important;
}
h3 { border-bottom: 1px solid var(--Subtext0); }
&lt;/style&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#history&#34;&gt;History, Writing, and Literature&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#science&#34;&gt;Science and Mathematics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#inter&#34;&gt;Interdisciplinary Studies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#language&#34;&gt;World Languages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So last year and this year so far have been intense. And not in a good way. Which is why it&amp;rsquo;s taken me so long to write down what my kids have been doing for homeschooling. But better late than never 😅&lt;/p&gt;
&lt;p&gt;I did make some micro posts about the year. You can check them out if you&amp;rsquo;d like&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2024/12/30/its-that-time-of-the.html&#34;&gt;Homeschooling costs for the 24/25 school year&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2024/09/28/ninth-grade-homeschool.html&#34;&gt;Homeschooling 9th Grade Schedule&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So last year I sat down with my son and looked at some of the high school requirements of various colleges and universities near us. Since he was little he&amp;rsquo;s been adamant that he wanted to study science so we focused on those that had strong science programs. Then with that list of requirements we made a rough plan for the next four years.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/signal-2025-01-03-15-19-17-218.jpg&#34; height=&#34;500&#34;  alt=&#34;&#34;&gt;
&lt;h1 id=&#34;course-of-study&#34;&gt;Course of Study&lt;/h1&gt;
&lt;h2 id=&#34;history&#34;&gt;History, Writing, and Literature&lt;/h2&gt;
&lt;h3 id=&#34;history&#34;&gt;History&lt;/h3&gt;
&lt;p&gt;For history my son wanted to begin with his World History requirement. I found several strong choices and we went through each option, looking at the syllabus and the topics offered. He chose  &lt;a href=&#34;https://www.aimacademy.online/onlineclasses/history-of-africa-and-asia/&#34;&gt;World History: Africa and Asia with Aim Academy&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/20250209t111313.jpg&#34; width=&#34;500&#34;  alt=&#34;&#34;&gt;
&lt;p&gt;This class centered viewing history through the lens of Africa and Asia versus other courses that had a more European centric view. He met with the class once a week online where they discussed as a group that week&amp;rsquo;s topic. Then he had a full week of assignments, including map practice to memorize all the countries and major land features in Africa and Asia, literature to read, multiple videos to watch, and finally a dozen questions or so to answer and submit for grading. Throughout the year he had essays to write, book reviews, and papers on current topics in the news. The teacher was wonderful and met with my son to help him get back on track when the first few lessons through him for a loop.&lt;/p&gt;
&lt;p&gt;Take a look at the book list for the class:&lt;/p&gt;







&lt;ul class=&#34;bookshelf bookshelf--variant-grid&#34;&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Wild Swans by Jung Chang&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781439106495&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D0sBu1Fj4Ed0C%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781439106495&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Wild Swans&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Jung Chang&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Barefoot Gen Volume 1 by Keiji Nakazawa&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780867198416&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D_SCYEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780867198416&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Barefoot Gen Volume 1&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Keiji Nakazawa&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Foundations of Chinese Civilization by Jing Liu (Author of graphic novels)&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781611720341&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DrM4vvgAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781611720341&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Foundations of Chinese Civilization&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Jing Liu (Author of graphic novels)&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Islam by Karen Armstrong&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780679640400&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DBzD_84TQXJkC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780679640400&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Islam&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Karen Armstrong&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Lissa by Hamdy, Sherine&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781487593476&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DE6A7DwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781487593476&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Lissa&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Hamdy, Sherine&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;It&amp;#39;s Trevor Noah: Born a Crime by Trevor Noah&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780525582168&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DjdKMDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780525582168&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;It&amp;#39;s Trevor Noah: Born a Crime&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Trevor Noah&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Africa by John Reader&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780141926933&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DCD9aXbcfCroC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780141926933&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Africa&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;John Reader&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Persepolis by Marjane Satrapi&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780375422300&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DRyiIEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780375422300&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Persepolis&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Marjane Satrapi&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Ocean of Churn by Sanjeev Sanyal&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9789386057617&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DoNekDAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9789386057617&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Ocean of Churn&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Sanjeev Sanyal&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
&lt;/ul&gt;

&lt;p&gt;And here are the films they had to watch (most were very intense for him)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Woman King (2022)&lt;/li&gt;
&lt;li&gt;Cry, Freedom (1987)&lt;/li&gt;
&lt;li&gt;Hotel Rwanda (2004)&lt;/li&gt;
&lt;li&gt;Wadjda (2012)&lt;/li&gt;
&lt;li&gt;Lagaan: Once Upon a Time in India (2001)&lt;/li&gt;
&lt;li&gt;First They Killed My Father (2017)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;writing&#34;&gt;Writing&lt;/h3&gt;
&lt;p&gt;For writing he kept working with his tutor from last year. They worked on a variety of different writing tasks and he had daily free writing time. He covered filling out applications, how to write an email, editing essays, creating outlines, works cited, and how to prepare a presentation and then present it. It was a well rounded year that he enjoyed.&lt;/p&gt;
&lt;h3 id=&#34;literature&#34;&gt;Literature&lt;/h3&gt;
&lt;p&gt;For the literature portion of his ELA class we sourced a variety of books for him to read and discuss. He also practiced summarizing books and writing reviews.&lt;/p&gt;







&lt;ul class=&#34;bookshelf bookshelf--variant-grid&#34;&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Return of the King by J&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780358380252&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DDDjFywEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780358380252&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Return of the King&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;J&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Demon-Haunted World: Science as a Candle in the Dark by Carl Sagan&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780307801043&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DYz8Y6KfXf9UC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780307801043&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Demon-Haunted World: Science as a Candle in the Dark&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Carl Sagan&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Braiding Sweetgrass by Robin Kimmerer&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781571318718&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DvmM9BAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781571318718&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Braiding Sweetgrass&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Robin Kimmerer&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Legendborn by Tracy Deonn&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781534441613&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DUaNvEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781534441613&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Legendborn&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Tracy Deonn&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Count of Monte Cristo by Alexandre Dumas&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780848111731&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DJZGvEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780848111731&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Count of Monte Cristo&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Alexandre Dumas&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Taming of the Shrew In Plain and Simple English (A Modern Translation) by BookCaps&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781610428903&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DeadUuq9HdHoC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781610428903&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Taming of the Shrew In Plain and Simple English (A Modern Translation)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;BookCaps&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Book Thief by Markus Zusak&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780756984403&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D3k0PRAAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780756984403&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Book Thief&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Markus Zusak&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Ashfall by Mike Mullin&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781933718613&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DMGOUOCv58LEC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781933718613&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Ashfall&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Mike Mullin&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Fellowship of the Ring (The Lord of the Rings, Book 1) by J. R. R. Tolkien&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780007322497&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DxFr92V2k3PIC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780007322497&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Fellowship of the Ring (The Lord of the Rings, Book 1)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;J. R. R. Tolkien&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Two Towers by J. R. R. Tolkien&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780007269716&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DiJc0ax823YQC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780007269716&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Two Towers&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;J. R. R. Tolkien&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Memory of Water by Emmi Itäranta&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780062326164&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DZBDSAgAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780062326164&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Memory of Water&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Emmi Itäranta&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Life as We Knew it by Susan Beth Pfeffer&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780152061548&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dkzvx4bH0oJcC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780152061548&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Life as We Knew it&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Susan Beth Pfeffer&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Binti: The Complete Trilogy by Nnedi Okorafor&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780756415198&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DlFaJEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780756415198&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Binti: The Complete Trilogy&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Nnedi Okorafor&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
&lt;/ul&gt;

&lt;p&gt;One other aspect for literature was through a class I found on outschool. It&amp;rsquo;s called &lt;a href=&#34;https://outschool.com/classes/visual-lit-high-school-draw-your-way-through-high-school-english-language-arts-Jpmm7cHq&#34;&gt;Visual Lit High School: Draw Your Way Through High School English Language Arts&lt;/a&gt;. Here he covered poetry and short stories learning oral expression, visual interpretation, and fundamental grammar skills.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20240903-083644.jpg&#34; width=&#34;500&#34;  alt=&#34;&#34;&gt;
&lt;p&gt;Just a few of the poems, short stories, and podcasts he analyzed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“A White Heron” Sarah Orne Jewett and Emily Dickinson’s “Hope is the thing with feathers”&lt;/li&gt;
&lt;li&gt;“Nonfiction Sketchnoting Activity Part 1. Podcast: “Colors” by Radiolab&lt;/li&gt;
&lt;li&gt;“Before I Got My Eye Put Out” (336)  by Emily Dickinson&lt;/li&gt;
&lt;li&gt;“Joy” by Anton Chekhov and “I am Nobody” &amp;ldquo;I heard a Fly buzz&amp;rdquo;  by Emily Dickinson&lt;/li&gt;
&lt;li&gt;“An Occurrence at Owl Creek Bridge” by Ambrose Bierce&lt;/li&gt;
&lt;li&gt;“War” by Luigi Pirandello&lt;/li&gt;
&lt;li&gt;“This Is What It Means To Say Phoenix, AZ” by Sherman Alexie&lt;/li&gt;
&lt;li&gt;“A Ghost Story&amp;quot; by Mark Twain&lt;/li&gt;
&lt;li&gt;“How To Become a Writer” by Lorrie Moore&lt;/li&gt;
&lt;li&gt;“The Interpreter of Maladies” by Jhumpa Lahiri&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id=&#34;science&#34;&gt;Science and Mathematics&lt;/h2&gt;
&lt;h3 id=&#34;honors-biology-with-a-lab&#34;&gt;Honors Biology with a Lab&lt;/h3&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/91-jplo3-ql.-sl1500-.jpg&#34; width=&#34;200&#34;  alt=&#34;&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://taylormadescience.com/course-descriptions/&#34;&gt;Honors Biology from taylormadescience.com&lt;/a&gt; covers the typical topics of cells, genetics, microbiology, plants, animals, human anatomy and physiology, and the environment.&lt;/p&gt;
&lt;p&gt;This is the third class my son has done with this teacher and he gets a lot out of it. Every week he reads a chapter from the textbook and takes notes, watches a pre-recorded lesson and then takes a quiz, and then performs the lab with the teacher and other students and then writes up a lab report. In total there were twenty five labs including a frog dissection.&lt;/p&gt;
&lt;h3 id=&#34;understanding-our-universe-through-astronomy&#34;&gt;Understanding our Universe through Astronomy&lt;/h3&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/71xfit3towl.-sl1200-.jpg&#34; width=&#34;200&#34;  alt=&#34;&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.onlineg3.com/product/astronomy/&#34;&gt;Astronomy from g3&lt;/a&gt; was one of his electives for the spring semester that was a high school level astronomy course adapted from college-level material. He had weekly webinars and textbook readings to cover as well as articles to read and a forum with other students to post responses to questions and prompts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Motions of the Earth and Moon and the Laws of Motion&lt;/li&gt;
&lt;li&gt;Light and Telescopes&lt;/li&gt;
&lt;li&gt;The Formation of Stars and Planets&lt;/li&gt;
&lt;li&gt;The Planets and other Bodies in the Solar System&lt;/li&gt;
&lt;li&gt;The Stars and Their Evolutions (Low Mass and High Mass)&lt;/li&gt;
&lt;li&gt;Galaxies and the Milky Way&lt;/li&gt;
&lt;li&gt;The Evolution of the Universe&lt;/li&gt;
&lt;li&gt;Formation and Structure of the Universe&lt;/li&gt;
&lt;li&gt;Life in the Universe&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;His favorite part was making trading cards that looked like Magic the Gathering Cards that covered the planets, the moons, and other bodies in the solar system. His final paper for the semester was on Carl Sagan and his life as an astronomer.&lt;/p&gt;
&lt;h3 id=&#34;contributing-to-scientific-understanding&#34;&gt;Contributing to Scientific Understanding&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://athenasacademy.com/courses/contributing-to-scientific-understanding/&#34;&gt;Contributing to Scientific Understanding from Athena&amp;rsquo;s Academy&lt;/a&gt; was his elective for the fall semester. This online class had weekly webinars covering how to contribute to scientific understanding in a variety of ways as a high school student. My son chose to add to Wikipedia with additional information about invasive plant species in Massachusetts and conducted a survey of several local sites to quantify the types he found and identify them. Then he learned how Wikipedia works and how to format and submit his findings for inclusion.&lt;/p&gt;
&lt;h3 id=&#34;honors-geometry&#34;&gt;Honors Geometry&lt;/h3&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/textgeometry.jpg&#34; width=&#34;200&#34;  alt=&#34;&#34;&gt;
&lt;p&gt;I think we finally found a math that my son isn&amp;rsquo;t a fan of 😂&lt;/p&gt;
&lt;p&gt;He muddled through it though. Once again we used Derek Owens. It is a solid math program that includes short videos, a textbook, and grading services. My son thinks the textbook is personally out to get him. My son had to email Mr. Owens many different times when ideas weren&amp;rsquo;t clicking and he always got back promptly with recorded videos that help my son tackle the concept.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id=&#34;inter&#34;&gt;Interdisciplinary Studies&lt;/h2&gt;
&lt;p&gt;This will be my son&amp;rsquo;s last year with his online Falcon&amp;rsquo;s group. He&amp;rsquo;s still planning on being active with some of the online clubs the kids run and join any get-togethers that are geographically feasible.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/20250214t205209.jpg&#34; width=&#34;500&#34;  alt=&#34;&#34;&gt;
&lt;p&gt;This counted as an elective that I&amp;rsquo;m calling &amp;ldquo;Integrated Humanities.&amp;rdquo; He contributed pieces to the weekly newsletter/paper and performed in the annual Halloween play. Once again they covered a wide variety of topics (that I&amp;rsquo;m not doing justice) that included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the People&amp;rsquo;s Puppet Parade and Purim&lt;/li&gt;
&lt;li&gt;Nationalism and World Wars&lt;/li&gt;
&lt;li&gt;Ledgers and formatting financial transactions&lt;/li&gt;
&lt;li&gt;Repercussions of extended space visits on Astronauts bodies&lt;/li&gt;
&lt;li&gt;Endangered species, adaptations, and neoteny&lt;/li&gt;
&lt;li&gt;Persian new year, Nowruz&lt;/li&gt;
&lt;li&gt;The crafting of Roman coins and the history of money&lt;/li&gt;
&lt;li&gt;Symbolism in the book “Spinning Silver” by Naomi Novik&lt;/li&gt;
&lt;li&gt;Holi the festival of color&lt;/li&gt;
&lt;li&gt;How molds were made before 3d printing, metal casting&lt;/li&gt;
&lt;li&gt;Samoa and fa&amp;rsquo;afafine, studying history through the lens of different cosmologies, gender stereotypes of different cultures.&lt;/li&gt;
&lt;li&gt;Cultural stereotypes around gendered clothing and hair.&lt;/li&gt;
&lt;li&gt;Liminal Space&lt;/li&gt;
&lt;li&gt;Late We&amp;rsquo;wha from the Zuni tribe&lt;/li&gt;
&lt;li&gt;Why do the money systems of different countries have different values?&lt;/li&gt;
&lt;li&gt;Spreading information or disinformation&lt;/li&gt;
&lt;li&gt;What it means to be open minded and the difference between how people think, versus what they think.&lt;/li&gt;
&lt;li&gt;The Black Death, rats, and leftover resources leading to cheap paper&lt;/li&gt;
&lt;li&gt;Currency, counterfeiting and prevention.&lt;/li&gt;
&lt;li&gt;Developing a money system for use in class and hosting makers fairs as a base 5 system, ledger, taxes, paying civic “employees”&lt;/li&gt;
&lt;li&gt;Decomposition, death, and cultural burial traditions.&lt;/li&gt;
&lt;li&gt;Ellis island and immigration&lt;/li&gt;
&lt;li&gt;Factories, products, and planned obsolescence. Environmental and economical impacts&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id=&#34;language&#34;&gt;European Portuguese&lt;/h2&gt;
&lt;p&gt;Last up for the year was studying Portuguese. He worked with a tutor and the online program &lt;a href=&#34;https://www.practiceportuguese.com/&#34;&gt;Practice Portuguese&lt;/a&gt;. We also worked through sections of the textbook &lt;a href=&#34;https://www.amazon.com/Bom-Dia-Portuguese-Language-Textbook-ebook/dp/B06WLPXKM2/&#34;&gt;Bom Dia!&lt;/a&gt; together.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;Whew. This year was a lot and it really stretched my son. The beginning of the year was rough as he adjusted to a much higher workload and writing demands. I am so proud of what he accomplished. Next year is 10th grade and that seems both impossible to me and right around the corner. Yikes.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mini-coding concept: An in-page editor for my blog posts</title>
      <link>https://heyloura.com/2025/05/06/minicoding-concept-an-inpage-editor.html</link>
      <pubDate>Tue, 06 May 2025 12:57:47 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/05/06/minicoding-concept-an-inpage-editor.html</guid>
      <description>&lt;p&gt;For a while I&amp;rsquo;ve had my own little personal edit button on my website that redirected me to the post in edit view on Lillihub. Last week I decided that maybe I wanted something even easier, an editor inside my website. So I&amp;rsquo;ve been playing around with that idea. Once again this takes advantage of having a Micropub enabled website. I have a small little server up on Deno Deploy for now handling that part of the integration. Here is a short video I recorded that shows off the editing portion:&lt;/p&gt;
&lt;p&gt;&lt;video width=&#34;600&#34; src=&#34;https://cdn.uploads.micro.blog/88328/2025/heyloura-inpageeditor-v1.mp4&#34; controls=&#34;controls&#34; preload=&#34;metadata&#34; poster=&#34;https://heyloura.com/uploads/2025/2d552f12f8.png&#34;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Please forgive the quality. I stepped outside my comfort zone recording it, and it was either upload as-is or get stuck forever in the mire of editing/being social paralysis 😂&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;{{ .Permalink }}&#34;&gt;{{ .Title }}&lt;/a&gt;
				&lt;/li&gt;
				{{- else -}}
				&lt;li&gt;
				  &lt;a class=&#34;p-url&#34; href=&#34;{{ .Permalink }}&#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;{{ .Permalink }}&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;{{ .Permalink }}&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>2024 Weird Web October</title>
      <link>https://heyloura.com/2024/10/03/162421.html</link>
      <pubDate>Fri, 04 Apr 2025 22:13:20 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/10/03/162421.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://weirdweboctober.website/&#34;&gt;https://weirdweboctober.website/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Themes&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://weirdweboctober.heyloura.com/2024-01-nature.html&#34;&gt;Nature&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weirdweboctober.heyloura.com/2024-02-css.html&#34;&gt;CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weirdweboctober.heyloura.com/2024-03-color.html&#34;&gt;Color&lt;/a&gt; - added 9/28/2025&lt;/li&gt;
&lt;li&gt;Lists&lt;/li&gt;
&lt;li&gt;Food&lt;/li&gt;
&lt;li&gt;Notifications&lt;/li&gt;
&lt;li&gt;Science&lt;/li&gt;
&lt;li&gt;Hashtags&lt;/li&gt;
&lt;li&gt;Blessed&lt;/li&gt;
&lt;li&gt;Art&lt;/li&gt;
&lt;li&gt;API&lt;/li&gt;
&lt;li&gt;Ritual&lt;/li&gt;
&lt;li&gt;GIFs&lt;/li&gt;
&lt;li&gt;History&lt;/li&gt;
&lt;li&gt;Audio&lt;/li&gt;
&lt;li&gt;Social&lt;/li&gt;
&lt;li&gt;Dimensions&lt;/li&gt;
&lt;li&gt;Words&lt;/li&gt;
&lt;li&gt;Data&lt;/li&gt;
&lt;li&gt;Capitalism&lt;/li&gt;
&lt;li&gt;Memes&lt;/li&gt;
&lt;li&gt;Bugs&lt;/li&gt;
&lt;li&gt;IRL&lt;/li&gt;
&lt;li&gt;Cursed&lt;/li&gt;
&lt;li&gt;Interactive&lt;/li&gt;
&lt;li&gt;Chat&lt;/li&gt;
&lt;li&gt;Nostalgia&lt;/li&gt;
&lt;li&gt;Generative&lt;/li&gt;
&lt;li&gt;Forms&lt;/li&gt;
&lt;li&gt;Emoji&lt;/li&gt;
&lt;li&gt;Spooky&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Eight Silk Brocades</title>
      <link>https://heyloura.com/2025/04/04/eight-silk-brocades.html</link>
      <pubDate>Fri, 04 Apr 2025 14:04:19 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/04/04/eight-silk-brocades.html</guid>
      <description>&lt;p&gt;The eight silk brocades are a set of Qi Gong exercises meant to work and warm up muscles groups commonly used throughout the day. Especially the legs, hips, and back. I tend to use them as cool down exercises after a longer Tai Chi workout, see &lt;a href=&#34;https://heyloura.com/tai-chi/long-yang&#34;&gt;Long Yang&lt;/a&gt;, but the movements are also quite nice in the morning to wake up.&lt;/p&gt;
&lt;h2 id=&#34;eight-silk-brocades&#34;&gt;Eight Silk Brocades&lt;/h2&gt;
&lt;p&gt;Perform each exercise eight times breathing slowly. The mouth should be closed and your tongue should lightly press on the roof of your mouth. You should only take the movement to 70-80% of your maximum and you should not overextend or lock out your joints.&lt;/p&gt;
&lt;h3 id=&#34;a-note-on-breathing&#34;&gt;A Note on Breathing&lt;/h3&gt;
&lt;p&gt;Your breath should become a focus &lt;strong&gt;only after&lt;/strong&gt; you commit the exercises to memory and don&amp;rsquo;t need to focus on the mechanics of your movements. In general, inhaling means the movements are coming back to the center of the body and exhaling means the movement should be moving away from your center. You should also raise up your stance slightly when you inhale and sink down slightly when you exhale.&lt;/p&gt;
&lt;p&gt;The hardest part is that your breath should drive the movements and not the other way around. It is easy to think, &amp;ldquo;I move my hands apart and exhale&amp;rdquo; when it really should be &amp;ldquo;When I exhale, I move my hands apart&amp;rdquo;. Your breath dictates your speed.&lt;/p&gt;
&lt;h2 id=&#34;1-two-hands-hold-up-the-heavens&#34;&gt;1. Two Hands Hold up the Heavens&lt;/h2&gt;
&lt;p&gt;Stand in a neutral stance. Slowly bring your hands up, joining them together at about eye level, and continue raising them upward until they are interlaced high over your head with palms facing the sky. Slowly release letting your arms drop down to your sides ready to begin again.&lt;/p&gt;
&lt;h2 id=&#34;2-separate-heaven-and-earth&#34;&gt;2. Separate Heaven and Earth&lt;/h2&gt;
&lt;p&gt;Slowly bring your hands up but when they are a chest level push one hand down, palm down, and raise the other hand to the sky, palm up. Slowly circle your hands out to the side and around until they have traded positions. Then let the hands drift close, chest level, like you are holding an imaginary ball and do the same on the other side.&lt;/p&gt;
&lt;h2 id=&#34;3-drawing-the-bow-to-shoot-the-eagle&#34;&gt;3. Drawing the Bow to Shoot the Eagle&lt;/h2&gt;
&lt;p&gt;Feet out wide, slightly more than shoulder length, with knees bent (a horse stance). Alternate a shooting the bow motion using the waist to twist side-to-side. Make sure your knees remain over the ankles and not twisting inward or over-extending forward. If they are, you need to adjust your stance. One set is considered &amp;ldquo;shooting&amp;rdquo; both left and right.&lt;/p&gt;
&lt;h2 id=&#34;4-wise-owl-looks-backward&#34;&gt;4. Wise Owl Looks Backward&lt;/h2&gt;
&lt;p&gt;Start in a neutral stance and then look back over the shoulder. As you do so turn your palms to face outward. When you return to look front your palms will return to normal facing to the back. One set is considered looking both left and right.&lt;/p&gt;
&lt;h2 id=&#34;5-shake-the-back-and-wag-the-tail&#34;&gt;5. Shake the Back and Wag the Tail&lt;/h2&gt;
&lt;p&gt;Stand in a horse stance, placing your hands on your thighs. Starting with one corner bend forward, look down at the ground and then move from your waist to the other corner. Like you are trying to find a set of keys lost in the grass. When you reach the opposite corner from where you started bring yourself back up, gazing at the horizon. One set is considered looking both left and right.&lt;/p&gt;
&lt;h2 id=&#34;6-pull-down-the-sky-and-hold-the-feet&#34;&gt;6. Pull Down the Sky and Hold the Feet&lt;/h2&gt;
&lt;p&gt;Start in a neutral stance and let both hands float upward. When they are high overhead turn your palms to face you and bring them back down to settle on your lower back. With your hands trace down the back of your legs, bending at the waist as you do so. Go as far as you can and pause. To come up, bend your knees and pretend to sit back onto a stool while looking up at the sky.&lt;/p&gt;
&lt;h2 id=&#34;7-punch-forward-with-an-angry-gaze&#34;&gt;7. Punch Forward with an Angry Gaze&lt;/h2&gt;
&lt;p&gt;In a horse stance punch forward, alternating sides.&lt;/p&gt;
&lt;h2 id=&#34;8-bouncing-on-the-back-to-relieve-illness&#34;&gt;8. Bouncing on the Back to Relieve illness&lt;/h2&gt;
&lt;p&gt;This begins with a fold with the body and then a rounding up as you bring your hands overhead. Then if you are comfortable take a moment to bend back even further into a slight backbend. Then let your hands drop to your sides and roll up on your toes. Then drop your heels to begin again. &lt;em&gt;You can do a small hop if you are comfortable with it.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>108 Long Yang Form</title>
      <link>https://heyloura.com/2025/04/04/long-yang-form.html</link>
      <pubDate>Fri, 04 Apr 2025 14:03:20 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/04/04/long-yang-form.html</guid>
      <description>&lt;p&gt;As my Sifu always says &amp;ldquo;This is your form&amp;rdquo; and it should feel like &amp;ldquo;coming home.&amp;rdquo; After many years of practice, it finally does.&lt;/p&gt;
&lt;p&gt;The goal for beginners is to complete this form in about 15 minutes and as you advance you should slow it down. Every movement should flow into the next one and there should never be a moment where you are not moving. Advanced practitioners should aim for 40 minutes or longer.&lt;/p&gt;
&lt;h2 id=&#34;traditional-yang-tai-chi-108-movement-long-form&#34;&gt;Traditional Yang Tai Chi 108 Movement Long Form&lt;/h2&gt;
&lt;h3 id=&#34;part-one&#34;&gt;Part One&lt;/h3&gt;

&lt;style&gt;
:root {
   
  --yt-aspect-ratio-16-9: 56.25%;

   
  --yt-bg-black: #000;
  --yt-play-button-bg: rgba(255, 0, 0, 0.8);
  --yt-play-button-bg-hover: rgba(255, 0, 0, 1);
  --yt-play-button-icon: #fff;
  --yt-overlay-bg: rgba(0, 0, 0, 0.85);
  --yt-overlay-text: #fff;
  --yt-focus-outline: #e53935;

   
  --yt-play-button-width: 68px;
  --yt-play-button-height: 48px;
  --yt-play-button-border-radius: 12px;

   
  --yt-focus-outline-width: 3px;
  --yt-focus-outline-offset: 4px;

   
  --yt-transition-duration: 0.2s;
  --yt-transition-timing: ease-in-out;
}

.video-wrapper {
  position: relative;
  display: block;
  width: 100%;
  padding: 0;
  padding-bottom: var(--yt-aspect-ratio-16-9);
  margin: 0;
  height: 0;
  max-width: 100%;
  overflow: hidden;
  background-color: var(--yt-bg-black);
  cursor: pointer;
  outline: none;
  border: none;
  color: inherit;
  font: inherit;
  text-align: inherit;
  appearance: none;
  -webkit-appearance: none;
}

.video-wrapper[data-is-loaded=&#34;true&#34;] {
  cursor: auto;
}

.video-wrapper:focus-visible {
  outline: var(--yt-focus-outline-width) solid var(--yt-focus-outline);
  outline-offset: var(--yt-focus-outline-offset);
}

.video-thumbnail {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
  object-position: center;
  background-color: var(--yt-bg-black);
  z-index: 1;
  transition: opacity var(--yt-transition-duration) var(--yt-transition-timing);
}

.video-wrapper:hover .video-thumbnail {
  opacity: 0.9;
}

.video-overlay {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  background: var(--yt-overlay-bg);
  color: var(--yt-overlay-text);
  text-align: center;
  font-size: 0.85em;
  padding: 0.5em 1em;
  z-index: 2;
  pointer-events: auto;
}

.video-play-button {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--yt-play-button-width);
  height: var(--yt-play-button-height);
  background-color: var(--yt-play-button-bg);
  border-radius: var(--yt-play-button-border-radius);
  z-index: 3;
  pointer-events: none;
  transition: all var(--yt-transition-duration) var(--yt-transition-timing);
}

.video-wrapper:hover .video-play-button {
  background-color: var(--yt-play-button-bg-hover);
  transform: translate(-50%, -50%) scale(1.1);
}

.video-wrapper:active .video-play-button {
  transform: translate(-50%, -50%) scale(1.05);
}

.video-play-button::before {
  content: &#39;&#39;;
  position: absolute;
  left: 26px;
  top: 14px;
  width: 0;
  height: 0;
  border-left: 18px solid var(--yt-play-button-icon);
  border-top: 12px solid transparent;
  border-bottom: 12px solid transparent;
}

.video-wrapper iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  border: none;
  z-index: 4;
}

.video-noscript {
  display: block;
  max-width: 100%;
  background-color: var(--yt-bg-black);
  color: inherit;
  text-align: center;
  padding: 0;
  margin-top: 0.5em;
}

.video-noscript img {
  display: block;
  width: 100%;
  height: auto;
}

.video-noscript a {
  display: inline-block;
  padding: 0.75em 1em;
  color: inherit;
  text-decoration: underline;
}

.yt-text-link {
  display: none;
}
&lt;/style&gt;

&lt;script&gt;
(function(){
  &#39;use strict&#39;;

  
  const CONSTANTS = {
    VIDEO_ID_LENGTH: 11,
    MAX_INPUT_LENGTH: 2048,
    VIDEO_ID_PATTERN: /^[a-zA-Z0-9_-]{11}$/,
    PLAYLIST_PREFIXES: /^(PL|OL|UU|LL|FL)/i,
    ALLOWED_URL_CHARS: /^[a-zA-Z0-9_\-?=&amp;#:/.]+$/,
    TIME_FORMATS: {
      HOURS: 3600,
      MINUTES: 60,
      SECONDS: 1
    },
    YOUTUBE_NOCOOKIE_DOMAIN: &#39;https://www.youtube-nocookie.com&#39;,
    YOUTUBE_IMG_DOMAIN: &#39;https://img.youtube.com&#39;,
    EMBED_PARAMS: &#39;autoplay=1&amp;mute=1&#39;
  };

  

  function validateInput(input, maxLength = CONSTANTS.MAX_INPUT_LENGTH) {
    if (!input || typeof input !== &#39;string&#39;) return &#39;&#39;;

    const trimmed = input.trim();

    if (trimmed.length &gt; maxLength) {
      console.warn(`Input exceeds maximum length of ${maxLength}`);
      return &#39;&#39;;
    }

    
    if (!CONSTANTS.ALLOWED_URL_CHARS.test(trimmed)) {
      console.warn(&#39;Input contains invalid characters&#39;);
      return &#39;&#39;;
    }

    return trimmed;
  }

  

  function parseStartValue(value) {
    if (!value) return 0;

    
    if (/^\d+$/.test(value)) {
      const parsed = parseInt(value, 10);
      return isNaN(parsed) ? 0 : Math.max(0, parsed);
    }

    
    let total = 0;
    let matched = false;
    const regex = /(\d+)(h|m|s)/gi;
    let match;

    while ((match = regex.exec(value)) !== null) {
      matched = true;
      const num = parseInt(match[1], 10);
      if (isNaN(num)) continue;

      const unit = match[2].toLowerCase();
      if (unit === &#39;h&#39;) total += num * CONSTANTS.TIME_FORMATS.HOURS;
      else if (unit === &#39;m&#39;) total += num * CONSTANTS.TIME_FORMATS.MINUTES;
      else if (unit === &#39;s&#39;) total += num * CONSTANTS.TIME_FORMATS.SECONDS;
    }

    return matched ? Math.max(0, total) : 0;
  }

  

  function extractStartTime(queryString) {
    if (!queryString) return 0;

    try {
      const cleanQuery = queryString.startsWith(&#39;?&#39;) || queryString.startsWith(&#39;#&#39;)
        ? queryString.slice(1)
        : queryString;

      const params = new URLSearchParams(cleanQuery);

      
      return parseStartValue(params.get(&#39;start&#39;)) ||
             parseStartValue(params.get(&#39;t&#39;)) ||
             parseStartValue(params.get(&#39;time_continue&#39;)) ||
             0;
    } catch (e) {
      console.warn(&#39;Failed to parse query parameters:&#39;, e);
      return 0;
    }
  }

  

  function parseId(raw) {
    const validated = validateInput(raw);
    if (!validated) {
      return { type: &#39;unknown&#39;, id: &#39;&#39;, start: 0 };
    }

    let startSeconds = 0;
    let normalized = validated;

    
    const queryIndex = normalized.indexOf(&#39;?&#39;);
    if (queryIndex !== -1) {
      startSeconds = extractStartTime(normalized.slice(queryIndex + 1));
      normalized = normalized.slice(0, queryIndex);
    }

    
    const hashIndex = normalized.indexOf(&#39;#&#39;);
    if (hashIndex !== -1) {
      startSeconds = startSeconds || extractStartTime(normalized.slice(hashIndex + 1));
      normalized = normalized.slice(0, hashIndex);
    }

    
    if (CONSTANTS.PLAYLIST_PREFIXES.test(normalized)) {
      return { type: &#39;playlist&#39;, id: normalized, start: startSeconds };
    }

    
    if (CONSTANTS.VIDEO_ID_PATTERN.test(normalized)) {
      return { type: &#39;video&#39;, id: normalized, start: startSeconds };
    }

    
    const listMatch = normalized.match(/list=([^&amp;]+)/);
    if (listMatch &amp;&amp; listMatch[1]) {
      return { type: &#39;playlist&#39;, id: listMatch[1], start: startSeconds };
    }

    console.warn(&#39;Unable to parse video/playlist ID:&#39;, raw);
    return { type: &#39;unknown&#39;, id: &#39;&#39;, start: startSeconds };
  }

  

  function validateThumbnailUrl(thumbUrl) {
    if (!thumbUrl) return &#39;&#39;;

    let cleaned = thumbUrl.trim();

    
    const markdownMatch = cleaned.match(/^\[[^\]]*\]\(([^)]+)\)$/);
    if (markdownMatch) {
      cleaned = markdownMatch[1].trim();
    }

    
    try {
      const url = new URL(cleaned, document.baseURI);

      
      if (url.protocol !== &#39;http:&#39; &amp;&amp; url.protocol !== &#39;https:&#39;) {
        console.warn(&#39;Thumbnail URL must use http or https protocol&#39;);
        return &#39;&#39;;
      }

      return url.href;
    } catch (e) {
      console.warn(&#39;Invalid thumbnail URL:&#39;, e);
      return &#39;&#39;;
    }
  }

  

  function getPlaylistPlaceholder() {
    const svg = `&lt;svg xmlns=&#39;http://www.w3.org/2000/svg&#39; viewBox=&#39;0 0 1280 720&#39;&gt;` +
                `&lt;rect width=&#39;100%&#39; height=&#39;100%&#39; fill=&#39;#000&#39;/&gt;` +
                `&lt;rect x=&#39;220&#39; y=&#39;260&#39; width=&#39;840&#39; height=&#39;60&#39; fill=&#39;#fff&#39;/&gt;` +
                `&lt;rect x=&#39;220&#39; y=&#39;340&#39; width=&#39;660&#39; height=&#39;60&#39; fill=&#39;#fff&#39;/&gt;` +
                `&lt;/svg&gt;`;
    return &#39;data:image/svg+xml;charset=utf-8,&#39; + encodeURIComponent(svg);
  }

  

  function setupThumbnail(thumbnail, kind, customThumb) {
    if (!thumbnail) return;

    if (customThumb) {
      
      thumbnail.onerror = null;
      thumbnail.src = customThumb;
    } else if (kind.type === &#39;playlist&#39;) {
      
      thumbnail.src = getPlaylistPlaceholder();
    } else if (kind.type === &#39;video&#39; &amp;&amp; kind.id) {
      
      thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/maxresdefault.jpg`;
      thumbnail.onerror = () =&gt; {
        thumbnail.onerror = null;
        thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/0.jpg`;
      };
    }
    
  }

  

  function createEmbedUrl(kind) {
    if (kind.type === &#39;playlist&#39; &amp;&amp; kind.id) {
      return `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/videoseries?list=${encodeURIComponent(kind.id)}&amp;${CONSTANTS.EMBED_PARAMS}`;
    } else if (kind.type === &#39;video&#39; &amp;&amp; kind.id) {
      let url = `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/${encodeURIComponent(kind.id)}?${CONSTANTS.EMBED_PARAMS}`;
      if (kind.start &gt; 0) {
        url += `&amp;start=${Math.floor(kind.start)}`;
      }
      return url;
    }
    return &#39;&#39;;
  }

  

  function loadEmbed(wrapper, kind, title) {
    if (wrapper.dataset.isLoaded === &#39;true&#39;) return;

    const embedUrl = createEmbedUrl(kind);
    if (!embedUrl) {
      console.error(&#39;Unable to create embed URL - invalid video/playlist ID&#39;);
      
      wrapper.innerHTML = &#39;&lt;div style=&#34;padding: 2em; text-align: center; color: #fff;&#34;&gt;Unable to load video. Please check the video ID.&lt;/div&gt;&#39;;
      return;
    }

    
    const iframe = document.createElement(&#39;iframe&#39;);
    iframe.setAttribute(&#39;allowfullscreen&#39;, &#39;&#39;);
    iframe.setAttribute(&#39;loading&#39;, &#39;lazy&#39;);
    iframe.setAttribute(&#39;allow&#39;, &#39;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#39;);
    iframe.setAttribute(&#39;title&#39;, title ? `YouTube video player: ${title}` : &#39;YouTube video player&#39;);
    iframe.src = embedUrl;

    
    const replacement = document.createElement(&#39;div&#39;);
    replacement.className = wrapper.className;
    replacement.dataset.listenersAdded = &#39;true&#39;;
    replacement.dataset.isLoaded = &#39;true&#39;;
    replacement.appendChild(iframe);

    wrapper.replaceWith(replacement);
  }

  

  function enhanceEmbeds() {
    const wrappers = document.querySelectorAll(&#39;.video-wrapper&#39;);

    wrappers.forEach(wrapper =&gt; {
      
      if (wrapper.dataset.listenersAdded === &#39;true&#39;) return;
      wrapper.dataset.listenersAdded = &#39;true&#39;;

      
      const rawVideoId = wrapper.dataset.videoId || &#39;&#39;;
      const rawThumbUrl = wrapper.dataset.thumb || &#39;&#39;;
      const videoTitle = wrapper.dataset.videoTitle || &#39;&#39;;

      
      const kind = parseId(rawVideoId);
      const safeThumb = validateThumbnailUrl(rawThumbUrl);

      
      const thumbnail = wrapper.querySelector(&#39;.video-thumbnail&#39;);
      setupThumbnail(thumbnail, kind, safeThumb);

      
      const loadHandler = () =&gt; loadEmbed(wrapper, kind, videoTitle);

      wrapper.addEventListener(&#39;click&#39;, loadHandler);

      const overlay = wrapper.querySelector(&#39;.video-overlay&#39;);
      if (overlay) overlay.addEventListener(&#39;click&#39;, loadHandler);
      if (thumbnail) thumbnail.addEventListener(&#39;click&#39;, loadHandler);

      
      wrapper.addEventListener(&#39;keydown&#39;, (e) =&gt; {
        if (e.key === &#39;Enter&#39; || e.key === &#39; &#39;) {
          e.preventDefault();
          loadHandler();
        }
      });
    });
  }

  
  enhanceEmbeds();
  if (document.readyState === &#39;loading&#39;) {
    document.addEventListener(&#39;DOMContentLoaded&#39;, enhanceEmbeds);
  }
})();
&lt;/script&gt;&lt;p class=&#34;yt-text-link&#34;&gt;
      &lt;a href=&#34;https://www.youtube.com/watch?v=DDuArQFIvMc&#34;&gt;YouTube Video&lt;/a&gt;
    &lt;/p&gt;&lt;button type=&#34;button&#34;
    class=&#34;video-wrapper&#34;
    aria-label=&#34;Play YouTube video&#34;
    data-video-id=&#34;DDuArQFIvMc&#34;
    data-thumb=&#34;&#34;
    &gt;&lt;img
      class=&#34;video-thumbnail&#34;
      src=&#34;data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20viewBox=%270%200%201280%20720%27%3E%3Crect%20width=%27100%25%25%27%20height=%27100%25%25%27%20fill=%27%23000%27/%3E%3C/svg%3E&#34;
      alt=&#34;YouTube Thumbnail&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;&lt;div class=&#34;video-play-button&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;&lt;noscript&gt;
    &lt;div class=&#34;video-noscript&#34;&gt;&lt;img src=&#34;https://img.youtube.com/vi/DDuArQFIvMc/maxresdefault.jpg&#34;
             alt=&#34;YouTube Thumbnail&#34;&gt;&lt;p&gt;
          &lt;a href=&#34;https://www.youtube.com/watch?v=DDuArQFIvMc&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;YouTube Video&lt;/a&gt;
        &lt;/p&gt;&lt;/div&gt;
  &lt;/noscript&gt;
&lt;ol&gt;
&lt;li&gt;Beginning form.&lt;/li&gt;
&lt;li&gt;Energy ball right to ward off left.&lt;/li&gt;
&lt;li&gt;Energy ball left to ward off right.&lt;/li&gt;
&lt;li&gt;Roll back&lt;/li&gt;
&lt;li&gt;Press forward&lt;/li&gt;
&lt;li&gt;Sit back then push&lt;/li&gt;
&lt;li&gt;Single whip&lt;/li&gt;
&lt;li&gt;Lifting hands&lt;/li&gt;
&lt;li&gt;Elbow stroke to white crane flashes its wings&lt;/li&gt;
&lt;li&gt;Brush knee and strike&lt;/li&gt;
&lt;li&gt;Play the guitar&lt;/li&gt;
&lt;li&gt;Left brush knee and strike&lt;/li&gt;
&lt;li&gt;Right brush knee and strike&lt;/li&gt;
&lt;li&gt;Center brush knee and strike&lt;/li&gt;
&lt;li&gt;Play the guitar&lt;/li&gt;
&lt;li&gt;Brush knee and strike&lt;/li&gt;
&lt;li&gt;Scoop (catch the record)&lt;/li&gt;
&lt;li&gt;Deflect, parry and punch&lt;/li&gt;
&lt;li&gt;Seal the breath and push&lt;/li&gt;
&lt;li&gt;Close by throwing the soap bubble&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;part-two&#34;&gt;Part Two&lt;/h3&gt;
&lt;p class=&#34;yt-text-link&#34;&gt;
      &lt;a href=&#34;https://www.youtube.com/watch?v=iA_CfFfH0CM&#34;&gt;YouTube Video&lt;/a&gt;
    &lt;/p&gt;&lt;button type=&#34;button&#34;
    class=&#34;video-wrapper&#34;
    aria-label=&#34;Play YouTube video&#34;
    data-video-id=&#34;iA_CfFfH0CM&#34;
    data-thumb=&#34;&#34;
    &gt;&lt;img
      class=&#34;video-thumbnail&#34;
      src=&#34;data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20viewBox=%270%200%201280%20720%27%3E%3Crect%20width=%27100%25%25%27%20height=%27100%25%25%27%20fill=%27%23000%27/%3E%3C/svg%3E&#34;
      alt=&#34;YouTube Thumbnail&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;&lt;div class=&#34;video-play-button&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;&lt;noscript&gt;
    &lt;div class=&#34;video-noscript&#34;&gt;&lt;img src=&#34;https://img.youtube.com/vi/iA_CfFfH0CM/maxresdefault.jpg&#34;
             alt=&#34;YouTube Thumbnail&#34;&gt;&lt;p&gt;
          &lt;a href=&#34;https://www.youtube.com/watch?v=iA_CfFfH0CM&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;YouTube Video&lt;/a&gt;
        &lt;/p&gt;&lt;/div&gt;
  &lt;/noscript&gt;
&lt;ol start=&#34;21&#34;&gt;
&lt;li&gt;Tiger returns to the mountain&lt;/li&gt;
&lt;li&gt;Roll back, press, sit back and push&lt;/li&gt;
&lt;li&gt;Single whip&lt;/li&gt;
&lt;li&gt;Step right, face left with fist under elbow&lt;/li&gt;
&lt;li&gt;Step back and repulse the monkey&lt;/li&gt;
&lt;li&gt;Step back and repulse the monkey&lt;/li&gt;
&lt;li&gt;Step back and repulse the monkey&lt;/li&gt;
&lt;li&gt;Shift weight three times to slant flying (left hand close)&lt;/li&gt;
&lt;li&gt;Round the back to lifting hands&lt;/li&gt;
&lt;li&gt;Elbow stroke to white crane flashes its wings&lt;/li&gt;
&lt;li&gt;High pat on the horse&lt;/li&gt;
&lt;li&gt;Dip the needle at the sea bottom&lt;/li&gt;
&lt;li&gt;Fan through back&lt;/li&gt;
&lt;li&gt;Face danger, sit back and cover high&lt;/li&gt;
&lt;li&gt;Long knock to double chop&lt;/li&gt;
&lt;li&gt;Grab, deflect, parry and punch&lt;/li&gt;
&lt;li&gt;Shoulder stroke&lt;/li&gt;
&lt;li&gt;Roll back, press, sit back and push&lt;/li&gt;
&lt;li&gt;Single whip&lt;/li&gt;
&lt;li&gt;Wave hands in clouds&lt;/li&gt;
&lt;li&gt;Single whip&lt;/li&gt;
&lt;li&gt;Spear forward, settle back&lt;/li&gt;
&lt;li&gt;Circle hands right to open and kick left&lt;/li&gt;
&lt;li&gt;Circle hands left to open and kick right&lt;/li&gt;
&lt;li&gt;Turn double chop&lt;/li&gt;
&lt;li&gt;Turn to open and kick left&lt;/li&gt;
&lt;li&gt;Brush knee and strike&lt;/li&gt;
&lt;li&gt;Brush knee and strike&lt;/li&gt;
&lt;li&gt;Bend the steel bar&lt;/li&gt;
&lt;li&gt;Lift the ceiling with your back to cover high&lt;/li&gt;
&lt;li&gt;White snake spits out poison&lt;/li&gt;
&lt;li&gt;Two eye hits to a grab, deflect, parry and punch&lt;/li&gt;
&lt;li&gt;Sit back and cover high to open and kick right&lt;/li&gt;
&lt;li&gt;Tame the tiger right&lt;/li&gt;
&lt;li&gt;Turn and tame the tiger left&lt;/li&gt;
&lt;li&gt;Cover to open and kick right&lt;/li&gt;
&lt;li&gt;Double box the ears to the corner&lt;/li&gt;
&lt;li&gt;Pass the kick by and separate left&lt;/li&gt;
&lt;li&gt;Turn and open kick right&lt;/li&gt;
&lt;li&gt;Scoop, deflect, parry, and punch&lt;/li&gt;
&lt;li&gt;Seal the breath and push&lt;/li&gt;
&lt;li&gt;Close by throwing the soap bubble&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;part-three&#34;&gt;Part Three&lt;/h3&gt;
&lt;ol start=&#34;63&#34;&gt;
&lt;li&gt;Tiger returns to the mountain&lt;/li&gt;
&lt;li&gt;Roll back, press, sit back and push&lt;/li&gt;
&lt;li&gt;Single whip&lt;/li&gt;
&lt;li&gt;Catch energy ball left&lt;/li&gt;
&lt;li&gt;Shearing the horses mane, right&lt;/li&gt;
&lt;li&gt;Shearing the horses mane, left&lt;/li&gt;
&lt;li&gt;Shearing the horses mane, right&lt;/li&gt;
&lt;li&gt;Ward off left&lt;/li&gt;
&lt;li&gt;Energy ball left to ward off right.&lt;/li&gt;
&lt;li&gt;Roll back, press, sit back and push&lt;/li&gt;
&lt;li&gt;Single whip&lt;/li&gt;
&lt;li&gt;Fair lady works the shuttle left&lt;/li&gt;
&lt;li&gt;Fair lady works the shuttle right&lt;/li&gt;
&lt;li&gt;Fair lady works the shuttle left&lt;/li&gt;
&lt;li&gt;Fair lady works the shuttle right&lt;/li&gt;
&lt;li&gt;Ward off left&lt;/li&gt;
&lt;li&gt;Energy ball left to ward off right.&lt;/li&gt;
&lt;li&gt;Single whip&lt;/li&gt;
&lt;li&gt;Snake creeps down (&lt;strong&gt;two times&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Step back and repulse the monkey (&lt;strong&gt;three times&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Single leg to slant flying (left hand apart)&lt;/li&gt;
&lt;li&gt;Round the back to lifting hands&lt;/li&gt;
&lt;li&gt;Elbow stroke to white crane flashes its wings&lt;/li&gt;
&lt;li&gt;High pat on the horse&lt;/li&gt;
&lt;li&gt;Dip the needle at the sea bottom&lt;/li&gt;
&lt;li&gt;Fan through back&lt;/li&gt;
&lt;li&gt;Face danger, sit back and cover high&lt;/li&gt;
&lt;li&gt;Long knock to double chop&lt;/li&gt;
&lt;li&gt;Grab, deflect, parry and punch&lt;/li&gt;
&lt;li&gt;Shoulder stroke, roll back, press, sit back and push&lt;/li&gt;
&lt;li&gt;Single whip&lt;/li&gt;
&lt;li&gt;Wave hands in clouds&lt;/li&gt;
&lt;li&gt;Spear forward the settle back&lt;/li&gt;
&lt;li&gt;Press and spear&lt;/li&gt;
&lt;li&gt;Turn and long chop&lt;/li&gt;
&lt;li&gt;Cover and open kick right&lt;/li&gt;
&lt;li&gt;Scoop, deflect, parry and punch&lt;/li&gt;
&lt;li&gt;Shoulder stroke to roll back, press, sit back and push&lt;/li&gt;
&lt;li&gt;Single whip&lt;/li&gt;
&lt;li&gt;Snake creeps down&lt;/li&gt;
&lt;li&gt;Seven star block&lt;/li&gt;
&lt;li&gt;To step back and ride the tiger&lt;/li&gt;
&lt;li&gt;Eyebrow kick&lt;/li&gt;
&lt;li&gt;Side step to draw the bow and shoot the tiger&lt;/li&gt;
&lt;li&gt;Long scoop, deflect, parry and punch&lt;/li&gt;
&lt;li&gt;Close by throwing the soap bubble&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;end-notes&#34;&gt;End Notes&lt;/h3&gt;
&lt;p&gt;Like many things, as this form was passed along from teacher to student and from one language to another, there are small changes to the movements and terminology. This is how I learned the form.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>🐯 Eighth Grade For 2023/2024</title>
      <link>https://heyloura.com/2025/04/04/eighth-grade-for.html</link>
      <pubDate>Fri, 04 Apr 2025 13:33:39 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/04/04/eighth-grade-for.html</guid>
      <description>&lt;style&gt;
.book { 
width: 190px !important;
height: 290px !important;
}
h3 { border-bottom: 1px solid var(--Subtext0); }
&lt;/style&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#history&#34;&gt;History, Writing, and Literature&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#science&#34;&gt;Science and Mathematics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#inter&#34;&gt;Interdisciplinary Studies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#art&#34;&gt;Art and Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#health&#34;&gt;Health and Financial Literacy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#physical-education&#34;&gt;Physical Education&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wow, eighth grade. How is this possible???&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Note: This has been updated as of 3/13/2024.&lt;/small&gt;&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/blog-hs8-01.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: A person wearing a hoodie and shorts is standing on a tree branch by a body of water.&#34;&gt;
&lt;h1 id=&#34;course-of-study&#34;&gt;Course of Study&lt;/h1&gt;
&lt;h2 id=&#34;history&#34;&gt;History, Writing, and Literature&lt;/h2&gt;
&lt;h3 id=&#34;history&#34;&gt;History&lt;/h3&gt;
&lt;p&gt;With the broad social studies aspect of his Falcons co-op we aren&amp;rsquo;t doing a large formal study of history. On his own he reviewed some Ancient history and the Middle Ages with the audiobooks from Curiosity Chronicles.&lt;/p&gt;
&lt;p&gt;There is also a history focus in his art with &amp;ldquo;Visual History: Draw Stick Figure Stories of Modern World History&amp;rdquo; where he will be covering&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The transformation of Eurasian societies in an era of global trade and rising European power, 1750-1870&lt;/li&gt;
&lt;li&gt;Patterns of nationalism, state-building, and social reform in Europe and the Americas, 1830-1914&lt;/li&gt;
&lt;li&gt;Patterns of global change in the era of Western military and economic domination, 1800-1914&lt;/li&gt;
&lt;li&gt;Major global trends from 1750-1914&lt;/li&gt;
&lt;li&gt;Reform, revolution, and social change in the world economy of the early century&lt;/li&gt;
&lt;li&gt;The causes and global consequences of World War I&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/blog-hs8-02.jpg&#34; width=&#34;600&#34; height=&#34;451&#34; alt=&#34;Auto-generated description: A person smiles at a phone on the table while another person writes with a cat sitting on their notebook.&#34;&gt;
&lt;h3 id=&#34;writing&#34;&gt;Writing&lt;/h3&gt;
&lt;p&gt;The bane of our homeschooling this year. So, I got my son some tutoring hours with Anna (see below for Falcons) to help unblock him and hopefully help him enjoy writing again.  He&amp;rsquo;s doing lots of free writing and working some creative writing pieces. With his falcons class he also helped create and edit the Halloween play and wrote an essay on the symbolism in the movie Encanto.&lt;/p&gt;
&lt;p&gt;He is also doing an online English Language Arts class. In the class they covered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grammar&lt;/li&gt;
&lt;li&gt;How to summarize a book&lt;/li&gt;
&lt;li&gt;Write an organized five-paragraph paper with a works cited page&lt;/li&gt;
&lt;li&gt;Give two oral &amp;ldquo;Book Talks&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Learn how opinion writing is different from expository writing&lt;/li&gt;
&lt;li&gt;Write and illustrate their own fable&lt;/li&gt;
&lt;li&gt;Read short stories and participate in multiple Socratic Seminars&lt;/li&gt;
&lt;li&gt;Study the narrative genre with an analysis of literary elements&lt;/li&gt;
&lt;li&gt;Write a short story, creating a unique world, characters, conflict, suspense, tension, climax, resolution and theme&lt;/li&gt;
&lt;li&gt;Write a book of their own poems&lt;/li&gt;
&lt;li&gt;How to write compare/contrast pieces&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/blog-hs8-03.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: Two people are exploring a rocky crevice with flowing water at the bottom.&#34;&gt;
&lt;h3 id=&#34;literature&#34;&gt;Literature&lt;/h3&gt;
&lt;p&gt;I keep a well stocked bookcase of books that my son is free to pick from. He&amp;rsquo;s welcome to choose whatever he&amp;rsquo;s interested in from our collection of books or check out books from the library.&lt;/p&gt;
&lt;p&gt;This is what he&amp;rsquo;s been reading so far this year:&lt;/p&gt;







&lt;ul class=&#34;bookshelf bookshelf--variant-grid&#34;&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Dungeon Crawler Carl by Matt Dinniman&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9798688591507&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dhwr1zQEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9798688591507&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Dungeon Crawler Carl&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Matt Dinniman&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Romeo and Juliet by William Shakespeare&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780763659486&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DRY0aAAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780763659486&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Romeo and Juliet&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;William Shakespeare&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Cartoon History of the Universe by Larry Gonick&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781101902554&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DDXqWBAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781101902554&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Cartoon History of the Universe&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Larry Gonick&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Dreamer by Pam Muñoz Ryan&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780606239400&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DQsM4uAAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780606239400&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Dreamer&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Pam Muñoz Ryan&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Voyage of the Beagle by Charles Darwin&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781627887359&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DpAVxDQAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781627887359&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Voyage of the Beagle&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Charles Darwin&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Watership Down by Richard Adams&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781439176122&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DittzoegmRpAC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781439176122&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Watership Down&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Richard Adams&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Nineteen Eighty-Four. The Graphic Novel by George Orwell&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780241436523&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DoPmMzgEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780241436523&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Nineteen Eighty-Four. The Graphic Novel&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;George Orwell&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Sapiens A Graphic History, Volume 1 by Yuval Noah Harari&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781473582910&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DEMn2DwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781473582910&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Sapiens A Graphic History, Volume 1&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Yuval Noah Harari&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;How to Calculate Quickly by Henry Sticker&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780486202952&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dwnhc0-EKaGYC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780486202952&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;How to Calculate Quickly&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Henry Sticker&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Journey to Center of the Earth by Jules Verne&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781623959043&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D-8UmCwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781623959043&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Journey to Center of the Earth&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Jules Verne&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Story That Cannot Be Told by J. Kasper Kramer&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781534430693&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DsgL8DwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781534430693&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Story That Cannot Be Told&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;J. Kasper Kramer&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Cartoon Guide to Genetics by Larry Gonick&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780062730992&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DTR2zzV77DCMC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780062730992&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Cartoon Guide to Genetics&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Larry Gonick&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;When Bugs Were Big, Plants Were Strange, and Tetrapods Stalked the Earth by Hannah Bonner&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780792263265&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3De2YWngEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780792263265&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;When Bugs Were Big, Plants Were Strange, and Tetrapods Stalked the Earth&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Hannah Bonner&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Great Human Journey by Ian Tattersall&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781593731489&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DJnBymQEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781593731489&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Great Human Journey&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Ian Tattersall&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Unnameables by Ellen Booraem&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780152063689&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DNcbrB0VahKsC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780152063689&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Unnameables&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Ellen Booraem&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Iliad by Gareth Hinds&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780763681135&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D-rJ1DwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780763681135&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Iliad&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Gareth Hinds&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Macbeth by Gareth Hinds&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781893131507&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dol8oBgAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781893131507&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Macbeth&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Gareth Hinds&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;How to Train Your Dragon by Cressida Cowell&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780316737371&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D4pJVngEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780316737371&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;How to Train Your Dragon&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Cressida Cowell&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;An Uninterrupted View of the Sky by Melanie Crowder&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780147512505&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D0PmPDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780147512505&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;An Uninterrupted View of the Sky&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Melanie Crowder&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Rogue Protocol: The Murderbot Diaries by Martha Wells&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781250185433&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DJvAyDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781250185433&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Rogue Protocol: The Murderbot Diaries&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Martha Wells&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Poe: Stories and Poems by Gareth Hinds&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780763681128&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DEcM3DwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780763681128&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Poe: Stories and Poems&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Gareth Hinds&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Hidden Figures by Margot Lee Shetterly&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780062363619&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D26mpCgAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780062363619&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Hidden Figures&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Margot Lee Shetterly&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Neverending Story by Michael Ende&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780140074314&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DPoFPEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780140074314&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Neverending Story&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Michael Ende&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Understanding Comics by Scott McCloud&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780060976255&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DtUwqbo48lp4C%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780060976255&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Understanding Comics&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Scott McCloud&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Network Effect by Martha Wells&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781250229847&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D0AGrDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781250229847&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Network Effect&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Martha Wells&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;All Systems Red by Martha Wells&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780765397522&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DZSu2DQAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780765397522&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;All Systems Red&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Martha Wells&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Fugitive Telemetry by Martha Wells&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781250765383&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DIhLjDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781250765383&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Fugitive Telemetry&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Martha Wells&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Wildhood by Barbara Natterson-Horowitz&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781501164705&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DRObsDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781501164705&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Wildhood&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Barbara Natterson-Horowitz&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Last Cuentista by Donna Barba Higuera&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781800784475&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DrQN6EAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781800784475&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Last Cuentista&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Donna Barba Higuera&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Beowulf by Gareth Hinds&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781893131217&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DMOqkAwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781893131217&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Beowulf&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Gareth Hinds&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Sapiens: A Graphic History, Volume 2 by Yuval Noah Harari&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780063212244&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DnnwsEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780063212244&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Sapiens: A Graphic History, Volume 2&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Yuval Noah Harari&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
&lt;/ul&gt;

&lt;hr/&gt;
&lt;h2 id=&#34;science&#34;&gt;Science and Mathematics&lt;/h2&gt;
&lt;p&gt;My son was begging to do two science classes this year.&lt;/p&gt;
&lt;h3 id=&#34;honors-high-school-earth-science-with-a-lab&#34;&gt;Honors High School Earth Science with a Lab&lt;/h3&gt;
&lt;p&gt;Once again we are doing a class from Taylor Made Science &lt;a href=&#34;https://taylormadescience.com/course-descriptions/&#34;&gt;Honors Earth Science with Lab&lt;/a&gt;. He likes the teacher and really wants to stretch himself with science.&lt;/p&gt;
&lt;p&gt;So this course covers the main fields of geology and an introduction to astronomy. The teacher sends a box of lab supplies as part of the course which helps out so much. The course is going to be a flipped classroom style this year - which was new.&lt;/p&gt;
&lt;p&gt;So he does the textbook reading with guided notes on Friday and watches the lecture on Monday&amp;rsquo;s and takes a quick online quiz on the material. Wednesday he attends the zoom class where the teacher checks for understanding and then starts the lab with them, often breaking them into smaller groups. He&amp;rsquo;ll finish the lab after the class and submits it.&lt;/p&gt;
&lt;img style=&#34;margin:1em; auto&#34; class=&#34;book&#34; src=&#34;https://cdn.uploads.micro.blog/88328/2023/6b41530cbe.png&#34; height=&#34;300&#34; alt=&#34;&#34; /&gt;
&lt;h3 id=&#34;physics-optional&#34;&gt;Physics (optional)&lt;/h3&gt;
&lt;img style=&#34;margin: 1em auto&#34; src=&#34;https://cdn.uploads.micro.blog/88328/2023/434b125781.png&#34; width=&#34;600&#34; height=&#34;318&#34; alt=&#34;&#34; /&gt;
&lt;p&gt;My son&amp;rsquo;s love of science really blossomed with &lt;a href=&#34;https://science.mom/index.html&#34;&gt;Science Mom&lt;/a&gt; chemistry course that we did three years ago. Since then, whenever they offer a new course he is all on board. Plus, I want him to have fun with science. This year they are doing physics! The first course will be &lt;a href=&#34;https://sciencemom.teachable.com/p/physics-1-mechanics&#34;&gt;Physics 1: Mechanics&lt;/a&gt; and the second course will be on &lt;a href=&#34;https://sciencemom.teachable.com/p/physics-2-electromagnetism&#34;&gt;Physics 2: Electromagnetism&lt;/a&gt;. Since he&amp;rsquo;s doing another full science course this will be a fun extra that he can do as much or as little as he wants.&lt;/p&gt;
&lt;h3 id=&#34;mini-course---ancient-mammals-from-the-permian-to-the-holocene&#34;&gt;Mini Course - Ancient Mammals from the Permian to the Holocene&lt;/h3&gt;
&lt;p&gt;This was a fun outschool class I found for him to enjoy and he spent 8 weeks on it. He covered Mammoths &amp;amp; Elephants, Sail-backed Pelycosaurs (Dimetrodon &amp;amp; Edaphosaurs), Sabre-toothed felines, Dicynodonts, Horses, Gorgonopsids, Camels and Cynodonts. This prompted him to reread his Dinosaur encyclopedia and some of his pre-history bugs and animal books.&lt;/p&gt;
&lt;h3 id=&#34;honors-algebra-1&#34;&gt;Honors Algebra 1&lt;/h3&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/blog-hs8-04.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: A person is sitting at a desk working on a math problem displayed on a computer screen, surrounded by papers, a drink, and wearing headphones.&#34;&gt;
&lt;p&gt;It&amp;rsquo;s math time. Algebra style. He&amp;rsquo;ll be using the self-paced online course &lt;a href=&#34;https://www.derekowens.com/course_info_algebra1.php&#34;&gt;Derek Owens Honors Algebra 1&lt;/a&gt;. I went back on forth on a few different options. Art of Problem Solving was a contender as well as the Thinkwell online course but I decided on Derek Owens because I think the format would work best with my son. There are videos that teach and you fill in notes as you go along. Homework that is done on paper and then emailed out to be graded. It comes back with handwritten corrections. I&amp;rsquo;m a big believer in handwriting out math and that&amp;rsquo;s ultimately what swayed me to Derek Owen over Thinkwell. Bonus, they do all the grading and record keeping.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img class=&#34;book&#34; src=&#34;https://cdn.uploads.micro.blog/88328/2023/dfd3dc5817.jpg&#34; width=&#34;384&#34; height=&#34;497&#34; alt=&#34;&#34; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img class=&#34;book&#34; src=&#34;https://cdn.uploads.micro.blog/88328/2023/f0b793e417.jpg&#34; width=&#34;384&#34; height=&#34;497&#34; alt=&#34;&#34; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id=&#34;inter&#34;&gt;Interdisciplinary Studies&lt;/h2&gt;
&lt;p&gt;One of the best homeschooling finds I found last year was &lt;a href=&#34;https://falconsedu.com/&#34;&gt;Falcons&lt;/a&gt;. We used the online class last year and it was very apparent that this year we needed to keep Falcon&amp;rsquo;s as a cornerstone to our homeschooling again. The teacher, Anna, is fantastic. She weaves such wonderful topics together for the kids. Really, they covered too many things to enumerate here.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/blog-hs8-05.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: A person wearing eclipse glasses is in a backyard setting with patio furniture and a large red umbrella looking up at the sky.&#34;&gt;
&lt;p&gt;A small sample of topics would be making their own made up culture, practice about splitting the history part out from historical fiction, symbolism in Encanto, the building of bomb shelters and why people expected the Cold War to turn into WWIII, connecting Hollerith boards to the film &amp;ldquo;Hidden Figures&amp;rdquo;, reliable and unreliable sources, universal human experiences, Ramadan, Lunar New Year, Dr. Martin Luther King Jr., what the differences were between texting and face-to-face communication when it comes to nuanced responses, the behavior of waves, how our brains process facial expressions vs emojis, cyberbullying, Shakespeare, coming of age ceremonies around the world, Aztecs, watching out for AI generated videos on youtube, and infinity&lt;/p&gt;
&lt;p&gt;And here are some of the main questions they explored together so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the difference between machine &amp;ldquo;learning&amp;rdquo; and human learning?&lt;/li&gt;
&lt;li&gt;Can machines resolve a contradiction between wants?&lt;/li&gt;
&lt;li&gt;Do you need bad guys to make a good story?&lt;/li&gt;
&lt;li&gt;Should we be celebrating Thanksgiving at all?&lt;/li&gt;
&lt;li&gt;Does change always mean loss of power? For whom?&lt;/li&gt;
&lt;li&gt;Why do we still have climate change?&lt;/li&gt;
&lt;li&gt;What is a friend? How can we handle things when friends make mistakes?&lt;/li&gt;
&lt;li&gt;How might the rapid/short forms of texting and social media be shaping our communication?&lt;/li&gt;
&lt;li&gt;How does function often follow form in media?&lt;/li&gt;
&lt;li&gt;How can we navigate inevitable change?&lt;/li&gt;
&lt;li&gt;What is Encanto REALLY about? Why do you think so?&lt;/li&gt;
&lt;li&gt;Why is there meaning assigned to human features?&lt;/li&gt;
&lt;li&gt;What separates different cultures? What is culture?&lt;/li&gt;
&lt;li&gt;What is food?&lt;/li&gt;
&lt;li&gt;What is a puppet?&lt;/li&gt;
&lt;li&gt;Why is there resistance to kids learning about Black history right now?&lt;/li&gt;
&lt;li&gt;When does a culture &amp;ldquo;outgrow&amp;rdquo; its old laws? What&amp;rsquo;s done then?&lt;/li&gt;
&lt;li&gt;Does everything in the past count as history?&lt;/li&gt;
&lt;li&gt;How long ago does something have to be to be history?&lt;/li&gt;
&lt;li&gt;Can an object be history?&lt;/li&gt;
&lt;li&gt;Who in history tends to be included and who/what is left out?&lt;/li&gt;
&lt;li&gt;How does symbolism affect how we tell history?&lt;/li&gt;
&lt;li&gt;What determines the likelihood of certain histories being recorded and disseminated?&lt;/li&gt;
&lt;li&gt;What is Black history? Is there a difference between Black history and history?&lt;/li&gt;
&lt;li&gt;What types of changes do wars make? What are changes that aren&amp;rsquo;t war based?&lt;/li&gt;
&lt;li&gt;What is the ultimate job of a culture?&lt;/li&gt;
&lt;li&gt;What happens in the time after war?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;art&#34;&gt;Art and Music&lt;/h2&gt;
&lt;h3 id=&#34;clarinet&#34;&gt;Clarinet&lt;/h3&gt;
&lt;p&gt;He&amp;rsquo;s been practicing his clarinet and taking weekly private lessons. I think his interest is waning, but every time I suggest moving on he insists on keeping with it.&lt;/p&gt;
&lt;h3 id=&#34;art&#34;&gt;Art&lt;/h3&gt;
&lt;p&gt;We pivoted in art, since it really isn&amp;rsquo;t anything he wants to engage in. We did an online class called &amp;ldquo;Drawing Your Own Dragons &amp;amp; Other Cool Creatures!&amp;rdquo; for 15 weeks and he did make some cool monster fish drawing he enjoyed.&lt;/p&gt;
&lt;p&gt;We are now going to try a class called &amp;ldquo;Visual History: Draw Stick Figure Stories of Modern World History&amp;rdquo; since he does enjoy stick figure drawing. He will also read &amp;ldquo;Understanding Comics&amp;rdquo; by Scott McCloud and have an end of year art project to make a stick figure poster explaining something historical or scientific, his choice.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id=&#34;health&#34;&gt;Health and Financial Literacy&lt;/h2&gt;
&lt;h3 id=&#34;life-skills---social&#34;&gt;Life Skills - Social&lt;/h3&gt;
&lt;p&gt;My son is taking an online class on Pro-Social Skills for Teens. They cover topics for friendship making skills, dealing with feelings, alternatives to aggression, and skills for dealing with stress.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id=&#34;physical-education&#34;&gt;Physical Education&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/blog-hs8-06.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: A swimmer is competing in a lane of an indoor swimming pool with an audience watching from the side.&#34;&gt;
&lt;p&gt;He continues on with our local swim team and attending the local Kung Fu classes when he is able. He was thrilled to be invited to the New England Championship with his swim team.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&#34;things-we-dropped&#34;&gt;Things we dropped&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Big History&lt;/li&gt;
&lt;li&gt;Torchlight Constellations&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>🐯 Seventh Grade for 2022/2023</title>
      <link>https://heyloura.com/2025/04/04/seventh-grade-for.html</link>
      <pubDate>Fri, 04 Apr 2025 13:21:45 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/04/04/seventh-grade-for.html</guid>
      <description>&lt;div style=&#34;text-align:center&#34; class=&#34;sub-nav&#34;&gt;
&lt;a href=&#34;https://heyloura.com/categories/homeschooling/&#34;&gt;#homeschooling&lt;/a&gt;
&lt;/div&gt;
&lt;h1 id=&#34;i-cant-believe-we-are-done&#34;&gt;I can&amp;rsquo;t believe we are done!&lt;/h1&gt;
&lt;p&gt;Seventh grade was a whirlwind and high school seems like it is just around the corner. I definitely felt like this year went by faster then last year! Now here I am putting together a progress report for my local school system and I decided that I should post it here on my blog. Now the school system gets a boring bullet list, but here I can have some fun. Hopefully this gives someone else some ideas about homeschooling the middle school years.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/img-20220918-153650.png&#34; alt=&#34;&#34;&gt;
&lt;h2 id=&#34;mathematics&#34;&gt;Mathematics:&lt;/h2&gt;
&lt;p&gt;Algebra is just around the corner so we used &lt;a href=&#34;https://www.criticalthinking.com/understanding-pre-algebra.html&#34;&gt;Understanding Pre-Algebra: Middle School Mathematics&lt;/a&gt; this year to get ready.&lt;/p&gt;
&lt;h2 id=&#34;english-language-arts&#34;&gt;English Language Arts:&lt;/h2&gt;
&lt;h3 id=&#34;writing&#34;&gt;Writing&lt;/h3&gt;
&lt;p&gt;This year my son did writing with an outside teacher. He used a middle school class from the Well Trained Mind Academy - &lt;a href=&#34;https://www.wtmacademy.com/course/expository-writing-i/&#34;&gt;Expository Writing I&lt;/a&gt;. This had him writing narrative summaries, chronological narratives, descriptions, biographical sketches, and sequences, plus beginning literary essays about both fiction and poetry; one- and two-level outlining; thesaurus use and note-taking. This was probably the hardest thing he did this year and he knocked it out of the park.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/img-20230317-090024.png&#34; alt=&#34;&#34;&gt;
&lt;h3 id=&#34;literature-and-reading&#34;&gt;Literature and Reading&lt;/h3&gt;
&lt;p&gt;For reading I don&amp;rsquo;t make a specific list of books that he needs to work through. Though I did stock our home library with about 20 new books for the school year making sure several of those were harder books, either classics or denser non-fiction works. He usually reads both a fiction book and a non-fiction book at a time but it&amp;rsquo;s up to him to pick out the particular book he wants in those categories.&lt;/p&gt;







&lt;ul class=&#34;bookshelf bookshelf--variant-grid&#34;&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Hobbit: Illustrated Edition by J.R.R. Tolkien&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780544174221&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DWbm1mQEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780544174221&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Hobbit: Illustrated Edition&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;J.R.R. Tolkien&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Mighty Mars Rovers: The Incredible Adventures Of Spirit And Opportunity (Turtleback School &amp;amp; Library Binding Edition) (Scientists in the Field (Paperback)) by Elizabeth Rusch&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780606398121&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DpdcpvgAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780606398121&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Mighty Mars Rovers: The Incredible Adventures Of Spirit And Opportunity (Turtleback School &amp;amp; Library Binding Edition) (Scientists in the Field (Paperback))&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Elizabeth Rusch&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Odyssey by Gareth Hinds&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781893131385&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D3FDjBQAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26edge%3Dcurl%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781893131385&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Odyssey&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Gareth Hinds&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Science Comics by Falynn Koch 10 book set (Plagues, Solar System, Cats, The Brain, Bats, Dogs, Robots and Drones, Dinosaurs, Wild Weather, Trees) by Falynn Koch&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781626727526&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DOgOgDgAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781626727526&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Science Comics by Falynn Koch 10 book set (Plagues, Solar System, Cats, The Brain, Bats, Dogs, Robots and Drones, Dinosaurs, Wild Weather, Trees)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Falynn Koch&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Almost Human: The Astonishing Tale of Homo Naledi and the Discovery That Changed Our Human Story by Lee Berger&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781426218125&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DwVRcDAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26edge%3Dcurl%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781426218125&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Almost Human: The Astonishing Tale of Homo Naledi and the Discovery That Changed Our Human Story&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Lee Berger&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Fascinating Fibonaccis (Dale Seymour Publications) by Dale Seymour Publications Secondary&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780866513432&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DVHqAQgAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780866513432&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Fascinating Fibonaccis (Dale Seymour Publications)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Dale Seymour Publications Secondary&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Science Comics: Coral Reefs: Cities of the Ocean by Maris Wicks&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781626721463&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DqDTSsgEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781626721463&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Science Comics: Coral Reefs: Cities of the Ocean&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Maris Wicks&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Navigating Early by Clare Vanderpool&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780307930651&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DK8hvDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26edge%3Dcurl%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780307930651&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Navigating Early&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Clare Vanderpool&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Harry Potter and the Order of the Phoenix: The Illustrated Edition (Harry Potter, Book 5) (Illustrated edition) by J. K. Rowling&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780545791434&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DygPhzgEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780545791434&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Harry Potter and the Order of the Phoenix: The Illustrated Edition (Harry Potter, Book 5) (Illustrated edition)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;J. K. Rowling&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Team Moon: How 400,000 People Landed Apollo 11 on the Moon by Catherine Thimmesh&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780547349695&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dotvj2JoP0-gC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26edge%3Dcurl%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780547349695&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Team Moon: How 400,000 People Landed Apollo 11 on the Moon&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Catherine Thimmesh&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;How To: Absurd Scientific Advice for Common Real-World Problems by Randall Munroe&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780525537090&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DCZ-rDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780525537090&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;How To: Absurd Scientific Advice for Common Real-World Problems&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Randall Munroe&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Mistborn: The Final Empire by Brandon Sanderson&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780765311788&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DdlfOfxkm1PoC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26edge%3Dcurl%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780765311788&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Mistborn: The Final Empire&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Brandon Sanderson&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Life Skills for Teens: How to Cook, Clean, Manage Money, Fix Your Car, Perform First Aid, and Just About Everything in Between by Karen Harris&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781951806408&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DeeawzgEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781951806408&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Life Skills for Teens: How to Cook, Clean, Manage Money, Fix Your Car, Perform First Aid, and Just About Everything in Between&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Karen Harris&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Hero of Ages: Book Three of Mistborn by Brandon Sanderson&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780765356147&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DqtGvAwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780765356147&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Hero of Ages: Book Three of Mistborn&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Brandon Sanderson&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;What If? Serious Scientific Answers to Absurd Hypothetical Questions by Randall Munroe&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780544272996&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DtgZIBAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780544272996&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;What If? Serious Scientific Answers to Absurd Hypothetical Questions&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Randall Munroe&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Project Hail Mary: A Novel by Andy Weir&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780593135228&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DiEiHEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780593135228&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Project Hail Mary: A Novel&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Andy Weir&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Well of Ascension by Brandon Sanderson&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781429961813&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DY-41Q9zk32kC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781429961813&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Well of Ascension&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Brandon Sanderson&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Spinning Silver: A Novel by Naomi Novik&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780399181009&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DoF1BDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780399181009&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Spinning Silver: A Novel&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Naomi Novik&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Left-Handed Fate by Kate Milford&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780805098006&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dy9mkDAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780805098006&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Left-Handed Fate&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Kate Milford&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Dark Talent by Brandon Sanderson&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781466881532&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DTOeUCgAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781466881532&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Dark Talent&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Brandon Sanderson&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Alcatraz versus the Shattered Lens by Brandon Sanderson&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781444006759&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D2RnOd3J6T30C%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781444006759&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Alcatraz versus the Shattered Lens&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Brandon Sanderson&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Scrivener&amp;#39;s Bones by Brandon Sanderson&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780765378965&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DhupYCwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780765378965&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Scrivener&amp;#39;s Bones&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Brandon Sanderson&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Alcatraz Vs. the Evil Librarians by Brandon Sanderson&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780765378941&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DRzIuCwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780765378941&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Alcatraz Vs. the Evil Librarians&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Brandon Sanderson&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Let&amp;#39;s Talk about Sex by Robie H. Harris&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781406356045&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DsDPloAEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781406356045&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Let&amp;#39;s Talk about Sex&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Robie H. Harris&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Sex, Puberty and All that Stuff by Jacqui Bailey&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780749658502&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DVWBMGwAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780749658502&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Sex, Puberty and All that Stuff&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Jacqui Bailey&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Twelve by Cindy Lin&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780062821294&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DVGdzDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780062821294&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Twelve&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Cindy Lin&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;World Without Fish by Mark Kurlansky&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781523507092&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DPx1bDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781523507092&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;World Without Fish&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Mark Kurlansky&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;I Am Malala by Malala Yousafzai&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780316322423&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dx0rjngEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780316322423&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;I Am Malala&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Malala Yousafzai&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;They Called Us Enemy by George Takei&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781684067510&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DoEWUDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781684067510&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;They Called Us Enemy&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;George Takei&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Seventh Grade vs. the Galaxy by Joshua S. Levy&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781541546509&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DPxh_DwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781541546509&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Seventh Grade vs. the Galaxy&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Joshua S. Levy&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Science Comics: Rocks and Minerals by Andy Hirsch&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781250803092&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DVgLyDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781250803092&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Science Comics: Rocks and Minerals&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Andy Hirsch&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Science Comics: Sharks by Joe Flood&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781626727885&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DCxNFDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781626727885&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Science Comics: Sharks&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Joe Flood&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Science Comics: Cats by Andy Hirsch&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781250143129&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DN0hhuQEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781250143129&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Science Comics: Cats&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Andy Hirsch&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Rez Dogs by Joseph Bruchac&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780593326213&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DE3AtEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780593326213&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Rez Dogs&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Joseph Bruchac&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;What If? 2 by Randall Munroe&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781473680630&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D6bLmzgEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781473680630&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;What If? 2&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Randall Munroe&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Twenty Thousand Leagues Under the Sea by Jules Verne&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781853260315&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D1kZyen7-PD8C%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781853260315&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Twenty Thousand Leagues Under the Sea&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Jules Verne&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Cosmic Queries by Neil deGrasse Tyson&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781426221781&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D2HMOEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26edge%3Dcurl%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781426221781&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Cosmic Queries&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Neil deGrasse Tyson&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
&lt;/ul&gt;

&lt;h3 id=&#34;grammar-and-vocabulary&#34;&gt;Grammar and Vocabulary&lt;/h3&gt;
&lt;p&gt;We used a couple of resources this year to cover common grammatical and spelling mistakes, sentence diagramming, and common Latin roots and stems. The resources were from the Critical Thinking Company: &lt;a href=&#34;https://www.criticalthinking.com/sentence-diagramming-beginning.html&#34;&gt;Sentence Diagramming Beginning&lt;/a&gt;, &lt;a href=&#34;https://www.criticalthinking.com/word-roots-level-1.html&#34;&gt;Word Roots Level 1&lt;/a&gt;, and &lt;a href=&#34;https://www.criticalthinking.com/editor-in-chief-level-2.html&#34;&gt;Editor in Chief Level 2&lt;/a&gt;. There was also quite a lot of working with work roots during his interdisciplinary studies with his Falcon&amp;rsquo;s class (see below)&lt;/p&gt;
&lt;h2 id=&#34;science&#34;&gt;Science&lt;/h2&gt;
&lt;p&gt;Science is what my son loves more than anything. &amp;ldquo;There is no such thing as too much science&amp;rdquo; is a frequent quote I hear when we are bouncing around ideas of things to do an learn.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/img-20221130-085400.png&#34; alt=&#34;&#34;&gt;
&lt;h3 id=&#34;astronomy--space-science&#34;&gt;Astronomy &amp;amp; Space Science&lt;/h3&gt;
&lt;p&gt;One science he dove into this year was astronomy. He read several non-fiction works around this subject this year (see the reading list above) and took an online class from Outschool for a semester called &lt;a href=&#34;https://outschool.com/classes/twisted-universe-more-ways-math-helps-us-understand-space-ongoing-nbmzu5Ux&#34;&gt;Twisted Universe: More Ways Math Helps Us Understand Space&lt;/a&gt; and in it he covered some amazing topics like Titius-Bode Law and logarithmic patterns of planets in our solar system, ion engines, the Roche Limit, how to use the Rayleigh criterion to understand a telescope&amp;rsquo;s power, reviewing Newton&amp;rsquo;s Laws to understand how Newton&amp;rsquo;s Laws apply to space, the James Webb Space Telescope, what is escape velocity and how to analyze how fast a rocket needs to go in order to leave Earth and the moon, what are Solar Flares, Hubble&amp;rsquo;s Law, calculating and comparing the speeds each of Saturn&amp;rsquo;s rings as they orbit the planets and in general, calculating the speed of astronomical objects based on locations at different times. Whew&amp;hellip;.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/img-20220826-090240-blur.png&#34;  alt=&#34;&#34;&gt;
&lt;h3 id=&#34;science-sleuths&#34;&gt;Science Sleuths&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://taylormadescience.com/course-descriptions/&#34;&gt;Science Sleuths&lt;/a&gt; is a year long online class for middle schoolers that prepares them for honors high school level science classes involving labs. It&amp;rsquo;s taught by Cheryl Taylor. It covers basic science skills and lab techniques, such as scientific inquiry, scientific measurement, math and graphing skills used in science, and data collection and analysis. That they then use to solve mysteries around forensics topics. He also learned a valuable lesson around not losing supplies from his supply box.&lt;/p&gt;
&lt;h2 id=&#34;social-studies--interdisciplinary-studies&#34;&gt;Social Studies &amp;amp; Interdisciplinary Studies&lt;/h2&gt;
&lt;p&gt;We started the year by going over early American History but that fizzled out before January. Partly because there was an already full course load going on and partly because the online co-op I signed both my kids up for was doing a fantastic job covering social studies and a million other things.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/img-20220918-151037.png&#34; alt=&#34;&#34;&gt;
&lt;p&gt;So &lt;a href=&#34;https://falconsedu.com/&#34;&gt;Falcon&amp;rsquo;s Edu&lt;/a&gt; is an online co-op run by an absolutely fabulous teacher named Anna. She weaves together complex topics for the kids to discuss and has really created a fantastic community. There was a weekly newsletter/paper that the kids put together and ran. My son contributed several pieces around gemstones and other science topics he was interested in at the time. They created a Halloween play and performed it over Zoom, they practiced running the class themselves, they did some crafting every class. They shared their interests and did deep dives on topics like colonialism, geography and how it affected history, selective breeding, taxonomic trees, mass production, plate tectonics, slavery and racism, Native American boarding schools, civic duties, advertising, protests, pandemics, primary and secondary sources, and Pride month. There is no way I could cover all that they did or do it justice, but here are some of the main discussion topics they explored together:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can a colonized culture ever go back to the way it was?&lt;/li&gt;
&lt;li&gt;Does might make right?&lt;/li&gt;
&lt;li&gt;What does it mean to own land?&lt;/li&gt;
&lt;li&gt;Apologies and their role in communities and in history&lt;/li&gt;
&lt;li&gt;Diversity, Equity, and Inclusion and what is culture and how does it spread?&lt;/li&gt;
&lt;li&gt;What does it mean to be an adult?&lt;/li&gt;
&lt;li&gt;How do yard sales help save the world?&lt;/li&gt;
&lt;li&gt;How humans around the world work with materials and use themselves as materials&lt;/li&gt;
&lt;li&gt;What does it mean to be indigenous?&lt;/li&gt;
&lt;li&gt;Whose voyages got into history books and why?&lt;/li&gt;
&lt;li&gt;What would happen if all oil drilling stopped today?&lt;/li&gt;
&lt;li&gt;What cultures would we expect to rely on bamboo?&lt;/li&gt;
&lt;li&gt;How many pandemics have happened in history?&lt;/li&gt;
&lt;li&gt;What about invasive species?&lt;/li&gt;
&lt;li&gt;How would US history be different without African diaspora?&lt;/li&gt;
&lt;li&gt;Is a ham and cheese sandwich expensive? What makes something expensive?&lt;/li&gt;
&lt;li&gt;Does child labor make a culture stronger, weaker, or something else?&lt;/li&gt;
&lt;li&gt;Why do so many cultures have similar holidays around the same time of year?&lt;/li&gt;
&lt;li&gt;What is a bad guy?&lt;/li&gt;
&lt;li&gt;What ways did the industrial revolution change society? Why did it change?&lt;/li&gt;
&lt;li&gt;What is a memorial?&lt;/li&gt;
&lt;li&gt;What makes a fruit, a fruit?&lt;/li&gt;
&lt;li&gt;Why is a red panda called a red panda? What other animals are named for animals? Why?&lt;/li&gt;
&lt;li&gt;When did Thanksgiving become a holiday?&lt;/li&gt;
&lt;li&gt;Did humans domesticate dogs, or the other way around?&lt;/li&gt;
&lt;li&gt;What is a missionary?&lt;/li&gt;
&lt;li&gt;Are factories reverent? Can machines be reverent?&lt;/li&gt;
&lt;li&gt;Why do holidays and books get outlawed?&lt;/li&gt;
&lt;li&gt;What does it mean &amp;ldquo;having good done to you&amp;rdquo;? (around foster care and indigenous children)&lt;/li&gt;
&lt;li&gt;How can we handle fear-mongering? Demonization versus humanization.&lt;/li&gt;
&lt;li&gt;Do person-made problems also have person-made solutions?&lt;/li&gt;
&lt;li&gt;What&amp;rsquo;s polite? Different culture mannerisms.&lt;/li&gt;
&lt;li&gt;Why are animals on our planet so different?&lt;/li&gt;
&lt;li&gt;How is a clam like a cricket?&lt;/li&gt;
&lt;li&gt;Why do we classify animals? Is classification constructive in other areas?&lt;/li&gt;
&lt;li&gt;Is hair political?&lt;/li&gt;
&lt;li&gt;The &amp;ldquo;Don&amp;rsquo;t Say Gay&amp;rdquo; bill and other banned books/topics? Why so many so quickly?&lt;/li&gt;
&lt;li&gt;Why do we have moments of silence?&lt;/li&gt;
&lt;li&gt;Who gets to decide what is appropriate?&lt;/li&gt;
&lt;li&gt;When inappropriate things happen in history, what should be done?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;physical-education-and-health&#34;&gt;Physical Education and Health&lt;/h2&gt;
&lt;p&gt;He swam for the local swim team and did Kung Fu at a local school. He also stated going to some Tai Chi classes. I also had a couple books on puberty and sex for him to read and we spent a lot of time going over nutrition and how to keep bodies healthy.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/video-20230115-143428-exported-15779.png&#34;  alt=&#34;&#34;&gt;
&lt;h2 id=&#34;extracurriculars-and-fieldtrips&#34;&gt;Extracurriculars and Fieldtrips&lt;/h2&gt;
&lt;p&gt;This year we visited two different aquariums, the Corning Museum of Glass, and Niagara Falls. He did an 8 week course on python coding and continued playing the clarinet.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/img-20220921-101338.png&#34; alt=&#34;&#34;&gt;
&lt;p&gt;So that was it. Whew! No wonder the year flew by. He is excited for eighth grade, summer camp and more swimming! He also started a D&amp;amp;D campaign with some cousins and friends. Next up&amp;hellip; braces 😆&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>🐲 Fifth Grade for 2022/2023</title>
      <link>https://heyloura.com/2025/04/04/131717.html</link>
      <pubDate>Fri, 04 Apr 2025 13:17:17 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/04/04/131717.html</guid>
      <description>&lt;div style=&#34;text-align:center&#34; class=&#34;sub-nav&#34;&gt;
&lt;a href=&#34;https://heyloura.com/categories/homeschooling/&#34;&gt;#homeschooling&lt;/a&gt;
&lt;/div&gt;
&lt;h1 id=&#34;we-did-it-fifth-grade-is-done&#34;&gt;We did it! Fifth grade is done!&lt;/h1&gt;
&lt;p&gt;This year was tough. My daughter is a reluctant homeschooler. She wasn&amp;rsquo;t thrilled when the pandemic shut everything down and sent her schooling at home and she wasn&amp;rsquo;t thrilled waiting for reliable vaccines and until I felt like schools had returned to a somewhat normal state. But I like to think that even with all bumps we had some fun 😁&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/img-20220920-104026.png&#34; alt=&#34;&#34;&gt;
&lt;h2 id=&#34;mathematics&#34;&gt;Mathematics:&lt;/h2&gt;
&lt;p&gt;We actually cycled through a few different math curriculums to find one that worked for my daughter. Turns out she needed a curriculum that spirals through topics rather than a mastery approach. We ended up with &lt;a href=&#34;https://www.criticalthinking.com/mathematical-reasoning-level-f.html&#34;&gt;Mathematics Reasoning Level F&lt;/a&gt;. It had bright interesting pages, it wasn&amp;rsquo;t the same thing day-in and day-out. I wouldn&amp;rsquo;t say she loved it, but she did get through it.&lt;/p&gt;
&lt;h2 id=&#34;english-language-arts&#34;&gt;English Language Arts:&lt;/h2&gt;
&lt;h3 id=&#34;writing-grammar-and-spelling&#34;&gt;Writing, Grammar, and Spelling&lt;/h3&gt;
&lt;p&gt;This year my daughter did most of her writing with outside teachers. But also did some free writing and writing paragraphs about whatever interested her with me. There were quite a few about chickens 🐣. She enjoyed her online class through Outschool - &lt;a href=&#34;https://outschool.com/classes/ongoing-english-class-a-full-semester-of-english-standards-ged-aligned-bWMOWIkY&#34;&gt;Ongoing English Class&lt;/a&gt;. We also really focused on spelling this year using a variety of materials. In the end we used a curriculum called &lt;a href=&#34;https://www.soundfoundations.co.uk/en_US/product-category/apples-pears-en_us/&#34;&gt;Apples and Pears&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;literature-and-reading&#34;&gt;Literature and Reading&lt;/h3&gt;
&lt;p&gt;For reading I don&amp;rsquo;t make a specific list of books that need to be worked through, I just challenge them to choose what&amp;rsquo;s interesting and to reach for a mix of easy and hard titles. I did end up picking an additional 12 books for our home library across fiction and non-fiction that I thought she&amp;rsquo;d be interested in. I did have to insist on at least one book being about puberty to her dismay.&lt;/p&gt;







&lt;ul class=&#34;bookshelf bookshelf--variant-grid&#34;&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Harry Potter and the Chamber of Secrets (MinaLima Edition) (2) by J. K. Rowling&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781338716535&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DQ9gizgEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781338716535&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Harry Potter and the Chamber of Secrets (MinaLima Edition) (2)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;J. K. Rowling&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Athena: Goddess of Wisdom and War (Tales of Great Goddesses) by Imogen Greenberg&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781647000684&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DZ-n9DwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781647000684&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Athena: Goddess of Wisdom and War (Tales of Great Goddesses)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Imogen Greenberg&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Hatchet: 30th Anniversary Edition (Brian&amp;#39;s Saga Book 1) by Gary Paulsen&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781442403321&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DQdX94z_OoukC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781442403321&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Hatchet: 30th Anniversary Edition (Brian&amp;#39;s Saga Book 1)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Gary Paulsen&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Spinning Silver: A Novel by Naomi Novik&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780399181009&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DoF1BDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780399181009&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Spinning Silver: A Novel&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Naomi Novik&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Left-Handed Fate by Kate Milford&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780805098006&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dy9mkDAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780805098006&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Left-Handed Fate&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Kate Milford&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Ancient Egyptian World by Eric H. Cline&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780195173918&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DnvfJygAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780195173918&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Ancient Egyptian World&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Eric H. Cline&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;It&amp;#39;s So Amazing! by Robie H. Harris&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780763668747&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dj7ZvDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780763668747&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;It&amp;#39;s So Amazing!&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Robie H. Harris&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;A Kid&amp;#39;s Guide to Keeping Chickens by Melissa Caughey&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781612124186&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DxkmbBwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781612124186&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;A Kid&amp;#39;s Guide to Keeping Chickens&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Melissa Caughey&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Harriet the Spy by Louise Fitzhugh&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780593482322&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D-81rEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780593482322&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Harriet the Spy&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Louise Fitzhugh&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;History Smashers: The Titanic by Kate Messner&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780593120439&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DLjsiEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780593120439&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;History Smashers: The Titanic&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Kate Messner&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;History Smashers: Women&amp;#39;s Right to Vote by Kate Messner&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780593120347&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DUpLqDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780593120347&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;History Smashers: Women&amp;#39;s Right to Vote&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Kate Messner&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The School for Good and Evil by Soman Chainani&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780062104915&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DY8MTHn6j9W4C%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780062104915&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The School for Good and Evil&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Soman Chainani&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Science Comics: Cats by Andy Hirsch&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781250143129&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DN0hhuQEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781250143129&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Science Comics: Cats&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Andy Hirsch&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Rez Dogs by Joseph Bruchac&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780593326213&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DE3AtEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780593326213&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Rez Dogs&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Joseph Bruchac&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Primates by Jim Ottaviani&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781250062932&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dmqt2oAEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781250062932&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Primates&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Jim Ottaviani&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Phantom Tollbooth by Norton Juster&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780394820378&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D87UWNi83IrIC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780394820378&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Phantom Tollbooth&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Norton Juster&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Science Comics: Volcanoes by Jon Chad&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781626723603&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dg2a3DAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781626723603&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Science Comics: Volcanoes&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Jon Chad&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Science Comics: Crows by Kyla Vanderklugt&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781250781581&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dd5_TDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781250781581&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Science Comics: Crows&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Kyla Vanderklugt&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;How the U. S. Government Works by Syl Sobel J. D.&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781438011639&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dl9p-uwEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781438011639&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;How the U. S. Government Works&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Syl Sobel J. D.&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Food Anatomy by Julia Rothman&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781612123394&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DA14dDQAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781612123394&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Food Anatomy&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Julia Rothman&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;A Really Short History of Nearly Everything by Bill Bryson&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780385738101&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DIUyNEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780385738101&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;A Really Short History of Nearly Everything&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Bill Bryson&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
&lt;/ul&gt;

&lt;h2 id=&#34;science&#34;&gt;Science&lt;/h2&gt;
&lt;h3 id=&#34;kitchen-chemistry--fundamental-of-physics&#34;&gt;Kitchen Chemistry &amp;amp; Fundamental of Physics&lt;/h3&gt;
&lt;p&gt;This was a fun class that I found that I don&amp;rsquo;t think will be offered again but here is the link to the section she used: &lt;a href=&#34;https://courses.seahomeschoolers.com/course/kitchen-chemistry/&#34;&gt;Kitchen Chemistry&lt;/a&gt;. This was a blast and she would have loved if it lasted all year long. I really enjoyed the molecular bond cookies she made.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/img-20220929-172245.png&#34; alt=&#34;&#34;&gt;
&lt;p&gt;I believe that the teacher is turning this course into a book for homeschoolers and if she does, I highly recommend it.  The second half of the year was all about Physics. This was another fun class that was very hands on although I don&amp;rsquo;t think she liked it as much as kitchen chemistry: &lt;a href=&#34;https://courses.seahomeschoolers.com/course/fundamentals-of-physics/&#34;&gt;Fundamentals of Physics&lt;/a&gt;. We also did a lot of fun science experiments together. She gobbled up a lot of disease videos from Science Mom&amp;rsquo;s &lt;a href=&#34;https://science.mom/microbiology&#34;&gt;microbiology course&lt;/a&gt; we did last year and watched a bunch of science videos from &lt;a href=&#34;https://www.generationgenius.com/science-videos-for-kids/&#34;&gt;Generation Genius&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/img-20220823-140238.png&#34; width=&#34;400&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
&lt;h2 id=&#34;social-studies--interdisciplinary-studies&#34;&gt;Social Studies &amp;amp; Interdisciplinary Studies&lt;/h2&gt;
&lt;p&gt;My daughter &lt;strong&gt;loves&lt;/strong&gt; history and she really loved the &lt;a href=&#34;https://outschool.com/classes/history-mystery-mysteries-and-unusual-stories-qRcayGkj&#34;&gt;History Mystery&lt;/a&gt; class I found on Outschool. The class dove into a wide variety of mysteries including Boudica (Celtic Queen), the haunted Myrtle Plantation, mysteries in Chinese mythology, the mysterious life of King John, Dighton Rock and other mysterious carvings, the Man in the Iron Mask, the Isabella Stuart Gardner theft, the Ghost War, the mysterious Aztec, fun Norse mythology and strange laws in the United States. Now some did give her a fright, but the teacher is very forthcoming about the &amp;ldquo;scarier&amp;rdquo; topics so you can skip those if needed.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/img-20221101-192321.png&#34; alt=&#34;&#34;&gt;
&lt;p&gt;She also joined the Falcon&amp;rsquo;s with her brother this year. &lt;a href=&#34;https://falconsedu.com/&#34;&gt;Falcon&amp;rsquo;s Edu&lt;/a&gt; is an online co-op run by an absolutely fabulous teacher named Anna. She weaves together complex topics for the kids to discuss and has really created a fantastic community. There was a weekly newsletter/paper that the kids put together and ran. My daughter contributed several pieces around chickens and created some pretty fantastic comics to share.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/img-20230128-141842.png&#34; alt=&#34;&#34;&gt;
&lt;p&gt;In Falcon&amp;rsquo;s they created a Halloween play and performed it over Zoom, they practiced running the class themselves, they did some crafting every class. They shared their interests and did deep dives on topics like colonialism, geography and how it affected history, selective breeding, taxonomic trees, mass production, plate tectonics, slavery and racism, Native American boarding schools, civic duties, advertising, protests, pandemics, primary and secondary sources, and Pride month. There is no way I could cover all that they did or do it justice, but here are some of the main discussion topics they explored together:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can a colonized culture ever go back to the way it was?&lt;/li&gt;
&lt;li&gt;Does might make right?&lt;/li&gt;
&lt;li&gt;What does it mean to own land?&lt;/li&gt;
&lt;li&gt;Apologies and their role in communities and in history&lt;/li&gt;
&lt;li&gt;Diversity, Equity, and Inclusion and what is culture and how does it spread?&lt;/li&gt;
&lt;li&gt;What does it mean to be an adult?&lt;/li&gt;
&lt;li&gt;How do yard sales help save the world?&lt;/li&gt;
&lt;li&gt;How humans around the world work with materials and use themselves as materials&lt;/li&gt;
&lt;li&gt;What does it mean to be indigenous?&lt;/li&gt;
&lt;li&gt;Whose voyages got into history books and why?&lt;/li&gt;
&lt;li&gt;What would happen if all oil drilling stopped today?&lt;/li&gt;
&lt;li&gt;What cultures would we expect to rely on bamboo?&lt;/li&gt;
&lt;li&gt;How many pandemics have happened in history?&lt;/li&gt;
&lt;li&gt;What about invasive species?&lt;/li&gt;
&lt;li&gt;How would US history be different without African diaspora?&lt;/li&gt;
&lt;li&gt;Is a ham and cheese sandwich expensive? What makes something expensive?&lt;/li&gt;
&lt;li&gt;Does child labor make a culture stronger, weaker, or something else?&lt;/li&gt;
&lt;li&gt;Why do so many cultures have similar holidays around the same time of year?&lt;/li&gt;
&lt;li&gt;What is a bad guy?&lt;/li&gt;
&lt;li&gt;What ways did the industrial revolution change society? Why did it change?&lt;/li&gt;
&lt;li&gt;What is a memorial?&lt;/li&gt;
&lt;li&gt;What makes a fruit, a fruit?&lt;/li&gt;
&lt;li&gt;Why is a red panda called a red panda? What other animals are named for animals? Why?&lt;/li&gt;
&lt;li&gt;When did Thanksgiving become a holiday?&lt;/li&gt;
&lt;li&gt;Did humans domesticate dogs, or the other way around?&lt;/li&gt;
&lt;li&gt;What is a missionary?&lt;/li&gt;
&lt;li&gt;Are factories reverent? Can machines be reverent?&lt;/li&gt;
&lt;li&gt;Why do holidays and books get outlawed?&lt;/li&gt;
&lt;li&gt;What does it mean &amp;ldquo;having good done to you&amp;rdquo;? (around foster care and indigenous children)&lt;/li&gt;
&lt;li&gt;How can we handle fear-mongering? Demonization versus humanization.&lt;/li&gt;
&lt;li&gt;Do person-made problems also have person-made solutions?&lt;/li&gt;
&lt;li&gt;What&amp;rsquo;s polite? Different culture mannerisms.&lt;/li&gt;
&lt;li&gt;Why are animals on our planet so different?&lt;/li&gt;
&lt;li&gt;How is a clam like a cricket?&lt;/li&gt;
&lt;li&gt;Why do we classify animals? Is classification constructive in other areas?&lt;/li&gt;
&lt;li&gt;Is hair political?&lt;/li&gt;
&lt;li&gt;The &amp;ldquo;Don&amp;rsquo;t Say Gay&amp;rdquo; bill and other banned books/topics? Why so many so quickly?&lt;/li&gt;
&lt;li&gt;Why do we have moments of silence?&lt;/li&gt;
&lt;li&gt;Who gets to decide what is appropriate?&lt;/li&gt;
&lt;li&gt;When inappropriate things happen in history, what should be done?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;physical-education--health&#34;&gt;Physical Education &amp;amp; Health&lt;/h2&gt;
&lt;p&gt;My daughter joined a dance competition team and acrobatic dancing remains her favorite. We also talked a lot about puberty this year and making healthy food choices and what healthy relationships should look like.&lt;/p&gt;
&lt;h2 id=&#34;extracurriculars&#34;&gt;Extracurriculars&lt;/h2&gt;
&lt;p&gt;She enjoyed a Harry Potter Club on Outschool and other drawing classes on Outschool. She also did a series of &amp;ldquo;Drawing with Scientists&amp;rdquo; online classes. Plus she was always outside building fairy gardens. This year we visited two different aquariums, the Corning Museum of Glass, and Niagara Falls. She also continued learning to play the guitar.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/frog.png&#34; alt=&#34;&#34;&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/img-20220915-080905.png&#34; alt=&#34;&#34;&gt;
&lt;p&gt;I&amp;rsquo;m a little sad that this year was our last year homeschooling but this girl knows what she wants and she&amp;rsquo;s fantastic enough to go get it. I&amp;rsquo;m sure next year will bring more dance, more requests to find pirate treasure, and a new adventure at school tackling the sixth grade.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>🐯 Sixth Grade for 2021/2022</title>
      <link>https://heyloura.com/2025/04/04/sixth-grade-for.html</link>
      <pubDate>Fri, 04 Apr 2025 13:11:21 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/04/04/sixth-grade-for.html</guid>
      <description>&lt;div style=&#34;text-align:center&#34; class=&#34;sub-nav&#34;&gt;
&lt;a href=&#34;
/categories/homeschooling/&#34;&gt;#homeschooling&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;This page was created 03/20/2024 as a look back to our earlier years homeschooling.&lt;/p&gt;
&lt;h2 id=&#34;mathematics&#34;&gt;Mathematics&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/20220103-115127copy.jpg&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Math Mammoth Topical Books&lt;/li&gt;
&lt;li&gt;ALEKS Middle School Course 3&lt;/li&gt;
&lt;li&gt;Upper Elementary Challenge Math by Edward Zacaroo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;english-language-arts&#34;&gt;English Language Arts&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/pxl-20211117-212521102copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Michael Clay Thompson Language Arts&lt;/li&gt;
&lt;li&gt;Weekly paragraphs and small essays on topics from literature, social studies and science.&lt;/li&gt;
&lt;li&gt;Spelling: Evan Moor Daily Practice&lt;/li&gt;
&lt;li&gt;Evan Moor Daily Practice and lists of commonly misspelled words&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;reading--literature&#34;&gt;Reading &amp;amp; Literature&lt;/h2&gt;







&lt;ul class=&#34;bookshelf bookshelf--variant-grid&#34;&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Eagle of the Ninth by Rosemary Sutcliff&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781101907696&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DApOTEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781101907696&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Eagle of the Ninth&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Rosemary Sutcliff&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Ancient American World by William Leonard Fash&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780195222470&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DMu8WSBOA3ZYC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780195222470&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Ancient American World&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;William Leonard Fash&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Ancient Egyptian World by Eric H. Cline&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780195173918&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DnvfJygAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780195173918&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Ancient Egyptian World&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Eric H. Cline&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Ancient Roman World by Ronald Mellor&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780195222494&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D2s2QwQEACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780195222494&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Ancient Roman World&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Ronald Mellor&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Ancient Chinese World by Terry Kleeman&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780195171020&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dps-A60cvtpwC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780195171020&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Ancient Chinese World&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Terry Kleeman&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Beowulf by Robert Nye&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780756916411&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DdsQFcAAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780756916411&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Beowulf&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Robert Nye&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Trumpeter of Krakow by Eric P. Kelly&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781774645710&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DAgjtEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781774645710&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Trumpeter of Krakow&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Eric P. Kelly&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Door in the Wall by Marguerite de Angeli&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780307806352&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DueYZ5i23VmQC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780307806352&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Door in the Wall&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Marguerite de Angeli&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Way Life Works by Mahlon B. Hoagland&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780613922593&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Do1x3PQAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780613922593&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Way Life Works&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Mahlon B. Hoagland&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Way We Work by David Macaulay&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780618233786&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dt0Twxoa3zrkC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780618233786&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Way We Work&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;David Macaulay&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Evolution by Jay Hosler&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780809043118&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DsM1k5AAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780809043118&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Evolution&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Jay Hosler&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Stuff of Life by Mark Schultz&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780809089468&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DEvvHVDmNdJ8C%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780809089468&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Stuff of Life&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Mark Schultz&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Caesar&amp;#39;s Gallic War by Olivia E. Coolidge&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780208023346&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DFMMNAAAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780208023346&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Caesar&amp;#39;s Gallic War&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Olivia E. Coolidge&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;D&amp;#39;Aulaires Book of Greek Myths by Ingri d&amp;#39;Aulaire&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781524770648&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DDTncDgAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781524770648&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;D&amp;#39;Aulaires Book of Greek Myths&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Ingri d&amp;#39;Aulaire&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Feathered Serpent, Dark Heart of Sky by David Bowles&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781941026731&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DJtRSDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781941026731&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Feathered Serpent, Dark Heart of Sky&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;David Bowles&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Island of the Blue Dolphins by Scott O&amp;#39;Dell&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780395069622&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DvoxukO3jUDYC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780395069622&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Island of the Blue Dolphins&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Scott O&amp;#39;Dell&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Bridge to Terabithia by Katherine Paterson&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780061975165&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DjEdNOQhEHNcC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780061975165&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Bridge to Terabithia&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Katherine Paterson&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Golden Goblet by Eloise Jarvis McGraw&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780140303353&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DkePYCwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780140303353&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Golden Goblet&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Eloise Jarvis McGraw&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Treasury of Egyptian Mythology by Donna Jo Napoli&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781426318610&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DWBIBEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781426318610&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Treasury of Egyptian Mythology&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Donna Jo Napoli&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
&lt;/ul&gt;

&lt;h2 id=&#34;science&#34;&gt;Science&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Genetics and Microbiology by Science Mom&lt;/li&gt;
&lt;li&gt;Biochemistry Literacy for Kids&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20220112-100041copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;h2 id=&#34;social-studies&#34;&gt;Social Studies&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/20210905-144840copy.jpg&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;US states geography, features, and capitals&lt;/li&gt;
&lt;li&gt;Ancient China, Ancient Rome, Ancient Greeks, Ancient America&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;electives&#34;&gt;Electives&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/pxl-20211202-200231728copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Typing: Online tool. Typsey.com&lt;/li&gt;
&lt;li&gt;Music: Clarinet, online tutor&lt;/li&gt;
&lt;li&gt;P.E: Martial Arts&lt;/li&gt;
&lt;li&gt;Sports: Swim Team @ YMCA&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;extracurriculars-and-fieldtrips&#34;&gt;Extracurriculars and Fieldtrips&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20220407-144722copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;New England Aquarium&lt;/li&gt;
&lt;li&gt;Acadia National Parks&lt;/li&gt;
&lt;li&gt;Hammond Museum: A Medieval Castle&lt;/li&gt;
&lt;li&gt;Butterfly Atrium - Hershey Gardens&lt;/li&gt;
&lt;li&gt;Hike along part of the Appalachian Trail&lt;/li&gt;
&lt;li&gt;Wicked - The Musical&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20220409-153232copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
</description>
    </item>
    
    <item>
      <title>🐲 Fourth Grade for 2021/2022</title>
      <link>https://heyloura.com/2025/04/04/fourth-grade-for.html</link>
      <pubDate>Fri, 04 Apr 2025 12:58:00 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/04/04/fourth-grade-for.html</guid>
      <description>&lt;div style=&#34;text-align:center&#34; class=&#34;sub-nav&#34;&gt;
&lt;a href=&#34;
/categories/homeschooling/&#34;&gt;#homeschooling&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;This page was created 03/19/2024 as a look back to our earlier years homeschooling.&lt;/p&gt;
&lt;h2 id=&#34;mathematics&#34;&gt;Mathematics&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/20220318-083533copy.jpg&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Math Mammoth Topic Books&lt;/li&gt;
&lt;li&gt;ALEKS Level 5&lt;/li&gt;
&lt;li&gt;Primary Grade Challenge Math by Edward Zacaroo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;english-language-arts&#34;&gt;English Language Arts&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/pxl-20211117-181318609copy.jpg&#34; width=&#34;600&#34; height=&#34;800&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Michael Clay Thompson Language Arts&lt;/li&gt;
&lt;li&gt;Fable and Song by Cottage Press&lt;/li&gt;
&lt;li&gt;Spelling: Evan Moor Daily Practice&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;reading--literature&#34;&gt;Reading &amp;amp; Literature&lt;/h2&gt;







&lt;ul class=&#34;bookshelf bookshelf--variant-grid&#34;&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;A Wrinkle in Time by Madeleine L&amp;#39;Engle&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781429915649&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dr119-dYq0mwC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781429915649&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;A Wrinkle in Time&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Madeleine L&amp;#39;Engle&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Harry Potter and the Sorcerer&amp;#39;s Stone by J.K. Rowling&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781781100486&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DwrOQLV6xB-wC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781781100486&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Harry Potter and the Sorcerer&amp;#39;s Stone&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;J.K. Rowling&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Redwall by Brian Jacques&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780441005482&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DlQdKGK7WvTwC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780441005482&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Redwall&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Brian Jacques&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Science Comics: Coral Reefs by Maris Wicks&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781626721456&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DfKdwCwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781626721456&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Science Comics: Coral Reefs&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Maris Wicks&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Human Body Theater by Maris Wicks&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781626725874&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D9e6UCgAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781626725874&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Human Body Theater&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Maris Wicks&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Mrs. Frisby and the Rats of Nimh by Robert C. O&amp;#39;Brien&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781665911610&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D1ToqEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781665911610&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Mrs. Frisby and the Rats of Nimh&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Robert C. O&amp;#39;Brien&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Saint George and the Dragon by Margaret Hodges&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780833561138&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DT75HPgAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780833561138&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Saint George and the Dragon&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Margaret Hodges&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;From the Mixed-Up Files of Mrs. Basil E. Frankweiler by E.L. Konigsburg&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781442431263&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DgeqKd50y6MQC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781442431263&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;From the Mixed-Up Files of Mrs. Basil E. Frankweiler&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;E.L. Konigsburg&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Story of King Arthur and His Knights by Howard Pyle&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780486172743&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DD_vDAgAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780486172743&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Story of King Arthur and His Knights&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Howard Pyle&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Tale of Despereaux by Kate DiCamillo&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780763649432&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Drsi8h_NkCosC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780763649432&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Tale of Despereaux&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Kate DiCamillo&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Adventures of Robin Hood by Richard Lancelyn Green&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780141334899&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D2ACTEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780141334899&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Adventures of Robin Hood&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Richard Lancelyn Green&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Hundred Dresses by Eleanor Estes&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780152052607&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dherrly9O22EC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780152052607&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Hundred Dresses&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Eleanor Estes&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
&lt;/ul&gt;

&lt;h2 id=&#34;science&#34;&gt;Science&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/20220217-112239.jpg&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Biology with Science Mom&lt;/li&gt;
&lt;li&gt;Part of Biochemistry Literacy for kids&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;social-studies&#34;&gt;Social Studies&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20220115-144801copy.jpg&#34; width=&#34;600&#34; height=&#34;855&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;US states geography, features, and capitals&lt;/li&gt;
&lt;li&gt;Middle Ages: Curiosity Chronicles Middle Ages&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;electives&#34;&gt;Electives&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/pxl-20210905-191359319copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Typing: Online tool. Typsey.com&lt;/li&gt;
&lt;li&gt;Music: Recorder, online tutor&lt;/li&gt;
&lt;li&gt;P.E: Dance&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;extracurriculars-and-fieldtrips&#34;&gt;Extracurriculars and Fieldtrips&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/20210917-115235copy.jpg&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;New England Aquarium&lt;/li&gt;
&lt;li&gt;Acadia National Parks&lt;/li&gt;
&lt;li&gt;Hammond Museum: A Medieval Castle&lt;/li&gt;
&lt;li&gt;Butterfly Atrium - Hershey Gardens&lt;/li&gt;
&lt;li&gt;Hike along part of the Appalachian Trail&lt;/li&gt;
&lt;li&gt;Wicked - The Musical&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20211231-111915copy.jpg&#34; width=&#34;600&#34; height=&#34;800&#34; alt=&#34;&#34;&gt;
</description>
    </item>
    
    <item>
      <title>🐯 Fifth Grade for 2020/2021</title>
      <link>https://heyloura.com/2025/04/04/fifth-grade-for.html</link>
      <pubDate>Fri, 04 Apr 2025 12:50:07 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/04/04/fifth-grade-for.html</guid>
      <description>&lt;div style=&#34;text-align:center&#34; class=&#34;sub-nav&#34;&gt;
&lt;a href=&#34;
/categories/homeschooling/&#34;&gt;#homeschooling&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;This page was created 03/19/2024 as a look back to our earlier years homeschooling.&lt;/p&gt;
&lt;h2 id=&#34;mathematics&#34;&gt;Mathematics&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/pxl-20201210-134937676copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Math Mammoth Grade 5&lt;/li&gt;
&lt;li&gt;Upper Elementary Challenge Math by Edward Zacaroo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;english-language-arts&#34;&gt;English Language Arts&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/pxl-20210211-190313813.mpcopy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Michael Clay Thompson Language Arts&lt;/li&gt;
&lt;li&gt;Elementary Sentence Composing by Killagon&lt;/li&gt;
&lt;li&gt;Institute for Excellence in Writing - Style and Structure&lt;/li&gt;
&lt;li&gt;Evan Moor Daily Practice and lists of commonly misspelled words&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;reading--literature&#34;&gt;Reading &amp;amp; Literature&lt;/h2&gt;







&lt;ul class=&#34;bookshelf bookshelf--variant-grid&#34;&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Hatchet: 30th Anniversary Edition (Brian&amp;#39;s Saga Book 1) by Gary Paulsen&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781442403321&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DQdX94z_OoukC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781442403321&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Hatchet: 30th Anniversary Edition (Brian&amp;#39;s Saga Book 1)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Gary Paulsen&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Harry Potter and the Prisoner of Azkaban by J.K. Rowling&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781781100516&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DSm5AKLXKxHgC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781781100516&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Harry Potter and the Prisoner of Azkaban&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;J.K. Rowling&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Harry Potter and the Chamber of Secrets by J.K. Rowling&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781781100509&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D5iTebBW-w7QC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781781100509&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Harry Potter and the Chamber of Secrets&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;J.K. Rowling&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;A Wrinkle in Time by Madeleine L&amp;#39;Engle&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781429915649&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dr119-dYq0mwC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781429915649&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;A Wrinkle in Time&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Madeleine L&amp;#39;Engle&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Harry Potter and the Sorcerer&amp;#39;s Stone by J.K. Rowling&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781781100486&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DwrOQLV6xB-wC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781781100486&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Harry Potter and the Sorcerer&amp;#39;s Stone&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;J.K. Rowling&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Mrs. Frisby and the Rats of Nimh by Robert C. O&amp;#39;Brien&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781665911610&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D1ToqEAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781665911610&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Mrs. Frisby and the Rats of Nimh&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Robert C. O&amp;#39;Brien&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Alice in Wonderland by Lewis Carroll&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781877527814&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DZxwpakTv_MIC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781877527814&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Alice in Wonderland&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Lewis Carroll&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Dealing with Dragons by Patricia C. Wrede&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780547538648&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DIrDqDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780547538648&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Dealing with Dragons&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Patricia C. Wrede&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Igraine the Brave by Cornelia Funke&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780545406185&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DY3pn9y6b7GcC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780545406185&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Igraine the Brave&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Cornelia Funke&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Witch of Blackbird Pond by Elizabeth George Speare&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780547550299&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3D6WGTMG3bF88C%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780547550299&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Witch of Blackbird Pond&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Elizabeth George Speare&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Ben and Me by Robert Lawson&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780881037548&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DVpAAAAAACAAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780881037548&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Ben and Me&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Robert Lawson&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Explorer by Katherine Rundell&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781481419451&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DJSs0DwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781481419451&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Explorer&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Katherine Rundell&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Peter Pan by J. M. Barrie&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780689830785&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dogjljqn1R2kC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780689830785&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Peter Pan&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;J. M. Barrie&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
&lt;/ul&gt;

&lt;h2 id=&#34;science&#34;&gt;Science&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/20200819-100318copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Earth Science by Science Mom&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Chemistry by Science Mom&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20200820-135442copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;social-studies&#34;&gt;Social Studies&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/26d35f1ddd.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Early American History with SEA online classes&lt;/li&gt;
&lt;li&gt;Ancient History &amp;amp; Geography with History Odyssey Level 2 - Ancient History&lt;/li&gt;
&lt;li&gt;Some Middle Ages with Curiosity Chronicles Middle Ages&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;electives&#34;&gt;Electives&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/pxl-20210225-185331646copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Typing: Online tool. Typsey.com&lt;/li&gt;
&lt;li&gt;Music: Clarinet, online tutor&lt;/li&gt;
&lt;li&gt;P.E.: Martial Arts&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>🐲 Third Grade for 2020/2021</title>
      <link>https://heyloura.com/2025/04/04/third-grade-for.html</link>
      <pubDate>Fri, 04 Apr 2025 12:17:33 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/04/04/third-grade-for.html</guid>
      <description>&lt;div style=&#34;text-align:center&#34; class=&#34;sub-nav&#34;&gt;
&lt;a href=&#34;
/categories/homeschooling/&#34;&gt;#homeschooling&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;This page was created 03/14/2024 as a look back to our earlier years homeschooling.&lt;/p&gt;
&lt;h2 id=&#34;mathematics&#34;&gt;Mathematics&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/pxl-20210115-132749411copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Math Mammoth Grade 5&lt;/li&gt;
&lt;li&gt;Primary Grade Challenge Math by Edward Zacaroo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;english-language-arts&#34;&gt;English Language Arts&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20200821-090327copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Grammar: Michael Clay Thompson Language Arts&lt;/li&gt;
&lt;li&gt;Writing: Elementary Sentence Composing by Killagon&lt;/li&gt;
&lt;li&gt;Writing: Institute for Excellence in Writing - Style and Structure&lt;/li&gt;
&lt;li&gt;Spelling: Evan Moor Daily Practice&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;reading--literature&#34;&gt;Reading &amp;amp; Literature&lt;/h2&gt;







&lt;ul class=&#34;bookshelf bookshelf--variant-grid&#34;&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Alice in Wonderland by Lewis Carroll&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781877527814&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DZxwpakTv_MIC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781877527814&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Alice in Wonderland&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Lewis Carroll&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Dealing with Dragons by Patricia C. Wrede&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780547538648&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DIrDqDwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780547538648&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Dealing with Dragons&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Patricia C. Wrede&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Igraine the Brave by Cornelia Funke&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780545406185&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DY3pn9y6b7GcC%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780545406185&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Igraine the Brave&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Cornelia Funke&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Framed! by James Ponti&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781481436328&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DD5apCgAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781481436328&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Framed!&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;James Ponti&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Charlotte&amp;#39;s Web by E. B. White&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780062406781&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DWwN4BgAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780062406781&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Charlotte&amp;#39;s Web&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;E. B. White&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Pippi Longstocking by Astrid Lindgren&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780192752048&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DXe8otKSjdX0C%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780192752048&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Pippi Longstocking&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Astrid Lindgren&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Wonderful Wizard of Oz (Pretty Books - Painted Editions) by L. Frank Baum&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9781401604202&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DYo01EAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9781401604202&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Wonderful Wizard of Oz (Pretty Books - Painted Editions)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;L. Frank Baum&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Charlie and the Chocolate Factory (Colour Edition) by Roald Dahl&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780141378558&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DiaD7DAAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780141378558&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Charlie and the Chocolate Factory (Colour Edition)&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Roald Dahl&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;Little House on the Prairie by Laura Ingalls Wilder&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780062094889&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3Dm06dCwAAQBAJ%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780062094889&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;Little House on the Prairie&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Laura Ingalls Wilder&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
    &lt;li&gt;
      &lt;div class=&#34;bookshelf__item&#34; title=&#34;The Phantom Tollbooth by Norton Juster&#34;&gt;
        &lt;a href=&#34;https://micro.blog/books/9780375985294&#34;&gt;
          &lt;img class=&#34;bookshelf__cover&#34; src=&#34;https://cdn.micro.blog/photos/300x/https%3A%2F%2Fbooks.google.com%2Fbooks%2Fcontent%3Fid%3DgOth2bxRX54C%26printsec%3Dfrontcover%26img%3D1%26zoom%3D5%26source%3Dgbs_api&#34; /&gt;
        &lt;/a&gt;
        &lt;div class=&#34;bookshelf__meta&#34;&gt;
          &lt;a href=&#34;https://micro.blog/books/9780375985294&#34;&gt;
            &lt;h3 class=&#34;bookshelf__title&#34;&gt;The Phantom Tollbooth&lt;/h3&gt;
          &lt;/a&gt;
          &lt;span class=&#34;bookshelf__by&#34;&gt;by&lt;/span&gt;
          &lt;span class=&#34;bookshelf__author&#34;&gt;Norton Juster&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
  
&lt;/ul&gt;

&lt;h2 id=&#34;science&#34;&gt;Science&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/pxl-20210303-160905121.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Interest lead topics in biology, physics and chemistry&lt;/li&gt;
&lt;li&gt;Month long study of climate change&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is a model of a cell she made out of pizza 🍕
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/pxl-20210211-190204230copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;social-studies&#34;&gt;Social Studies&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/pxl-20210506-201210865copy.jpg&#34; width=&#34;600&#34; height=&#34;717&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Early American History&lt;/li&gt;
&lt;li&gt;Curiosity Chronicles Middle Ages&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;electives&#34;&gt;Electives&lt;/h2&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/pxl-20210212-180016077copy.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Typing: Online tool. Typsey.com&lt;/li&gt;
&lt;li&gt;Music: Recorder&lt;/li&gt;
&lt;li&gt;Art: Weekly online classes from Outschool.com&lt;/li&gt;
&lt;li&gt;Health: Puberty, nutrition, safety&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>How to generate a number between 1...n in Hugo</title>
      <link>https://heyloura.com/2025/04/03/in-hugo-you-can-use.html</link>
      <pubDate>Thu, 03 Apr 2025 10:22:11 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/04/03/in-hugo-you-can-use.html</guid>
      <description>&lt;p&gt;In Hugo you can use {{&lt;code&gt;index (seq 18 | shuffle) 0&lt;/code&gt;}}.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What this is doing is basically making a &lt;a href=&#34;https://gohugo.io/functions/collections/seq/&#34;&gt;sequence&lt;/a&gt;, list, of numbers from 1-18 with &lt;code&gt;seq 18&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mixing up the list by &lt;a href=&#34;https://gohugo.io/functions/collections/shuffle/&#34;&gt;shuffling&lt;/a&gt; the elements with &lt;code&gt;shuffle&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Then grabbing the first element by it&amp;rsquo;s &lt;a href=&#34;https://gohugo.io/functions/collections/indexfunction/&#34;&gt;index&lt;/a&gt; of zero  &lt;code&gt;index (seq 18 | shuffle) 0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://heyloura.com/2023/10/09/dev-diary-week.html&#34;&gt;Originally mentioned in Dev Diary 0001 - Week of October 2nd 2023&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using Deno and Micropub to launch heyloura.com into Geminispace! </title>
      <link>https://heyloura.com/2025/03/11/coding-adventure-using-deno-and.html</link>
      <pubDate>Tue, 11 Mar 2025 16:19:54 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/03/11/coding-adventure-using-deno-and.html</guid>
      <description>&lt;p&gt;After &lt;a href=&#34;https://heyloura.com/2025/03/03/minicoding-adventure-explorations-with-a.html&#34;&gt;last mini-coding adventure&lt;/a&gt; where I was exploring a simple command-line browser idea I had there was a comment by &lt;a href=&#34;https://micro.blog/sod&#34;&gt;@sod&lt;/a&gt; that mentioned I might enjoy looking into Gopher or &lt;a href=&#34;https://geminiprotocol.net/&#34;&gt;Gemini&lt;/a&gt; as alternative protocols to http&amp;hellip; and he was 100% correct 😁&lt;/p&gt;
&lt;h1 id=&#34;making-a-blueprint-&#34;&gt;Making a blueprint 🗺️&lt;/h1&gt;
&lt;p&gt;After exploring some gemini sites (called capsules) I decided I wanted one. But&amp;hellip; I didn&amp;rsquo;t want to make extra work for myself by having to publish blog posts in two different places using two different tools. So I thought of two options. One, make a gemini server that could host my capsule and fetch my blog posts or two, I could go the other way. Make a gemini server, write posts in gemini syntax (.gmi) and then have them uploaded to my blog.&lt;/p&gt;
&lt;p&gt;I decided to go with the first option.&lt;/p&gt;
&lt;h1 id=&#34;1-a-scale-model-&#34;&gt;1.) A scale model 📡&lt;/h1&gt;
&lt;p&gt;First thing first. I needed to get something running locally. I already had a gemini client installed called &lt;a href=&#34;https://gmi.skyjake.fi/lagrange/&#34;&gt;Lagrange&lt;/a&gt; and I&amp;rsquo;ve been using Deno quite a bit for hobby projects. Luckily someone else had made a &lt;a href=&#34;https://github.com/doga/qgeminiserver/tree/master&#34;&gt;Gemini server middleware&lt;/a&gt; that I could use.&lt;/p&gt;
&lt;p&gt;First was the command to create the certificates needed&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 3650 -nodes
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And then I moved them into a &lt;code&gt;cert&lt;/code&gt; subfolder I made in my project folder.&lt;/p&gt;
&lt;p&gt;Next up was the &lt;code&gt;main.js&lt;/code&gt; file and the handful of lines 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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;Application&lt;/span&gt; } &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;jsr:@arma/qgeminiserver@2.0.3&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;keyPath&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;KEY_PATH&amp;#39;&lt;/span&gt;)  &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;../cert/key.pem&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;certPath&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;CERT_PATH&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;../cert/cert.pem&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;readTextFile&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;keyPath&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;cert&lt;/span&gt;     &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Deno&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;readTextFile&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;certPath&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;app&lt;/span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Application&lt;/span&gt;({&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;cert&lt;/span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;app&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;use&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;body&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;# Hello World!&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;app&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;start&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I ran this file with the &lt;code&gt;deno run --allow-env --allow-read --allow-net main.js&lt;/code&gt; command and there, in my Lagrange client after navigating to &lt;code&gt;gemini://localhost/&lt;/code&gt;, was &amp;ldquo;Hello World&amp;rdquo;&amp;hellip;beautiful 🤩&lt;/p&gt;
&lt;h2 id=&#34;getting-my-existing-blog-posts-with-micropub&#34;&gt;Getting my existing blog posts with Micropub&lt;/h2&gt;
&lt;p&gt;There are many things I like about using Micro.blog as my blog host. One of the big ones is the API and the Micropub implementation. In case you&amp;rsquo;re not familiar, Micropub is an open web standard for creating, editing, and deleting posts/pages from a website. So I just need a valid token and the location of my Micropub endpoint and the world is my oyster 🦪&amp;hellip; well, at least my blog posts are&amp;hellip; 🤣&lt;/p&gt;
&lt;p&gt;So, Micro.blog has a spot on its website where I can generate app tokens and the micropub endpoint is in the HTML head of my blog&amp;rsquo;s index page. I grabbed those two items and stuck them in an &lt;code&gt;.env&lt;/code&gt; file. Once there I could access them easily in Deno. &lt;code&gt;var token = Deno.env.get(&#39;token&#39;)&lt;/code&gt; and &lt;code&gt;var micropub = Deno.env.get(&#39;micropub&#39;)&lt;/code&gt;. I also needed the destination I was calling in Micropub, this is needed since I have several different blogs hosted and it needs to know which one I&amp;rsquo;m talking about. In this case, &lt;a href=&#34;https://heyloura.com&#34;&gt;https://heyloura.com&lt;/a&gt;. &lt;code&gt;var destination = Deno.env.get(&#39;destination&#39;)&lt;/code&gt;. I just declared each of these at the top of the file.&lt;/p&gt;
&lt;p&gt;I replaced the route that was serving &amp;ldquo;Hello World&amp;rdquo; with a fetch request.&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;app&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;use&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetching&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetch&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;`https://micro.blog/micropub?q=source&amp;amp;limit=10&amp;amp;mp-destination=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;encodeURIComponent(&lt;span style=&#34;color:#a6e22e&#34;&gt;destination&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bearer &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;token&lt;/span&gt; } } );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;results&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetching&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;page&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;results&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;items&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;p&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;p&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;properties&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;post-status&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;published&amp;#39;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;((&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;) =&amp;gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;page&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;page&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;properties&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\r\n\r\n&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;body&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I needed to filter out my draft posts, which is why there is a filter call with &lt;code&gt;.filter(p =&amp;gt; p.properties[&amp;quot;post-status&amp;quot;][0] == &#39;published&#39;)&lt;/code&gt; and the content of each post is under &lt;code&gt;item.properties[&amp;quot;content&amp;quot;][0]&lt;/code&gt;. Now for this sample, I simplified the code. In actuality I added extra text, emojis, links to named blog posts (instead of just outputting) the content. You get the idea.&lt;/p&gt;
&lt;p&gt;I once again saved and ran the run command and viola! I had a nice list of blog posts. Or at least that&amp;rsquo;s what I thought would happen&amp;hellip; Instead everything was garbled.&lt;/p&gt;
&lt;p&gt;Turns out the Gemini protocol doesn&amp;rsquo;t support markdown, which is what I typically use to write my posts in.&lt;/p&gt;
&lt;p&gt;Doh!&lt;/p&gt;
&lt;h2 id=&#34;from-markdown-to-gemtext&#34;&gt;From Markdown to Gemtext&lt;/h2&gt;
&lt;p&gt;Once again leaning on the open source community I found someone had already created a library &lt;a href=&#34;https://github.com/wooorm/dioscuri&#34;&gt;Dioscuri&lt;/a&gt;.  Awesome. Here&amp;rsquo;s what I needed to add at the top of my main.js file where the import statements 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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;dioscuri&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://esm.sh/dioscuri@1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;fromMarkdown&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://esm.sh/mdast-util-from-markdown@2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;gfm&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;gfmHtml&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://esm.sh/micromark-extension-gfm@3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;gfmFromMarkdown&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;gfmToMarkdown&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://esm.sh/mdast-util-gfm@3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;gfmFootnote&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;gfmFootnoteHtml&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://esm.sh/micromark-extension-gfm-footnote@2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;gfmFootnoteFromMarkdown&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;gfmFootnoteToMarkdown&lt;/span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://esm.sh/mdast-util-gfm-footnote@2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and then around the &lt;code&gt;item.properties[&amp;quot;content&amp;quot;][0]&lt;/code&gt; I called&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dioscuri&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;toGemtext&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;dioscuri&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fromMdast&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	  &lt;span style=&#34;color:#a6e22e&#34;&gt;fromMarkdown&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;properties&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		  &lt;span style=&#34;color:#a6e22e&#34;&gt;tight&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;endlinks&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6e22e&#34;&gt;extensions&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;gfm&lt;/span&gt;(), &lt;span style=&#34;color:#a6e22e&#34;&gt;gfmFootnote&lt;/span&gt;({&lt;span style=&#34;color:#a6e22e&#34;&gt;inlineNotes&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;})],&lt;span style=&#34;color:#a6e22e&#34;&gt;mdastExtensions&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;gfmFromMarkdown&lt;/span&gt;(), &lt;span style=&#34;color:#a6e22e&#34;&gt;gfmFootnoteFromMarkdown&lt;/span&gt;()]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	 }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now everything is displaying a bit better.&lt;/p&gt;
&lt;p&gt;Not perfectly. Links are gathered up at the bottom with a simple bracketed number and if it encounters any formatting it doesn&amp;rsquo;t understand it drops it.&lt;/p&gt;
&lt;h2 id=&#34;but-all-your-self-referencing-links-are-still-pointing-to-https-blog&#34;&gt;But all your self-referencing links are still pointing to https blog?&lt;/h2&gt;
&lt;p&gt;Yes&amp;hellip; which is why I made a little find and replace function. For a url that starts with &lt;code&gt;https://heyloura.com/:year/:month/:day/:id&lt;/code&gt; I replaced the &lt;code&gt;https://heyloura.com&lt;/code&gt; with a &lt;code&gt;/&lt;/code&gt; so it became a relative link. But that means I need a route to capture those&amp;hellip;&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/:year/:month/:day/:id&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;pathParams&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;year&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;pathParams&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;year&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;month&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;pathParams&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;month&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;day&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;pathParams&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;day&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetching&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetch&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;`https://micro.blog/micropub?q=source&amp;amp;properties=content&amp;amp;url=https://heyloura.com/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;year&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;month&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;day&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;amp;mp-destination=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;encodeURIComponent(&lt;span style=&#34;color:#a6e22e&#34;&gt;destination&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bearer &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;token&lt;/span&gt; } } );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetching&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;dioscuriContent&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;properties&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;body&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here I grabbed the route parameters and then asked my Micropub endpoint for the contents of that URL. &lt;code&gt;dioscuriContent&lt;/code&gt; is a helper function I made for the code in the previous section.&lt;/p&gt;
&lt;p&gt;Now links that reference my blog posts up on my blog can be resolved on my little Gemini server.&lt;/p&gt;
&lt;h2 id=&#34;thats-nice-but-what-about-images&#34;&gt;That&amp;rsquo;s nice, but what about images?&lt;/h2&gt;
&lt;p&gt;In the Gemini protocol, images are never included in the page. You can only link to them and then if a user clicks on one can you see it. Luckily I have the url of where the image is and I have a server that can fetch. The tricky part is returning the image as a &lt;code&gt;Unit8Array&lt;/code&gt;. No worries. I&amp;rsquo;ve got you covered.&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/uploads/:year/:id&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;pathParams&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;year&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;pathParams&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;year&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetching&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetch&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;`https://heyloura.com/uploads/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;year&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt; } );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;file&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetching&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;blob&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;file&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;arrayBuffer&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ResponseOk&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Body&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Uint8Array&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;)), &lt;span style=&#34;color:#a6e22e&#34;&gt;file&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;ctx&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ResponseFailure&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Same thing with the blog links. I checked for and replaced any url that had &lt;code&gt;https://heyloura.com/uploads/:year/:id&lt;/code&gt;. Since I&amp;rsquo;m using a middleware for a gemserver I used it&amp;rsquo;s helper method for returning a response (to make sure everything is going over the correct port, etc&amp;hellip;). So I added &lt;code&gt;import { Application, handleRoutes, Route, ResponseOk, Body, ResponseFailure } from &#39;jsr:@arma/qgeminiserver@2.0.3&#39;; &lt;/code&gt; to my import at the top of the file.&lt;/p&gt;
&lt;p&gt;My little proof of concept is complete. I can load up my little server on localhost, click around my links, and even load images I have hosted on my blog. 🤠&lt;/p&gt;
&lt;h1 id=&#34;preparing-the-launch-pad&#34;&gt;Preparing the launch pad&lt;/h1&gt;
&lt;p&gt;Now this is the point where I&amp;rsquo;d normally put my little project up on Deno Deploy and the server hosting my code part is done. One big catch though&amp;hellip; Deno Deploy doesn&amp;rsquo;t play nice with port 1965 and the &lt;a href=&#34;https://en.wikipedia.org/wiki/Trust_on_first_use&#34;&gt;TOFU certificates&lt;/a&gt; required by the Gemini protocol.&lt;/p&gt;
&lt;p&gt;Sigh. Guess we are going to have to do this the hard way.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-cloud-hosting&#34;&gt;Setting up cloud hosting&lt;/h2&gt;
&lt;p&gt;I spun up Ubuntu 24.04 on a shared VPS. I&amp;rsquo;m using Hetzner and it&amp;rsquo;ll come to around $5.60 a month to host this thing (as of current pricing). I actually followed this blog post by &lt;a href=&#34;https://davidtsadler.com/posts/gemini/2021-02-08/how-to-host-your-own-gemini-site-in-the-cloud/&#34;&gt;David Sadler&lt;/a&gt; pretty closely when I was setting everything up.&lt;/p&gt;
&lt;p&gt;On step &amp;ldquo;Install certificates&amp;rdquo; I did rename &lt;code&gt;key.rsa&lt;/code&gt; to &lt;code&gt;key.pem&lt;/code&gt; to match what I had in my &lt;code&gt;main.js&lt;/code&gt; file and then I had to veer off on my own since I was going install deno and use my code to run the server.&lt;/p&gt;
&lt;p&gt;First, deno needed to be installed. But! First first, &lt;code&gt;zip&lt;/code&gt; wasn&amp;rsquo;t installed on the machine&amp;hellip; so actually &lt;code&gt;sudo apt install zip&lt;/code&gt; was first. Then came the &lt;code&gt;curl -fsSL https://deno.land/install.sh | sh&lt;/code&gt; to get Deno installed.&lt;/p&gt;
&lt;p&gt;I &lt;code&gt;cd&lt;/code&gt; into the directory that was going to hold my little file and then created it with &lt;code&gt;nano main.js&lt;/code&gt; and copied the contents over.&lt;/p&gt;
&lt;p&gt;I verified everything was there. Ran my master command of &lt;code&gt;deno run --allow-env --allow-read --allow-net main.js&lt;/code&gt; and saw the wonderful output that it was up and running on localhost.&lt;/p&gt;
&lt;p&gt;The end.&lt;/p&gt;
&lt;p&gt;Except&amp;hellip; maybe I should check that I can reach my capsule with Lagrange&lt;/p&gt;
&lt;p&gt;..er&lt;/p&gt;
&lt;p&gt;&amp;hellip; huh &amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;hellip; crap &amp;hellip;&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t 😭&lt;/p&gt;
&lt;h2 id=&#34;loura-takes-a-nap&#34;&gt;Loura takes a nap&lt;/h2&gt;
&lt;p&gt;After running &lt;code&gt;sudo ufw status verbose&lt;/code&gt; to make sure I had the firewall configured correctly and running &lt;code&gt;sudo netstat -tnlp | grep :1965&lt;/code&gt; to check it was listening on port 1965 and double checking the &lt;code&gt;main.js&lt;/code&gt; file a dozen times. Every time I tried to connect I got &lt;code&gt;connection refused&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So I walked around my neighborhood, appreciated the subtle signs of spring, ate a wonderful lunch, and then took a nap.&lt;/p&gt;
&lt;p&gt;When I woke up and checked&amp;hellip;.&lt;/p&gt;
&lt;p&gt;&amp;hellip; Darn it, same error.&lt;/p&gt;
&lt;p&gt;Sigh&amp;hellip; search engine. Don&amp;rsquo;t fail me now.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://www.explainxkcd.com/wiki/images/3/3e/wisdom_of_the_ancients.png&#34; alt=&#34;Wisdom of the ancients&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;I did finally find the answer on this &lt;a href=&#34;https://askubuntu.com/questions/166068/port-seems-to-be-open-but-connection-refused&#34;&gt;AskUbunto&lt;/a&gt; thread from 2012.&lt;/p&gt;
&lt;p&gt;Installing &lt;code&gt;nmap&lt;/code&gt; and then running nmap confirmed &lt;code&gt;nmap -A -T4 capsule.heyloura.com&lt;/code&gt; that it was 127.0.1.1 that was the issue. &lt;code&gt;Nmap scan report for capsule.heyloura.com (127.0.1.1)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now that I knew what to look for&amp;hellip; I found a Github issue around it &lt;a href=&#34;https://github.com/denoland/deno/issues/5144&#34;&gt;Deno.ListenOptions hostname defaults to 127.0.0.1 instead of 0.0.0.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And, looking at the code for the middleware I&amp;rsquo;m using, I was delighted to see that I could pass in the hostname and specify 0.0.0.0 by changing &lt;code&gt;new Application({key, cert})&lt;/code&gt; to &lt;code&gt;new Application({key, cert, hostname: &#39;0.0.0.0&#39;})&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Holding my breath and ran my server again, and did a little joy dance when it finally connected.&lt;/p&gt;
&lt;h1 id=&#34;launching-&#34;&gt;Launching 🚀&lt;/h1&gt;
&lt;p&gt;The last step I needed was to make sure that my server ran even when I wasn&amp;rsquo;t logged in and that it would load when the server was rebooted and that it would auto-restart if needed. &lt;a href=&#34;pup.56k.guru&#34;&gt;Pup&lt;/a&gt; to the rescue. The install was easy with &lt;code&gt;deno run -Ar jsr:@pup/pup setup&lt;/code&gt; and then &lt;code&gt;pup init --id &amp;quot;deno-gemini&amp;quot; --autostart --cmd &amp;quot;deno run --allow-env --allow-read --allow-net main.js&amp;quot;&lt;/code&gt;. I made sure things could keep running if my user isn&amp;rsquo;t logged in with &lt;code&gt;sudo loginctl enable-linger username&lt;/code&gt; (where username was my username) and then to finish it off &lt;code&gt;pup enable-service&lt;/code&gt; and &lt;code&gt;pup run&lt;/code&gt;&lt;/p&gt;
&lt;h1 id=&#34;and-heylouracom-launched-as-capsuleheylouracom-&#34;&gt;And heyloura.com launched as capsule.heyloura.com 🪐&lt;/h1&gt;
&lt;p&gt;For those wanting to browse it:&lt;/p&gt;
&lt;p&gt;gemini://capsule.heyloura.com/&lt;/p&gt;
&lt;p&gt;Otherwise, here is a picture.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/73c74456da.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 id=&#34;final-notes&#34;&gt;Final notes&lt;/h1&gt;
&lt;p&gt;The code above was simplified for brevity but hopefully I listed enough of the steps that someone else can copy what I did. I&amp;rsquo;m thrilled that changes I make to my blog are reflected immediately to my Gemini capsule and since it is all driven by Micropub I can use my own little tools for posting and managing content.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m enjoying wandering around Geminispace and hope that others are inspired to check it out.&lt;/p&gt;
&lt;p&gt;Happy coding everyone,
Loura&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Explorations with a command line browser</title>
      <link>https://heyloura.com/2025/03/03/minicoding-adventure-explorations-with-a.html</link>
      <pubDate>Mon, 03 Mar 2025 17:19:25 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/03/03/minicoding-adventure-explorations-with-a.html</guid>
      <description>&lt;p&gt;So last weekend I was a bit tired of the internet. Which will probably be another post at some point. But suffice it to say that the invasive tracking browsers are up to just turns my stomach.&lt;/p&gt;
&lt;p&gt;Which lead me back to an old desire of mine, building my own web browser. I&amp;rsquo;ve never gotten very far. Browsers are so very very complex and as soon as I get started I get overwhelmed. So maybe instead of tackling something so gargantuan, I start a bit smaller.&lt;/p&gt;
&lt;p&gt;That lead me down a rabbit hole of text-based browsers. The one that struck me the most was &lt;a href=&#34;https://offpunk.net/whatisoffpunk.html&#34;&gt;Offpunk&lt;/a&gt;. I liked how it incorporated feeds, the simple text interface, and the concept of offline first. Which got me thinking&amp;hellip;. What could I pull off in a couple of hours?&lt;/p&gt;
&lt;p&gt;Deno has some libraries to help with a command line tool. I ended up grabbing &lt;a href=&#34;https://github.com/c4spar/deno-cliffy&#34;&gt;deno-cliffy&lt;/a&gt; to start. I ran into some issues with getting it to import but eventually figured out that running &lt;code&gt;deno add jsr:@cliffy/command@^1.0.0-rc.7&lt;/code&gt; worked instead of using the import in the &lt;code&gt;main.js&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Now that was situated I grabbed an rss parser and a feed from a blog I enjoyed. I did a quick fetch to grab the feed and then parsed it using the tool.&lt;/p&gt;
&lt;p&gt;Turns of cliffy lets you pass in a list of suggestions with a paging interface. Sweet&amp;hellip;&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;xml&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;text&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;feed&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parseFeed&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;xml&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;postSelection&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Input&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prompt&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Choose a post&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;info&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;list&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;maxRows&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;suggestions&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;feed&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;entries&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/8fdb6acfcd.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;As you can see, the list of items in the RSS feed are displayed and you can type/filter down to the one you want to view.&lt;/p&gt;
&lt;p&gt;Once selected I fetched the actual post.&lt;/p&gt;
&lt;p&gt;But displaying a bunch of HTML on the command line isn&amp;rsquo;t my idea of a good reading experience.&lt;/p&gt;
&lt;p&gt;That where another library came in &lt;a href=&#34;https://www.npmjs.com/package/html-to-text&#34;&gt;html-to-text from npm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A little bit of configuration later and I have&amp;hellip;.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/38e8978328.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Which is actually pretty nice to read. The big drawback is I don&amp;rsquo;t have paging and I find scrolling up on the command line to be distracting. Maybe I could pipe it to less or something.&lt;/p&gt;
&lt;h2 id=&#34;where-to-next&#34;&gt;Where to next?&lt;/h2&gt;
&lt;p&gt;I thought this was a nice and quick proof of concept that building something out like a text-based browser could be in my grasp (assuming I&amp;rsquo;m sticking to just getting text and not having to support forms)&lt;/p&gt;
&lt;p&gt;But that doesn&amp;rsquo;t solve&amp;hellip; I want my cool new browser on my android phone.&lt;/p&gt;
&lt;p&gt;And I also want it without using web-view anything. My trust in the browser is waning. That strikes out almost all of the javascript -&amp;gt; cross platform apps tools.&lt;/p&gt;
&lt;p&gt;Deno included.&lt;/p&gt;
&lt;h2 id=&#34;little-side-quest&#34;&gt;Little Side Quest&lt;/h2&gt;
&lt;p&gt;There is a &lt;a href=&#34;https://github.com/littledivy/deno_sdl2&#34;&gt;SDL2 deno&lt;/a&gt; project that I found in my quest to see if Deno could do desktop apps. The documentation is a bit poor and it took some major head scratching to get the dependencies squared away on Windows. But I was able to get a little &amp;ldquo;Hello World&amp;rdquo; up and running&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/8000868bc6.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&#34;some-idle-thoughts&#34;&gt;Some idle thoughts&lt;/h2&gt;
&lt;p&gt;I do want to pursue this browser idea a bit further. I recently got the cross platform GUI library python &lt;a href=&#34;https://kivy.org/&#34;&gt;Kivy&lt;/a&gt; up and running with a little test project. I may pull out my little idea sketchbook and see what I can come up with. What could a browser be&amp;hellip; if we didn&amp;rsquo;t use the current browser kings as a blueprint?&lt;/p&gt;
&lt;p&gt;Could RSS reign supreme? Bookmarks and link graphs?&lt;/p&gt;
&lt;p&gt;Dear reader, have you ever thought about it?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Micro.blog Private Notes &#43; 7.css Fun</title>
      <link>https://heyloura.com/2025/02/11/coding-adventure-microblog-private-notes.html</link>
      <pubDate>Tue, 11 Feb 2025 18:48:32 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/02/11/coding-adventure-microblog-private-notes.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>My 2025 Productivity System</title>
      <link>https://heyloura.com/2025/01/14/my-productivity-system.html</link>
      <pubDate>Tue, 14 Jan 2025 14:40:16 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2025/01/14/my-productivity-system.html</guid>
      <description>&lt;p&gt;I bounce around tools a lot trying to keep my life organized. Everywhere I look, the tasks I need to get done just keep multiplying. I&amp;rsquo;ve probably tried dozens of apps by now over the years. I really liked Notion, but didn&amp;rsquo;t like the lack of portability for my data. Logseq was fun but keeping things synced was hard. Obsidian was close to what I wanted, but ultimately the freedom to endlessly tweak the system made it more of a distraction to me.&lt;/p&gt;
&lt;p&gt;Then came 2024 and my life getting exponentially more difficult in an emotional way and all these systems I crafted crumbled. When life was going fine, my executive function skills could keep up with multi-step processes or deal with some friction in the system. But just when I needed these systems the most to keep me afloat and make sure the essentials are getting done they failed. Or I failed, depending on your point of view.&lt;/p&gt;
&lt;p&gt;What did keep me getting stuff done? The index card in my pocket.&lt;/p&gt;
&lt;p&gt;Since then, my paper system has evolved and that&amp;rsquo;s what I want to take a moment to record in this post. But unlike other options, I can toss aside the extra&amp;rsquo;s in this system at anytime and go back to what I can depend on&amp;hellip; a simple list on an index card.&lt;/p&gt;
&lt;h2 id=&#34;the-index-card&#34;&gt;The index card&lt;/h2&gt;
&lt;p&gt;I have three varieties of index cards in my system.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The capture card or inbox&lt;/li&gt;
&lt;li&gt;Project cards&lt;/li&gt;
&lt;li&gt;Reference cards&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I keep all of these in a little index card holder in my pocket or purse. This is similar to the &lt;a href=&#34;https://en.wikipedia.org/wiki/Hipster_PDA&#34;&gt;Hipster PDA&lt;/a&gt;. Here is a peak at my &lt;strong&gt;inbox card&lt;/strong&gt;, where I jot down tasks or notes as I get them, and a &lt;strong&gt;reference card&lt;/strong&gt; which is this month&amp;rsquo;s calendar so I can see what dates I have appointments scheduled&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250114-092422.jpg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;Auto-generated description: A calendar and a notebook page contain handwritten entries listing events and reminders for January, placed on a wooden surface.&#34;&gt;
&lt;p&gt;Similar to the &lt;em&gt;Getting Things Done&lt;/em&gt; system, GTD, my inbox card captures whatever I come across. Periodically throughout the day I cross off things that take less than two minutes (and do them) and at the end of the day the rest of the items are transferred to projects cards, other reference cards, or put as notes on slips of paper (more on that below).&lt;/p&gt;
&lt;p&gt;Project cards are the cornerstone of my system and each active project has its own card that is stored in my holder. I currently have around 20 that I&amp;rsquo;m carrying around. When a project is done I put it in storage if I think I might need to reference in the future otherwise I recycle it.&lt;/p&gt;
&lt;p&gt;When I create a project card I brainstorm the tasks I think I need to do. Then I highlight the &amp;ldquo;Next Action&amp;rdquo; I need to take and the color it is highlighted corresponds to the context that task needs. I cross out tasks as I complete them and before I put the card away for the day I make sure I have another action highlighted for the next time I circle around to it.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250114-092451.jpg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;Auto-generated description: Index cards on a wooden surface display handwritten notes, including task lists and a project named Lillihub - Timeline.&#34;&gt;
&lt;p&gt;Reference cards I tend to keep on a graph paper index card and contain information I want to reference. Monthly calendars or larger projects that will take more than six weeks are things I&amp;rsquo;ll normally write up a reference card for. As an example here are my six week homeschooling reference cards for the kids and one I put together for work. So when I&amp;rsquo;m homeschooling, I have the homeschooling reference cards on hand and when I&amp;rsquo;m working&amp;hellip; the work one.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/a49bd5743c.jpg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;Auto-generated description: Three handwritten study planners on a wooden surface outline tasks and schedules for various academic subjects and activities.&#34;&gt;
&lt;p&gt;Now, I tend to view projects as things done at a discrete point in time. For instance, changing my HVAC filters is something that must be done and redone on a schedule. So &amp;ldquo;change HVAC filters in January&amp;rdquo; is a project in my system and I&amp;rsquo;ll make a project card for it. However, the reoccurring reminder to do it is not a project and I needed somewhere to store that and be sure to rediscover that reminder when I needed it.&lt;/p&gt;
&lt;h2 id=&#34;keeping-organized---a-tickler-file&#34;&gt;Keeping organized - a tickler file&lt;/h2&gt;
&lt;p&gt;Now I&amp;rsquo;ve been familiar with &lt;a href=&#34;https://analogoffice.net/2023/01/11/all-about-tickler.html&#34;&gt;43 folders or a tickler file system&lt;/a&gt; since I read the post on Analog Office . I just never used one since&amp;hellip; one, I was mostly using apps and two, they don&amp;rsquo;t tend to be portable. If I was going to break free of the apps I needed something portable.&lt;/p&gt;
&lt;p&gt;In December 2024 inspiration struck and I crafted my own tickler file. One that was small, portable, and fit in my purse. I took an old Tomoe River A6 planner I wasn&amp;rsquo;t using and some washi tape I had on hand and went to crafting. I doubled up the pages and taped them together making slightly more than 43 pouches. Tomoe River paper is thin which helps keep this whole thing portable. The A6 size means that my 3x5 index cards fit right inside. Plus it folds open flat and I can use the outside of the pouches to put sticky notes.&lt;/p&gt;
&lt;div class=&#34;microblog_collection&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250114-092359-m.jpg&#34; alt=&#34;A person is holding a stack of decorated and colorful index cards labeled Jan 31st, suggesting they are used for organizing or journaling purposes.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250114-092359.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250114-092336-m.jpg&#34; alt=&#34;A hand is holding open a notebook with grid paper and a pink sticky note on one page.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250114-092336.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250114-092220-m.jpg&#34; alt=&#34;A colorful, tabbed notebook titled PRESENT with various illustrations on its cover is placed on a wooden surface.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250114-092220.jpg&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250114-092155-m.jpg&#34; alt=&#34;A black zippered pouch containing a large stack of colorful, organized papers is lying open on a wooden surface.&#34; data-microblog-lightbox=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250114-092155.jpg&#34;&gt;&lt;/div&gt;
&lt;p&gt;I have a pouch for each day and monthly ones in the back. My reference cards, slips of papers with notes and reminders, all live in this pouch. At the beginning of the month I distribute all the slips of paper it collected to the dates they need to go. If they repeat, I keep that info on the paper and move it along as needed. This method of rotating out reoccurring cards is a lifesaver for all those home-based tasks that I need to keep in mind. Changing filters in the fish tank, car maintenance, you name it. I make a slip of paper and move them along.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2025/img-20250114-121304.jpg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;Auto-generated description: A handwritten note on graph paper outlines a monthly digital photo organization process, including steps like deleting blurry photos and selecting favorites.&#34;&gt;One thing I did discover, is that I need to use thin paper to keep the tickler file from getting too big. I just tore apart an old Hobonichi journal, with Tomoe River paper, I never used and cut the paper to fit instead of using thicker index cards for everything.&lt;/p&gt;
&lt;h2 id=&#34;using-the-system&#34;&gt;Using the system&lt;/h2&gt;
&lt;p&gt;I wake up, make coffee and grab my tickler file. I open it up to today&amp;rsquo;s date and pull out whatever slips of paper it contains and glance at the sticky notes. I put aside what I feel like I can handle that day and move the rest to tomorrows folder. Then I pull out my index card holder and look through my projects cards. Anything new I think of I jot down on my inbox card as well as a tentative plan of attack for the day. Then I get to work.&lt;/p&gt;
&lt;p&gt;My inbox index card is right there for when an email comes in or I get a Teams message. I have it in my pocket when homeschooling the kids so I can jot down a random supply I need to pick up. I bring it to work meetings. If I need to go somewhere, everything fits in my purse. In fact, my tickler file fits in my A6 planner cover that has card slots and a small mesh holder for my highlighters&amp;hellip; so it often is my purse when I&amp;rsquo;m out and about.&lt;/p&gt;
&lt;p&gt;At the end of the day I spend about 15 minutes sorting slips back into the ticker file or creating project cards or updating reference cards.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been a long time since I felt so in control of my tasks across all facets of my life 😊🗃️&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Homeschooling costs for the 24/25 school year</title>
      <link>https://heyloura.com/2024/12/30/its-that-time-of-the.html</link>
      <pubDate>Tue, 31 Dec 2024 12:29:33 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/12/30/its-that-time-of-the.html</guid>
      <description>&lt;p&gt;It&amp;rsquo;s that time of the year when I close my books on the costs for the current school year. Take a big breath, and then in late February I&amp;rsquo;ll start planning, putting down deposits and hunting for supplies for the next school year.&lt;/p&gt;
&lt;p&gt;The first thing you need to understand, is the homeschool unicorn. 🦄 It&amp;rsquo;s this mythical curriculum you can get for your child that is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rigorous&lt;/li&gt;
&lt;li&gt;easy to use&lt;/li&gt;
&lt;li&gt;free / low-cost&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now most curriculum for homeschoolers fit one of the three. You can even get two of those bullet points if you look around and do your research. Unfortunately something that is all three does not exist. Even if the marketing on the curriculum promises it.&lt;/p&gt;
&lt;p&gt;I work full-time as a software engineer and I&amp;rsquo;m the primary homeschooling parent for my children. I&amp;rsquo;m also a &lt;a href=&#34;https://www.youtube.com/watch?v=WEsI56HsADw&#34;&gt;secular, eclectic, academic&lt;/a&gt; homeschooler which in homeschooling circles is pretty small segment. What that means is, I &lt;strong&gt;have&lt;/strong&gt; to have an easy-to-use curriculum since 40+ hours of my week are for work, I &lt;strong&gt;want&lt;/strong&gt; rigorous curriculum choices customized to my kids and I&amp;rsquo;m not interested in anything religious or masquerading as secular or that whitewashes history which removes many curriculum choices and communities.&lt;/p&gt;
&lt;p&gt;So rigorous and easy-to-use means that I spend $$$. These numbers are what &lt;strong&gt;I&lt;/strong&gt; spend and are not representative of other homeschoolers.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m sharing this in part to be more open in general but also because I come across countless posts in homeschooling groups about a homeschooling parent who wants to/must work full-time and is looking for a unicorn. If you work, the biggest hurdle becomes time. I don&amp;rsquo;t have time to chase deals, or go to the library, or spend hours making a free curriculum work. As my kids get older and their learning requires more time for understanding and cementing concepts&amp;hellip; I can&amp;rsquo;t make that time magically appear in my schedule. What I can do, is pay others for their time.&lt;/p&gt;
&lt;p&gt;So here is my real world example:&lt;/p&gt;
&lt;p&gt;My son, age 14, 9th Grade (1st year of high school):&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20240907-125807.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: A person is sitting in a chair reading a book with a cat on their lap.&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://simplify4you.com/&#34;&gt;Homeschool Consulting with simplify&lt;/a&gt; - $1,500 per year. I think of this as paying for his guidance counselor. They make sure we are on track to fulfill high school requirements, help me find resources, and talk one-on-one with my son to understand his goals and aspirations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://taylormadescience.com/course-descriptions/&#34;&gt;Honors Biology from taylormadescience.com&lt;/a&gt; - $775. Includes lab kit, video lectures, quizzes, exams, grading, one hour per week live with the licensed teacher and doing labs over zoom with other homeschooling students. The textbook I got used for $10.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://falconsedu.com/&#34;&gt;Online Falcons from falconsedu&lt;/a&gt; - $3,375. This is his third and last year with the Falcon&amp;rsquo;s. I&amp;rsquo;m considering this an integrated humanities class as far as transcripts go. I&amp;rsquo;m not sure how to best describe it, other than awesome. &lt;a href=&#34;https://heyloura.com/eighth-grade-for-2023-2024/#inter&#34;&gt;Maybe check out this blog post I did for his 8th grade year&lt;/a&gt;. It&amp;rsquo;s also a large social outlet for him.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://derekowens.com/course_info_geometry.php&#34;&gt;Honors Geometry from Derek Owens&lt;/a&gt; - $600. He has access to lecture videos and textbook assignments. Homework is done on paper and scanned in to be graded, by a human, with grades and detailed feedback sent back. The teacher is prompt when answering my son&amp;rsquo;s emailed questions and has proactively reached out when my son was struggling on a topic. The textbook I got used for $30 and the workbooks I got printed and shipped for $50.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.aimacademy.online/onlineclasses/history-of-africa-and-asia/&#34;&gt;World History: Africa and Asia with Aim Academy&lt;/a&gt; - $649. This is a wonderful class that meets live one hour a week. The book list and movie list are intense and the history content does not pull any punches. My son loves the class so far. I spent around $120 for the eight books and $20 or so renting the assigned movies.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://buildyourlibrary.com/purchase-level-9-curriculum/&#34;&gt;Literature from Build Your Library&lt;/a&gt; - $300. This is a full curriculum but we are only using the literature portion of it. I assign the readings, we discuss, and then he writes about the literature with feedback from his writing tutor. The cost include the price of the PDF and paper copies of the nineteen books.&lt;/li&gt;
&lt;li&gt;Writing tutor - $1,800 per year. He meets with his tutor for one hour per week and then does assignments she assigns independently. Together with Literature this will count as a 1 credit ELA course.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://athenasacademy.com/courses/contributing-to-scientific-understanding/&#34;&gt;Contributing to Scientific Understanding from Athena&amp;rsquo;s Academy&lt;/a&gt; - $375. This was a one semester class and he had one hour per week live with the teacher.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.onlineg3.com/product/astronomy/&#34;&gt;Astronomy from g3&lt;/a&gt; - $275. This is a high school level astronomy class that is adapted from a college level textbook. The textbook I got used for $89.&lt;/li&gt;
&lt;li&gt;European Portuguese - $230. He is using &lt;a href=&#34;https://www.practiceportuguese.com/&#34;&gt;Practice Portuguese&lt;/a&gt; and we are working through a Portuguese textbook &lt;a href=&#34;https://www.amazon.com/Bom-Dia-Portuguese-Language-Textbook-ebook/dp/B06WLPXKM2/&#34;&gt;Bom Dia!&lt;/a&gt; together.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whew. So that comes to $10,198.&lt;/p&gt;
&lt;p&gt;But, I have two kids!&lt;/p&gt;
&lt;p&gt;My daughter, age 12, 7th grade&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20240903-095524.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: A person is sitting at a desk petting a cat, with a map on the wall and various items on shelves in the background.&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://derekowens.com/course_info_prealgebra.php&#34;&gt;Prealgebra from Derek Owens&lt;/a&gt; - $640. Same provider as my son above. Prealgebra doesn&amp;rsquo;t have a textbook but it does need two workbooks.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://falconsedu.com/&#34;&gt;Online Falcons from falconsedu&lt;/a&gt; - $3,375. This is her second year with the Falcon&amp;rsquo;s and she loves it!&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://spellingyousee.com/&#34;&gt;Spelling from spellingyousee&lt;/a&gt; - $60. She tolerates this 🤣&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://mintandbloomlearning.com/store/p/melancholy-grammar-workbooks-complete-bundle?rq=grammar&#34;&gt;Melancholy Grammar with Creative Writing from Mint and Bloom&lt;/a&gt; - $40. She loves this! It fits her perfectly and she asks to do it first thing everyday.&lt;/li&gt;
&lt;li&gt;Science - 175*. I purchased the upcoming Astronomy course for her to use in the spring. This fall, since I own every &lt;a href=&#34;https://sciencemom.teachable.com/courses/&#34;&gt;Science Mom&lt;/a&gt; course she choose to use microbiology.&lt;/li&gt;
&lt;li&gt;History - free*. It&amp;rsquo;s free only because I already own the materials. She&amp;rsquo;s doing &lt;a href=&#34;https://www.curiositychronicles.org/&#34;&gt;Curiosity Chronicles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Literature - free*. After five years homeschooling (and buying all the materials because I can&amp;rsquo;t even squeeze in time to go to the library with their limited hours) I have an abundance of books. She just grabs stuff of the shelf she wants to read.&lt;/li&gt;
&lt;li&gt;[Health: The Chat: Stanford Medicine] - $110. Five 45-minute Workshops (virtual).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So that comes to $4,400 for kid #2.&lt;/p&gt;
&lt;p&gt;The grand total? &lt;strong&gt;$14,598&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And that doesn&amp;rsquo;t include paper, pens, and other random supplies I need to rush out for and grab for a project. Also not included in the numbers above are the summer camps, music lessons, or sport fees that I spend. I kept these out since many parents who are not homeschoolers also incur these costs. Same with our family trips to museums or to other historical points of interest.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s less than a secular private school in my area but much more than public school.&lt;/p&gt;
&lt;p&gt;So there you have it. 😎&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Musings about my blog in the new year</title>
      <link>https://heyloura.com/2024/12/21/musings-about-my.html</link>
      <pubDate>Sat, 21 Dec 2024 21:30:23 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/12/21/musings-about-my.html</guid>
      <description>&lt;p&gt;I want to post a bit more on my blog this coming year. Probably about various coding projects I&amp;rsquo;m playing around with and maybe a little bit about homeschooling. I just find it hard in the moment to jot things down so I can do a post about it later. So I think I need a better workflow on taking notes, with the intent to polish it up to a post.&lt;/p&gt;
&lt;p&gt;Secondly, I&amp;rsquo;ve played around a lot with themes this year on my blog. I don&amp;rsquo;t think I&amp;rsquo;ll ever be one to commit to a theme or style but there are a couple of things I want to hone in on. One thing I&amp;rsquo;ve been meaning to do it a &amp;ldquo;print&amp;rdquo; theme. I think it would be cool to do one so I can save my entire blog to a pdf and then print it out if I&amp;rsquo;d like.&lt;/p&gt;
&lt;p&gt;The other theme idea I&amp;rsquo;ve been thinking on, is how to make my blog more interactive. I have the beginnings of an old school RPG plan where you explore my blog (as a character) and &amp;ldquo;find&amp;rdquo; the post. It&amp;rsquo;s still in the very beginning stages. Something on the lines of using the URL as an identifier that can then be used to seed a level. You can wander around, face little monsters, and go on the hunt to find the blog post. Lots of different angles to consider. I&amp;rsquo;d leave the RSS feeds intact for those who read my site that way and I&amp;rsquo;d probably have an archive page that isn&amp;rsquo;t gamified in any way.&lt;/p&gt;
&lt;p&gt;But working on that may run counter to #1. Blogging a bit more. But, writing a little game engine from scratch in vanilla JS and figuring out the mechanics sounds fun. I have a little bit started already. If you are viewing my blog on a desktop and click the background image, it starts a little game screen and you can move the little character around using the arrow keys. (I hope at least.) And that&amp;rsquo;s it. I don&amp;rsquo;t even have walls working 😅&lt;/p&gt;
&lt;p&gt;Anyway, not sure if I&amp;rsquo;ll get to any of that. Or if any of that makes much sense (everyone in my house is fighting a cold and I&amp;rsquo;m exhausted). But that&amp;rsquo;s where my mind is at.&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.html</link>
      <pubDate>Mon, 18 Nov 2024 17:07:29 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/11/18/microblog-hosted-blog.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>Yard work</title>
      <link>https://heyloura.com/2024/11/06/today-i-woke.html</link>
      <pubDate>Wed, 06 Nov 2024 16:51:51 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/11/06/today-i-woke.html</guid>
      <description>&lt;p&gt;Today I woke up feeling dread. Bad news, in my experience, comes in waves and this whole year has been one wave after another. So I did what I tend to do when this happens&amp;hellip; yard work. I hate yard work but I can&amp;rsquo;t deny that it makes me feel better. So when I had time during my lunch break I grabbed my work gloves and my wheelbarrow and went outside.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20241022-173552.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;This November, it&amp;rsquo;s too warm and dry. It feels a bit alien. And yard work put me in close proximity to bugs, which I also don&amp;rsquo;t enjoy. And my yard is big. There is so much work to do.&lt;/p&gt;
&lt;p&gt;The truth is, that this year I neglected my yard. There was so much going on, from family drama, deaths, and life-changing illnesses in those close to me. I spent most of the year in survival mode and my yard, which I normally enjoy, felt like a burden. I knew I was neglecting it. And every time I glanced at it, I saw all the things I was letting go. Greenbrier in planted beds, poison ivy in every shaded corner, invasive species like knotweed and mugwort sprouting in all corners, and my poor neglected koi pond.&lt;/p&gt;
&lt;p&gt;So what did I do this year? I spent my time indoors&amp;hellip; not looking at it.&lt;/p&gt;
&lt;p&gt;Now it&amp;rsquo;s fall and all those plants have seeded.&lt;/p&gt;
&lt;p&gt;This afternoon I went to one of the side beds and painstakingly pulled out weeds. They were filled with those hitchhiker seeds. I got fistfuls of them in my hair. Some flew off and fell down on the dirt. They&amp;rsquo;ll probably take root and be back next year. Ticks crawled up my pant legs, it no longer gets cold enough to reliably keep them at bay.&lt;/p&gt;
&lt;p&gt;In the middle of the bed, I spied something surprising.&lt;/p&gt;
&lt;p&gt;See, when I bought my house it was clear that who ever lived here before took great pride in the yard. Perfectly manicured and designed but I do question their plant choices. I have eight varieties of bamboo that were planted with no thought to contain them. I have finicky trees that don&amp;rsquo;t survive well in this zone that are planted way too close to the house and septic system.&lt;/p&gt;
&lt;p&gt;So when we moved in, despite not having a green thumb, I bought milkweed plants. I can&amp;rsquo;t tackle the larger problems but it&amp;rsquo;s something small I can do. There are several native varieties of milkweed that I thought could do well here. I had read about the declining bee and butterfly population and I wanted to do something that would help. Lots of effort and a couple of seasons later&amp;hellip; all my lovely plants were dead.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know if the milkweed I spotted, seven thin stalks among the weeds, somehow survived against the odds and escaped my notice. Or if this was something new that had come along on its own.&lt;/p&gt;
&lt;p&gt;I finished my efforts and bagged the weeds and hopefully the majority of their seeds. I put away my gloves and wheelbarrow. But on my way back to the front door, I stopped at the milkweed pods. Most of the milkweed seeds had already dispersed, but there were still a few holding on. So I helped spread them out.&lt;/p&gt;
&lt;p&gt;Because I live here. And even if maintaining my yard is overwhelming, I&amp;rsquo;d be remiss if I let it go.&lt;/p&gt;
&lt;p&gt;And you know what? I did feel better when I went back inside.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fairphone 4, three month review</title>
      <link>https://heyloura.com/2024/10/24/174040.html</link>
      <pubDate>Thu, 24 Oct 2024 17:40:40 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/10/24/174040.html</guid>
      <description>&lt;p&gt;So I&amp;rsquo;ve been using a Fairphone 4 with e/OS instead of Android for the last three months. I have not signed in at all with my Google account and I&amp;rsquo;m not using the Murena Cloud service either (photo, email, contact, document storage solution). Which is probably a good thing since Murena is experiencing a bit of an outage at the moment. There are a lot of things I like about it and a few that I don&amp;rsquo;t.&lt;/p&gt;
&lt;h2 id=&#34;what-i-like&#34;&gt;What I like:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s durable. I&amp;rsquo;m not using a case and I have a glass screen protector on it. I&amp;rsquo;ve dropped this thing like four times on concrete and besides a scuff on the side and a thin crack on the screen protector it&amp;rsquo;s fine.&lt;/li&gt;
&lt;li&gt;I love how simple the app launcher is. There is no app drawer and no widgets. Just simple screens you swipe through.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/screenshot-20241024-172424-blisslauncher.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I love love the Advanced Privacy section. I get a kick out of going in and seeing what it&amp;rsquo;s blocked.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/screenshot-20241024-120508-advanced-privacy.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I love the privacy score in the App Lounge (it&amp;rsquo;s version of a play store). I&amp;rsquo;ve passed on a few apps because I can see what trackers and permissions it requests.&lt;/li&gt;
&lt;li&gt;Managing permissions is a breeze. Nothing is hidden under nested sub menus. Three taps to the permission manager in a nice easy to read list.&lt;/li&gt;
&lt;li&gt;There is a file explorer!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-i-dont-like&#34;&gt;What I don&amp;rsquo;t like&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Remember how I&amp;rsquo;m not using a case? The green back gets pretty dirty.&lt;/li&gt;
&lt;li&gt;The photos are&amp;hellip; Meh. Not a deal breaker for me and honestly, this could be a bit of a user error thing since I haven&amp;rsquo;t taken anytime to mess with the settings.&lt;/li&gt;
&lt;li&gt;Some of the stock apps are kinda useless, especially if you aren&amp;rsquo;t doing the Murena cloud thing and you can&amp;rsquo;t easily remove them.&lt;/li&gt;
&lt;li&gt;Since I&amp;rsquo;m not using the App Lounge with a Google Account, I can&amp;rsquo;t get any paid apps.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-almost-deal-breaker&#34;&gt;The almost deal breaker&lt;/h2&gt;
&lt;p&gt;Messages using the stock app are inconsistent. I sometimes miss texts and don&amp;rsquo;t realize it until I reboot my phone. Plus group messages are often acting up. Either it sends my texts individually, like there is no group, or loses them. Plus, the images it sends are super compressed to the point of unusable. I did find a setting to stop the compression&amp;hellip; but then they wouldn&amp;rsquo;t send at all :(&lt;/p&gt;
&lt;p&gt;In the end I had to install Google Messages (shudder). Which I could do strangely enough without using my Google Account. It throws out warnings here in there that play services needs to be updated&amp;hellip; but so far it is working.&lt;/p&gt;
&lt;p&gt;All in all, I&amp;rsquo;m sticking with it and I&amp;rsquo;m considering picking up a couple of fairphones for my kids now the e/OS has some parental controls. The message thing is holding me back a bit and I&amp;rsquo;m not sure how much I&amp;rsquo;d recommend it. I love the privacy and the right to repair mentality. It just needs a little bit more work to smooth out some rough edges.&lt;/p&gt;
&lt;p&gt;Other random notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My banking app, Ally, works just fine.&lt;/li&gt;
&lt;li&gt;Microsoft Authenticator works&lt;/li&gt;
&lt;li&gt;The stock Maps app works fine for navigating (I actually like it more than Google Maps) but it sucks at finding things nearby&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>A journey into the world of pediatric chronic pain - a new normal</title>
      <link>https://heyloura.com/2024/09/21/a-journey-into.html</link>
      <pubDate>Sat, 21 Sep 2024 09:01:26 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/09/21/a-journey-into.html</guid>
      <description>&lt;p&gt;To start, I just want to say the my daughter is doing so much better after her six week stay up at Boston Children&amp;rsquo;s. The program and doctors and her team were wonderful and it is such a night and day difference, now two and a half months after, from where we were when she was accepted.&lt;/p&gt;
&lt;p&gt;I had meant to write updates during the process, but the intensity caught me off guard I had no energy for anything other than the essentials. By the end of it all I was burnt out.&lt;/p&gt;
&lt;p&gt;We had her first follow-up after leaving the program on Friday and I finally had it in me to sit down and write this update. You can find the first one I wrote &lt;a href=&#34;https://heyloura.com/2024/03/20/the-inciting-incident.html&#34;&gt;here&lt;/a&gt; and the second one &lt;a href=&#34;https://heyloura.com/2024/06/02/and-we-wait.html&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;the-twilight-zone&#34;&gt;The Twilight Zone&lt;/h2&gt;
&lt;p&gt;So my daughter has Complex Regional Pain Syndrome, CRPS, that started with a minor knee injury and then the symptoms spread throughout her four limbs. Specifically the allodynia, extreme pain to normal touch, as well as discoloration, numbness and/or relentless tingling sensations.&lt;/p&gt;
&lt;p&gt;I felt like we entered a twilight zone while we were there. It&amp;rsquo;s such a unique program with only a handful of similar ones in the US. They limit the number of kids to around 10 with a rolling admission. We ended up staying six weeks, which is a little longer than average but pretty typical for the CRPS patients.&lt;/p&gt;
&lt;p&gt;Everyday, as a caregiver, you meet with someone from the care team for at least an hour. She had an MD specializing in pediatric pain, a psychologist, a physical therapist, an occupational therapist, a recreation therapist, and a social worker. It was amazing watching them work. Her team of six professionals were wholly focused on her and one/two other kids for the whole stay. Six professionals, eight hours a day, focusing on three or so kids, for weeks at a time. They also stayed in contact with each other the whole time. You could mention anything to one of them, even if it was unrelated to their specialty, and within an hour everyone on the team was aware. There were no bottlenecks of communication and once a day they all sat together and discussed their plan of treatment and observations. So, it was a unified interdisciplinary approach to get my daughter back to daily functioning so that her pain could fade into the background.&lt;/p&gt;
&lt;p&gt;On my daughters side she spent the eight hours rotating through, an hour or two with each specialty. There were also times all the kids did group work together. They had a kitchen, a laundry room, a gym, baths and showers, and a classroom. Basically if it&amp;rsquo;s something a kid might need help remastering, they had it. They would also leave the building and go for walks with a team member so they could get used to different environments.&lt;/p&gt;
&lt;h2 id=&#34;emotions&#34;&gt;Emotions&lt;/h2&gt;
&lt;p&gt;I cried everyday, even ugly cried, especially during the psychology sessions. While we did part of those with my daughter, they also set aside time for just me and my husband, to work through the complicated knot of feelings this has brought about. They really do understand how hard it is to be a parent of a child in constant pain.&lt;/p&gt;
&lt;p&gt;Wednesdays were harder still, since they had caregivers meet for a special hour long support group in the break room. We would all tear up talking about how we ended up there and what our kids were going through. We would celebrate if a child was able to fall asleep a little earlier or sleep for a little longer. Such a little thing but also such a big thing when your kid can&amp;rsquo;t sleep or stay asleep because it hurts to touch bedding.&lt;/p&gt;
&lt;p&gt;Caregivers who had been there a bit would give sage advice on how to validate parking and what coffee shop had a good selection. There were caregivers and kids from all over the country, Alaska even while I was there, and they had dropped everything and made their way to Boston when a spot opened for them. One woman told me she came from California with her child with just three days notice, leaving her other children with her husband, and was prepared to stay an undetermined amount of time. These kids come for chronic migraine, chronic stomach pains, CRPS, and now&amp;hellip; long covid.&lt;/p&gt;
&lt;p&gt;Especially in the beginning I felt like an imposter. Yes my child was in pain&amp;hellip; but was it really this bad? A father who was there my first week reassured me. If we were here it was because many professionals along the way all agreed this was the best course of action. Then I thought we&amp;rsquo;d probably only need to be there a short time&amp;hellip; maybe three weeks at most. But, no, a full six weeks. Which looking back, was the right amount of time for my daughter.&lt;/p&gt;
&lt;h2 id=&#34;moving-forward&#34;&gt;Moving Forward&lt;/h2&gt;
&lt;p&gt;It seems extraordinary to me. I&amp;rsquo;m so used to quick medical appointments and a &amp;ldquo;Here, take this drug&amp;rdquo; approach. But they gave us parents/caregivers yet another hour long session each week diving into the science and research and why they did what they did. Which, in my daughters case was weaning her off even the occasional over-the-counter medication she was taking for pain and drilling in CBT therapy techniques, mindfulness, and education on the mind-body connection. She went in using a cane for support and a few days in, she put it away and never took it back out. When we arrived she had to rest after a flight of stairs, by week three she was walking up and down six (with breaks) as part of her physical therapy.&lt;/p&gt;
&lt;p&gt;The second week was the hardest. The new-ness had worn off and the increased demands of physical therapy and occupation therapy had set in. With the increase may daughter was getting dizzy and would walk in crooked lines down the hallway of the hotel, hitting walls and doors. She&amp;rsquo;d have to sit down abruptly after a short walk. She was snappy, irritated, and in pain. But bit by bit, day by day and even with some setbacks it got better.&lt;/p&gt;
&lt;p&gt;One of her personal goals going in was being able to wear shorts and sit in the grass. I&amp;rsquo;m happy to say she got there. It was hard, hard work on her part. Following the plan her team gave her everyday (with lots of prodding and complaints in the beginning) and giving it her all. At the end we sat down with her team they shared her progress, they track so many different stats, and compared her scores at intake and when she was finished. She improved across the board and in several cases was back to performing the same as her peers without chronic pain.&lt;/p&gt;
&lt;h2 id=&#34;back-to-normal&#34;&gt;Back to&amp;hellip; Normal?&lt;/h2&gt;
&lt;p&gt;The real work came when we left the program. We were handed stacks of papers and many individualized plans. Most are still pinned up on my fridge. Plans to keep moving on painful days, plans to handle different moods, plans to tackle school work and plans to keep going with life. They gave us a schedule of activities to sign her up for. She needs an hour of exercise everyday, chores everyday, getting out in the community, a learning activity and finally a recharging activity.&lt;/p&gt;
&lt;p&gt;We also still need CBT therapy weekly, breathing practices, and good sleep hygiene. And on top of it all we need to pace it out so that she doesn&amp;rsquo;t &amp;ldquo;boom and bust&amp;rdquo; as they call it. Which is doing so much that the she invites a pain flare and can&amp;rsquo;t get moving the next day. Which we have yet another plan for. We really had to adjust our whole family routine and life cadence. But all in all I&amp;rsquo;d say we are better off with these adjustments.&lt;/p&gt;
&lt;p&gt;This will probably be my last big update. The whole goal of the program was to get us to a point where everyday life can take over. The more she can use her skills and be involved in life, the easier it will be to put the pain on the backburner. Even if the pain flares up, which it has and will again, she&amp;rsquo;ll know what it is and how to tackle it. This isn&amp;rsquo;t something that can be cured. Her central nervous system is hyperactive in a way that translates to pain. But the mind doesn&amp;rsquo;t have to focus on that. With enough time and practice and a busy fulfilling life it can be an ever quieting murmur in the background.&lt;/p&gt;
&lt;p&gt;I was joking with the psychologist on Friday saying one big take away I had was always carry a thermos of ice water around. &amp;ldquo;Yep!&amp;rdquo; she laughed &amp;ldquo;Our million dollar program, for such great wisdom. Take breaks and drink cold water.&amp;rdquo; Of course it is &lt;strong&gt;so&lt;/strong&gt;, &lt;strong&gt;so&lt;/strong&gt; much more than that and words cannot describe how thankful I am for her team up at Boston Children&amp;rsquo;s.&lt;/p&gt;
&lt;h2 id=&#34;crps-posts-and-updates&#34;&gt;CRPS Posts and Updates:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2024/03/20/the-inciting-incident.html&#34;&gt;Mar 20, 2024: The longest four months - a journey into the world of pediatric chronic pain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2024/04/25/its-just-over.html&#34;&gt;Apr 25, 2024&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2024/06/02/and-we-wait.html&#34;&gt;Jun 2, 2024: A journey into the world of pediatric chronic pain - a continuation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sep 21 2024: A journey into the world of pediatric chronic pain - a new normal&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>I redecorated my homeschooling room</title>
      <link>https://heyloura.com/2024/08/26/i-redecorated-my.html</link>
      <pubDate>Mon, 26 Aug 2024 20:37:10 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/08/26/i-redecorated-my.html</guid>
      <description>&lt;p&gt;An updated homeschool room is unlocked 😆&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20240824-170004.jpg&#34; width=&#34;600&#34; height=&#34;599&#34; alt=&#34;Auto-generated description: A well-organized home office space features two workstations with modern decor, office chairs, and various storage solutions.&#34;&gt;
&lt;p&gt;I&amp;rsquo;m homeschooling my two kids this year. Ninth grade for my son and seventh for my daughter. I decided that it was time to get create a better workspace for them. Something that fits their ages a bit better and reflects a bit more independence. I&amp;rsquo;ve spent years with them right at a table working alongside and keeping them on task. But they both need practice with time management and I felt this would be a better fit.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20240824-165157.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: A well-organized home office features dual workstations, shelves with storage, framed artwork on the wall, and a large pinned map of the United States.&#34;&gt;
&lt;p&gt;So three desks, one for me to keep and eye on them, and two for them. The desks are separated to give them a bit of personal space. They both have plenty of space to store their books and materials. Natural light and, not pictured, a couch to spend time reading.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/img-20240824-165035.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Auto-generated description: A well-organized office workspace includes a computer on a desk, various office supplies, and a black office chair.&#34;&gt;
&lt;p&gt;I even made sure the cats had little cubbies 🐈 because they love hanging out with us during the day.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I Created Some DCC Character Sheets</title>
      <link>https://heyloura.com/2024/08/21/i-created-some.html</link>
      <pubDate>Wed, 21 Aug 2024 14:19:36 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/08/21/i-created-some.html</guid>
      <description>&lt;p&gt;Looks like my little gaming group can get together this weekend to play some &lt;a href=&#34;https://goodman-games.com/dungeon-crawl-classics-rpg/&#34;&gt;Dungeon Crawl Classics&lt;/a&gt;, DCC. Yay! During our last game I noticed that we spent just as much time looking up what the characters can do versus actually playing the game. I think that&amp;rsquo;s because we only get to play every four-six weeks which is just enough time to forget everything. So I hunted around for some good fan-made character sheets that actually explained what a character class/race could do. There were a couple of options that were close to what I wanted, but I ended up just drawing my own.&lt;/p&gt;
&lt;p&gt;So here they are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/uploads/2024/cleric-character-sheet-v2.pdf&#34;&gt;DCC Cleric Character Sheet v2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/uploads/2024/thief-character-sheet-v1.pdf&#34;&gt;DCC Thief Character Sheet v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/uploads/2024/warrior-character-sheet-v1.pdf&#34;&gt;DCC Warrior Character Sheet v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/uploads/2024/wizard-character-sheet-v1.pdf&#34;&gt;DCC Wizard Character Sheet v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/uploads/2024/elf-character-sheet-v1.pdf&#34;&gt;DCC Elf Character Sheet v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/uploads/2024/dwarf-character-sheet-v1.pdf&#34;&gt;DCC Dwarf Character Sheet v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/uploads/2024/halfling-character-sheet-v1.pdf&#34;&gt;DCC Halfling Character Sheet v1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;/&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;/&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;&lt;/code&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;/p&gt;
&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;/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;Note, the &lt;code&gt;id&lt;/code&gt; is the id of the reader, not the bookmark.&lt;/p&gt;&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;Whew….&lt;/p&gt;&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;
</description>
    </item>
    
    <item>
      <title>A journey into the world of pediatric chronic pain - a continuation</title>
      <link>https://heyloura.com/2024/06/02/and-we-wait.html</link>
      <pubDate>Sun, 02 Jun 2024 08:06:01 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/06/02/and-we-wait.html</guid>
      <description>&lt;p&gt;I shared back at the &lt;a href=&#34;https://heyloura.com/2024/03/20/the-inciting-incident.html&#34;&gt;end of March&lt;/a&gt; how my world went topsy-turvy on me when my daughter&amp;rsquo;s knee injury, now healed, triggered a case of pediatric Complex Regional Pain Syndrome, CRPS.&lt;/p&gt;
&lt;h2 id=&#34;and-we-wait&#34;&gt;And we wait&lt;/h2&gt;
&lt;p&gt;Since then I&amp;rsquo;ve watched rather helplessly as school work from missed school days piled up and as her peers decided she must be faking at this point since she still sometimes needs a cane to get around. The stress is eating away at my silly and creative girl and stress makes everything worse.&lt;/p&gt;
&lt;p&gt;Sometimes I wonder if the pain is really that bad, I guess this is somewhat common among caregivers. But then I catch her flinching from rain drops or from one of our cats brushing against her leg. Or having her sit down in the aisle of a store because taking one more step is really too much. Her skin tingles, itches and burns for hours. Her limbs turn red or purple or grey and swell. Her feet go numb and her hands go numb. She&amp;rsquo;s dropping things and she&amp;rsquo;s scared. Since my last update, the CPRS has spread to both legs and now both arms.&lt;/p&gt;
&lt;p&gt;I just want to give her a hug or a loving rub on the arm. But even that is painful for her.&lt;/p&gt;
&lt;p&gt;So, the last two months have been hard. She no longer wants to go back to school at this point. I remember sharing last year that she was so excited to try out public school and make some friends. Now it&amp;rsquo;s her number one dread. She held it together for the school play (which she auditioned for on crutches and did fantastic with). But fell apart after the last show. I thought for sure that she wouldn&amp;rsquo;t go back. But after a mental health day she wanted to keep with it, at least until the end of the year.&lt;/p&gt;
&lt;p&gt;On the brighter side, she&amp;rsquo;s recently taken up yoga with a beloved aunt. Though some of her friends from earlier in the year have decided to fade away she&amp;rsquo;s found new ones. Ones just as silly as she is.&lt;/p&gt;
&lt;p&gt;I am so glad we decided to use Boston Children&amp;rsquo;s for her care. Given the severity of the symptoms and that out-patient Physical Therapy and CBT Therapy aren&amp;rsquo;t as effective as they&amp;rsquo;d like we were recommended for the in-patient Pediatric Pain Rehabilitation Center, PPRC. Getting all the paperwork and recommendations in order took a while. I am so thankful that my husband dealt with the phone calls back and forth. We finally got on the official waiting list at the mid-May. So we settled in for a long wait, since it can take a while for a spot to open up.&lt;/p&gt;
&lt;p&gt;With the plan of keeping spirits up, in early spring I signed my daughter up for fun things to do during the summer. An outdoor camp to build a fun shelter village, a mystery crime lab camp, and a musical theater camp. A trip with the family to Atlantic City, NJ.&lt;/p&gt;
&lt;p&gt;We had a group orientation zoom call with the PPRC a week after getting on the waiting list. During the call we went over what to expect and that they only have 10 kids in the program at any given time and that we shouldn&amp;rsquo;t expect to get in until the fall. That&amp;rsquo;s fine. I already had summer plans squared away and we could hold on until the fall. If we had to.&lt;/p&gt;
&lt;p&gt;But after the orientation we were informed that a spot had opened up and it was ours if we wanted it. The catch, she would need to start in one week.&lt;/p&gt;
&lt;h2 id=&#34;frantic-preparations&#34;&gt;Frantic preparations&lt;/h2&gt;
&lt;p&gt;So we frantically made arrangements. She would miss the end of the school year, so we needed to get the school on the same page. We live close-ish to Boston. But it is no where near an easy commute and this program is no cake-walk. It is an intensive 8 hour per day program with home exercises every day. A caregiver needs to be available for in-person meetings with the care providers for an average of 7 hours a week. Could we handle four hours additional in the car, since Boston traffic is ridiculous during rush hour(s)? Everyday? For 3-6+ weeks? Probably not. My husband and I have full-time jobs, albeit remote ones, and a son with his own schedule and homeschooling to finish for the year. But that&amp;rsquo;s not going to stop me.&lt;/p&gt;
&lt;p&gt;Week one we stayed in a hotel with family helping to watch my son. Next week we should get a time estimate for her length of stay in the program. From there we will make adjustments and make it work, alternating weeks with my husband being in Boston taking point on the PPRC program with me up in Boston.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to follow up with a separate post detailing our time in the program. It might take me a while though, even week one is far more emotionally draining than I thought it would be.&lt;/p&gt;
&lt;h2 id=&#34;crps-posts-and-updates&#34;&gt;CRPS Posts and Updates:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2024/03/20/the-inciting-incident.html&#34;&gt;Mar 20, 2024: The longest four months - a journey into the world of pediatric chronic pain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2024/04/25/its-just-over.html&#34;&gt;Apr 25, 2024&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>The longest four months - a journey into the world of pediatric chronic pain</title>
      <link>https://heyloura.com/2024/03/20/the-inciting-incident.html</link>
      <pubDate>Wed, 20 Mar 2024 16:45:13 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/03/20/the-inciting-incident.html</guid>
      <description>&lt;p&gt;It was November 2023 when I was at my computer just sending off an email to my daughters dance studio about her participating in the local Christmas Parade. That&amp;rsquo;s when I got a call from the school nurse. &amp;ldquo;She hurt her knee standing up from her desk at school, it looks pretty swollen and she&amp;rsquo;s in quite a bit of pain.&amp;rdquo; she relayed to me. Little did I know that would be my introduction into the strange and terrifying world of pediatric chronic pain conditions.&lt;/p&gt;
&lt;h2 id=&#34;the-inciting-incident&#34;&gt;The inciting incident.&lt;/h2&gt;
&lt;p&gt;My daughter is eleven and in sixth grade. When she got home from school she was limping and could barely make it up the stairs. We started the RICE protocol. Rest, ice, compress, and elevate. By the evening she needed a cane and was begging to go to the emergency room. &amp;ldquo;Something is really wrong&amp;rdquo; she would say. We had her repeat what happened several times. &amp;ldquo;You just stood up to get a pencil? Did you jump up? Maybe you hurt it earlier somehow?&amp;rdquo;. But the answer was always yes, no, and no. We ended up making the hard call not to take her to the ER that night and kept her comfortable the best we could. But the pain would not budge.&lt;/p&gt;
&lt;p&gt;We managed to talk our way into our pediatrician seeing her first thing in the morning. Who referred us to an orthopedic saying that it looked like an acute knee injury. We found one who could see us the next day. But I was left wondering how there could be such an injury from simply standing up. At this point she needed crutches to move around and needed to alternate pain medications every three hours to keep on top of it.&lt;/p&gt;
&lt;p&gt;The x-rays reveled nothing. The orthopedic suspected Lyme disease due to the prevalence of ticks in our area, the fact we live in the woods, and that it does sometimes present with a swelling of the knee. I finally relaxed a bit. That made sense to me. We just needed a blood test to verify. A few years earlier my son had Lyme that presented with a swollen knee. And while Lyme is not something to take lightly, a long course of antibiotics can usually do the trick. My daughter was not happy with the blood draw but I was feeling relief.&lt;/p&gt;
&lt;p&gt;A couple days later, doing anything and everything we could think of to distract her from the unceasing pain that now radiated up and down her whole leg the results finally came back. Negative.&lt;/p&gt;
&lt;p&gt;We called the orthopedic who wouldn&amp;rsquo;t see us for two weeks. We called the pediatrician thinking it must be a false negative. At this point I wanted it to be Lyme because I could wrap my head around that. What else could it be? Severe tissue damage? Nerve damage? Her leg was cold, her foot felt strange to her, and the pain medication was doing little even though we were giving her the max allowed. She begged to go to the emergency room so someone could do something. But I knew they would just refer us to a specialist.&lt;/p&gt;
&lt;p&gt;On Friday I had had enough. The orthopedic must have missed something. So we were going to find another one who could see us sooner. I researched potential pediatric orthopedics we could feasibly drive to and my husband made the calls. Eventually someone from Boston Children&amp;rsquo;s could see us and we would make the drive. We just needed to get through the next five days to the appointment.&lt;/p&gt;
&lt;h2 id=&#34;an-obstacle-to-overcome&#34;&gt;An obstacle to overcome&lt;/h2&gt;
&lt;p&gt;Those five days waiting to get a second opinion passed by so slowly. Having your child in pain just hurts the heart so much. My anxiety was high, I was still trying to juggle work and homeschooling my son, and I couldn&amp;rsquo;t do a thing to help my daughter.&lt;/p&gt;
&lt;p&gt;On the drive to see an orthopedic at Boston Children&amp;rsquo;s my daughter broke my heart with her soft question, &amp;ldquo;What if they can&amp;rsquo;t find out what&amp;rsquo;s wrong?&amp;rdquo; I assured her the best I could and while the Xray didn&amp;rsquo;t reveal anything they did order an MRI to get a better look. The doctor was thinking of a couple of possibilities including sprains or tears. But booking an MRI takes time and my daughter would just have to make it through until then.&lt;/p&gt;
&lt;p&gt;We did manage to get her back to school after Thanksgiving break. Starting with half days, crutches, a knee brace, a pass for the elevator, and a note letting the school nurse give her pain meds as needed. Her leg would swell up sometimes and  turn red/purple and back to really pale. She complained of her foot feeling numb. And I could no longer rub her leg to help warm it up telling me it would burn and tingle like pins and needles if I touched it.&lt;/p&gt;
&lt;p&gt;The MRI itself was uneventful. Though extending out her leg and keeping it still was extremely painful for her. While we had seen some minor improvements in pain while we waited for the MRI appointment but the pain came back in full force after it.&lt;/p&gt;
&lt;p&gt;It was my husbands birthday in early December when we had a follow up call with the orthopedic. They walked us through the images. She did have an injury to the back of her knee. Apparently she had a cortical desmoid, a benign growth, right where the calf muscle attaches to the femur and the muscle had pulled on it. They weren&amp;rsquo;t sure of the healing time but weren&amp;rsquo;t too concerned. Rest, ice, compress, and elevate and then see us in six to eight weeks.&lt;/p&gt;
&lt;p&gt;I mentioned the other sensations my daughter was experiencing with the reply that the nerves could be over-sensitized from the injury but it should resolve itself along with the injury.&lt;/p&gt;
&lt;p&gt;So we waited. Slowly my daughter weaned off most of the pain medications. &amp;ldquo;They don&amp;rsquo;t work so why take them?&amp;rdquo; was her thought. Though in general she did feel like her overall pain was going down. But the strange burning and pins/needle sensations in the leg kept right on. Even spreading from mid-thigh to ankle with complaints that her foot felt like paper.&lt;/p&gt;
&lt;p&gt;The holidays were strained. The constant stress was getting to me and on top of it all we found out that my mother-in-law needed an emergency heart bypass.&lt;/p&gt;
&lt;h2 id=&#34;the-tension-rises&#34;&gt;The tension rises&lt;/h2&gt;
&lt;p&gt;My husband was dealing with the extreme complications that happened during his mother&amp;rsquo;s heart bypass. We did not know if she would make it and what the repercussions were going to be.  He was spending as much time with her as he could while I tried to hold down the fort at home.&lt;/p&gt;
&lt;p&gt;Our follow up with Boston Children&amp;rsquo;s didn&amp;rsquo;t happen until mid January. They seemed concerned that her pain levels and nerve sensations were still unrelenting. The follow up Xray didn&amp;rsquo;t give conclusive evidence to the level of healing so they recommended a CT scan. They also referred us up the chain of orthopedic doctors to the head of the orthopedic division of Boston Children&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;The CT scan had my daughter writhing in pain. Keeping her leg out stretched and still for 15 min left her pale and sweating and in even more pain then she&amp;rsquo;s become accustomed to. She&amp;rsquo;s disheartened that they&amp;rsquo;ll ever find answers. And to tell the truth, so am I. How can this injury be almost healed and she still be suffering this much?&lt;/p&gt;
&lt;p&gt;I was an anxious ball of energy on January 22nd when we finally got back to Boston Children&amp;rsquo;s to see the head of orthopedics. He breezed right in and listened to us for a few moments before asking if we had ever heard of complex regional pain syndrome or CRPS. The knee injury was healed and what we were dealing with was something more insidious.&lt;/p&gt;
&lt;p&gt;He explained the basics. That she was dealing with an amplified pain response. The skin sensitivity? Allodynia that is a common symptom of CRPS. We needed to go see the Boston Children&amp;rsquo;s pain treatment center and until then get started on physical therapy and various desensitization techniques. He seemed upbeat that she would make a recovery even if it would take a bit of work to get there.&lt;/p&gt;
&lt;p&gt;I left the appointment hopeful. It felt like we could finally do something. Physical therapy was doable. The desensitization techniques of rubbing various texture on the skin or using a TENs unit seemed doable. My husband was upbeat too. We had a diagnosis that fit the symptoms and steps to do.&lt;/p&gt;
&lt;p&gt;It wasn&amp;rsquo;t until later that night I decided to research a bit into CRPS and everything came crashing down. While my daughter has a lot of things going for her, in terms of her having a good chance of CRPS going into remission, the stories of people of those who don&amp;rsquo;t&amp;hellip; it terrified me. When you have a diagnosis for your child which is sometimes referred to the world&amp;rsquo;s most painful incurable condition&amp;hellip; What on earth do you do?&lt;/p&gt;
&lt;h2 id=&#34;everything-changes&#34;&gt;Everything changes&lt;/h2&gt;
&lt;p&gt;I went on auto-pilot for a couple weeks. Fake smile, enthusiasm, and getting shit done mode. We found a physical therapist that my daughter loves. She started making progress on using her leg. The desensitization techniques were the hardest to stay on top of.&lt;/p&gt;
&lt;p&gt;When we started she couldn&amp;rsquo;t stand the touch of a cotton ball on her leg. A few weeks later, she could stand a couple of touches. We had moments where it seemed like we were making great progress. Then days where she tried to put tights on to dance class, where she sits and watches, and was in agony the whole time, from the simple feeling of the material.&lt;/p&gt;
&lt;p&gt;It took nearly a month to get an appointment at the Pain Treatment Center which was both very quick and excruciatingly slow. A big snow storm was predicted the day of the appointment, which caused another patient to reschedule. That allowed us to have all five specialists with us in the room at the same time.&lt;/p&gt;
&lt;p&gt;They agreed, CRPS.&lt;/p&gt;
&lt;p&gt;Our task was to continue with physical therapy, add in CBT therapy, focus more on desensitization and see them in four weeks. They also had lots of handouts, video/book recommendations, apps for my daughter to have on her phone with meditation techniques, and a push to attend the Comfort Ability workshop that they host. They were reassuring that pediatric cases of CRPS have better outcomes. Early treatment leads to better outcomes. Treating it aggressively has better outcomes. This is something I have to believe.&lt;/p&gt;
&lt;p&gt;And so that&amp;rsquo;s what we did. I ordered all the books both in print and the audiobook versions for car listening. We found a CBT therapist that had availability and took our insurance after more phone calls than I can count. We kept up with physical therapy and stressed the desensitization practices. Little by little we saw some improvements.&lt;/p&gt;
&lt;p&gt;First she could straighten her leg. Then she could put the smallest amount of weight on her foot. Then a bit more. With time she could get about mostly with one crutch. Then a few steps without help. Then back to the crutch. By early March she started walking by herself and only occasionally needing a cane.&lt;/p&gt;
&lt;p&gt;Luckily a spot opened up for the Comfort Ability workshop we were waitlisted on. It was for both parents and kids, though we were in separate areas. It was heart wrenching hearing everyone&amp;rsquo;s stories about their children. But it felt good to hear from the specialists and get tools in our toolbox.&lt;/p&gt;
&lt;p&gt;We left the workshop in a good mood. My daughter was grinning ear to ear because while we worked through a binder of information she was doing aromatherapy, art therapy, and learning meditation and comfort techniques.&lt;/p&gt;
&lt;p&gt;It all unraveled and came crashing down later that evening. She hadn&amp;rsquo;t wanted to mention it because she was scared of what it meant, but the allodynia, the extreme skin sensitivity, had been getting worse. The workshop and talking with other adolescents who had been going through chronic pain had given her the courage to speak up.&lt;/p&gt;
&lt;p&gt;The allodynia&amp;hellip; instead of being confined to her left leg had now spread to her right leg.&lt;/p&gt;
&lt;p&gt;Back to being terrified I go.&lt;/p&gt;
&lt;h2 id=&#34;where-do-we-go-from-here&#34;&gt;Where do we go from here?&lt;/h2&gt;
&lt;p&gt;So that&amp;rsquo;s where we are at. Boston Children&amp;rsquo;s has recommended that my daughter attend the in-patient Pediatric Pain Rehabilitation Center when a spot opens up along with monthly check-ins until then. We are continuing with all the therapies they recommended and I&amp;rsquo;m trying to keep spirits up.&lt;/p&gt;
&lt;p&gt;The fact that we see improvements has been keeping me hopeful. As long as the upward trajectory remains we can handle a few set backs. I debated in posting this to my blog. It&amp;rsquo;s far more personal than I normally share. But at the same time I really found some solace in others who posted about their stories for anyone to find.&lt;/p&gt;
&lt;p&gt;Ultimately I hit the &amp;ldquo;publish&amp;rdquo; button in-case another terrified parent is searching the internet at night about pediatric CRPS and wondering what it all means. Well, I can&amp;rsquo;t answer anything about what it all means&amp;hellip; but you&amp;rsquo;re not alone.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll come back here periodically and link to any updates I make. ## CRPS Posts and Updates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mar 20, 2024: The longest four months - a journey into the world of pediatric chronic pain* &lt;a href=&#34;https://heyloura.com/2024/04/25/its-just-over.html&#34;&gt;Apr 25, 2024&lt;/a&gt;* &lt;a href=&#34;https://heyloura.com/2024/06/02/and-we-wait.html&#34;&gt;Jun 2, 2024: A journey into the world of pediatric chronic pain - a continuation&lt;/a&gt;* &lt;a href=&#34;https://heyloura.com/2024/09/21/a-journey-into.html&#34;&gt;Sep 21 2024: A journey into the world of pediatric chronic pain - a new normal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Dev Diary 0013 - End of January through February</title>
      <link>https://heyloura.com/2024/03/01/dev-diary-end.html</link>
      <pubDate>Fri, 01 Mar 2024 17:22:42 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/03/01/dev-diary-end.html</guid>
      <description>&lt;p&gt;Life has been hectic. Like I mentioned back in December, I&amp;rsquo;m juggling two close family members with health issues. My mother-in-law survived the surgery, has gone through rehab, and is now back at her house (edit: and since I started writing this draft, back to the hospital). She requires a lot of help and lives over two hours away from any family. It&amp;rsquo;s a hard position to be in.&lt;/p&gt;
&lt;p&gt;Plus my daughter received a rare, potentially chronic, diagnosis. The knee injury was the catalyst to something bigger, which even though the knee has now healed, she still cannot walk unaided.  It will be a long road to recovery.&lt;/p&gt;
&lt;p&gt;All that to say, besides work, coding and side projects have taken a bit of a back seat for now.&lt;/p&gt;
&lt;h2 id=&#34;job-related&#34;&gt;Job Related&lt;/h2&gt;
&lt;p&gt;I fixed the issue with Azure Dev Ops and got everything running again. Which was a relief. Then I spent a week or so going over my goals for this next year and making a roadmap. At the end of the year I want this redesign project ready for launch and there are so many things to do to make that happen. Turns out there was a little money left in the budget to hire a contractor for some help so I don&amp;rsquo;t need to do everything solo.&lt;/p&gt;
&lt;p&gt;I split up the year into seven six-week cycles to leave room for vacations, holidays, and business travel. The last week in each cycle is focused exclusively on bug fixes and making sure there are tests for all major functionality introduced. Then I took stock of all the features that need work done to get launch ready and set an appetite for each of them.  Most of them I can only allocate two/three weeks on and then I will need to move on to keep up the pace.  Luckily at this point most of the features have already been implemented in a rough fashion, so I&amp;rsquo;m only refining them. Still, this will be hard to pull off.&lt;/p&gt;
&lt;h2 id=&#34;side-project---lillihub-&#34;&gt;Side Project - Lillihub 🐸&lt;/h2&gt;
&lt;p&gt;I tried an update and broke everything. (It&amp;rsquo;s fun when things work locally but fail when deployed🙃). So I rolled all my changes back out. Since then I&amp;rsquo;ve been fiddling with the ui design and the overall architecture and fixed the issue I ran into, which was a dependency mismatch.&lt;/p&gt;
&lt;h3 id=&#34;highlights&#34;&gt;Highlights&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;m working on adding in support for the micro.blog premium feature, highlights. In the micro.blog website, you add a bookmark you can access a special reader page that lets you mark up highlights. Which you can then search or start blog posts from. I really like this feature and I wanted to bring it into my app.&lt;/p&gt;
&lt;p&gt;There is an endpoint that returns a web page that has this functionality baked in. You can access it with a GET request to &lt;code&gt;https://micro.blog/hybrid/bookmarks/123&lt;/code&gt; (where 123 is the &lt;code&gt;id&lt;/code&gt; and passing along with a valid access token). I ran into a couple of issues with this. Nothing big. Just a couple of hard-coded micro.blog links and differences in UI since it doesn&amp;rsquo;t have my stylesheet.&lt;/p&gt;
&lt;p&gt;So my approach: Right now I&amp;rsquo;m using a DOM parser to parse the returned web page, grabbing the content, which helpfully has an id of &lt;code&gt;content&lt;/code&gt; and the contents of the &lt;code&gt;base&lt;/code&gt; tag in the html head. This allows me to rewrite any image tags in the reader to reference the right source.&lt;/p&gt;
&lt;p&gt;Then I grab the text of any existing highlights and do a &lt;code&gt;.replaceAll(&#39;text&#39;,&#39;&amp;lt;mark&amp;gt;text&amp;lt;/mark&amp;gt;&#39;)&lt;/code&gt;. Which I do instead of using positions like the current web-reader uses. I just couldn&amp;rsquo;t get the position portion to work and I tried a couple of different ways. The highlights were always a couple of characters off.&lt;/p&gt;
&lt;p&gt;Next I wrote a bit of JavaScript to capture new highlights, and I think I found a way to capture the underlying HTML tags with it. You basically create an empty fake container and clone the selection contents into it and then return the innerHTML. I haven&amp;rsquo;t fully tested the code below, but what I did test worked.&lt;/p&gt;
&lt;pre class=&#34;language-js&#34;&gt;&lt;code class=&#34;language-js&#34;&gt;
function getSelectionHtml() {
	var html = &#34;&#34;;
	if (typeof window.getSelection != &#34;undefined&#34;) {
		var sel = window.getSelection();
		if (sel.rangeCount) {
			var container = document.createElement(&#34;div&#34;);
			for (var i = 0, len = sel.rangeCount; i &lt; len; ++i) {
				container.appendChild(sel.getRangeAt(i).cloneContents());
			}
			html = container.innerHTML;
		}
	} else if (typeof document.selection != &#34;undefined&#34;) {
		if (document.selection.type == &#34;Text&#34;) {
			html = document.selection.createRange().htmlText;
		}
	}
	return html;
}

document.addEventListener(&#34;selectionchange&#34;, function(event) {
	const selection = window.getSelection();
	
	if (selection.rangeCount === 0) {
		return;
	}

	document.getElementById(&#39;selectionInput&#39;).value = getSelectionHtml();
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This should make it easier to set highlights over links or images.&lt;/p&gt;
&lt;p&gt;The last thing I need to do is get the highlights to save. Still figuring that part out.&lt;/p&gt;
&lt;h3 id=&#34;ui-updates&#34;&gt;UI Updates&lt;/h3&gt;
&lt;p&gt;I made a quick post about some &lt;a href=&#34;https://heyloura.com/2024/02/26/im-thinking-about.html&#34;&gt;UI changes here&lt;/a&gt;. Feedback was positive 😊&lt;/p&gt;
&lt;p&gt;Here was the update I shared&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/lillihub-ui-updates-bookmarks.png&#34; width=&#34;600&#34; height=&#34;354&#34; alt=&#34;&#34;&gt;
&lt;p&gt;and here is a new one showing the timeline in the dark theme&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/lillihub-ui-updates-timeline.png&#34; width=&#34;600&#34; height=&#34;310&#34; alt=&#34;&#34;&gt;
&lt;p&gt;I do think that the updated version, on the left, is the direction I&amp;rsquo;m heading towards.&lt;/p&gt;
&lt;h3 id=&#34;combined-posts--conversations&#34;&gt;Combined Posts + Conversations&lt;/h3&gt;
&lt;p&gt;One big change I&amp;rsquo;m contemplating is combining posts and conversations into one area, instead of having them as two separate tabs. The image above, left, shows this in action. It will still gather up all the conversations and show them under the original post, it just won&amp;rsquo;t break them into two piles like it currently does. I&amp;rsquo;ll probably have a toggle to switch it back to the separated view for those who prefer it. But overall I find having it in one place simplifies things.&lt;/p&gt;
&lt;h3 id=&#34;notes&#34;&gt;Notes&lt;/h3&gt;
&lt;p&gt;Micro.blog released a notes feature 🥳&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s simple and I&amp;rsquo;m really loving it. So I&amp;rsquo;m moving over my notes to it. Plus they released an API&amp;hellip; so I just had to play around with it.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/screenshot-notes-in-lillihub.png&#34; width=&#34;600&#34; height=&#34;541&#34; alt=&#34;&#34;&gt;
&lt;p&gt;Still need to make the create/edit/update screens. But I think it&amp;rsquo;s looking good 😎&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Private key (AES-CBC) encryption and decryption in Deno</title>
      <link>https://heyloura.com/2024/02/08/private-key-aes.html</link>
      <pubDate>Mon, 12 Feb 2024 08:36:50 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/02/08/private-key-aes.html</guid>
      <description>&lt;p&gt;I found myself needing to encrypt a small string on Deno (and subsequently decrypt it later) for a small side project. I checked out a few websites with code samples. But those didn&amp;rsquo;t work/were out of date. So this is what worked for me:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: I am not a security expert and I don&amp;rsquo;t play one on TV. You shouldn&amp;rsquo;t trust anything important with random code you found on the internet. Seriously.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;1-save-the-key&#34;&gt;1. Save the key&lt;/h2&gt;
&lt;p&gt;First we generate a key using the standard &lt;a href=&#34;https://deno.land/api@v1.40.4?s=SubtleCrypto&#34;&gt;SubtleCrypto&lt;/a&gt; api that ships with Deno. Then export a JSON webkey and save it. I&amp;rsquo;m putting it in an environmental variable. Make sure it is safe and secure.&lt;/p&gt;
&lt;pre class=&#34;language-js&#34;&gt;
&lt;code class=&#34;language-js&#34;&gt;
const key = await crypto.subtle.generateKey({ name: &#34;AES-CBC&#34;, length: 128 },true,[&#34;encrypt&#34;, &#34;decrypt&#34;]);
const rawKey = JSON.stringify(await crypto.subtle.exportKey(&#34;jwk&#34;, key));
&lt;/code&gt;
&lt;/pre&gt;
&lt;h2 id=&#34;2-encrypt-a-string&#34;&gt;2. Encrypt a string&lt;/h2&gt;
&lt;p&gt;Here we take the JSON webkey from our environmental variable that we created in step one and import it. Then using the key along with some random bytes, the initialization vector &lt;code&gt;iv&lt;/code&gt;, we encrypt the string. The last two lines deal with getting the encrypted string into a format to save. The &lt;code&gt;iv&lt;/code&gt; needs to be random and unique per message but it doesn&amp;rsquo;t need to be secret. So we can prepend it to the encrypted message.&lt;/p&gt;
&lt;p&gt;You could potentially take this one step further and get a hex string from the encrypted bytes and save that. But for my needs I stopped here and stored the comma separated string of numbers.&lt;/p&gt;
&lt;pre class=&#34;language-js&#34;&gt;
&lt;code class=&#34;language-js&#34;&gt;
async function encryptMe(decrypted)
{
    const _appSecret = JSON.parse(Deno.env.get(&#34;APP_SECRET&#34;));
    const iv = await crypto.getRandomValues(new Uint8Array(16)); 
    const key = await crypto.subtle.importKey(&#34;jwk&#34;, _appSecret, &#34;AES-CBC&#34;, true, [&#34;encrypt&#34;, &#34;decrypt&#34;]);
    const encrypted = await crypto.subtle.encrypt({name: &#34;AES-CBC&#34;, iv}, key, new TextEncoder().encode(decrypted));
    const encryptedBytes = new Uint8Array(encrypted);
    return `${iv.toString()}|${encryptedBytes.toString()}`;
}
&lt;/code&gt;
&lt;/pre&gt;
&lt;h2 id=&#34;3-decrypt-a-string&#34;&gt;3. Decrypt a string&lt;/h2&gt;
&lt;p&gt;The next step is to decrypt a string we previously encrypted.  After we make a key we will need to separate out the two parts of the passed in message. The first part specifies the &lt;code&gt;iv&lt;/code&gt; that was used and the second stores the encrypted message. You can use the &lt;code&gt;Uint8Array.from&lt;/code&gt; to re-create the Unit8Array. Then call the decrypt method from the key, use a text decoder and you have your decrypted message. Yay! 👏&lt;/p&gt;
&lt;pre class=&#34;language-js&#34;&gt;
&lt;code class=&#34;language-js&#34;&gt;
async function decryptMe(encrypted) 
{
    const _appSecret = JSON.parse(Deno.env.get(&#34;APP_SECRET&#34;));
    const key = await crypto.subtle.importKey(&#34;jwk&#34;, _appSecret, &#34;AES-CBC&#34;, true, [&#34;encrypt&#34;, &#34;decrypt&#34;]);
    const ivPart = encrypted.split(&#39;|&#39;)[0];
    const encryptedPart = encrypted.split(&#39;|&#39;)[1];

    const encryptedBytes = Uint8Array.from(encryptedPart.split(&#39;,&#39;).map(num =&gt; parseInt(num)));
    const iv = Uint8Array.from(ivPart.split(&#39;,&#39;).map(num =&gt; parseInt(num)));
    
    const decrypted = await crypto.subtle.decrypt({name: &#34;AES-CBC&#34;, iv}, key, encryptedBytes);
    const decryptedBytes = new Uint8Array(decrypted);
    return new TextDecoder().decode(decryptedBytes);
}
&lt;/code&gt;
&lt;/pre&gt;
&lt;details&gt;&lt;summary&gt;Permission notice&lt;/summary&gt;THE CODE SAMPLE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE CODE SAMPLE OR THE USE OR OTHER DEALINGS WITH THE CODE SAMPLE.&lt;/details&gt;
</description>
    </item>
    
    <item>
      <title>Dev Diary 0012: January 1st - 16th 2024</title>
      <link>https://heyloura.com/2024/01/16/dev-diary-january.html</link>
      <pubDate>Tue, 16 Jan 2024 13:13:46 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2024/01/16/dev-diary-january.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve spent the last few weeks of the New Year, like a lot of others, reflecting on where I&amp;rsquo;ve been and where I want to go. So this update is a little more rambling than most.&lt;/p&gt;
&lt;h2 id=&#34;work&#34;&gt;Work&lt;/h2&gt;
&lt;p&gt;I want to never use Azure Dev Ops again. It is giving me such a headache. I still can&amp;rsquo;t get our release pipeline working after upgrading our solution to .NET 8. Entity framework is complaining and its convoluted and not my strong suit.&lt;/p&gt;
&lt;p&gt;One of the pitfalls of being a solo developer. No one to ask questions or to brainstorm off of. ::sigh::&lt;/p&gt;
&lt;h2 id=&#34;personal-projects&#34;&gt;Personal Projects&lt;/h2&gt;
&lt;h3 id=&#34;my-blog&#34;&gt;My blog&lt;/h3&gt;
&lt;p&gt;Not too much happening here other than adding in the &lt;a href=&#34;https://github.com/svendahlstrand/plugin-search-space&#34;&gt;search-space&lt;/a&gt; plugin by &lt;a href=&#34;https://micro.blog/sod&#34;&gt;@sod&lt;/a&gt; on my search page and rearranging how posts appear on the index page as I shared in this update: &lt;a href=&#34;https://heyloura.com/2024/01/10/some-minor-blog.html&#34;&gt;Some minor blog updates&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The basic Hugo code I used can be found on &lt;a href=&#34;https://paste.lol/loura/micro-blog-group-by-date-then-reverse&#34;&gt;my paste bin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In general the idea is to group the posts by date with a &lt;code&gt;.GroupByDate&lt;/code&gt;
That gives you access to the {{ &lt;code&gt;.Key&lt;/code&gt; }} which is the date and then {{ &lt;code&gt;.Pages&lt;/code&gt; }} which is a collection that corresponds to that date. Then you need to sort the {{ &lt;code&gt;.Pages&lt;/code&gt; }} in reverse. That&amp;rsquo;s accomplished by {{ &lt;code&gt;range .Pages.Reverse&lt;/code&gt; }}&lt;/p&gt;
&lt;p&gt;I do have some other updates I want to get around to like adding a blogroll, which I might use the bookmarks feature of micro.blog for and creating a digital garden/wiki.&lt;/p&gt;
&lt;h3 id=&#34;a-cyoagamebook-website&#34;&gt;A CYOA/Gamebook website&lt;/h3&gt;
&lt;p&gt;This is a very &lt;em&gt;very&lt;/em&gt; rough concept right now. But I&amp;rsquo;d love to code a generic fantasy RPG as a gamebook or a &amp;ldquo;choose your own adventure&amp;rdquo; type game. I have the concept and flow chart written out. I also want to do it sans game engine and either code one up myself or craft standalone HTML pages. I also want to make my own artwork for it. I picked up a couple of illustration books to start practicing.&lt;/p&gt;
&lt;h3 id=&#34;lillihub&#34;&gt;Lillihub&lt;/h3&gt;
&lt;p&gt;Earlier this week I shared this video showcasing my favorite part about Lillihub, that it works 100% without JavaScript:&lt;/p&gt;
&lt;p&gt;&lt;video controls=&#34;controls&#34; playsinline=&#34;playsinline&#34; src=&#34;https://cdn.uploads.micro.blog/88328/2024/youcut-20240114-161643062.mp4&#34; width=&#34;640&#34; height=&#34;360&#34; poster=&#34;https://heyloura.com/uploads/2024/c0159c54e8.png&#34; preload=&#34;none&#34;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t think of any other social media site that can do that. Please let me know if another one out there exists.&lt;/p&gt;
&lt;p&gt;Back in 2023 I decided I wanted to flex my front-end coding muscles a bit. I was having lots of fun playing around with my blog design and exploring neocities sites. I went off on a tangent exploring iframes as a bit of a retro website frame system. I still think there is something to that, both as a way to manage a static website and to build very basic local apps. It was fun throwing together a calendar and a little budgeting app with it. That&amp;rsquo;s actually what Lillihub started as, until I ran into CORS issues. Then when I tossed in a backend with Deno, using my iframe trick didn&amp;rsquo;t seem useful. So I decided to challenge myself with writing all my own css and doing it all without JavaScript. Version 1 of the app had no JavaScript at all and I learned a ton doing it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Did you know you can stream HTML to the browser like a video? I didn&amp;rsquo;t.&lt;/li&gt;
&lt;li&gt;Did you know that you can target the action of an iframe to a different element? I didn&amp;rsquo;t.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;rsquo;s been a very fun project to build. Probably my favorite personal project ever. It even beat that time I folded 1000 origami cranes.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/2acb59154c.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id=&#34;updates&#34;&gt;Updates&lt;/h4&gt;
&lt;p&gt;Not too many updates were user facing. The biggest one was probably the editor previewing images as you write markdown. There were also a handful of bug fixes and I&amp;rsquo;m ordering the posts by date_timestamp, but I&amp;rsquo;m not sure that fixed the timeline marker issue. I&amp;rsquo;ll need to investigate further.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/screenshot-20240114-195849.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id=&#34;future-roadmap&#34;&gt;Future Roadmap?&lt;/h4&gt;
&lt;p&gt;I&amp;rsquo;ve been spending sometime thinking about the future of Lillihub. I feel like I have a solid base to launch off of now. And I&amp;rsquo;m doing my best to not slide into the thought that I should rip it all to pieces and rebuild it with a brand new latest and greatest framework. So I need to step back sometimes and admire what I like most about it. The fact that it streams HTML, that the UI is a bit different but very usable, that there is no build step and its mostly in one file (I know I know, that probably annoys the other developers who&amp;rsquo;ve glance at the source code)&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s up next? This is a simplified &amp;ldquo;I want&amp;rdquo; list, not exhaustive and &lt;em&gt;not a promise to build&lt;/em&gt; 😉:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I want to have the highlights incorporated into the bookmarks area and make tagging easier&lt;/li&gt;
&lt;li&gt;I want to add books via one of the book APIs out there&lt;/li&gt;
&lt;li&gt;I want it to better support the IndieWeb
&lt;ul&gt;
&lt;li&gt;Let people bring there own indieauth/micropub endpoints&lt;/li&gt;
&lt;li&gt;Let the editor have a dropdown to add microformats markup for replies, likes, etc..&lt;/li&gt;
&lt;li&gt;Microsub client? Integrated with posts?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Let the PWA accept shares
&lt;ul&gt;
&lt;li&gt;Share a URL? adds it as a bookmark&lt;/li&gt;
&lt;li&gt;Share copied text? starts a post&lt;/li&gt;
&lt;li&gt;Share a photo/video? uploads it and starts a post (with the photo/video included). Maybe AI could generate alt text&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;the-stats&#34;&gt;The Stats&lt;/h4&gt;
&lt;p&gt;Lillihub had around 40 users login in the past three weeks.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2024/screenshot-2024-01-16-120007.png&#34; width=&#34;600&#34; height=&#34;609&#34; alt=&#34;&#34;&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;There is a whole new year out there waiting for me. I want to keep playing, keep crafting, and keep my family and friends close.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dev Diary 0011 - December 11th - 30th</title>
      <link>https://heyloura.com/2023/12/30/dev-diary-december.html</link>
      <pubDate>Sat, 30 Dec 2023 21:57:05 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/12/30/dev-diary-december.html</guid>
      <description>&lt;p&gt;This month has been rough. It started with an unusual diagnosis for my daughters injured knee, the stress of the holidays, and my mother-in-law going from a routine procedure to a transfer to a larger city hospital to a surgery that ended precariously with complications. She&amp;rsquo;s still with us but the future is unclear.&lt;/p&gt;
&lt;p&gt;I guess all of that is to say I wasn&amp;rsquo;t on the ball the last three weeks, but since coding is one way I handle stress I did managed to get a few things accomplished.&lt;/p&gt;
&lt;h2 id=&#34;lillihub&#34;&gt;Lillihub&lt;/h2&gt;
&lt;h3 id=&#34;timeline-marker&#34;&gt;Timeline Marker&lt;/h3&gt;
&lt;p&gt;I think the biggest thing I started was a timeline marker. It was both easier than I expected and harder. It is up in production, but not in its final form. I still have tweaks to do. Like most of what I do with Lillihub, progressive enhancement is the name of the game. I try to build every feature first without JavaScript and only when I need to do I sprinkle a little in.&lt;/p&gt;
&lt;h4 id=&#34;step-one-what-was-last-seen&#34;&gt;Step One: What was last seen?&lt;/h4&gt;
&lt;p&gt;I needed to keep track of the last thing a user saw was but since I wasn&amp;rsquo;t using JavaScript I decided to calculate it off of a page load. Right now at least 10 posts are loaded per page (and could be up to 30 depending). If it was the first page of the timeline or conversation view I record the timestamp of now and I grab the time that the user last visited (see the next section on saving).&lt;/p&gt;
&lt;p&gt;Then I take a look at every post and see what timestamp it has. All new? Don&amp;rsquo;t show the marker and check the next page if the user navigates to it. All with an earlier timestamp? Display &amp;ldquo;All caught up&amp;rdquo;. Otherwise just after the first of the earlier timestamp show the marker.&lt;/p&gt;
&lt;h4 id=&#34;step-two-save-it&#34;&gt;Step Two: Save it.&lt;/h4&gt;
&lt;p&gt;But how do I save it? My first instinct was a cookie. But that might be confusing if a user jumps from device to device since the data wouldn&amp;rsquo;t carry over. So then I need a backend of some sort.&lt;/p&gt;
&lt;p&gt;Luckily Deno recently released their key-value store and it was so simple to get it up and running. I do need to keep an eye on how often I&amp;rsquo;m reading and writing to it since there is a usage charge. Which is another bonus in the no JavaScript solution, the calls to the KV store only happen when the page is being streamed and not whenever the user interacts.&lt;/p&gt;
&lt;p&gt;It ends up looking something like this:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-from-2023-12-30-20-25-33.png&#34; alt=&#34;Screenshot of Deno KV for Lillihub&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id=&#34;step-three-name-it&#34;&gt;Step Three: Name it.&lt;/h4&gt;
&lt;p&gt;So in order to figure out what to name the marker I asked on the blog. I got some great feedback -&amp;gt; &lt;a href=&#34;https://heyloura.com/2023/12/21/im-working-on.html&#34;&gt;December 21, 2023 at 4:39 PM&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;step-four-fix-it&#34;&gt;Step Four: Fix it?&lt;/h4&gt;
&lt;p&gt;But does this method always work? Turns out&amp;hellip; no. Because not everything is processed right away&lt;sup&gt;*&lt;/sup&gt; by Micro.blog. Let&amp;rsquo;s say I visit my timeline at 10am and I see all the posts Micro.blog has added to the timeline at the point. Let&amp;rsquo;s say someone I&amp;rsquo;m following made a post at 9:59am but it hadn&amp;rsquo;t finished being processed by Micro.blog at 10am. So when I go back at 11am I have a marker at the 10am mark, but that 9:59am now appears below it and I haven&amp;rsquo;t seen it before.&lt;/p&gt;
&lt;p&gt;I still debating if I want to fix this. In order to do so I would need to sort what Micro.blog returns by post id&amp;hellip; and therefore break the strictly chronological order it returns. And I&amp;rsquo;m making an assumption that the ids are sequential (they look it at quick glance)&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;*&lt;/sup&gt; : This is my own best guess as to what&amp;rsquo;s happening. I could very well be mistaken.&lt;/p&gt;
&lt;h4 id=&#34;enhancements-im-considering&#34;&gt;Enhancements I&amp;rsquo;m considering&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Using JavaScript figure out the post that was just scrolled past and save that as the last seen.&lt;/li&gt;
&lt;li&gt;Fold in &amp;ldquo;Jump to last seen&amp;rdquo; functionality&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;december-18th-updates&#34;&gt;December 18th Updates&lt;/h3&gt;
&lt;p&gt;As I mentioned in this post: &lt;a href=&#34;https://heyloura.com/2023/12/18/a-lillihub-update.html&#34;&gt;December 18, 2023 at 4:45 PM&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conversations don&amp;rsquo;t repeat as you page&lt;/li&gt;
&lt;li&gt;Comments from people you follow are highlighted&lt;/li&gt;
&lt;li&gt;Photo page for a user now has a grid view&lt;/li&gt;
&lt;li&gt;Comment threads now have a collapse at the bottom&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The conversations piece, not repeating as you page, was similar to the timeline marker. I keep track of the root ids encountered while paging and now exclude them until the first page is revisted (which resets the array)&lt;/p&gt;
&lt;p&gt;The comment collaspe is all CSS. The nice fade and scroll up is done with JavaScript.&lt;/p&gt;
&lt;h3 id=&#34;other-odds-and-ends&#34;&gt;Other odds and ends&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The media page now lists the URL of the media item&lt;/li&gt;
&lt;li&gt;You can go back from a &amp;ldquo;view post&amp;rdquo; to the timeline/conversations page you came from. The link is at the bottom of the comment thread.&lt;/li&gt;
&lt;li&gt;Bug fix: Crossposting and having everything unchecked. Turns out I should have paid attention to this last line in the documentation: &lt;a href=&#34;https://help.micro.blog/t/micropub-cross-posting-and-syndicate-to/1579&#34;&gt;Micropub cross-posting and syndicate-to&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;favorite-lillihub-thing&#34;&gt;Favorite Lillihub thing?&lt;/h3&gt;
&lt;p&gt;The timeline marker works across devices. This opens up interesting possibilities.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dev Diary 0010 - Week of December 4th</title>
      <link>https://heyloura.com/2023/12/13/dev-diary-week.html</link>
      <pubDate>Wed, 13 Dec 2023 12:13:04 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/12/13/dev-diary-week.html</guid>
      <description>&lt;p&gt;This was a major work week. I&amp;rsquo;m trying to wrap up a couple more features and get in a few more bug fixes before I wrap up for the holidays.&lt;/p&gt;
&lt;p&gt;At work, I am doing a major rewrite of our application(s). This marks heading into year 3 of the project. I needed to redesign the UI and workflows. I rearchitected the database, mapped all the data that needed to transfer over and reimplemented all the business logic (and in many cases extended it).I needed to rewrite an API that supports both the old way, for compatibility, and the new way. Next up is making an android app, finishing touches on the web app and implementing all our custom reports. Then on to launch phase!&lt;/p&gt;
&lt;p&gt;This is by far the largest project I&amp;rsquo;ve ever tackled. I&amp;rsquo;ve had a few contractors come on here and there to help but the lions share has been just little old me. Yes this is a little braggy&amp;hellip; but since I work solo the only people I can really brag to are the people who read my blog. 😆&lt;/p&gt;
&lt;p&gt;Okay&amp;hellip; back to the regular updates.&lt;/p&gt;
&lt;h2 id=&#34;lillihub&#34;&gt;Lillihub&lt;/h2&gt;
&lt;p&gt;Lillihub got some attention on Friday. It had been almost two weeks since I glanced at it and wanted to knock out a couple improvements. So on Friday I spent about fours hours working on a couple of improvements and a bug fix.&lt;/p&gt;
&lt;h3 id=&#34;never-trust-data-from-a-client-side&#34;&gt;Never trust data from a client side&lt;/h3&gt;
&lt;p&gt;That phrase has been drilled into my brain for more years than I can count. So, Lillihub sanitizes all the HTML from posts before rendering it. To do so I used the Deno Library &lt;a href=&#34;https://deno.land/x/ammonia@0.3.1/mod.ts&#34;&gt;ammonia&lt;/a&gt; and everything looked great. Except it was stripping out video tags. Woops. But luckily you can tell ammonia to whitelist some attributes.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;
    const builder = new ammonia.AmmoniaBuilder();
    builder.tags.add(&#34;video&#34;);
    builder.tagAttributes.set(&#34;video&#34;, new Set([&#34;src&#34;,&#34;width&#34;,&#34;height&#34;,&#34;controls&#34;,&#34;poster&#34;]));
    const cleaner = builder.build();
    const cleaned = cleaner.clean(str);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and that fixed the videos not showing issue.&lt;/p&gt;
&lt;h3 id=&#34;toggle-the-dark-theme&#34;&gt;Toggle the dark theme&lt;/h3&gt;
&lt;p&gt;Next up was being able to turn on dark mode and have that override the system settings. There are plenty of articles that give some ideas on how to pull it off but this is what I did:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a spot in the UI, under &amp;ldquo;Settings&amp;rdquo;, where there is a checkbox to enable dark mode. I save the user&amp;rsquo;s preference in a cookie.&lt;/li&gt;
&lt;li&gt;Update the CSS to include &lt;code&gt;html:not(.style-scope)[dark]&lt;/code&gt; that sets all the CSS variable colors to the dark theme colors&lt;/li&gt;
&lt;li&gt;Add in an additional selector of &lt;code&gt;html:not(.style-scope)[dark]&lt;/code&gt; where I have my &lt;code&gt;@media (prefers-color-scheme: dark)&lt;/code&gt; media queries&lt;/li&gt;
&lt;li&gt;When rendering the HTML, check the cookie and if they want the dark theme, add to the HTML tag the dark attribute like so: &lt;code&gt;dark=&amp;quot;true&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;limit--of-replies-display-in-the-feeds&#34;&gt;Limit # of replies display in the feeds&lt;/h3&gt;
&lt;p&gt;There have been a couple of times over the last few weeks that Lillihub got really slow on the conversations page. Turns out that some people can have really lively discussions and have lots and lots of replies. After around 100 or so it gets really noticeable. So I decided to set a default limit of 25 that a user can override if they want to. This should also allow people with slower connections set a low limit and reduce the data Lillihub is trying to send over to the device.&lt;/p&gt;
&lt;p&gt;Unfortunately I haven&amp;rsquo;t spotted a way to limit the number of replies on a post coming back from the Micro.blog API. So I&amp;rsquo;m adding it to my mental wishlist 😂&lt;/p&gt;
&lt;p&gt;There wasn&amp;rsquo;t too much to this one. Just:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a spot in the UI, under &amp;ldquo;Settings&amp;rdquo;, where there is a number input to set the &amp;ldquo;Display comment limit&amp;rdquo;. I save the user&amp;rsquo;s preference in a cookie.&lt;/li&gt;
&lt;li&gt;After grabbing the post and when I start streaming the comments I check the limit and only output under that limit. &lt;a href=&#34;https://github.com/heyloura/lillihub-client/blob/main/main.js#L754&#34;&gt;See the code here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If I did truncate the comments, add a link to view the post, which still shows all comments.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;create-the-most-basic-pwa-possible&#34;&gt;Create the most basic PWA possible&lt;/h3&gt;
&lt;p&gt;At the very least I wanted a way to launch Lillihub in a full screen way but PWA&amp;rsquo;s also have some other features I may be interested in adding in down the road. Like some basic offline support on the &amp;ldquo;Create Post&amp;rdquo; page or geolocation or notifications&amp;hellip; 🤩&lt;/p&gt;
&lt;p&gt;But how to get started in the most barebones way&amp;hellip;&lt;/p&gt;
&lt;p&gt;By spending an hour and a half coloring in a little frog. Seriously&amp;hellip; isn&amp;rsquo;t it adorable? &lt;strong&gt;The drawing is from a black and white sketch my sister sent me and I&amp;rsquo;m using it with her permission.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/lillihub-512.png&#34; alt=&#34;Logo image of a cartoonish frog holding onto a Lilypad. The Lilypad has an orange flower in the center that has five petals. The frog is blue and purple and has a smiling face.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;With that outta the way it was time to get started.  I needed to offer up a &lt;code&gt;manifest.webmanifest&lt;/code&gt; which I used my middleware function to do:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;
        if(ctx.request.url.pathname == &#34;/manifest.webmanifest&#34;) {
            ctx.response.body = `{
                &#34;name&#34;: &#34;Lillihub&#34;,
                &#34;short_name&#34;: &#34;Lillihub&#34;,
                &#34;start_url&#34;: &#34;/app/timeline&#34;,
                &#34;display&#34;: &#34;standalone&#34;,
                &#34;theme_color&#34;: &#34;#000000&#34;,
                &#34;background_color&#34;:&#34;#000000&#34;,
                &#34;icons&#34;: [
                  {
                    &#34;src&#34;: &#34;lillihub-512.png&#34;,
                    &#34;sizes&#34;: &#34;512x512&#34;,
                    &#34;type&#34;: &#34;image/png&#34;,
                    &#34;purpose&#34;: &#34;any maskable&#34;
                  }]
              }`;
            ctx.response.type = &#34;text/json&#34;;
        } 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The service worker is as small as I could make it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;
            self.addEventListener(&#39;install&#39;, function(event) {
                event.waitUntil(self.skipWaiting());
            });
               
            self.addEventListener(&#39;fetch&#39;, function(event) {

            });
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then just tell the HTML head where things are&amp;hellip;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;
 &amp;lt;meta name=&#34;apple-mobile-web-app-capable&#34; content=&#34;yes&#34;&amp;gt;
 &amp;lt;link rel=&#34;icon&#34; type=&#34;image/x-icon&#34; href=&#34;https://heyloura.com/favicon.ico&#34;&amp;gt;
 &amp;lt;link rel=&#34;apple-touch-icon&#34; href=&#34;https://heyloura.com/lillihub-512.png&#34;&amp;gt;
 &amp;lt;meta name=&#34;apple-mobile-web-app-status-bar-style&#34; content=&#34;black&#34;&amp;gt;
 &amp;lt;meta name=&#34;theme-color&#34; content=&#34;#000000&#34;&amp;gt;
 &amp;lt;meta name=&#34;apple-mobile-web-app-title&#34; content=&#34;Lillihub&#34;&amp;gt;
 &amp;lt;link rel=&#34;manifest&#34; href=&#34;https://heyloura.com/manifest.webmanifest&#34;&amp;gt;
 &amp;lt;script&amp;gt;if(&#39;serviceWorker&#39; in navigator){ navigator.serviceWorker.register(&#39;/sw.js&#39;) &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;wrap-up&#34;&gt;Wrap Up&lt;/h3&gt;
&lt;p&gt;So that was my week basically. I&amp;rsquo;m excited to get a little more work into Lillihub. Next week is the one month mark of making it public and I want to get a couple of things released for it in the next two weeks before I take a holiday break.&lt;/p&gt;
&lt;p&gt;Until next time,
Loura 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My App Defaults</title>
      <link>https://heyloura.com/2023/12/07/my-app-defaults.html</link>
      <pubDate>Thu, 07 Dec 2023 17:49:16 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/12/07/my-app-defaults.html</guid>
      <description>&lt;p&gt;Guess I&amp;rsquo;ll join in the &lt;a href=&#34;https://defaults.rknight.me/&#34;&gt;Duel of the Defaults&lt;/a&gt; 😄 I&amp;rsquo;ve held off since it seemed that most people were iOS users and I&amp;rsquo;m a Windows/Linux gal. But so many others have joined in and the list was fun to put together.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📧 Email Client: HEY&lt;/li&gt;
&lt;li&gt;🕸️ Website: Micro.blog &amp;amp; Namecheap&lt;/li&gt;
&lt;li&gt;📝✅ Notes + Todos: Tiddlywiki via Tiddlyhost.com&lt;/li&gt;
&lt;li&gt;📸 Photo Management: Amazon Photos&lt;/li&gt;
&lt;li&gt;🗓️ Calendar: Outlook&lt;/li&gt;
&lt;li&gt;🎁 Cloud file storage: Onedrive&lt;/li&gt;
&lt;li&gt;👽 Contacts: The standard Android app&lt;/li&gt;
&lt;li&gt;🌐 Browser: Brave (desktop) &amp;amp; Kiwi (Android)&lt;/li&gt;
&lt;li&gt;💬 Chat: The standard Android app&lt;/li&gt;
&lt;li&gt;🔖 Bookmarks: Micro.blog&lt;/li&gt;
&lt;li&gt;💵 Budgeting &amp;amp; Personal Finance: Fudget2&lt;/li&gt;
&lt;li&gt;📰 News: Allsides&lt;/li&gt;
&lt;li&gt;🔐 Password Management: Lastpass&lt;/li&gt;
&lt;li&gt;🎨 Photo Editing: Paint.Net&lt;/li&gt;
&lt;li&gt;👩‍💻 Code Editor: Visual Studio Code or Visual Studio&lt;/li&gt;
&lt;li&gt;📚 Books: Audible (audio) + physical copy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://micro.blog/robb@social.lol&#34;&gt;@robb@social.lol&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dev Diary 0009 - Week of November 27th</title>
      <link>https://heyloura.com/2023/12/04/dev-diary-week.html</link>
      <pubDate>Mon, 04 Dec 2023 16:52:17 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/12/04/dev-diary-week.html</guid>
      <description>&lt;p&gt;This week I spent most of my time playing around with my blog theme. I realized I&amp;rsquo;ve been using Micro.blog for over a year now and I wanted to make some fixes to my blog theme.&lt;/p&gt;
&lt;h2 id=&#34;step-one-group-by-year&#34;&gt;Step one: group by year&lt;/h2&gt;
&lt;p&gt;There are several places in my blog that I wanted to group things by year. Photos being the main one, but also category pages and the archive.&lt;/p&gt;
&lt;p&gt;Luckily Hugo has a way to easily &lt;a href=&#34;https://gohugo.io/methods/pages/groupbydate/&#34;&gt;group a page collection by date&lt;/a&gt;. Here is a simplified version of my archive page. Note the &lt;code&gt;.Key&lt;/code&gt; contains the date in the format specified by &lt;code&gt;GroupByDate&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;
{{ range (where .Site.Pages &#34;Type&#34; &#34;post&#34;).GroupByDate &#34;2006&#34; }}
&amp;lt;h2 id=&#34;{{ .Key }}&#34;&amp;gt;{{ .Key }}&amp;lt;/h2&amp;gt;
  {{ range .Pages }}
		&amp;lt;article class=&#34;h-entry&#34;&amp;gt;
			&amp;lt;a href=&#34;{{ .Permalink }}&#34; class=&#34;u-url&#34;&amp;gt;&amp;lt;span class=&#34;dt-published&#34; datetime=&#34;{{ .Date.Format &#34;2006-01-02T15:04:05-0700&#34; }}&#34;&amp;gt;{{ .Date.Format &#34;2006-01-02&#34; }}&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;:
			&amp;lt;span class=&#34;p-name&#34;&amp;gt;&amp;lt;b&amp;gt;{{ .Title }}&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;
			&amp;lt;span class=&#34;p-summary&#34;&amp;gt;{{ .Summary | truncate 100 }}&amp;lt;/span&amp;gt;
		&amp;lt;/article&amp;gt;
  {{ end }}
{{ end }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I did something similar for the photo page as well using&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;
{{ range (where .Site.Pages &#34;.Params.photos&#34; &#34;!=&#34; nil ).GroupByDate &#34;2006&#34; }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I also added some anchor links at the top of my website so you can easily jump down the page to the year you want to see.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-12-04-132844.png&#34; alt=&#34;Screenshot of my RPG blog theme that shows an orange at the top with the year 2023 and 2022 as links.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&#34;step-two-rpg-stats&#34;&gt;Step Two: RPG Stats&lt;/h2&gt;
&lt;p&gt;What&amp;rsquo;s an RPG themed blog with out some stats? Wouldn&amp;rsquo;t it be cool if those stats updated as I posted? I checked out the &lt;a href=&#34;https://micro.blog/account/plugins/view/22&#34;&gt;stats plugin&lt;/a&gt; by &lt;a href=&#34;https://micro.blog/amit&#34;&gt;@amit&lt;/a&gt; and decided that my health bar would be based off my long posts, my mana bar off of short posts, stamina off of average length versus longest post and finally experience off of total number of words. You can check out his code here &lt;a href=&#34;https://github.com/am1t/plugin-post-stats/blob/main/layouts/shortcodes/poststats/detailed.html&#34;&gt;plugin-post-stats/layouts/shortcodes/poststats/detailed.html at main · am1t/plugin-post-stats (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In short I used the his method to get the numbers of the different types of posts&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{{ $posts := where site.RegularPages &#34;Type&#34; &#34;post&#34; }}
{{ $microPostsCount := float ( len ( where $posts &#34;.Params.title&#34;  &#34;=&#34; nil )) }}
{{ $titlePostsCount := float ( len ( where $posts &#34;.Params.title&#34;  &#34;!=&#34; nil )) }}

{{ $scratch := newScratch }}
{{ $scratch.Set &#34;longCount&#34; 0 }}
{{ range $posts }}
    {{ $scratch.Add &#34;wordcount&#34; .WordCount }}
	{{ if ge .WordCount ($scratch.Get &#34;longCount&#34;) }}
		{{ $scratch.Set &#34;longestPost&#34; . }}
		{{ $scratch.Set &#34;longCount&#34; .WordCount }}
	{{ end }}
{{ end }}
{{ $postCount :=  len ($posts) }}
{{ $wordCount := $scratch.Get &#34;wordcount&#34; }}
{{ $maxWordCount := $scratch.Get &#34;longestPost&#34; }}
{{ $avgPostLength := float (div $wordCount $postCount) }}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then I display those in various ways above my bars. Next I needed to fill the bars and to do that division without Hugo just spitting out zeros I needed to add the &lt;code&gt;float&lt;/code&gt;.  Here is the code for one of the bars and &lt;a href=&#34;https://paste.lol/loura/micro-blog-custom-stats-display&#34;&gt;here you can view my code for all the bars.&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&#34;bar&#34;&amp;gt;
  &amp;lt;label&amp;gt;Mana: {{ $microPostsCount }}/{{ math.Add $titlePostsCount $microPostsCount}}&amp;lt;/label&amp;gt;
  &amp;lt;small&amp;gt;Micro Posts&amp;lt;/small&amp;gt;
  &amp;lt;div class=&#34;rpgui-progress blue&#34; data-rpguitype=&#34;progress&#34;&amp;gt;
    &amp;lt;div class=&#34; rpgui-progress-track&#34;&amp;gt;
      &amp;lt;div class=&#34; rpgui-progress-fill blue&#34; style=&#34;width: {{math.Mul 100 (math.Div $microPostsCount (math.Add $titlePostsCount $microPostsCount))}}%;&#34;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&#34; rpgui-progress-left-edge&#34;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&#34; rpgui-progress-right-edge&#34;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So now I have stats that update as I post to my blog. Pretty neat!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-12-04-153327.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;My character level is based off of how many years I&amp;rsquo;ve been blogging. The code is pretty similar to the group by year above, except I just get the number of years in the collection as a count and display it. Include the following in double braces: &lt;code&gt;len ((where .Site.Pages &amp;quot;Type&amp;quot; &amp;quot;post&amp;quot;).GroupByDate &amp;quot;2006&amp;quot; )&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-12-04-153535.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&#34;further-thoughts&#34;&gt;Further thoughts&lt;/h3&gt;
&lt;p&gt;I think it would be cool to make my own rpg themed plugin for Micro.blog that other people could add to their site. Then maybe make a webring so people could browse the Micro.blog &amp;ldquo;characters&amp;rdquo; 😆🤔&lt;/p&gt;
&lt;p&gt;It would also be cool to have the experience target update automatically and have fun taglines that I could put under my level.&lt;/p&gt;
&lt;h2 id=&#34;step-three-link-to--lillihub&#34;&gt;Step Three: Link to 🐸 Lillihub&lt;/h2&gt;
&lt;p&gt;The final piece was adding a link to Lillihub as an option for comments. Clicking the link, assuming you are logged in, will take you right to the post with all the comments loaded and visible.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-12-04-154009.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dev Diary 008 - Week of November 20th</title>
      <link>https://heyloura.com/2023/11/27/dev-diary-week.html</link>
      <pubDate>Mon, 27 Nov 2023 14:02:57 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/11/27/dev-diary-week.html</guid>
      <description>&lt;div class=&#34;trix-content&#34;&gt;
  &lt;div&gt;Whew... These last couple of months have been rough. This update is pretty short. I hosted Thanksgiving at my house this year so I wrapped up most dev related items by Wednesday.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Lillihub &lt;br&gt;&lt;br&gt;&lt;/strong&gt;I put out an update before signing off on Wednesday. It included some small fixes and photo swiping on a desktop screen as well. As I mentioned last week I used a web component library from &lt;a href=&#34;https://shoelace.style/components/carousel&#34;&gt;shoelace.style&lt;/a&gt; to pull it off. One issue I ran into was that the component didn&#39;t render until the DOMContentLoaded event fired. As I mentioned before somewhere, I think, is that Lillihub doesn&#39;t actually fire that event until everything is streamed over from the server. Which takes ages 😆. This was a big tradeoff I took to make make everything work without JavaScript. So the images would display stacked and then snap into the carousel about 20 seconds later....&lt;br&gt;&lt;br&gt;Anyway, the fix was actually pretty simple. I needed to run the shoelace component code first and since it was of type=&#34;module&#34; you need to add the &#34;async&#34; to the script tag. By putting that in the head, Lillihub starts getting the script and executing is as soon as it can. So it actually renders the components as they are streamed. Pretty neat. 🦄 No JavaScript? No problem, the images just stayed stacked.  &lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;&amp;lt;script async type=&#34;module&#34; src=&#34;https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.11.2/cdn/components/carousel/carousel.js&#34;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;br&gt;One of my next action steps on this project is to bundle up the three components I&#39;m using into Lillihub and stop relying on the CDN. This is made much harder because of their use of import maps and my resistance to use a bundler. (Yes there are a lot of benefits... but I do miss the days of grabbing a single .js file, and license, and plopping it into a directory)&lt;br&gt;&lt;br&gt;I also haven&#39;t really come across too many instances where pulling the images into a carousel breaks things. By break I mean that it doesn&#39;t look right, maybe extra white space or two image dots when there is only one image. Since micro.blog pulls in blog posts via RSS, there is no standard format that post + images come over. Even among blogs hosted at micro.blog since themes can be customized. So I made a best guess and added in my own markup to the incoming post. &lt;br&gt;&lt;br&gt;The code itself is pretty straight forward and &lt;a href=&#34;https://github.com/heyloura/lillihub-client/blob/90d9276d1265bdf1885c37ef154b4425c647f379/main.js#L190&#34;&gt;you can see it here&lt;/a&gt;. I find out if a post has images and then iterate through them creating the web component and then removing the original image from the DOM. For those I follow on Micro.blog this works out pretty well. There is one person who&#39;s content has malformed paragraph tags with images and those display with too much whitespace. Then the Micro.blog CDN occasionally returns blank 1x1 pixel images. But overall it works and looks great. Plus no one has emailed to complain. &lt;br&gt;&lt;br&gt;&lt;strong&gt;Other Dev Adjacent Things - Tiddlywiki&lt;/strong&gt;&lt;br&gt;&lt;br&gt;So I did begin work on a little tiddlywiki clone. But then fell back in love with Tiddlywiki when I was exploring the UI and code. I may have grabbed a tiddlyhost.com site 😆&lt;br&gt;&lt;br&gt;  &lt;figure class=&#34;attachment attachment--preview attachment--lightboxable attachment--png&#34;&gt;
      &lt;a download=&#34;image.png&#34; title=&#34;Download image.png&#34; data-click-proxy-target=&#34;lightbox_link_blob_1450412634&#34; href=&#34;https://world.hey.com/loura/9fee0974/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2RhaW5OVyIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--8da9b280cb7315fea88b6d5c89c5ef6db3ce0e2b/image.png?disposition=attachment&#34;&gt;
        &lt;img src=&#34;https://world.hey.com/loura/9fee0974/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2RhaW5OVyIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--8da9b280cb7315fea88b6d5c89c5ef6db3ce0e2b/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--946116ea0c454412635aa7309bd9472bf633014c/image.png&#34; alt=&#34;image.png&#34; srcset=&#34;https://world.hey.com/loura/9fee0974/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2RhaW5OVyIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--8da9b280cb7315fea88b6d5c89c5ef6db3ce0e2b/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUQya0NBQW82REhGMVlXeHBkSGxwUVRvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--8c0bbbd8bfe72a73b222ec1c20265f8631973dc9/image.png 2x, https://world.hey.com/loura/9fee0974/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2RhaW5OVyIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--8da9b280cb7315fea88b6d5c89c5ef6db3ce0e2b/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUZta0NBQTg2REhGMVlXeHBkSGxwUERvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--d2fed6b5089e475a3013538949ec7f311ac6e345/image.png 3x&#34; decoding=&#34;async&#34; loading=&#34;lazy&#34;&gt;
&lt;/a&gt;
  &lt;/figure&gt;&lt;br&gt;&lt;br&gt;I did customize it a bit. I&#39;m using these plugins:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;https://feathericonset.tiddlyhost.com/&#34;&gt;https://feathericonset.tiddlyhost.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#34;https://kookma.github.io/TW-Shiraz/&#34;&gt;https://kookma.github.io/TW-Shiraz/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#34;https://tgrosinger.github.io/tw5-checklist/&#34;&gt;https://tgrosinger.github.io/tw5-checklist/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;and the theme, &lt;a href=&#34;https://crazko.github.io/krystal/&#34;&gt;Krystal&lt;/a&gt;. The theme was a little broken for my version of Tiddlywiki so I added the &lt;a href=&#34;https://loura.paste.lol/tiddlywiki-custom-css-krystal-theme&#34;&gt;following css&lt;/a&gt; and fix things up a bit.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Other Dev Adjacent Things - File Management&lt;br&gt;&lt;br&gt;&lt;/strong&gt;Another project I began tackling was my personal file management. Over the years I&#39;ve tried various cloud services and some knowledge management systems. Which made everything a mess. So it&#39;s time to clean it all up before the new year. I was inspired by this post about &lt;a href=&#34;https://ianlhayes.com/2023/11/11/slaying-the-dragon/&#34;&gt;Slaying the Obsidian Dragon&lt;/a&gt; and this one that is linked to about &lt;a href=&#34;https://dougist.com/2009/08/file-system-infobase-manager/&#34;&gt;File System Infobase Manager&lt;/a&gt; and got started. &lt;br&gt;&lt;br&gt;I&#39;m migrating everything to my main Linux computer and I&#39;m using the following naming convention for my files: &#34;key1-20231127-descriptive-file-name&#34;. The &#34;key1&#34; is both the category and subcategory that the file belongs in. For example I have a category &#34;kids&#34;. &#34;kids2&#34; is all public school related information. &#34;kids3&#34; is all summer camp related information. So the public school calendar for my daughter was renamed to &#34;kids2-20230906-school-year-calendar-23-24.pdf&#34;. The second part of the file name is the file creation date. Then I&#39;m just plopping all the files in one big directory.&lt;br&gt;&lt;br&gt;I also have on master text file at the top that lists all the categories and subcategories. This is working really well for single files. I&#39;m still figuring out how I want directories of files to be organized (or removed) and if I want to do something similar for my images/videos.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Other Dev Adjacent Things - Learning Rust&lt;/strong&gt;&lt;br&gt;&lt;br&gt;I made a little time at the end of the week to play around with Rust. I like it! I&#39;ve done a few small examples in it and now I want to dig into it a bit more with a small project after I finish the Rust book. I think I&#39;m going to combine it with my want to code my own web browser. So I spent time gathering up resources, checking out posts from other brave souls, and I&#39;m ready to start thinking a bit more deeply on it.&lt;br&gt;&lt;br&gt;I also came across this interesting video while hunting, great food for thought: &lt;a href=&#34;https://www.youtube.com/watch?v=f84n5oFoZBc&#34;&gt;Hammock Driven Development - Rich Hickey&lt;/a&gt;&lt;br&gt;&lt;br&gt;I&#39;m not interested in building the functionality around HTTP or parsing the DOM/CSS, so I&#39;ll probably just use premade libraries for that. I am interesting in (descending order of interest): Protecting the user (trackers, bad JS actors), making discovery easier/safer (it&#39;s a web after all, RSS?), helping the user keep track of things (bookmarks? tags?), user defined styles, math behind CSS box models. That&#39;s not to say this project will tackle all, or any, of those. I&#39;m also not interested in just taking one of the standard browsers and trying to copy it. I want to make something a little different, even if I&#39;m the only one who will use it 😁&lt;br&gt;&lt;br&gt;&lt;br&gt;Okay, one day when I say my update is short... I&#39;ll mean it. I just kinda zone out when writing these updates and the next thing I know they are super long. 🤷‍♀️&lt;br&gt;&lt;br&gt;Anyway, until next week,&lt;br&gt;Loura&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt; &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Dev Diary 007 - Week of November 13th</title>
      <link>https://heyloura.com/2023/11/21/dev-diary-week.html</link>
      <pubDate>Tue, 21 Nov 2023 19:23:50 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/11/21/dev-diary-week.html</guid>
      <description>&lt;div class=&#34;trix-content&#34;&gt;
  &lt;div&gt;Remember how I said, everything back to normal? That lasted all of Monday morning. Then I got the call from school that my daughter hurt her knee... getting a pencil. We are still running around trying to figure it out (Whew, thankfully it&#39;s not Lyme disease). Then my son messed up his orthodontics... We are still running around trying to get appointments to get it fixed. Then my neck seized up from the stress of it all.  &lt;br&gt;&lt;br&gt;So yeah, I got stuff done, this write up is gonna be short, I&#39;m going to go do some Tai Chi to re-center. &lt;br&gt;&lt;br&gt;&lt;strong&gt;Work Work&lt;/strong&gt;&lt;br&gt;A major framework update needs to be applied to the codebase. Over 3000 changes, thankfully most auto-merged but I have about 230 to review manually. My life at work is a never-ending scroll of code commit diffs.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Lillihub&lt;/strong&gt;&lt;br&gt;I released it! Yay! 🥳&lt;br&gt;&lt;br&gt;And it didn&#39;t crash into a million little pieces as people began to check it out. 🙌&lt;br&gt;&lt;br&gt;I really appreciate everyone who helped me beta test, gave me feedback, or left a nice comment. As I said, this week was tough and it helped lighten my mood on Friday seeing people enjoy it.&lt;br&gt;&lt;br&gt;Before I launched, I added tinylytics to the public landing page and the login page to get a since at how many people are checking it out and what device/browser they are using. Not everyone who visits the landing page is going to login, and you only need to login once every two weeks. The stats are public and you can check them out here: &lt;a href=&#34;https://tinylytics.app/public/jSQ4JedtXXFRw9qfRrny&#34;&gt;Lillihub | Stats page | tinylytics&lt;/a&gt;&lt;br&gt;&lt;br&gt;  &lt;figure class=&#34;attachment attachment--preview attachment--lightboxable attachment--png&#34;&gt;
      &lt;a download=&#34;image.png&#34; title=&#34;Download image.png&#34; data-click-proxy-target=&#34;lightbox_link_blob_1442475187&#34; href=&#34;https://world.hey.com/loura/5d2eb356/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2V6YlBwViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--80f6c66bd8441bc5ccef3d87981c945b77db4b6f/image.png?disposition=attachment&#34;&gt;
        &lt;img src=&#34;https://world.hey.com/loura/5d2eb356/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2V6YlBwViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--80f6c66bd8441bc5ccef3d87981c945b77db4b6f/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--946116ea0c454412635aa7309bd9472bf633014c/image.png&#34; alt=&#34;image.png&#34; srcset=&#34;https://world.hey.com/loura/5d2eb356/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2V6YlBwViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--80f6c66bd8441bc5ccef3d87981c945b77db4b6f/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUQya0NBQW82REhGMVlXeHBkSGxwUVRvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--8c0bbbd8bfe72a73b222ec1c20265f8631973dc9/image.png 2x, https://world.hey.com/loura/5d2eb356/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2V6YlBwViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--80f6c66bd8441bc5ccef3d87981c945b77db4b6f/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUZta0NBQTg2REhGMVlXeHBkSGxwUERvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--d2fed6b5089e475a3013538949ec7f311ac6e345/image.png 3x&#34; decoding=&#34;async&#34; loading=&#34;lazy&#34;&gt;
&lt;/a&gt;
  &lt;/figure&gt;&lt;br&gt;&lt;br&gt;Next we can take a look at the number of requests. Right now Lillihib is running on the free Deno Deploy plan and I took great care when writing the app to make as few requests as possible on the client to Deno Deploy (though I make plenty to the Micro.blog API). When I announced Lillihub on Friday it peaked at around 2.5K requests for the day. Now it&#39;s hovering around 1K per day.&lt;br&gt;&lt;br&gt;  &lt;figure class=&#34;attachment attachment--preview attachment--lightboxable attachment--png&#34;&gt;
      &lt;a download=&#34;image.png&#34; title=&#34;Download image.png&#34; data-click-proxy-target=&#34;lightbox_link_blob_1442485493&#34; href=&#34;https://world.hey.com/loura/5d2eb356/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2YxbFBwViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--6497255b42591a045a80ac70044a1c6030a3e1f7/image.png?disposition=attachment&#34;&gt;
        &lt;img src=&#34;https://world.hey.com/loura/5d2eb356/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2YxbFBwViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--6497255b42591a045a80ac70044a1c6030a3e1f7/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--946116ea0c454412635aa7309bd9472bf633014c/image.png&#34; alt=&#34;image.png&#34; srcset=&#34;https://world.hey.com/loura/5d2eb356/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2YxbFBwViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--6497255b42591a045a80ac70044a1c6030a3e1f7/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUQya0NBQW82REhGMVlXeHBkSGxwUVRvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--8c0bbbd8bfe72a73b222ec1c20265f8631973dc9/image.png 2x, https://world.hey.com/loura/5d2eb356/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2YxbFBwViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--6497255b42591a045a80ac70044a1c6030a3e1f7/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUZta0NBQTg2REhGMVlXeHBkSGxwUERvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--d2fed6b5089e475a3013538949ec7f311ac6e345/image.png 3x&#34; decoding=&#34;async&#34; loading=&#34;lazy&#34;&gt;
&lt;/a&gt;
  &lt;/figure&gt;&lt;br&gt;&lt;br&gt;Which is fantastic! Plus the error logs look pretty good. Only a handful of &amp;quot;Bad Requests&amp;quot; I need to hunt down.&lt;br&gt;&lt;br&gt;I also wrapped up a little more dev work as well. A little &lt;strong&gt;sneak peak&lt;/strong&gt; before I update Lillihub later this week, you can now swipe photos on the desktop view 📷 &lt;strong&gt;😆&lt;/strong&gt;&lt;br&gt;&lt;br&gt;  &lt;figure class=&#34;attachment attachment--preview attachment--lightboxable attachment--png&#34;&gt;
      &lt;a download=&#34;image.png&#34; title=&#34;Download image.png&#34; data-click-proxy-target=&#34;lightbox_link_blob_1442507936&#34; href=&#34;https://world.hey.com/loura/5d2eb356/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2VnN1BwViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--3ec37eb41501c7b3b7eae85be221a1f0c9244ad3/image.png?disposition=attachment&#34;&gt;
        &lt;img src=&#34;https://world.hey.com/loura/5d2eb356/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2VnN1BwViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--3ec37eb41501c7b3b7eae85be221a1f0c9244ad3/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--946116ea0c454412635aa7309bd9472bf633014c/image.png&#34; alt=&#34;image.png&#34; srcset=&#34;https://world.hey.com/loura/5d2eb356/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2VnN1BwViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--3ec37eb41501c7b3b7eae85be221a1f0c9244ad3/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUQya0NBQW82REhGMVlXeHBkSGxwUVRvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--8c0bbbd8bfe72a73b222ec1c20265f8631973dc9/image.png 2x, https://world.hey.com/loura/5d2eb356/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2VnN1BwViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--3ec37eb41501c7b3b7eae85be221a1f0c9244ad3/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUZta0NBQTg2REhGMVlXeHBkSGxwUERvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--d2fed6b5089e475a3013538949ec7f311ac6e345/image.png 3x&#34; decoding=&#34;async&#34; loading=&#34;lazy&#34;&gt;
&lt;/a&gt;
  &lt;/figure&gt;&lt;br&gt;&lt;br&gt;I decided to use a web component, &lt;a href=&#34;https://shoelace.style/components/carousel&#34;&gt;https://shoelace.style/components/carousel&lt;/a&gt;, for the photo-swipe. I degrades gracefully for those without JavaScript, because JavaScript free is 100% supported by Lillihub. It simply defaults to what it always had... stacked photos. &lt;br&gt;&lt;br&gt;Also included:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Post titles, when they exist, to the &amp;quot;My Blog&amp;quot; -&amp;gt; &amp;quot;Posts&amp;quot; area. &lt;/li&gt;&lt;li&gt;Better date display (when JavaScript enabled) otherwise it defaults to the format Micro.blog returns&lt;/li&gt;&lt;li&gt;Tagmoji list on the &amp;quot;New Post&amp;quot; page. That way you don&#39;t have to guess what the tag emoji is...&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;&lt;strong&gt;Personal Blog&lt;/strong&gt;&lt;br&gt;Thanks to my new-to-me, MacBook Pro from 2019, I was able to track down the issue with my Rainbow Road blog design and fix it. I&#39;m a little bummed that it was because Safari and Firefox on iOS have issues with using &lt;em&gt;image-rendering: pixelated; &lt;/em&gt;on &lt;em&gt;border-image-slice. &lt;/em&gt;Which made me change how I structured the page to get the border to display nicely. I really wish browsers were more consistent.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Okay, that&#39;s enough for now 😄&lt;br&gt;Until next time,&lt;br&gt;Loura &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Dev Diary 006 - Week of November 6th</title>
      <link>https://heyloura.com/2023/11/14/dev-diary-week.html</link>
      <pubDate>Tue, 14 Nov 2023 22:12:14 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/11/14/dev-diary-week.html</guid>
      <description>&lt;div class=&#34;trix-content&#34;&gt;
  &lt;div&gt;This week was back to pretty much normal now that everyone is over their colds and now that my wisdom tooth is gone 😄&lt;br&gt;&lt;br&gt;&lt;strong&gt;General Development&lt;/strong&gt;&lt;br&gt;&lt;br&gt;So far this year I&#39;ve tried a handful of ways to track my tasks. Both physical copies inside of journals and on post-it-notes. A couple of apps too, like Notion or Zoho Notes. Still haven&#39;t found a system that sticks around for more than a few months. So on a whim I did some searching and came across:&lt;br&gt; &lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;https://jamesclear.com/ivy-lee&#34;&gt;The Ivy Lee Method: The Daily Routine for Peak Productivity (jamesclear.com)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=MKNTftOmxeU&#34;&gt;My Favourite Bullet Journal Hack 💜 The Alastair Method - YouTube&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;Which made me want to switch back to paper for now. Then my mind jumped over to difference to tracking my knowledge versus my tasks. I tend to mix the two together and then have my little nuggets of knowledge get mixed up with unfinished tasks or tasks, infused with knowledge, discarded when done. I find this most often occurs with my development work. Which circled me over to one of my familiar topics that I revisit every couple of years. Creating a personal wiki. And whenever I think wiki, I think &lt;a href=&#34;https://tiddlywiki.com/&#34;&gt;TiddlyWiki&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Turns out I&#39;m not the only one who thought of maybe hosting one on Micro.blog&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;https://help.micro.blog/t/hosting-my-wiki-on-mb/1681&#34;&gt;Hosting my wiki on MB...? - Hosting on Micro.blog - Micro.blog Help Center&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;I came across this video next. A little meandering but I really enjoyed it.&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=Uv1UfLPK7_Q&#34;&gt;Joe Armstrong &amp; Jeremy Ruston - Intertwingling the Tiddlywiki with Erlang | Code Mesh LDN 18 - YouTube&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;Now that video brought up a term that I hadn&#39;t heard in a long time: Quine. A quine is a computer program which takes no input and produces a copy of its own source code as its only output. Which took me back to my first foray into learning about the indieweb and thinking I might like to start a blog. I built a little self-saving HTML engine back then. The code isn&#39;t the best, but it worked.&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;https://github.com/heyloura/stunning-indie-web/tree/main&#34;&gt;GitHub - heyloura/stunning-indie-web: Trying out a concept to create a indie web blog engine&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;I wonder if I could code my own little TiddlyWiki clone and make a little personal knowledge management system out of it. Hmmm 🤔&lt;br&gt;&lt;br&gt;Which meant I almost immediately started a little local project to see if I could get something simple up and running. I&#39;m making use of:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;https://github.com/showdownjs/showdown&#34;&gt;showdownjs/showdown: A bidirectional Markdown to HTML to Markdown converter written in Javascript (github.com)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#34;https://shoelace.style/&#34;&gt;https://shoelace.style/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;It&#39;s still rather undefined at this stage. I want it to be a quine like TiddlyWiki, because that seems like a fun concept. I want to use web components to get a bit more familiar with them. I want to be able to tag notes and support backlinks. I&#39;ll share more as I play around and build things out.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Hexcrawls and Dungeon Crawl Classics&lt;/strong&gt;&lt;br&gt;&lt;br&gt;I&#39;m running the players through &lt;a href=&#34;https://shop.swordfishislands.com/the-dark-of-hot-springs-island/&#34;&gt;The Dark of Hot Springs Island&lt;/a&gt;, which is a hexcrawl. It&#39;s basically a play style where you have a map, a bunch of random tables, and then you piece together what happens while the players explore. This particular one has tons of tables, plus a dash of objectionable content I want to filter out. So I wanted to see what was out there to make this as easy as I could to run. &lt;br&gt;&lt;br&gt;I found this neat little program called &lt;a href=&#34;https://campaignwiki.org/hex-describe&#34;&gt;Hexdescribe&lt;/a&gt; where you can describe the map and create a bunch of random tables to apply to the areas on the map. The &lt;a href=&#34;https://campaignwiki.org/hex-describe/help&#34;&gt;syntax &lt;/a&gt;to build these out it pretty simple and powerful. The map I came up with is this:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;text font-family=&#34;monospace&#34; font-size=&#34;1px&#34;
0103 ocean
0104 ocean
0106 ocean
0107 ocean
0202 ocean
0203 dark-green village &#34;HS-01&#34;
0204 ocean
0205 ocean
0206 dark-green trees &#34;HS-14&#34; 
0207 ocean
0302 ocean
0303 dark-green trees &#34;HS-02&#34;
0304 dark-green trees &#34;HS-05&#34;
0305 dark-green forest-mountains &#34;HS-09&#34;
0306 dark-soil mountains &#34;HS-15&#34;
0307 dark-green keep &#34;HS-19&#34;
0308 ocean
0401 ocean
0402 dark-green trees &#34;HS-03&#34;
0403 dark-soil mountains &#34;HS-06&#34;
0404 dark-green forest-mountains &#34;HS-10&#34;
0405 dark-green forest-mountains &#34;HS-16&#34;
0406 dark-green trees &#34;HS-20&#34; 
0407 dark-green trees &#34;HS-23&#34;
0408 ocean
0501 ocean
0502 dark-green village &#34;HS-04&#34;
0503 dark-green trees &#34;HS-07&#34;
0504 rock &#34;HS-11&#34;
0505 dark-green forest-mountains &#34;HS-17&#34;
0506 dark-green forest-mountains &#34;HS-21&#34;
0507 dark-green trees &#34;HS-24&#34;
0508 ocean
0601 ocean
0602 dark-green trees &#34;HS-08&#34;
0603 dark-green forest-mountains &#34;HS-12&#34;
0604 rock &#34;HS-18&#34;
0605 dark-green forest-mountains &#34;HS-22&#34;
0606 dark-green forest-mountains &#34;HS-25&#34;
0607 ocean
0702 ocean
0703 dark-green trees &#34;HS-13&#34;
0704 ocean
0705 ocean
0706 ocean
0707 ocean
0802 ocean
0803 ocean
include gnomeyland.txt&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;br&gt;Which displays the island the adventure takes place. Though I did need to tilt it to make the hexes line up.&lt;br&gt;  &lt;figure class=&#34;attachment attachment--preview attachment--lightboxable attachment--png&#34;&gt;
      &lt;a download=&#34;image.png&#34; title=&#34;Download image.png&#34; data-click-proxy-target=&#34;lightbox_link_blob_1433475431&#34; href=&#34;https://world.hey.com/loura/2b28d0ac/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2RuR1hGViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--987a6c9816edfa13a97e445ddace7e16882b1bca/image.png?disposition=attachment&#34;&gt;
        &lt;img src=&#34;https://world.hey.com/loura/2b28d0ac/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2RuR1hGViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--987a6c9816edfa13a97e445ddace7e16882b1bca/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--946116ea0c454412635aa7309bd9472bf633014c/image.png&#34; alt=&#34;image.png&#34; srcset=&#34;https://world.hey.com/loura/2b28d0ac/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2RuR1hGViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--987a6c9816edfa13a97e445ddace7e16882b1bca/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUQya0NBQW82REhGMVlXeHBkSGxwUVRvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--8c0bbbd8bfe72a73b222ec1c20265f8631973dc9/image.png 2x, https://world.hey.com/loura/2b28d0ac/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2RuR1hGViIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--987a6c9816edfa13a97e445ddace7e16882b1bca/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUZta0NBQTg2REhGMVlXeHBkSGxwUERvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--d2fed6b5089e475a3013538949ec7f311ac6e345/image.png 3x&#34; decoding=&#34;async&#34; loading=&#34;lazy&#34;&gt;
&lt;/a&gt;
  &lt;/figure&gt;&lt;br&gt;&lt;br&gt;The next thing I did was take the random encounter tables and hex descriptions and add them in. But that produces a lot of text. So I altered it to use global variables and display information for only one hex at a time. It does require me to go in an update the location of the players each time it runs, but I find it worth it to have a much more concise output. Here is a sample of what my output looks like:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;&lt;em&gt;
Water Imp: Init +6; &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Atk claws +5 melee (1d4) or water jet +10 missile fire (2d6); AC 16&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;; HD 2d8; MV 40’ or swim 80’; &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Act 1d20&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;; SP chill water (when submerged, may freeze 20’ diameter sphere of water to subzero temperatures), vulnerable to fire and heat, elemental traits; SV &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Fort +8, Ref +8, Will +8&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;; AL N.
&lt;/em&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Init 18; HD 14; Dilute,Simmer,Wave&lt;/li&gt;&lt;li&gt;Init 7; HD 9; Pool,Globe,Spout&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;strong&gt;Interesting Flora&lt;/strong&gt;:
&lt;em&gt;
Constrictor Vine&lt;/em&gt;: Roots that resemble pale hair grow outward from central bush for 30’ to 50’, then constrict back. Reshape and destroy areas. Edible berries.
&lt;p&gt;&lt;strong&gt;The Rusted Hydra&lt;/strong&gt; (hs-16-01)
&lt;em&gt;
Ancients
&lt;/em&gt;
A spire of basalt 30’ tall, 20’ in diameter, and covered in smooth vertical channels rises from an overgrown slope. A red-brown statue of a seven-headed hydra stands atop the spire, mouths agape in a frozen roar toward the sky. Rainbow-colored flowers bloom thickly around the outcrop.
&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;br&gt;And a sample of the code that produced that:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;;Explore Hex
1,&lt;hr/&gt;&lt;b&gt;Weather&lt;/b&gt;: [[same type] [same currentWeather]]&lt;hr/&gt;&lt;b&gt;Wandering Encounter&lt;/b&gt;[[same type] Wandering Encounter]&lt;hr/&gt;&lt;b&gt;Interesting Flora&lt;/b&gt;: [Interesting Flora]&lt;hr/&gt;&lt;/p&gt;
&lt;p&gt;;hs-16-01 explore description
1,[global store Mountainous-Jungle as type][Explore Hex][hs-16-01 explore]&lt;/p&gt;
&lt;p&gt;;hs-16-01 explore
1,&lt;b&gt;The Rusted Hydra&lt;/b&gt; (hs-16-01) [The Rusted Hydra]&lt;/p&gt;
&lt;p&gt;;hs-16-01 investigate description
1,[global store Mountainous-Jungle as type][Explore Hex][hs-16-01 investigate]&lt;/p&gt;
&lt;p&gt;;hs-16-01 investigate
1,&lt;b&gt;The Rusted Hydra (The Dark)&lt;/b&gt; (hs-16-01) [The Rusted Hydra]&lt;p&gt;&lt;b&gt;The Dark&lt;/b&gt;&lt;/p&gt;[The Rusted Hydra The Dark]&lt;/p&gt;
&lt;p&gt;;The Rusted Hydra
1,&lt;p&gt;&lt;em&gt;Ancients&lt;/em&gt;&lt;/p&gt;&lt;p&gt;A spire of basalt 30’ tall, 20’ in diameter, and covered in smooth vertical channels rises from an overgrown slope. A red-brown statue of a seven-headed hydra stands atop the spire, mouths agape in a frozen roar toward the sky. Rainbow-colored flowers bloom thickly around the outcrop.&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;br&gt;Getting all the info from the adventure pdf into the right format was a lot of copy-and-paste. But using hexdescribe made it super quick to start running the game when I was finished and it gave me all the pieces I needed to start crafting the story for the players. &lt;br&gt;&lt;br&gt;Another thing I added for fun, the tables for weather. I used the concept of a &lt;a href=&#34;https://goblinshenchman.wordpress.com/2019/06/03/hex-power-flower-weather/&#34;&gt;hex weather flower&lt;/a&gt; and now I can enter in the weather they just encountered and get what the weather will be. &lt;a href=&#34;https://paste.lol/loura/hexdescribe-weather&#34;&gt;Here it the input I used&lt;/a&gt; for the weather portion. I hope to extend it with actual randomized descriptions of the weather at some point.&lt;br&gt;&lt;br&gt;Anyway, that was a lot to jot down. It&amp;rsquo;s time for some tea and to find a good book to read. 🍵📚&lt;br&gt;&lt;br&gt;Until next week,&lt;br&gt;Loura&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Dev Diary 0005 - Week of October 30th</title>
      <link>https://heyloura.com/2023/11/06/dev-diary-week.html</link>
      <pubDate>Mon, 06 Nov 2023 10:16:53 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/11/06/dev-diary-week.html</guid>
      <description>&lt;div class=&#34;trix-content&#34;&gt;
  &lt;div&gt;&lt;strong&gt;Job Related&lt;/strong&gt;&lt;br&gt;&lt;br&gt;This week ended up being a short week as well so I didn&#39;t quite get through my to-do list as I planned. But I still managed to straighten out the application permissions and role creation (which groups common permissions together). I wrote several more unit tests and started mapping out a QA test plan. My boss said one of the help desk employees will help out testing application so I want to make sure that testing is approachable and that we have a good way to track issues in Asana (the project management system my company uses).&lt;br&gt;&lt;br&gt;&lt;strong&gt;General&lt;/strong&gt;&lt;br&gt;&lt;br&gt;Sick kids, sick husband, sick me. Though I avoided the head cold that was going through the rest of my family my wisdom tooth infection was pretty bad. So I got it removed on Thursday. Ouch.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Side Project - Lillihub&lt;/strong&gt;&lt;br&gt;&lt;br&gt;Besides playing Animal Crossing, I worked on my side project and updated it with a couple new things and all the changes &lt;a href=&#34;https://heyloura.com/2023/10/30/dev-diary-week.html&#34;&gt;I wrote about from last week&lt;/a&gt;. &lt;br&gt;&lt;br&gt;The biggest one I think people will like is side swiping images (when there are multiple) on small screens. I tried getting it to look good and work well on a large screen, but horizontal scrolling is just a difficult UI monster at that size without resorting to JavaScript. So I played it safe and only did the swipe on small screens. I&#39;ll continue to ponder how to make it work desktop users. &lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;In general, on the server using a DOM parser I check each post for multiple images. If I find multiple images I save a reference to that image (or the anchor element if the image is in an anchor tag) and then remove it from the DOM. Then I create a new div container with the css markup I need and append it to the bottom of the post, placing each image inside.&lt;br&gt;&lt;br&gt;It isn&#39;t 100% perfect, if the underlying blog post had malformed HTML tags, or really small images... things can look a bit strange. But overall it works as I expected.&lt;/div&gt;&lt;div&gt;&lt;br&gt;I did get rather frustrated trying to implement &#34;last seen&#34; functionality. I kept running into issues setting a cookie with a post id. I&#39;m not sure if it&#39;s because I was doing it inside a GET request or if it&#39;s because I&#39;m using chunked transfer encoding or something else. I&#39;ll need to dig into this. &lt;br&gt;&lt;br&gt;Here are the other things I did:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;The post editor now has spellcheck enabled&lt;/li&gt;&lt;li&gt;The post editor now has a character counter&lt;/li&gt;&lt;li&gt;Made UI consistent across bookmarks, bookshelves, manage blog area with same action button format as the posts&lt;/li&gt;&lt;li&gt;Manage blog posts now shows the full text of the blog post for long posts as well as short posts&lt;/li&gt;&lt;li&gt;The permalink for the post is now above the comments&lt;/li&gt;&lt;li&gt;Added in a favico.ico&lt;/li&gt;&lt;li&gt;You can now unmute and unblock users (from their profile page, under Advanced)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;Also, lots of little bug fixes everywhere. Some from when I refactored and some that were there all along.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I also &lt;a href=&#34;https://github.com/heyloura/lillihub-client&#34;&gt;released the source code&lt;/a&gt;! Yay! &lt;br&gt;&lt;br&gt;I&#39;m not sure why showing people my code, outside of work, bothers me. Imposter syndrome? Spending too long as a solo developer and developing bad coding habits? Maybe.🤷‍♀️ But in any case. It&#39;s up there for people to take a look 😄&lt;br&gt;&lt;br&gt;Until next week,&lt;br&gt;Loura&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Dev Diary 0004  - Week of October 23rd</title>
      <link>https://heyloura.com/2023/10/30/dev-diary-week.html</link>
      <pubDate>Mon, 30 Oct 2023 10:37:13 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/10/30/dev-diary-week.html</guid>
      <description>&lt;div class=&#34;trix-content&#34;&gt;
  &lt;div&gt;&lt;strong&gt;Job Related&lt;br&gt;&lt;br&gt;&lt;/strong&gt;Vacation week 🥳&lt;br&gt;&lt;br&gt;&lt;strong&gt;General&lt;/strong&gt;&lt;br&gt;&lt;br&gt;I had high hopes for a productive vacation. I wanted to repaint my home office and decorate it. I wanted to get journaling done, go on walks, do some shopping, and work on my side projects... Life decided I needed an infected wisdom tooth that I now need to get removed. Which prompted some high anxiety moments. Add in two sick children and I didn&#39;t really get much accomplished.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Side Project - Lillihub&lt;/strong&gt;&lt;br&gt;&lt;br&gt;I did get some progress done on Lillihub. I&#39;ve gone through and put in documentation, refactored and simplified where it makes sense and got it running locally. I&#39;ve been using the Deno Playground Editor up until this point. I just need to flesh out the README.md and then I&#39;ll send out the update to my beta testers.&lt;br&gt;&lt;br&gt;I did adjust the menu/action button area for posts. I liked having it above the comments but I could only fit at most four actions before it didn&#39;t work for smaller screen sizes. I could go with icons... and that does seem like the UI trend everywhere. But I like buttons spelled out for me. That way I don&#39;t need to guess what action is associated with the button.&lt;br&gt;&lt;br&gt;  &lt;figure class=&#34;attachment attachment--preview attachment--lightboxable attachment--png&#34;&gt;
      &lt;a download=&#34;image.png&#34; title=&#34;Download image.png&#34; data-click-proxy-target=&#34;lightbox_link_blob_1413900567&#34; href=&#34;https://world.hey.com/loura/f6d12953/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2NYYVVaVSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--e308f38664d1f656104f575a547d88b8c1143f71/image.png?disposition=attachment&#34;&gt;
        &lt;img src=&#34;https://world.hey.com/loura/f6d12953/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2NYYVVaVSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--e308f38664d1f656104f575a547d88b8c1143f71/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--946116ea0c454412635aa7309bd9472bf633014c/image.png&#34; alt=&#34;image.png&#34; srcset=&#34;https://world.hey.com/loura/f6d12953/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2NYYVVaVSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--e308f38664d1f656104f575a547d88b8c1143f71/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUQya0NBQW82REhGMVlXeHBkSGxwUVRvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--8c0bbbd8bfe72a73b222ec1c20265f8631973dc9/image.png 2x, https://world.hey.com/loura/f6d12953/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2NYYVVaVSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--e308f38664d1f656104f575a547d88b8c1143f71/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUZta0NBQTg2REhGMVlXeHBkSGxwUERvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--d2fed6b5089e475a3013538949ec7f311ac6e345/image.png 3x&#34; decoding=&#34;async&#34; loading=&#34;lazy&#34;&gt;
&lt;/a&gt;
  &lt;/figure&gt;&lt;br&gt;&lt;br&gt;I also added in a &#34;Photos&#34; page when viewing the profile of a user. It makes a nice little grid and then you can click the image to go to the post itself.&lt;br&gt;&lt;br&gt;  &lt;figure class=&#34;attachment attachment--preview attachment--lightboxable attachment--png&#34;&gt;
      &lt;a download=&#34;image.png&#34; title=&#34;Download image.png&#34; data-click-proxy-target=&#34;lightbox_link_blob_1413919095&#34; href=&#34;https://world.hey.com/loura/f6d12953/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2Qzc1VaVSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--79ebccab3ab1aefd27e75fadf5c2b4b9e8761aec/image.png?disposition=attachment&#34;&gt;
        &lt;img src=&#34;https://world.hey.com/loura/f6d12953/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2Qzc1VaVSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--79ebccab3ab1aefd27e75fadf5c2b4b9e8761aec/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--946116ea0c454412635aa7309bd9472bf633014c/image.png&#34; alt=&#34;image.png&#34; srcset=&#34;https://world.hey.com/loura/f6d12953/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2Qzc1VaVSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--79ebccab3ab1aefd27e75fadf5c2b4b9e8761aec/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUQya0NBQW82REhGMVlXeHBkSGxwUVRvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--8c0bbbd8bfe72a73b222ec1c20265f8631973dc9/image.png 2x, https://world.hey.com/loura/f6d12953/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHNLd2Qzc1VaVSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--79ebccab3ab1aefd27e75fadf5c2b4b9e8761aec/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUZta0NBQTg2REhGMVlXeHBkSGxwUERvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--d2fed6b5089e475a3013538949ec7f311ac6e345/image.png 3x&#34; decoding=&#34;async&#34; loading=&#34;lazy&#34;&gt;
&lt;/a&gt;
  &lt;/figure&gt;&lt;br&gt;&lt;br&gt;A couple other things I squeezed in:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Blockquote styling&lt;/li&gt;&lt;li&gt;All posts have a &#34;Quote&#34; button which takes you to the editor with the post text already in a blockquote&lt;/li&gt;&lt;li&gt;All posts now have a &#34;View Post&#34; link that takes you to the single post view in Lillihub - which has the comments auto expanded&lt;/li&gt;&lt;li&gt;Fixed the bug on managing bookmark tags&lt;/li&gt;&lt;li&gt;Reduced the image size requested from the micro.blog CDN in an effort to make pages more friendly to those with poor network quality.&lt;/li&gt;&lt;li&gt;Added an indicator next to a username if you are not following them. The action toggle also has a &#34;Follow User&#34; button in this case.&lt;/li&gt;&lt;li&gt;Added link to user website on profile page.&lt;/li&gt;&lt;li&gt;Fixed bug when uploading an image without JS turned on. It wouldn&#39;t redirect back to the page.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;Things I&#39;m thinking about&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Making image quality a setting. That way people who want large images coming over the network can.&lt;/li&gt;&lt;li&gt;I still want to make multiple image posts side-scroll on small screens. It&#39;s challenging since there is no fixed format multiple images come over. Could be a sequence of image tags, or images in separate paragraphs or something else....&lt;/li&gt;&lt;li&gt;Make the editing experience a bit better.&lt;/li&gt;&lt;li&gt;Add in a &#34;last seen&#34; divider on the timeline &amp; conversations page, so you can know where you last left off&lt;/li&gt;&lt;li&gt;Add in a &#34;new post&#34; indicator (for those with JS) if there are new posts to see&lt;/li&gt;&lt;li&gt;A couple of issues: iframe issue in iOS action bar, autocorrect in markdown editor, word count in editor, and mention page crashing sometimes.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;&lt;strong&gt;Things I Learned&lt;/strong&gt;&lt;br&gt;&lt;br&gt;How to make the details tag in css look kinda-like a modern dropdown button. You need to make the position absolute and then set the margins based on where you want them on the page. Since I had the details tag on the right side of the page I gave everything negative margins to pull it left. Set the z-index so it opens above the content on the page.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;&lt;code class=&#34;language-css&#34;&gt;details {
   position: absolute;    
   z-index: 5;    
   margin-left: -92px;
}
.details-content {
  margin-left: -129px;
  width: 200px;
}&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;And the HTML element&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;&amp;lt;details&amp;gt;
  &amp;lt;summary&amp;gt;Actions&amp;lt;/summary&amp;gt;
  &amp;lt;div class=&#34;details-content&#34;&amp;gt;
    &amp;lt;button&amp;gt;Hello World&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/details&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Dev Diary 0003 - Week of October 16th</title>
      <link>https://heyloura.com/2023/10/23/dev-diary-week.html</link>
      <pubDate>Mon, 23 Oct 2023 15:55:20 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/10/23/dev-diary-week.html</guid>
      <description>&lt;h2 id=&#34;job-related&#34;&gt;Job Related&lt;/h2&gt;
&lt;p&gt;This week was all about adjusting the application to handle a special user role. In general the application is your standard multi-tenant application except we have one type of user that needs to operate across tenants but isn&amp;rsquo;t a super user. They are restricted to a subset of tenants (unlike a super user) but also have elevated permissions across those tenants. So I had to scaffold up some tables to manage the user to tenant links and now I&amp;rsquo;m adjusting the back-end services to respect the permissions. I also created a handful of tests to check various permission cases. I&amp;rsquo;m on vacation next week but when I return I&amp;rsquo;ll start the changes needed on the front end.&lt;/p&gt;
&lt;h2 id=&#34;side-project---lillihub&#34;&gt;Side Project - Lillihub&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve started cleaning up the code and adding in documentation. Right now the project is a single&lt;sup&gt;1&lt;/sup&gt; JavaScript file under 2500 lines (and under 128KB&lt;sup&gt;2&lt;/sup&gt;). That includes the everything. The HTML, CSS, a touch of frontend JS and all the backend JS for the webserver running on Deno. There is no build step and there are no frameworks. And I really want to keep it that way. The problem is that adding in documentation is taking up precious bytes. So I&amp;rsquo;m refactoring and keeping things DRY in an effort to keep things slim.&lt;/p&gt;
&lt;p&gt;Why? I&amp;rsquo;m an odd duck developer. Maybe its because I&amp;rsquo;ve worked solo all my career but in order to push myself and become better I tend to place constraints on myself. It forces me to grow and look at problems from different angles. I don&amp;rsquo;t do this at work but my side projects are all fair game to my crazy ideas.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t want Lillihub to be a chore to maintain. Which inevitably happens when you add a metric ton of dependencies. I wanted Lillihub to not only work without JavaScript&amp;hellip; but be a delight to use without JavaScript. Hint to anyone out there who wants to do that: Turn off JavaScript on your browser when you are developing. It&amp;rsquo;ll make the pain points pretty obvious.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m still aiming to release the app for Micro.blog users and make the source code public in November 🫣 which is a little nerve wracking.&lt;/p&gt;
&lt;h2 id=&#34;side-project---blog-redesign&#34;&gt;Side Project - Blog Redesign&lt;/h2&gt;
&lt;p&gt;As I mentioned last week. The clean simple design I created was getting on my nerves. So&amp;hellip;. what to do&amp;hellip;. Apparently make a delightful little theme inspired by Super MarioKart. I spent many delightful hours in my youth perfecting my runs through Rainbow Road for the sole purpose of beating my siblings. I spent an hour making the delightful border along my blog content. Worth it.&lt;/p&gt;
&lt;h2 id=&#34;what-i-learned&#34;&gt;What I learned&lt;/h2&gt;
&lt;p&gt;The powers of  &lt;code&gt;border-image-slice&lt;/code&gt; in CSS in conjunction with &lt;code&gt; image-rendering: pixelated;&lt;/code&gt;. It really helps make retro feeling borders.&lt;/p&gt;
&lt;h2 id=&#34;what-im-thinking&#34;&gt;What I&amp;rsquo;m thinking&lt;/h2&gt;
&lt;p&gt;That streaming HTML is super cool. Why haven&amp;rsquo;t I known about it before.&lt;/p&gt;
&lt;p&gt;Why am I getting &lt;code&gt;broken pipe&lt;/code&gt; and &lt;code&gt;Http - response already completed&lt;/code&gt; errors from Lillihub? My search-engine-fu is failing me here.&lt;/p&gt;
&lt;h2 id=&#34;postscript&#34;&gt;PostScript&lt;/h2&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; : Okay you caught me. I am using two external JS files on the front end. One is a markdown editor and one is an image compressor library.&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;2&lt;/sup&gt; : The KB restriction is from the Deno Playground. One file and a max of 128KB. I wasn&amp;rsquo;t kidding when I said I wanted to keep things small and the Deno Playground Editor is such a delight to use that I&amp;rsquo;m willing to play by those constraints 😆.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dev Diary 0002 - Week of October 9th</title>
      <link>https://heyloura.com/2023/10/16/dev-diary-week.html</link>
      <pubDate>Mon, 16 Oct 2023 11:17:12 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/10/16/dev-diary-week.html</guid>
      <description>&lt;h2 id=&#34;job-related&#34;&gt;Job Related&lt;/h2&gt;
&lt;p&gt;Now the MVP is done at work, it is time to show it off. We had a wonderful team lunch and I was able to walk the staff and the director through everything I&amp;rsquo;ve been building this last year. It was well received and everyone seemed excited for the next set of features I&amp;rsquo;m building out. We decided that there will be two more build out phases in the project. Focused on getting user feedback and making any adjustments needed. After that it will be pushed to production and replace the current system. I still have a hard time wrapping my head about the timeframe needed to get everything completed. But I&amp;rsquo;m hoping that this time next year the rewrite will be up and running and I&amp;rsquo;ll no longer need to support the legacy application&lt;/p&gt;
&lt;h2 id=&#34;side-project---lillihub&#34;&gt;Side Project - Lillihub&lt;/h2&gt;
&lt;p&gt;Lillihub got an update at the end of this week! This will probably be the last big update before I open up the app to anyone who wants to try it out. I need to focus the next two weeks on getting some screenshots, writing up some documentation, and cleaning up the code. Here&amp;rsquo;s what I was able to add this week:&lt;/p&gt;
&lt;h3 id=&#34;content-filters&#34;&gt;Content Filters&lt;/h3&gt;
&lt;p&gt;I added in the ability to set content filters. There have been a couple times when a person I follow on Micro.blog posts something that isn&amp;rsquo;t that great for my mental health. I don&amp;rsquo;t want to stop following them, I just want that topic hidden. So that&amp;rsquo;s essentially what this does.&lt;/p&gt;
&lt;p&gt;I save a cookie with a comma separated list of terms and then I check both posts and replies for that term. If it appears, I remove the whole thing. The following code snippet returns true if any terms in the &lt;code&gt;contentFilters&lt;/code&gt; array are contained within the text of &lt;code&gt;content_html&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;contentFilters.some(filter =&gt; filter.toLowerCase().trim() != &#39;&#39; &amp;&amp; content_html.toLowerCase().includes(filter.toLowerCase().trim()));`&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Right now I do have a placeholder when content is removed but depending on user feedback I might remove this.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-10-16-103806.png&#34; width=&#34;400&#34; alt=&#34;screenshot of lillihub showing the UI when a post is filtered out&#34;&gt;
&lt;h3 id=&#34;bookmarks&#34;&gt;Bookmarks&lt;/h3&gt;
&lt;p&gt;At first I thought I couldn&amp;rsquo;t add bookmarks using the &lt;a href=&#34;https://help.micro.blog/t/json-api-bookmarks/110&#34;&gt;Micro.blog Bookmarks API&lt;/a&gt;. But digging into it a bit closer I realized that the indieweb microformats did have the concept of a bookmark. At first I tried just making posts with the correct classes on the posts, like &lt;code&gt;u-bookmark-of&lt;/code&gt; but that didn&amp;rsquo;t work. The &lt;a href=&#34;https://www.w3.org/TR/micropub/&#34;&gt;Micropub spec&lt;/a&gt; I was using doesn&amp;rsquo;t mention bookmarks but eventually my searching online brought up the &lt;a href=&#34;https://indieweb.org/Micropub#New_Bookmark&#34;&gt;bookmark documentation from indieweb.org&lt;/a&gt;that specified how to make a bookmark post against a micropub implementation. And it worked! So now Lillihub can add a url as one of your bookmarks in Micro.blog.&lt;/p&gt;
&lt;p&gt;I also added in the ability to create a post from one of your bookmarks. Right now it just takes you to the create a post page with the bookmark in a &lt;code&gt;blockquote&lt;/code&gt; but this is something I hope to improve upon in a later iteration.&lt;/p&gt;
&lt;h3 id=&#34;crossposting-per-post&#34;&gt;Crossposting (per post)&lt;/h3&gt;
&lt;p&gt;This was requested from one of my beta testers and seeing as &lt;a href=&#34;https://micro.blog/manton&#34;&gt;@manton&lt;/a&gt; updated Micro.blog with the ability as described in his post &lt;a href=&#34;https://www.manton.org/2023/02/23/adding-perpost-crossposting.html&#34;&gt;Adding per-post cross-posting to Micro.blog&lt;/a&gt; I thought I would add it as well. This was a bit of a pain since I don&amp;rsquo;t use cross-posting and in order to test it I needed to set up both new accounts on different services and set them up on Micro.blog. But I managed it and with a little bit of trial and error I got things working. In general you:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make a get request to &lt;code&gt;https://micro.blog/micropub?q=syndicate-to&lt;/code&gt; to get the targets a user has configured.&lt;/li&gt;
&lt;li&gt;When posting to the micropub endpoint, add a query parameter of &lt;code&gt;mp-syndicate-to[]&lt;/code&gt; for each target.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;side-project---blog-redesign&#34;&gt;Side Project - Blog Redesign&lt;/h2&gt;
&lt;p&gt;Okay, I dislike the new design I have. Simple and elegant is just not how my blog rolls. I&amp;rsquo;m already working on something new to put in its place this upcoming week. I also purchased a year subscription at &lt;a href=&#34;https://tinylytics.app/&#34;&gt;tinylytics&lt;/a&gt; since I&amp;rsquo;m pretty interested in some stats on people who visit the lillihub landing page I&amp;rsquo;m going to put on my blog.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dev Diary 0001 - Week of October 2nd</title>
      <link>https://heyloura.com/2023/10/09/dev-diary-week.html</link>
      <pubDate>Mon, 09 Oct 2023 11:59:24 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/10/09/dev-diary-week.html</guid>
      <description>&lt;p&gt;I came across this blog post as I was working this week. &lt;a href=&#34;https://www.clairecodes.com/dev-diary/&#34;&gt;Claire Codes - Dev Diary&lt;/a&gt; and it inspired me to try my hand at one. I&amp;rsquo;ve seen some other people write a weekly note and I think it&amp;rsquo;s in a similar vein. Just a little more focused on my software development skill set and not life in general. I can&amp;rsquo;t promise I&amp;rsquo;ll do these every week. But it is something I&amp;rsquo;ll aspire to.&lt;/p&gt;
&lt;h2 id=&#34;job-related&#34;&gt;Job Related&lt;/h2&gt;
&lt;p&gt;Our last contractor for this work project had their contract end on the last day of September. Because of the time difference in our working schedules their final pull request didn&amp;rsquo;t come in until after I signed off for the evening. So first thing Monday was reviewing it, making sure the tests all passed and getting it in the Azure pipeline to go up to our test instance.&lt;/p&gt;
&lt;p&gt;This marked the end of any outside help due to a lack of grant funds, the end of the MVP phase, and me taking the project the rest of the way solo.&lt;/p&gt;
&lt;p&gt;I spent most of the week going through the MVP with a fine tooth comb and coming up the next list of high priority features and gathering requirements. This dev cycle should take me until the end of March 2024 if my estimates are close.&lt;/p&gt;
&lt;h2 id=&#34;side-project---lillihub&#34;&gt;Side Project - Lillihub&lt;/h2&gt;
&lt;p&gt;My side project, Lillihub, is going well. I have around 25 beta testers at the moment providing fantastic feedback. And based on the number of requests over the week people are actually using it. I&amp;rsquo;m hoping this will help me gauge request #&amp;rsquo;s when I release it outside the beta test.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-10-09-095120.png&#34;  alt=&#34;two line graphs of the activity of lillihub from the last 24 hours&#34;&gt;
&lt;p&gt;I did one small update this week. There was a bug where if the timeline feed had a video embed, it would stop loading any more posts. This has been resolved. I also got some feedback on the design portion and did a little css update to smooth a few things out for now. It should be a little less boxy and has a subtle gradient as you scroll. Personally, I love how the dark mode is coming along.&lt;/p&gt;
&lt;img style=&#34;border: 1px solid #000;&#34; width=&#34;500&#34; src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-10-09-090059.png&#34; alt=&#34;&#34;&gt;
&lt;p&gt;Which brings me to&amp;hellip;&lt;/p&gt;
&lt;h2 id=&#34;side-project---blog-redesign&#34;&gt;Side Project - Blog Redesign&lt;/h2&gt;
&lt;p&gt;I need a place to put some Lillihub documentation and help articles. I go back and forth on getting the project it&amp;rsquo;s own separate website. For now I think I&amp;rsquo;ll have it as a subsection of my website since I don&amp;rsquo;t see this moving beyond a hobby project and that gives me another reason to redesign my blog. I think this is change number four in under a year 😆&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;ll still be a micro.blog hosted blog under the hood. I&amp;rsquo;m aiming for something pretty simple with one large illustration on the side. I&amp;rsquo;m having fun learning a bit of Hugo and customizing how bookmarks can be nested.&lt;/p&gt;
&lt;h2 id=&#34;what-i-learned&#34;&gt;What I Learned&lt;/h2&gt;
&lt;h3 id=&#34;how-to-generate-a-number-between-1n-in-hugo&#34;&gt;How to generate a number between 1&amp;hellip;n in Hugo&lt;/h3&gt;
&lt;p&gt;So I bought some lovely hand drawn svg illustrations to go on my website from &lt;a href=&#34;https://www.etsy.com/shop/TwigandMothStudio?ref=shop-header-name&amp;amp;listing_id=1224363154&#34;&gt;TwigandMothStudio - Etsy&lt;/a&gt; and I wanted a random one on each page of my website. I have a total of 18 illustrations that I named &lt;code&gt;1.svg&lt;/code&gt;, &lt;code&gt;2.svg&lt;/code&gt;, &amp;hellip; and so on. Now in Hugo you can use {{&lt;code&gt;index (seq 18 | shuffle) 0&lt;/code&gt;}}.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What this is doing is basically making a &lt;a href=&#34;https://gohugo.io/functions/collections/seq/&#34;&gt;sequence&lt;/a&gt;, list, of numbers from 1-18 with &lt;code&gt;seq 18&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mixing up the list by &lt;a href=&#34;https://gohugo.io/functions/collections/shuffle/&#34;&gt;shuffling&lt;/a&gt; the elements with &lt;code&gt;shuffle&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Then grabbing the first element by it&amp;rsquo;s &lt;a href=&#34;https://gohugo.io/functions/collections/indexfunction/&#34;&gt;index&lt;/a&gt; of zero  &lt;code&gt;index (seq 18 | shuffle) 0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;how-to-change-the-fill-color-on-an-external-svg&#34;&gt;How to change the fill color on an external SVG&lt;/h3&gt;
&lt;p&gt;The SVG file&amp;rsquo;s I purchased have a fill color of black and I wanted them to match the colors I&amp;rsquo;m using. Which I found out you can do with a css filter! Here is what I&amp;rsquo;m using for the light theme:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-css&#34;&gt;filter: invert(30%) sepia(13%) saturate(983%) hue-rotate(196deg) brightness(94%) contrast(90%);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now figuring out what values are needed for the filter can be a chore. But someone already build a little tool for that. &lt;a href=&#34;https://codepen.io/sosuke/pen/Pjoqqp&#34;&gt;CSS filter generator to convert from black to target hex color&lt;/a&gt; It&amp;rsquo;s fantastic!&lt;/p&gt;
&lt;h3 id=&#34;how-to-create-a-custom-single-page-in-microblog-theme&#34;&gt;How to create a custom single page in Micro.blog theme&lt;/h3&gt;
&lt;p&gt;I want to split my website into two main areas. One that has my general website and blog related items and one that can be customized as a product page for Lillihub. Luckily a Micro.blog custom theme can let you do just that.&lt;/p&gt;
&lt;p&gt;It boils down to creating a layout template page and a content page. The content page creates that page on the website and then you tell it what custom layout you want to use using frontmatter. You&amp;rsquo;ll need a title and a type. The type needs to match the layout name you want to use. So for instance, I did &lt;code&gt;content/bookmarks.md&lt;/code&gt; with a &lt;code&gt;type: bookmarks&lt;/code&gt; in the frontmatter.&lt;/p&gt;
&lt;p&gt;I also created a file &lt;code&gt;layouts/bookmarks/single.html&lt;/code&gt; which held the template. Even though the template is a &lt;code&gt;single&lt;/code&gt; you can still access lists of categories and other items Micro.blog makes available in templates.&lt;/p&gt;
&lt;h3 id=&#34;how-to-nest-bookmarks-under-tags-in-microblog&#34;&gt;How to nest bookmarks under tags in Micro.blog&lt;/h3&gt;
&lt;p&gt;I love the fact that Micro.blog premium let&amp;rsquo;s you have bookmark tags. So I wanted to update my theme to take better advantage of it and nest the bookmarks under the tag name. The code is a bit long to just paste here, so you can find it in my &lt;a href=&#34;https://loura.paste.lol/micro-blog-nested-bookmark-tags&#34;&gt;micro-blog-nested-bookmark-tags (paste.lol)&lt;/a&gt;. In general this is what&amp;rsquo;s needed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make an empty collection called &lt;code&gt;$tags&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Iterate through the tags and add them to the collection. Since they are comma separated, you&amp;rsquo;ll need to split them on the comma first.&lt;/li&gt;
&lt;li&gt;Remove any duplicates from &lt;code&gt;$tags&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Iterate through &lt;code&gt;$tags&lt;/code&gt; and select bookmarks that have the current &lt;code&gt;$tag&lt;/code&gt;. I also chose to ignore the empty tag.&lt;/li&gt;
&lt;li&gt;Display the items.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Coding a framed productivity app - building out the calendar</title>
      <link>https://heyloura.com/2023/07/14/coding-a-framed.html</link>
      <pubDate>Fri, 14 Jul 2023 12:00:37 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/07/14/coding-a-framed.html</guid>
      <description>&lt;h1 id=&#34;coding-a-framed-productivity-app---building-out-the-calendar&#34;&gt;Coding a framed productivity app - building out the calendar&lt;/h1&gt;
&lt;p&gt;This is a continuation of my experiments using iframes as a modular way to build an app. You can start from the beginning here: &lt;a href=&#34;https://heyloura.com/2023/07/08/lets-code-something.html&#34;&gt;Introduction Post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is what I&amp;rsquo;ll be building today: &lt;a href=&#34;https://glitch.com/edit/#!/tasty-picturesque-nutmeg&#34;&gt;code&lt;/a&gt;, &lt;a href=&#34;https://tasty-picturesque-nutmeg.glitch.me&#34;&gt;preview&lt;/a&gt;&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-07-13-205301.png&#34; alt=&#34;screenshot of a calendar app with dark buttons and a few dots on the dates in different colors&#34;&gt;
&lt;p&gt;This calendar will form the starting point of my productivity app. Now this app begins to toe the line of, why don&amp;rsquo;t you just use web components or one of the many many framework libraries? And if I were building something for my company or working with other developers&amp;hellip; I would.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;m fond of this idea. And honestly, playing around with this approach, I like more and more. It keeps things modular without the overhead of a large JavaScript framework and doesn&amp;rsquo;t require any server-side processing. There is a nice simplicity to writing HTML includes this way.&lt;/p&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Getting Started.&lt;/h2&gt;
&lt;p&gt;Want to follow along? You are going to need some basic familiarity with JavaScript, html, css, you will need a code editor and have the files served from a webserver. &lt;mark&gt;Due to iframe restrictions, this won&amp;rsquo;t work locally.&lt;/mark&gt;&lt;/p&gt;
&lt;p&gt;So in my last post &lt;a href=&#34;https://heyloura.com/2023/07/12/a-basic-framed.html&#34;&gt;A basic framed* website&amp;hellip; more experiments with disappearing iframes&lt;/a&gt; I showed a way to pull an iframe into a page and run any script tags that it contained. Some might have noticed that with anything complicated you&amp;rsquo;d probably run into scope issues. For instance, &lt;code&gt;id&lt;/code&gt; tags might clash. A call to &lt;code&gt;document.querySelector&lt;/code&gt; might return an unexpected element when it is run from the parent (because another element might be a match). So if I&amp;rsquo;m going to be serious using this, that&amp;rsquo;s going to need to be fixed.&lt;/p&gt;
&lt;p&gt;Also, just some clean up. Script files are now in the script folder and styles are in the&amp;hellip; you guessed it&amp;hellip; styles folder. I put all the fragment pieces (or should I call them components&amp;hellip; arg&amp;hellip; naming things is hard) in a fragments folder. The colors I chose for the app come from &lt;a href=&#34;https://github.com/catppuccin/catppuccin&#34;&gt;catppuccin/catppuccin: 😸 Soothing pastel theme for the high-spirited! (github.com)&lt;/a&gt;, the font stack is &amp;ldquo;Humanist&amp;rdquo; from &lt;a href=&#34;https://modernfontstacks.com/&#34;&gt;Modern Font Stacks&lt;/a&gt; and the icons are from &lt;a href=&#34;https://icons.getbootstrap.com/&#34;&gt;Bootstrap Icons · Official open source SVG icon library for Bootstrap (getbootstrap.com)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I rolled my own css taking advantage of css grids and flex-box. The main css file is only 65 lines long. Not too shabby. And the css in the &lt;code&gt;./fragments/_calendar.html&lt;/code&gt; is an additional 20. Considering most website calendars are monsters of JavaScript and lots and lots of divs I&amp;rsquo;m quite happy.&lt;/p&gt;
&lt;p&gt;The calendar I&amp;rsquo;m building is for letting the user navigate around and it boils down to a bunch of buttons and a couple of classes. The &lt;code&gt;data-day&lt;/code&gt; attribute helps keep the JavaScript clean and tidy so I don&amp;rsquo;t need to look at the button text to determine what day the button represents.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&#34;en&#34;&amp;gt;&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt;
  &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1&#34;&amp;gt;
  &amp;lt;meta name=&#34;robots&#34; content=&#34;noindex, nofollow&#34; /&amp;gt;
  &amp;lt;script src=&#34;https://heyloura.com/scripts/fragment.js&#34; type=&#34;text/javascript&#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;section&amp;gt;
      &amp;lt;div class=&#34;month_picker&#34;&amp;gt;
        &amp;lt;b&amp;gt;
          &amp;lt;span class=&#34;date_month&#34;&amp;gt;&amp;lt;/span&amp;gt;
          &amp;lt;span class=&#34;date_year&#34;&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;/b&amp;gt;
        &amp;lt;button class=&#34;previous_month&#34; type=&#34;button&#34;&amp;gt;Prev&amp;lt;/button&amp;gt;
        &amp;lt;button class=&#34;today_switch&#34; type=&#34;button&#34;&amp;gt;Today&amp;lt;/button&amp;gt;
        &amp;lt;button class=&#34;next_month&#34; type=&#34;button&#34;&amp;gt;Next&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&#34;weekday&#34;&amp;gt;
        &amp;lt;div&amp;gt;Su&amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;Mo&amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;Tu&amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;We&amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;Th&amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;Fr&amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;Sa&amp;lt;/div&amp;gt;  
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&#34;day_picker&#34;&amp;gt;
        &amp;lt;button data-day=&#34;1&#34; type=&#34;button&#34;&amp;gt;1&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;2&#34; type=&#34;button&#34;&amp;gt;2&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;3&#34; type=&#34;button&#34;&amp;gt;3&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;4&#34; type=&#34;button&#34;&amp;gt;4&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;5&#34; type=&#34;button&#34;&amp;gt;5&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;6&#34; type=&#34;button&#34;&amp;gt;6&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;7&#34; type=&#34;button&#34;&amp;gt;7&amp;lt;/button&amp;gt;  
        &amp;lt;button data-day=&#34;8&#34; type=&#34;button&#34;&amp;gt;8&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;9&#34; type=&#34;button&#34;&amp;gt;9&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;10&#34; type=&#34;button&#34;&amp;gt;10&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;11&#34; type=&#34;button&#34;&amp;gt;11&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;12&#34; type=&#34;button&#34;&amp;gt;12&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;13&#34; type=&#34;button&#34;&amp;gt;13&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;14&#34; type=&#34;button&#34;&amp;gt;14&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;15&#34; type=&#34;button&#34;&amp;gt;15&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;16&#34; type=&#34;button&#34;&amp;gt;16&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;17&#34; type=&#34;button&#34;&amp;gt;17&amp;lt;/button&amp;gt;  
        &amp;lt;button data-day=&#34;18&#34; type=&#34;button&#34;&amp;gt;18&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;19&#34; type=&#34;button&#34;&amp;gt;19&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;20&#34; type=&#34;button&#34;&amp;gt;20&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;21&#34; type=&#34;button&#34;&amp;gt;21&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;22&#34; type=&#34;button&#34;&amp;gt;22&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;23&#34; type=&#34;button&#34;&amp;gt;23&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;24&#34; type=&#34;button&#34;&amp;gt;24&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;25&#34; type=&#34;button&#34;&amp;gt;25&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;26&#34; type=&#34;button&#34;&amp;gt;26&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;27&#34; type=&#34;button&#34;&amp;gt;27&amp;lt;/button&amp;gt;  
        &amp;lt;button data-day=&#34;28&#34; type=&#34;button&#34;&amp;gt;28&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;29&#34; type=&#34;button&#34;&amp;gt;29&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;30&#34; type=&#34;button&#34;&amp;gt;30&amp;lt;/button&amp;gt;
        &amp;lt;button data-day=&#34;31&#34; type=&#34;button&#34;&amp;gt;31&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
  &amp;lt;/section&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The real workhorse here is the css. &lt;code&gt;display: grid;&lt;/code&gt; is where the magic happens.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-css&#34;&gt;
      .weekday, .day_picker {
        display: grid;
        grid-template-columns: repeat(7, 1fr);
        text-align: center;
      }
      .month_picker {
        text-align: center;
        display: flex;
        align-items: center;
        width: 100%;
        padding: 0.5em;
      }
      .month_picker &gt; * {
        flex: 1 1 auto;
        text-decoration: none;
      }
      .day_picker button.hide-date {
        display:none;
      }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We have a couple of things JavaScript will take care of, showing the name of the month and the year. Highlighting today and what&amp;rsquo;s been selected (via classes) and most importantly hiding any extra days in a month and shifting over the day of the week the grid starts on (hint, css does this).&lt;/p&gt;
&lt;h2 id=&#34;planning-out-the-interactions&#34;&gt;Planning out the interactions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;When a user clicks the &lt;code&gt;Next&lt;/code&gt; of &lt;code&gt;Prev&lt;/code&gt; buttons the month shown should change accordingly&lt;/li&gt;
&lt;li&gt;When a user clicks the &lt;code&gt;Today&lt;/code&gt; button, the calendar should show the current month with today&amp;rsquo;s date selected.&lt;/li&gt;
&lt;li&gt;When a user clicks on a date button, that date should be selected.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In all cases, the fragment should notify the parent about the interaction either that the date changed or the month did. It&amp;rsquo;s the parents&amp;rsquo; responsibility about what should happen because of that interaction. Perhaps it saves the information somewhere, perhaps it will notify a different fragment.&lt;/p&gt;
&lt;h2 id=&#34;restricting-scope&#34;&gt;Restricting scope&lt;/h2&gt;
&lt;p&gt;One thing that I need to fix is how to target just the element I&amp;rsquo;m interested in for these click events and nothing else. Which means I need to lock down the scope somehow. I&amp;rsquo;m envisioning a way to label an iframe, so that inside it I can use that as a selector and keep my JavaScript from being over eager. That sounds an awful lot like an &lt;code&gt;id&lt;/code&gt; attribute. &lt;em&gt;Note: There is also an &lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt; on the iframe which helps with performance.&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&#34;en&#34;&amp;gt;&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt;
  &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1&#34;&amp;gt;
  &amp;lt;meta name=&#34;description&#34; content=&#34;a basic calendar and todo list app&#34;&amp;gt;
  &amp;lt;title&amp;gt;Framed* Productivity App&amp;lt;/title&amp;gt;
  &amp;lt;script src=&#34;scripts/disappearingFrame.js&#34; type=&#34;text/javascript&#34;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;./styles/style.css&#34; /&amp;gt; 
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;iframe aria-busy=&#34;true&#34; 
      src=&#34;./fragments/_header.html&#34; 
      loading=&#34;lazy&#34;
      onload=&#34;disappear(this)&#34;&amp;gt;&amp;lt;/iframe&amp;gt;
  &amp;lt;main&amp;gt;
    &amp;lt;iframe aria-busy=&#34;true&#34;
      id=&#34;main_calendar&#34;
      src=&#34;./fragments/_calendar.html&#34; 
      loading=&#34;lazy&#34;
      onload=&#34;disappear(this)&#34;&amp;gt;&amp;lt;/iframe&amp;gt;
  &amp;lt;/main&amp;gt;
  &amp;lt;footer aria-live=&#34;polite&#34;&amp;gt;
    &amp;lt;iframe aria-busy=&#34;true&#34; 
      src=&#34;./fragments/_nav.html&#34; 
      loading=&#34;lazy&#34;
      onload=&#34;disappear(this)&#34;&amp;gt;&amp;lt;/iframe&amp;gt;
  &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Here is the index.html. You can see the &lt;code&gt;id=&amp;quot;main_calendar&amp;quot;&lt;/code&gt; on the middle iframe. Let&amp;rsquo;s write some code to grab it from inside. The &lt;code&gt;./fragments/_header.html&lt;/code&gt; and &lt;code&gt;./fragments/_nav.html&lt;/code&gt; are trivial so I won&amp;rsquo;t include the code here. If you&amp;rsquo;re interested they are up on glitch &lt;a href=&#34;https://glitch.com/edit/#!/tasty-picturesque-nutmeg&#34;&gt;code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There is a way to get the id element of the frame using &lt;code&gt;window.frameElement&lt;/code&gt;. You can actually get access to all the attributes that way. I&amp;rsquo;m going to alter the &lt;code&gt;scripts/fragment.js&lt;/code&gt; file a bit here. One, I&amp;rsquo;m going to make the IIFE asynchronous. Second, I&amp;rsquo;m going to add an event listener to see when everything is loaded. Then I&amp;rsquo;m going to get either the id of the frame or generate a random identifier. Lastly I&amp;rsquo;ll set it on every child of the iframe body with an attribute name of scope.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Why not use the &lt;code&gt;id&lt;/code&gt;? Because someone might put an id on an element and I don&amp;rsquo;t want to override that and they might have multiple children, thus we&amp;rsquo;d be giving id&amp;rsquo;s to multiple elements which is a basic no-no.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;scripts/fragment.js&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;
;(async () =&gt; {
  // if we loaded this outside an iframe... bail.
  if(window.self === window.top) {
    window.location.replace(&#34;/&#34;);
  }
})();

// when everything is loaded
// set up an identifier so we have something to scope off of.
window.addEventListener(&#34;DOMContentLoaded&#34;, (event) =&gt; {
	let body = document.querySelector(&#39;body&#39;);
	let uuid = window.frameElement.getAttribute(&#39;id&#39;) ?? self.crypto.randomUUID();
	
	for (let child of body.children) { 
	  child.setAttribute(&#39;data-scope&#39;, uuid);  
	}
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and some changes to the &lt;code&gt;disappear&lt;/code&gt; function in &lt;code&gt;scripts/disappearingFrame.js&lt;/code&gt; to make sure our new script tag also has the &lt;code&gt;data-scope&lt;/code&gt; attribute&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;
/* Copy the contents of the iframe into the DOM and execute scripts  */
function disappear(frame) {
  let body = (frame.contentDocument.body||frame.contentDocument);
  let children = [...body.children];
  let scope = body.children[0].getAttribute(&#39;data-scope&#39;);
  
  for(let child of children) {
    if(child.tagName === &#39;SCRIPT&#39;){
      let script = document.createElement(&#34;script&#34;);
      
      script.setAttribute(&#39;data-scope&#39;, scope);     
      script.text = child.innerHTML;
      document.head.appendChild( script ).parentNode.removeChild( script );
    } else {
      frame.before(child);
    }
  }
  
  frame.remove();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the iframe &amp;ldquo;disappears&amp;rdquo; I won&amp;rsquo;t have access to the window.frameElement. By copying this &lt;code&gt;data-scope&lt;/code&gt; attribute to every child I&amp;rsquo;ll have something to select off of. One other tweak. This works best if there is only one child with the &lt;code&gt;data-scope&lt;/code&gt; attribute. Otherwise if the fragment body has multiple children you&amp;rsquo;d need to start looping to cover all the elements. So I made the design decision that I would structure my fragment like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&#34;en&#34;&amp;gt;&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt;
  &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1&#34;&amp;gt;
  &amp;lt;meta name=&#34;robots&#34; content=&#34;noindex, nofollow&#34; /&amp;gt;
  &amp;lt;script src=&#34;https://heyloura.com/scripts/fragment.js&#34; type=&#34;text/javascript&#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;style&amp;gt;
	... my styles here
  &amp;lt;/style&amp;gt;
  &amp;lt;section&amp;gt;
	... my elements here
  &amp;lt;/section&amp;gt;
  &amp;lt;script&amp;gt;
    // * * * * *
    // inside the iframe you can access attributes on the iframe element
    // via the `window.frameElement`. Outside the iframe the attributes have
    // been copied to the script tag `document.currentScript`
    // * * * * *
    ;(async () =&amp;gt; {
      &amp;lt;!-- Executes only when copied into the parent DOM --&amp;gt;
      if(window.top == window.self) { 
        const scope = document.currentScript.getAttribute(&#39;scope&#39;);
        const fragment = document.querySelector(`section[scope=&#39;${scope}&#39;]`);
     
      } // parent DOM code       
    })(); // end IIFE
  &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The important thing is that it is one element that all the other DOM elements go within. Also, notice how the scope is grabbed. The script itself get&amp;rsquo;s tagged with the &lt;code&gt;scope&lt;/code&gt; so you can grab it using &lt;code&gt;document.currentScript.getAttribute(&#39;scope&#39;)&lt;/code&gt;. Then to be extra tricky I created a constant I called fragment that was set to &lt;code&gt;document.querySelector(&#39;section[scope=&#39;${scope}&#39;]&#39;);&lt;/code&gt;. So now we can use &lt;code&gt;fragment.querySelector&lt;/code&gt; in our code and only get elements from this instance of the fragment. Fantastic!&lt;/p&gt;
&lt;p&gt;The rest of the JavaScript code is a bit long for this post, so I&amp;rsquo;ll only call out a few items. But if you want me to go into more detail on the calendar functionality let me know below.&lt;/p&gt;
&lt;h3 id=&#34;set-events-on-the-fragment-not-the-document&#34;&gt;Set events on the fragment, not the document&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;
fragment.addEventListener(&#34;click&#34;, (event) =&gt; {
	...
}); // end click event handlers
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;dispatch-events-on-the-document-with-the-scope&#34;&gt;Dispatch events on the document with the scope&lt;/h3&gt;
&lt;p&gt;If you dispatch events with the scope&amp;hellip;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;
document.dispatchEvent(new CustomEvent(&#39;calendar-date-selected&#39;, {
  detail: {
	date: event.target.getAttribute(&#34;data-date&#34;),
	scope: scope
  } 
}));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The parent can listen for it and react&amp;hellip;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;
document.addEventListener(&#39;calendar-date-selected&#39;, function (event) {
	console.log(event.detail.date, event.detail.scope);
	// do something cool
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;set-custom-event-listeners-with-scope&#34;&gt;Set custom event listeners with scope.&lt;/h3&gt;
&lt;p&gt;If you create the event listener with the scope you can make sure the right fragment (in the case of multiples) gets the right event. I&amp;rsquo;m using this to put the dots on the calendar.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/fragments/_calendar.html&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;
// listen for custom event to render the dots on the calendar
document.addEventListener(`calendar-render-dots-${scope}`, function (event) {
  // reset the buttons
  let dayBtns = fragment.querySelectorAll(&#39;.day_picker button&#39;);
  for (let btn of dayBtns) { 
	btn.innerHTML = `${btn.getAttribute(&#34;data-day&#34;)}&lt;br/&gt;`;
  }
  
  // add in the dots
  for(let detail of event.detail) {
	var date = new Date(parseInt(detail.date));
	let btn = fragment.querySelector(`[data-day=&#39;${date.getDate()}&#39;]`);

	if(btn.getAttribute(&#34;data-date&#34;) == detail.date)
	{
	  btn.innerHTML += `&lt;span style=&#34;color: ${detail.color}&#34;&gt;•&lt;/span&gt; `;
	}
  }
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;
&amp;lt;script&amp;gt;    
  /* 
  **  calendar events 
  */
  document.addEventListener(&#39;calendar-date-selected&#39;, function (event) {
	console.log(&#39;calendar-date-selected&#39;, event.detail.date, event.detail.scope);
  });
  document.addEventListener(&#39;calendar-ready&#39;, renderDots);
  document.addEventListener(&#39;calendar-month-changed&#39;, renderDots);

  function renderDots(event) {
	if(event.detail.scope == &#34;main_calendar&#34;){
	 document.dispatchEvent(new CustomEvent(`calendar-render-dots-${ event.detail.scope }`, {
		detail: [{date: 1688875200000, color: &#39;yellow&#39; },
				 {date: 1689480000000, color: &#39;green&#39;},
				 {date: 1688616000000, color: &#39;aqua&#39;}] 
	  })); 
	}
  }
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;but-what-about-the-scoping-the-css&#34;&gt;But what about the scoping the CSS?&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s not perfect but we can get most of the way there. A good rule of thumb is to only have essential styles in the fragment. No need to make the buttons fancy, the parent can handle that. Once again we are going to lean on the &lt;code&gt;disappear&lt;/code&gt; function to help us out.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll add a check for a style tag. We can get a list of all the styles by leaning on the browser. We can create a temporary document and a copy of the style tag. By appending to this temporary document, the browser will parse it. Then we can use the &lt;code&gt;sheet.cssRules&lt;/code&gt; that lists all the style elements. Basically I loop through and split the selector on a &lt;code&gt;,&lt;/code&gt; and then for each selector prepend  &lt;code&gt;[data-scope]=scope&lt;/code&gt;. Once I have all the changes, I replace the contents of the style tag with my changes and then append it.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-js&#34;&gt;
/* Copy the contents of the iframe into the DOM and execute scripts  */
function disappear(frame) {
  let body = (frame.contentDocument.body||frame.contentDocument);
  let children = [...body.children];
  let scope = body.children[0].getAttribute(&#39;data-scope&#39;);
  
  for(let child of children) {
    if(child.tagName === &#39;SCRIPT&#39;){
      let script = document.createElement(&#34;script&#34;);
      
      script.setAttribute(&#39;data-scope&#39;, scope);     
      script.text = child.innerHTML;
      document.head.appendChild( script ).parentNode.removeChild( script );
    } 
    if(child.tagName === &#39;STYLE&#39;){
      let doc = document.implementation.createHTMLDocument(&#34;&#34;);
      let styleElement = document.createElement(&#34;style&#34;);
      styleElement.textContent = child.innerHTML;
      doc.body.appendChild(styleElement); // to compute the css rules
      child.innerHTML = &#39;&#39;;
      
      // scope out the styles
      for(var style of styleElement.sheet.cssRules) {
        let selectors = style.selectorText;
        let scoped = [];
        
        for(var selector of selectors.split(&#39;,&#39;)){
          scoped.push(`[data-scope=&#39;${scope}&#39;] ${selector}`);
        }
        
        child.innerHTML += style.cssText.replace(selectors, scoped.join(&#39;, &#39;)) + &#39; &#39;;
      }

      frame.before(child);
    }
    else {
      frame.before(child);
    }
  }
  
  frame.remove();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This method is not perfect but covers most of the css selector scenarios. Not bad for about 16 lines.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-07-14-105422.png&#34; alt=&#34;screenshot of the UI with a code behind view highlighting the css class selector changes&#34;&gt;
&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;The disappearing trick has graduated and now has a way to add scope to both the JavaScript and CSS contained within fragments. So we can use multiple of the same fragments on the same page. Also, with custom events we can interact with the parent page.&lt;/p&gt;
&lt;p&gt;The best part is, with two small script files and the html file anyone can take the calendar I built and add it to their website. &lt;a href=&#34;https://glitch.com/edit/#!/tasty-picturesque-nutmeg&#34;&gt;code&lt;/a&gt;, &lt;a href=&#34;https://tasty-picturesque-nutmeg.glitch.me&#34;&gt;preview&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;The next step is to add an event list to our calendar. This will demonstrate how two fragments can be used together for more complex interactions. But first, I&amp;rsquo;m going on vacation So stay tuned for the next post in two weeks.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/07/08/lets-code-something.html&#34;&gt;Let&amp;rsquo;s code something experimental&amp;hellip; an introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/07/09/an-experimental-take.html&#34;&gt;An experimental take on the retro website frames&amp;hellip; disappearing iframes with vanilla-js, html, and css&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/07/12/a-basic-framed.html&#34;&gt;A basic framed* website&amp;hellip; more experiments with disappearing iframes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coding a framed productivity app - building out the calendar (you are here)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Coding a framed productivity app - building an event list (upcoming)&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>A basic framed* website... more experiments with disappearing iframes</title>
      <link>https://heyloura.com/2023/07/12/a-basic-framed.html</link>
      <pubDate>Wed, 12 Jul 2023 17:40:07 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/07/12/a-basic-framed.html</guid>
      <description>&lt;h1 id=&#34;a-basic-framed-website-more-experiments-with-disappearing-iframes&#34;&gt;A basic framed* website&amp;hellip; more experiments with disappearing iframes&lt;/h1&gt;
&lt;p&gt;Want to follow along? You are going to need some basic familiarity with JavaScript, html, css, you will need a code editor and have the files served from a webserver. &lt;mark&gt;Due to iframe restrictions, this won&amp;rsquo;t work locally.&lt;/mark&gt;&lt;/p&gt;
&lt;p&gt;From my &lt;a href=&#34;https://heyloura.com/2023/07/09/an-experimental-take.html&#34;&gt;An experimental take on the retro website frames&amp;hellip; disappearing iframes with vanilla-js, html, and css&lt;/a&gt; post we know have a way of using html pages as page fragments using iframes and then making those iframes disappear. Let&amp;rsquo;s tackle a small proof of concept website using this method. We want the website to have the navigation links and footer to load in from iframes.&lt;/p&gt;
&lt;h2 id=&#34;navigating-pages&#34;&gt;Navigating pages&lt;/h2&gt;
&lt;p&gt;So let&amp;rsquo;s start with a navigation fragment. Since my website is using the small classless css library &lt;a href=&#34;https://simplecss.org/&#34;&gt;Simple.css&lt;/a&gt; we&amp;rsquo;re going to structure the main navigation like they intended. Which is basically a &lt;code&gt;nav&lt;/code&gt; tag in a &lt;code&gt;header&lt;/code&gt; tag. Simple enough. Let&amp;rsquo;s create &lt;code&gt;_nav.html&lt;/code&gt; and use our starting fragment template. &lt;em&gt;Don&amp;rsquo;t know what&amp;rsquo;s needed in the &lt;code&gt;fragmentRedirect.js&lt;/code&gt; file? Check out the previous &lt;a href=&#34;https://heyloura.com/2023/07/09/an-experimental-take.html#navigating-to-incomplete-website-fragments&#34;&gt;post&lt;/a&gt; or &lt;a href=&#34;https://glitch.com/edit/#!/dour-honeysuckle-plow&#34;&gt;code&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;robots&amp;#34; content=&amp;#34;noindex, nofollow&amp;#34; /&amp;gt;
  &amp;lt;script src=&amp;#34;fragmentRedirect.js&amp;#34; type=&amp;#34;text/javascript&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Next we&amp;rsquo;re going to add in the navigation and the links to the pages of the website.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;robots&amp;#34; content=&amp;#34;noindex, nofollow&amp;#34; /&amp;gt;
  &amp;lt;script src=&amp;#34;fragmentRedirect.js&amp;#34; type=&amp;#34;text/javascript&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;nav&amp;gt;
    &amp;lt;a href=&amp;#34;/&amp;#34;&amp;gt;Home&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;#34;/cats.html&amp;#34;&amp;gt;Cats&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;#34;/fish.html&amp;#34;&amp;gt;Fish&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;#34;/chickens.html&amp;#34;&amp;gt;Chickens&amp;lt;/a&amp;gt;
  &amp;lt;/nav&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The next step is to load our navigation into our home page so let&amp;rsquo;s create the &lt;code&gt;index.html&lt;/code&gt; file for our website including the &lt;code&gt;disappearingFrame.js&lt;/code&gt; script we made previously. Note the &lt;code&gt;aria-live&lt;/code&gt; and &lt;code&gt;aria-busy&lt;/code&gt; tags I used to mark for screen-readers where the content will be changing. This time I used &lt;code&gt;aria-live=&amp;quot;polite&amp;quot;&lt;/code&gt; to notify the user, since navigational elements are pretty important.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;title&amp;gt;A framed* website&amp;lt;/title&amp;gt;
  &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;./style.css&amp;#34; /&amp;gt;
  &amp;lt;script src=&amp;#34;disappearingFrame.js&amp;#34; type=&amp;#34;text/javascript&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;main&amp;gt;
    &amp;lt;header aria-live=&amp;#34;polite&amp;#34;&amp;gt;
      &amp;lt;h1&amp;gt;A framed&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; website&amp;lt;/h1&amp;gt;
      &amp;lt;iframe aria-busy=&amp;#34;true&amp;#34; 
        src=&amp;#34;/_navigation.html&amp;#34;
        title=&amp;#34;main navigation links&amp;#34;
        onload=&amp;#34;disappear(this)&amp;#34;&amp;gt;&amp;lt;/iframe&amp;gt;
    &amp;lt;/header&amp;gt;
  &amp;lt;/main&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is what have so far, but if you&amp;rsquo;re following along with your own code you might have noticed something as it loaded. A flash of white and the size of the header shrinking and expanding as we showed the iframe and then removed it after adding in the elements. Let&amp;rsquo;s fix that.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-07-07-181908.png&#34; alt=&#34;a screenshot of a website featuring my favorite pets. It is empty except for the main navigation elements and the title&#34;&gt;
&lt;p&gt;Luckily the white flash has been solved before and &lt;a href=&#34;https://stackoverflow.com/a/26162760&#34;&gt;StackOverflow&lt;/a&gt; was quick to point me in the right direction. It actually does something similar to what we did with iframes. It creates a script tag to hide the iframe and then when everything is loaded it re-shows the iframe. Why do that in JavaScript and not use css? Because if a user has JavaScript disabled the iframe will remain visible, which is what we want. We also don&amp;rsquo;t need to make the iframes visible at the end, because we remove them when we are done copying the content. Let&amp;rsquo;s add that to our &lt;code&gt;disappearingFrame.js&lt;/code&gt; file. Notice it&amp;rsquo;s using the IIFE pattern. Here&amp;rsquo;s what the script file looks like now:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// Hide the white flash of an iframe loading 
(function () {
    let div = document.createElement(&amp;#39;div&amp;#39;);
    let ref = document.getElementsByTagName(&amp;#39;base&amp;#39;)[0] || 
              document.getElementsByTagName(&amp;#39;script&amp;#39;)[0];

    div.innerHTML = &amp;#39;&amp;lt;style&amp;gt; iframe { visibility: hidden; } &amp;lt;/style&amp;gt;&amp;#39;;
    ref.parentNode.insertBefore(div, ref);
})();  

// Load an iframes content into the DOM
function disappear(frame) {
  let body = (frame.contentDocument.body || frame.contentDocument);
  let children = [...body.children];
  for(let child of children) {
    frame.before(child);
  }
  frame.remove();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That got rid of the flash&amp;hellip; but what about the height issue? Since the height is variable based on what you&amp;rsquo;re inserting the best way to deal with it is to set the height of the iframe to the height of the content or the parent container with some css. Here I set the height of the &lt;code&gt;header&lt;/code&gt; with a style tag. I added a little dummy content and this is what we have for &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;title&amp;gt;A framed* website&amp;lt;/title&amp;gt;
  &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;./style.css&amp;#34; /&amp;gt;
  &amp;lt;script src=&amp;#34;disappearingFrame.js&amp;#34; type=&amp;#34;text/javascript&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;style&amp;gt; body &amp;gt; header { height: 229px } &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;header aria-live=&amp;#34;polite&amp;#34;&amp;gt;
    &amp;lt;h2&amp;gt;A framed&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; website&amp;lt;/h2&amp;gt;
    &amp;lt;iframe aria-busy=&amp;#34;true&amp;#34; 
      src=&amp;#34;/_navigation.html&amp;#34;
      title=&amp;#34;main navigation links&amp;#34;
      onload=&amp;#34;disappear(this)&amp;#34;&amp;gt;&amp;lt;/iframe&amp;gt;
  &amp;lt;/header&amp;gt;
  &amp;lt;main&amp;gt;
    &amp;lt;header&amp;gt; 
      &amp;lt;h1&amp;gt;My favorite pets&amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;This website is dedicated to some of the wonderful pets
      I&amp;#39;ve had over the years.&amp;lt;/p&amp;gt;
    &amp;lt;/header&amp;gt;
  &amp;lt;/main&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Next we&amp;rsquo;ll add the footer, which is also a fragment. This one is easy.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;robots&amp;#34; content=&amp;#34;noindex, nofollow&amp;#34; /&amp;gt;
  &amp;lt;script src=&amp;#34;fragmentRedirect.js&amp;#34; type=&amp;#34;text/javascript&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;p&amp;gt;Built with 💖 by heyloura&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So the final index.html file is this&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;title&amp;gt;A framed* website&amp;lt;/title&amp;gt;
  &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;./style.css&amp;#34; /&amp;gt;
  &amp;lt;script src=&amp;#34;disappearingFrame.js&amp;#34; type=&amp;#34;text/javascript&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;style&amp;gt; body &amp;gt; header { height: 229px } &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;header aria-live=&amp;#34;polite&amp;#34;&amp;gt;
    &amp;lt;h2&amp;gt;A framed&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; website&amp;lt;/h2&amp;gt;
    &amp;lt;iframe aria-busy=&amp;#34;true&amp;#34; 
      src=&amp;#34;/_navigation.html&amp;#34;
      title=&amp;#34;main navigation links&amp;#34;
      onload=&amp;#34;disappear(this)&amp;#34;&amp;gt;&amp;lt;/iframe&amp;gt;
  &amp;lt;/header&amp;gt;
  &amp;lt;main&amp;gt;
    &amp;lt;header&amp;gt; 
      &amp;lt;h1&amp;gt;My favorite pets&amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;This website is dedicated to some of the wonderful pets
      I&amp;#39;ve had over the years.&amp;lt;/p&amp;gt;
      &amp;lt;figure&amp;gt;
        &amp;lt;img alt=&amp;#34;Orange tabby cat in the center of a lit Christmas tree&amp;#34; 
             src=&amp;#34;/photos/christmas_cat.jpg&amp;#34; /&amp;gt;
        &amp;lt;figcaption&amp;gt;
	        This is the cat who tried his best to knock down my Christmas tree.
        &amp;lt;/figcaption&amp;gt;
      &amp;lt;/figure&amp;gt;
    &amp;lt;/header&amp;gt;
  &amp;lt;/main&amp;gt;
  &amp;lt;footer aria-live=&amp;#34;off&amp;#34;&amp;gt;
    &amp;lt;iframe aria-busy=&amp;#34;true&amp;#34; 
      src=&amp;#34;/_footer.html&amp;#34;
      title=&amp;#34;the footer credits of the website&amp;#34;
      onload=&amp;#34;disappear(this)&amp;#34;&amp;gt;&amp;lt;/iframe&amp;gt;
  &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Which results in this:&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-07-07-194821.png&#34; alt=&#34;Screenshot of the website we are building with navigation, footer, and a cat stuck in a Christmas tree for content.&#34;&gt;
&lt;h2 id=&#34;update-website-navigation-to-highlight-the-current-page&#34;&gt;Update website navigation to highlight the current page.&lt;/h2&gt;
&lt;p&gt;We should probably indicate what page the user is on. But how can we do that if the navigation is in an iframe? Good question! Turns out you can, assuming you can use a little JavaScript, but we&amp;rsquo;ll need to adjust a few things first.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s test if we can pull a script tag and have it run when the content is pulled in from the iframe. Let&amp;rsquo;s adjust the &lt;code&gt;_navigation.html&lt;/code&gt; file and put a script at the bottom. Also let&amp;rsquo;s make sure we don&amp;rsquo;t run it in the iframe, only outside of it by checking if &lt;code&gt;window.top === window.self&lt;/code&gt; that way we can test if it works.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;robots&amp;#34; content=&amp;#34;noindex, nofollow&amp;#34; /&amp;gt;
  &amp;lt;script src=&amp;#34;fragmentRedirect.js&amp;#34; type=&amp;#34;text/javascript&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;nav&amp;gt;
    &amp;lt;a href=&amp;#34;/&amp;#34;&amp;gt;Home&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;#34;/cats.html&amp;#34;&amp;gt;Cats&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;#34;/fish.html&amp;#34;&amp;gt;Fish&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;#34;/chickens.html&amp;#34;&amp;gt;Chickens&amp;lt;/a&amp;gt;
  &amp;lt;/nav&amp;gt;
  &amp;lt;script&amp;gt;
    &amp;lt;!-- Don&amp;#39;t run code when in the iframe --&amp;gt;
    if(window.top === window.self) {
      alert(&amp;#39;Hello World!&amp;#39;);
    }
  &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Uh oh, that didn&amp;rsquo;t work. Turns out just inserting a script tag doesn&amp;rsquo;t work because of security concerns. Maybe that&amp;rsquo;s something the parent page can take care of when it&amp;rsquo;s pulling in the elements? Let&amp;rsquo;s give it a shot.&lt;/p&gt;
&lt;p&gt;What we need to do is detect if the element we are going to insert is a &lt;code&gt;script&lt;/code&gt; tag. Luckily we have a property that tells us that, &lt;code&gt;element.tagName&lt;/code&gt; and then we can do the trick we used to suppress the white flash of an iframe loading.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a script element.&lt;/li&gt;
&lt;li&gt;Take the contents from the iframes script tag and append it to that script.&lt;/li&gt;
&lt;li&gt;Append it to the head of the document, which causes the script to run.&lt;/li&gt;
&lt;li&gt;Then we can remove it (or not).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So here are the change to the &lt;code&gt;disappearingFrame.js&lt;/code&gt; file:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// Hide the white flash of an iframe loading
(function () {
    let div = document.createElement(&amp;#39;div&amp;#39;);
    let ref = document.getElementsByTagName(&amp;#39;base&amp;#39;)[0] || 
              document.getElementsByTagName(&amp;#39;script&amp;#39;)[0];

    div.innerHTML = &amp;#39;&amp;lt;style&amp;gt; iframe { visibility: hidden; } &amp;lt;/style&amp;gt;&amp;#39;;
    ref.parentNode.insertBefore(div, ref);
})();  

// Load an iframes content into the DOM
function disappear(frame) {
  let body = (frame.contentDocument.body || frame.contentDocument);
  let children = [...body.children];
  for(let child of children) {
    if(child.tagName === &amp;#39;SCRIPT&amp;#39;){
      let script = document.createElement(&amp;#34;script&amp;#34;);
      script.text = child.innerHTML;
      document.head.appendChild( script ).parentNode.removeChild( script );
    } else {
      frame.before(child);
    }
  }
  frame.remove();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sweet! We got the alert that time. This means we can include scripts in our fragments and then execute them. This opens up possibilities I&amp;rsquo;ll explore in the next post.&lt;/p&gt;
&lt;p&gt;So to mark our page as the current page in the navigation we can piggyback on the accessibility tag to mark the current page &lt;code&gt;aria-current=&amp;quot;page&amp;quot;&lt;/code&gt; attribute. Plus our stylesheet already styles anchor elements that have that attribute. But now we have a choice add the attribute during the iframe load or once it&amp;rsquo;s in our parent page. To keep things simple and scoped, I&amp;rsquo;m going to set the attribute from within the iframe. We&amp;rsquo;ll just need to swap around the condition of the iframe. &lt;em&gt;Note: when you pull in the script tag to the parent document, the document &lt;strong&gt;is&lt;/strong&gt; the parent. So you&amp;rsquo;ll need to be careful with using selectors.&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;robots&amp;#34; content=&amp;#34;noindex, nofollow&amp;#34; /&amp;gt;
  &amp;lt;script src=&amp;#34;fragmentRedirect.js&amp;#34; type=&amp;#34;text/javascript&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;nav&amp;gt;
    &amp;lt;a href=&amp;#34;/&amp;#34;&amp;gt;Home&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;#34;/cats.html&amp;#34;&amp;gt;Cats&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;#34;/fish.html&amp;#34;&amp;gt;Fish&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;#34;/chickens.html&amp;#34;&amp;gt;Chickens&amp;lt;/a&amp;gt;
  &amp;lt;/nav&amp;gt;
  &amp;lt;script&amp;gt;
    // check that we are in the iframe.
    if(window.top != window.self) {
      let url = document.referrer.substring(document.referrer.lastIndexOf(&amp;#39;/&amp;#39;) + 1);
      let navs = document.querySelectorAll(&amp;#39;a&amp;#39;);
      for (let nav of navs) {
        if(nav.getAttribute(&amp;#39;href&amp;#39;) == `/${url}` || 
             (nav.getAttribute(&amp;#39;href&amp;#39;) == &amp;#39;/&amp;#39; &amp;amp;&amp;amp; url == &amp;#39;index.html&amp;#39;)) {
          nav.setAttribute(&amp;#39;aria-current&amp;#39;,&amp;#39;page&amp;#39;)
        }
      }
    }
  &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;What we are doing, is that if we are in the iframe, grab the anchor tags and loop through them. Check to see if the end part of the url matches the anchor tag &lt;code&gt;href&lt;/code&gt;. We can get the url string from the &lt;code&gt;document.referrer&lt;/code&gt; but only if the iframe source is on the same primary domain as the parent page. You can click between the pages to see the highlighted navigation anchor change. Pretty sweet!&lt;/p&gt;
&lt;h2 id=&#34;dont-forget-about-the-no-js-crowd&#34;&gt;Don&amp;rsquo;t forget about the no-JS crowd&lt;/h2&gt;
&lt;p&gt;Now that we got something built, let&amp;rsquo;s see how it does if we turn JavaScript off. Everything looks fine, though the iframe pieces are not styled the same. This can be taken care of by adding a bit of styling to the &lt;code&gt;head&lt;/code&gt; section of the iframe and in the parent setting an appropriate width and height. But what happens if you click to change a page in the navigation? Disaster!&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-07-07-204952.png&#34; alt=&#34;A screenshot of the website we are building showing the nested navigation if you click when JavaScript is turned off.&#34;&gt;
&lt;p&gt;Turns out, the solution to this is pretty easy. Remember how we&amp;rsquo;re checking if the iframe is the top window in our JavaScript? You can tell anchor tags to open in the top window, by giving them the right target &lt;code&gt;target=&amp;quot;_top&amp;quot;&lt;/code&gt; so let&amp;rsquo;s make those changes.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;robots&amp;#34; content=&amp;#34;noindex, nofollow&amp;#34; /&amp;gt;
  &amp;lt;script src=&amp;#34;fragmentRedirect.js&amp;#34; type=&amp;#34;text/javascript&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;nav&amp;gt;
    &amp;lt;!-- For navigation elements make sure you add target=&amp;#34;_top&amp;#34; to the anchors --&amp;gt;
    &amp;lt;a href=&amp;#34;/&amp;#34; target=&amp;#34;_top&amp;#34;&amp;gt;Home&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;#34;/cats.html&amp;#34; target=&amp;#34;_top&amp;#34;&amp;gt;Cats&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;#34;/fish.html&amp;#34; target=&amp;#34;_top&amp;#34;&amp;gt;Fish&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;#34;/chickens.html&amp;#34; target=&amp;#34;_top&amp;#34;&amp;gt;Chickens&amp;lt;/a&amp;gt;
  &amp;lt;/nav&amp;gt;
  &amp;lt;script&amp;gt;
    if(window.top != window.self) {
      let url = document.referrer.substring(document.referrer.lastIndexOf(&amp;#39;/&amp;#39;) + 1);
      let navs = document.querySelectorAll(&amp;#39;a&amp;#39;);
      for (let nav of navs) {
        if(nav.getAttribute(&amp;#39;href&amp;#39;) == `/${url}` || 
             (nav.getAttribute(&amp;#39;href&amp;#39;) == &amp;#39;/&amp;#39; &amp;amp;&amp;amp; url == &amp;#39;index.html&amp;#39;)) {
          nav.setAttribute(&amp;#39;aria-current&amp;#39;,&amp;#39;page&amp;#39;)
        }
      }
    }
  &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And done!&lt;/p&gt;
&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Using our disappearing iframe trick we can build a basic website where the navigation and footer are in separate html pages. I&amp;rsquo;ve also shown how you can pull in Javascript from these iframes and execute it on the parent page. You can check out the result here: &lt;a href=&#34;https://glitch.com/edit/#!/decorous-atom-forger&#34;&gt;code&lt;/a&gt; - &lt;a href=&#34;https://decorous-atom-forger.glitch.me/&#34;&gt;preview&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;You can use this technique to build a basic website and split frequently repeated portions into their own fragments. Things like navigation, footers, page headers or other repeated content. The method is pretty simple and removes some of the major drawbacks the retro frame system people used in the early web. But it&amp;rsquo;s also a little more powerful than that, we now have a system that we can create a &amp;ldquo;component&amp;rdquo; with&amp;hellip; styles, html, and css all in one place. No need for a component framework, or the overhead, of something like Svelte, Vue or React and no need for anything server-side either. To challenge how far this can hold up I&amp;rsquo;m going to build a basic productivity app with this method. So stay tuned.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/07/08/lets-code-something.html&#34;&gt;Let&amp;rsquo;s code something experimental&amp;hellip; an introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/07/09/an-experimental-take.html&#34;&gt;An experimental take on the retro website frames&amp;hellip; disappearing iframes with vanilla-js, html, and css&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A basic framed website&amp;hellip; more experiments with disappearing iframes (you are here)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/07/14/coding-a-framed.html&#34;&gt;Coding a framed* productivity app - building out the calendar&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>An experimental take on the retro website frames... disappearing iframes with vanilla-js, html, and css</title>
      <link>https://heyloura.com/2023/07/09/an-experimental-take.html</link>
      <pubDate>Sun, 09 Jul 2023 15:07:20 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/07/09/an-experimental-take.html</guid>
      <description>&lt;h1 id=&#34;an-experimental-take-on-the-retro-website-frames-disappearing-iframes-with-vanilla-js-html-and-css&#34;&gt;An experimental take on the retro website frames&amp;hellip; disappearing iframes with vanilla-js, html, and css&lt;/h1&gt;
&lt;p&gt;Want to follow along? You are going to need some basic familiarity with JavaScript, html, css, and you will need a code editor. Also the files will need to be served from a webserver and not the local file system. For quick projects like this I use &lt;a href=&#34;https://glitch.com/&#34;&gt;Glitch&lt;/a&gt;. &lt;mark&gt;Why won&amp;rsquo;t it work? Because of iframe security restrictions.&lt;/mark&gt;&lt;/p&gt;
&lt;h2 id=&#34;lets-get-started&#34;&gt;Let&amp;rsquo;s Get Started&lt;/h2&gt;
&lt;p&gt;If you recall from my &lt;a href=&#34;https://heyloura.com/2023/07/08/lets-code-something.html&#34;&gt;introduction post&lt;/a&gt;, framed websites have three main issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You might navigate to the fragment page itself, thus seeing an incomplete website.&lt;/li&gt;
&lt;li&gt;Search engines wouldn&amp;rsquo;t/didn&amp;rsquo;t search the content in frames, thus impacting a sites SEO.&lt;/li&gt;
&lt;li&gt;Accessibility concerns, especially for screen readers, who can&amp;rsquo;t detect changes in one frame impacting another frame.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;navigating-to-incomplete-website-fragments&#34;&gt;Navigating to incomplete website fragments&lt;/h2&gt;
&lt;p&gt;So how can we bypass some of those issues? Let&amp;rsquo;s tackle the first one. We want to make sure that a &amp;ldquo;fragment&amp;rdquo; page isn&amp;rsquo;t accidentally indexed by search engines. Which is pretty simple to do. You can include a robots no-follow directive &lt;code&gt;&amp;lt;meta name=&amp;quot;robots&amp;quot; content=&amp;quot;noindex, nofollow&amp;quot; /&amp;gt;&lt;/code&gt; in the the &lt;code&gt;head&lt;/code&gt; section of the page. Like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;robots&amp;#34; content=&amp;#34;noindex, nofollow&amp;#34; /&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We also want to make sure that the website fragment isn&amp;rsquo;t linked to directly in the website, it needs to be in an iframe. That comes down to the website creator being careful while coding. But if JavaScript is allowed we can redirect the user back to the main website in case someone loads it on its own.&lt;/p&gt;
&lt;p&gt;What we want is to immediately invoke a function expression, &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Glossary/IIFE&#34;&gt;IIFE&lt;/a&gt;, that checks if the fragment page is running in an iframe, the method we are going to use to embed it, and if it is not, redirect the user. So how can we tell if it&amp;rsquo;s in an iframe? We can use the window object. We can check to see what the top window is, and if it&amp;rsquo;s the iframe we should bail i.e. &lt;code&gt;window.self === window.top&lt;/code&gt; and redirect the user. We can put this right in the head section of the document so that the redirect happens as fast as possible.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;robots&amp;#34; content=&amp;#34;noindex, nofollow&amp;#34; /&amp;gt;
  &amp;lt;script&amp;gt;
    ;(function () {
      if(window.self === window.top) {
        window.location.replace(&amp;#34;/&amp;#34;);
      }
    })();
  &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So now we&amp;rsquo;ve mostly taken care of the first point and as long as the website creator is careful to not link to frame sources directly we should be in a pretty good spot.&lt;/p&gt;
&lt;p&gt;Now to make things a little less busy in our fragment page, let&amp;rsquo;s put the script in it&amp;rsquo;s own file,  I&amp;rsquo;m calling mine &lt;code&gt;fragmentRedirect.js&lt;/code&gt; and we will call the fragment &lt;code&gt;_pets.html&lt;/code&gt; since I&amp;rsquo;m going to have it list some common pets. The underscore is just a naming notation I am following to tell me at a glance that this is not a standalone html page, but a fragment of one meant to be embedded.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;robots&amp;#34; content=&amp;#34;noindex, nofollow&amp;#34; /&amp;gt;
  &amp;lt;script src=&amp;#34;fragmentRedirect.js&amp;#34; type=&amp;#34;text/javascript&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;p&amp;gt;Common pets:&amp;lt;/p&amp;gt;
  &amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;Cats&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;Dogs&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;Fish&amp;lt;/li&amp;gt;
  &amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;the-disappearing-iframe&#34;&gt;The disappearing iframe&lt;/h2&gt;
&lt;p&gt;What if we could take the body of the iframe and replace itself in the parent document? Then there would be no frame to get in the way of seo and accessibility. This is something we can do, but we&amp;rsquo;re going to need JavaScript to do it.&lt;/p&gt;
&lt;p&gt;&lt;mark&gt;For security reasons this will only work if your iframe sources are on the same website domain&lt;/mark&gt;. Why? &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS&#34;&gt;CORS&lt;/a&gt;. So no using this trick to get third-party content 🙃&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m assuming you can set up a basic &lt;code&gt;index.html&lt;/code&gt; page to be the root of the website. This is my starting page with a catchy title. The &lt;code&gt;&amp;lt;sup&amp;gt;&lt;/code&gt; tag, is the superscript tag, which makes the asterisk small and aligned to the top of the line. One of the easiest ways to help with accessibility is to use the semantic HTML5 tags. With the added bonus that they make the HTML easier to read.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;title&amp;gt;A framed* website&amp;lt;/title&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;main&amp;gt;
    &amp;lt;header&amp;gt;&amp;lt;h2&amp;gt;A framed&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; website&amp;lt;/h2&amp;gt;&amp;lt;/header&amp;gt;
  &amp;lt;/main&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We should put in a bit of styling. I prefer small classless css libraries so I added in &lt;a href=&#34;https://simplecss.org/&#34;&gt;Simple.css&lt;/a&gt;. You can download it and then host it, my preference is to put it in a file named &lt;code&gt;style.css&lt;/code&gt; or you can link to the CDN. Let&amp;rsquo;s also embed the website fragment, &lt;code&gt;_pets.html&lt;/code&gt;, we made above. Notice the iframe has a &lt;code&gt;title&lt;/code&gt;, that&amp;rsquo;s for accessibility. It lets a screen reader know what it can expect to find in your iframe.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;title&amp;gt;A framed* website&amp;lt;/title&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;/style.css&amp;#34; /&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;main&amp;gt;
    &amp;lt;header&amp;gt;&amp;lt;h2&amp;gt;A framed&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; website&amp;lt;/h2&amp;gt;&amp;lt;/header&amp;gt;
    &amp;lt;iframe 
	    src=&amp;#34;/_pets.html&amp;#34;
	    title=&amp;#34;a list of common pets&amp;#34;&amp;gt;&amp;lt;/iframe&amp;gt;
  &amp;lt;/main&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Let&amp;rsquo;s take a look:&lt;/p&gt;
&lt;p&gt;Not too bad. We can see our list of common pets on the page. You can see the content even if JavaScript is off, which is excellent. But it&amp;rsquo;s still in an iframe.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/screenshot-2023-07-07-080508.png&#34; alt=&#34;a screenshot of the website from the above html that has the title &#39;A framed website&#39; and a list of common pets&#34;&gt;
&lt;p&gt;We&amp;rsquo;re going to need to add some JavaScript for this next part, making it disappear. And I don&amp;rsquo;t mean deleting it. I mean taking the content of the iframe, appending it into our parent page, and then deleting the iframe. Here&amp;rsquo;s a screen shot of what I mean:&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/byebyeiframe2.png&#34;  alt=&#34;two screenshots of the website with code-behind showing. One has the iframe tag still in it and the other doesn&#39;t&#34;&gt;
&lt;p&gt;Now the iframe tag has an onload attribute that you can use to execute some JavaScript when it&amp;rsquo;s done loading. Which is exactly what we want. I avoided the addEventListener method because there is a chance that by the time that even listener gets added, the iframe content is already loaded. I got the idea to make the iframe disappear from this blog post &lt;a href=&#34;https://www.filamentgroup.com/lab/html-includes/&#34;&gt;HTML Includes That Work Today | Filament Group, Inc.&lt;/a&gt; and tweaked the method.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;title&amp;gt;A framed* website&amp;lt;/title&amp;gt;
  &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;./style.css&amp;#34; /&amp;gt;
  &amp;lt;script&amp;gt;
    function disappear(frame) {
      let body = (frame.contentDocument.body || frame.contentDocument);
      let children = [...body.children];
      for(let child of children) {
        frame.before(child);
      }
      frame.remove();
    }
  &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;main&amp;gt;
    &amp;lt;header&amp;gt;
      &amp;lt;h1&amp;gt;A framed&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; website&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;
    &amp;lt;iframe 
	    src=&amp;#34;/_pets.html&amp;#34;
	    title=&amp;#34;a list of common pets&amp;#34;
        onload=&amp;#34;disappear(this)&amp;#34;&amp;gt;&amp;lt;/iframe&amp;gt;
  &amp;lt;/main&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;disappear&lt;/code&gt; function first tries to find the &lt;code&gt;body&lt;/code&gt; element of the loaded iframe and from that the children elements. The children nodes are a live list that reflect the changes in the DOM. Which means, to be safe, we should copy this into an array first. Then we iterate over the children and into the DOM of the parent page using &lt;code&gt;frame.before()&lt;/code&gt;. The final step once everything is copied over is to remove itself from the DOM with &lt;code&gt;frame.remove()&lt;/code&gt;.  Now there are quite a few improvements we can make to that function and some needed error checking, but for right now it gets the job done.&lt;/p&gt;
&lt;h2 id=&#34;seo-and-accessibility-concerns&#34;&gt;SEO and accessibility concerns&lt;/h2&gt;
&lt;p&gt;What about SEO and what about accessibility? The biggest issue with both is that they are not aware of dynamically loaded content. Though in 2023 the big search engines do crawl sites loaded with content via JavaScript. I couldn&amp;rsquo;t find any concrete sources, but my searching seemed to indicate that as long as the content updated dynamically happens quickly then there shouldn&amp;rsquo;t be a problem indexing it. But just in case, leave the content rich portions of your website out of the framed fragments.&lt;/p&gt;
&lt;p&gt;Now onto accessibility. A lot of accessibility issues come from the markup of the HTML and leaving important attributes off of tags. People seldom fill out the &lt;code&gt;alt&lt;/code&gt; tags on images or if they do, then not in a meaningful way. Using semantic html tags also helps with accessibility  There are also &lt;code&gt;aria-&lt;/code&gt; attributes that can be added to tags to further increase accessibility.&lt;/p&gt;
&lt;p&gt;The biggest accessibility drawback to this disappearing iframe approach is that there is no notification, that say a screen reader detect, to the change when the iframe content is pulled in and the iframe deleted. So we&amp;rsquo;re going to need to tell it. There is an &lt;code&gt;aria-live&lt;/code&gt; tag that let&amp;rsquo;s screen readers and assistive technology know that a region of the page is dynamic and an &lt;code&gt;aria-busy&lt;/code&gt; attribute which helps indicate what is being actively modified. The &lt;code&gt;aria-live&lt;/code&gt; tag isn&amp;rsquo;t something you want to add in dynamically, so I put it on a &lt;code&gt;section&lt;/code&gt; tag around the iframe that I marked with the &lt;code&gt;aria-busy&lt;/code&gt; attribute. You may of noticed I set &lt;code&gt;aria-live=&amp;quot;off&amp;quot;&lt;/code&gt;. This simply means the screen reader won&amp;rsquo;t interrupt the user with the update unless they are focused on that element. We could use &lt;code&gt;aria-live=&amp;quot;polite&amp;quot;&lt;/code&gt; if we wanted to tell the user. But avoid &lt;code&gt;aria-live=&amp;quot;assertive&amp;quot;&lt;/code&gt; since that&amp;rsquo;s really only for critical updates and interrupts the screen reader.&lt;/p&gt;
&lt;p&gt;The JavaScript for the frames I moved into a file called &lt;code&gt;disappearingFrames.js&lt;/code&gt; and I linked it in the head of the html document. Here is the final result of the index.html page:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;title&amp;gt;A framed* website&amp;lt;/title&amp;gt;
  &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;
  &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;
  &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;/style.css&amp;#34; /&amp;gt;
  &amp;lt;script src=&amp;#34;disappearingFrames.js&amp;#34; type=&amp;#34;text/javascript&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;main&amp;gt;
    &amp;lt;header&amp;gt;&amp;lt;h2&amp;gt;A framed&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt; website&amp;lt;/h2&amp;gt;&amp;lt;/header&amp;gt;
    &amp;lt;section aria-live=&amp;#34;off&amp;#34;&amp;gt;
	  &amp;lt;iframe aria-busy 
	    src=&amp;#34;/_pets.html&amp;#34;
	    title=&amp;#34;a list of common pets&amp;#34;
	    onload=&amp;#34;disappear(this)&amp;#34;&amp;gt;&amp;lt;/iframe&amp;gt;
    &amp;lt;/section&amp;gt;
  &amp;lt;/main&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;You can make iframes disappear using JavaScript by appending the contents to the parent page (same domain restriction applies). We can use this as the start of template system for a website.  You can check out the result here: &lt;a href=&#34;https://glitch.com/edit/#!/dour-honeysuckle-plow&#34;&gt;code&lt;/a&gt; - &lt;a href=&#34;https://dour-honeysuckle-plow.glitch.me/&#34;&gt;preview&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;So now we have a small proof of concept that has a different approach on using iframes in a framed website context. But to make sure this really works, we need to build something a bit more substantial. So next up, let&amp;rsquo;s put together a basic website with this approach.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/07/08/lets-code-something.html&#34;&gt;Let&amp;rsquo;s code something experimental&amp;hellip; an introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An experimental take on the retro website frames. (you are here)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/07/12/a-basic-framed.html&#34;&gt;A basic framed* website… more experiments with disappearing iframes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/07/14/coding-a-framed.html&#34;&gt;Coding a framed* productivity app - building out the calendar&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Let&#39;s code something experimental... an introduction</title>
      <link>https://heyloura.com/2023/07/08/lets-code-something.html</link>
      <pubDate>Sat, 08 Jul 2023 10:00:00 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/07/08/lets-code-something.html</guid>
      <description>&lt;p&gt;If you can&amp;rsquo;t tell from my blog design, I&amp;rsquo;ve been on a bit of a retro website kick. I find them nostalgic and fun and I kind of miss the days where personal websites were a surprise to look at. A few weeks ago I was wasting some time browsing on &lt;a href=&#34;https://neocities.org/&#34;&gt;Neocities&lt;/a&gt; when I came across an old-school framed website. A website that kept its structure, like navigation, in separate html files that were then loaded into the main page with frames. What a blast from the past. But that got me thinking, why did we move away from them?&lt;/p&gt;
&lt;p&gt;Well, one frustrating search later and the consensus seems to be that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You might navigate to the template? fragment? page, thus seeing an incomplete website.&lt;/li&gt;
&lt;li&gt;Search engines wouldn&amp;rsquo;t search the content in frames, which impacted a sites SEO&lt;/li&gt;
&lt;li&gt;Then the accessibility concerns, especially for screen readers, who can&amp;rsquo;t detect changes in one frame impacting another frame.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Okay, well then&amp;hellip; what were the strengths? People used them for a reason after all.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Without modern tools or a back-end server, website creators had to copy the same structure over-and-over for every page of their website. So if they added a new navigation link&amp;hellip; they needed to update every page that they had. Frames got rid of that. Define your navigation in one place and just link that in all your other files.&lt;/li&gt;
&lt;li&gt;Frames reduce bandwidth and server load, because the same content does not need to be loaded every time.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now that first strength stood out to me and itched at the back of my brain. Then came a blog post from Chris over at Go Make Things: &lt;a href=&#34;https://gomakethings.com/modern-developer-tooling-is-bad-for-developers-actually/&#34;&gt;Modern developer tooling is bad for developers, actually&lt;/a&gt;  which is something I&amp;rsquo;ve been thinking about over the last few years. Along with how almost everything in web development is complicated, fragile, and inaccessible to the lay person.&lt;/p&gt;
&lt;p&gt;So then I thought about frames again&amp;hellip; and I opened a code editor and started playing around. I wanted to build something, that didn&amp;rsquo;t require build tools or other modern tooling, but still had that self-contained feel that &lt;a href=&#34;https://svelte.dev/&#34;&gt;Svelte&lt;/a&gt; and &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Web_components&#34;&gt;Web Components&lt;/a&gt; brought into my life, specifically that the css, js, and html are all in one place. I wanted no dependencies and something flexible enough that it could be a static website/blog, functional without JavaScript, or maybe even a basic web application (with some JavaScript).&lt;/p&gt;
&lt;p&gt;I came up with something I kind of dig. It&amp;rsquo;s not polished and a little bit strange, but I&amp;rsquo;m going to share it anyway with a series of blog posts every few days. I&amp;rsquo;m calling it framed*.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Let&amp;rsquo;s code something experimental&amp;hellip; an introduction (you are here)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/07/09/an-experimental-take.html&#34;&gt;An experimental take on the retro website frames.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/07/12/a-basic-framed.html&#34;&gt;A basic framed* website… more experiments with disappearing iframes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/07/14/coding-a-framed.html&#34;&gt;Coding a framed* productivity app - building out the calendar&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A good idea? Maybe, maybe not. A fun one to scratch a coding itch? Yes!&lt;/p&gt;
&lt;p&gt;Hope you enjoy 🤪&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Idea: Mini-adventure cards</title>
      <link>https://heyloura.com/2023/05/14/im-rather-excited.html</link>
      <pubDate>Sun, 14 May 2023 10:39:34 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/05/14/im-rather-excited.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m rather excited to run a Dungeon Crawl Classics game in a couple weeks. I&amp;rsquo;ve been making some mini-adventure cards to have on hand for inspiration. After trying out a couple of card sizes I think I like the 5inx7in format the best.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/d2fe667279.jpg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;Journal page with 5in by 7in rectangle containing an adventure concept and map for a Dungeon Crawl Classics game. &#34;&gt;
</description>
    </item>
    
    <item>
      <title>Logseq or Obsidian, I can&#39;t decide</title>
      <link>https://heyloura.com/2023/05/13/logseq-or-obsidian.html</link>
      <pubDate>Sat, 13 May 2023 07:06:38 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/05/13/logseq-or-obsidian.html</guid>
      <description>&lt;p&gt;About a month ago I decided that I wanted to try &lt;a href=&#34;https://logseq.com/&#34;&gt;Logseq&lt;/a&gt;. I had downloaded &lt;a href=&#34;https://obsidian.md/&#34;&gt;Obsidian&lt;/a&gt; earlier in the year and never really used it and mostly forgot about it. Until I was inspired to &lt;a href=&#34;https://heyloura.com/2023/04/04/as-part-of.html&#34;&gt;clean up my digital subscriptions&lt;/a&gt; back in April. One thing I did was cancel my budgeting solution, YNAB, and start building out my own little budget tracker. Another part of that was letting go of Notion. While I really enjoyed using Notion, I didn&amp;rsquo;t feel like I used it enough to justify paying for it and it had become so overgrown I felt lost and discouraged when I opened it. So I went looking for something that would fill that knowledge management gap.&lt;/p&gt;
&lt;h2 id=&#34;logseq&#34;&gt;Logseq&lt;/h2&gt;
&lt;p&gt;I downloaded Logseq to try it out and kept with it for a little over two weeks to get a feel for it. I watched lots of videos, I tested out various ways of organizing my information and taking daily notes.&lt;/p&gt;
&lt;h3 id=&#34;the-good&#34;&gt;The Good&lt;/h3&gt;
&lt;p&gt;I love the outlining first approach. It&amp;rsquo;s how I naturally approach taking notes on paper so having first class support for it out of the box was wonderful. I loved how the daily notes were all on the main page and scrollable. I enjoyed the built in todo&amp;rsquo;s and time tracking. It felt a lot more effortless then Obsidian to put in information. Here is a screenshot, from the Android application, of the home screen. Clean and simple.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/6cd97cce2c.png&#34; height=&#34;400&#34; alt=&#34;&#34; /&gt;
&lt;p&gt;I wrote far more in Logseq then I did in Obsidian during its two week trial. It was more effortless and it might be silly but those little bullet list icons really help me. I really enjoyed how detailed the &amp;ldquo;Linked&amp;rdquo; and &amp;ldquo;Unlinked&amp;rdquo; references are in Logseq, and how you could change information within those linked references and it doesn&amp;rsquo;t make you navigate screens like it does in the Obsidian app.&lt;/p&gt;
&lt;h3 id=&#34;the-bad&#34;&gt;The Bad&lt;/h3&gt;
&lt;p&gt;The query language frustrated me to no end. I love being able to quickly tweak a dataview, plugin needed, in Obsidian. In logseq the documentation, videos, and tutorials all around queries are lacking. So if I were to go all in with Logseq that&amp;rsquo;s something I&amp;rsquo;d need to rectify to really harness Logseq&amp;rsquo;s power. Here&amp;rsquo;s what I mean.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/d5fc60b99d.png&#34; width=&#34;600&#34; height=&#34;412&#34; alt=&#34;&#34; /&gt;
&lt;p&gt;Files, files, files. Logseq creates markdown files for you every time you tag something. And keeping those files in sync across devices I found pretty frustrating. I&amp;rsquo;m using &lt;a href=&#34;https://syncthing.net/&#34;&gt;Syncthing&lt;/a&gt;, because I&amp;rsquo;m trying really hard not to pick up any new subscriptions, and I kept losing files or having lots of empty ones appear with partially typed out file names. It was pretty bad on the Android app, where if the app lost focus while you were typing in a tag, it will make an empty page&amp;hellip; even if you haven&amp;rsquo;t finished typing the name out.&lt;/p&gt;
&lt;p&gt;If you go under the hood and view the files they are all in one directory with no organization. I know that shouldn&amp;rsquo;t bother me, but it kinda does.&lt;/p&gt;
&lt;p&gt;Those frustrations and the fact that I couldn&amp;rsquo;t make a quick expense tracker, since I don&amp;rsquo;t have the query chops yet, convinced me to give Obsidian a two week trial as well.&lt;/p&gt;
&lt;p&gt;Which brings me to the last con on my list. Logseq, since it&amp;rsquo;s outliner based, starts everything with a list in Markdown. That annoyed me when bringing my files over to Obsidian.&lt;/p&gt;
&lt;h2 id=&#34;obsidian&#34;&gt;Obsidian&lt;/h2&gt;
&lt;p&gt;I loved how I was able to quickly import my &lt;a href=&#34;https://johnnydecimal.com/&#34;&gt;Johnny Decimal&lt;/a&gt; folder structure into Obsidian and feel right at home. I also enjoyed the numerous tutorials that I found. There are far more video tutorials for Obsidian then there are for Logseq. There was even a built in expense ledger, though I had to abandon it when I learned it didn&amp;rsquo;t work on mobile devices.&lt;/p&gt;
&lt;p&gt;It didn&amp;rsquo;t take much time at all to create a little budget tracking system in Obsidian either. Which I&amp;rsquo;ll write up in detail at somepoint and post here on my blog.  All it took was a couple of plugins, &lt;a href=&#34;https://github.com/blacksmithgu/obsidian-dataview&#34;&gt;DataView&lt;/a&gt; and &lt;a href=&#34;https://github.com/chhoumann/quickadd&#34;&gt;QuickAdd&lt;/a&gt; and I was off.&lt;/p&gt;
&lt;h3 id=&#34;the-good-1&#34;&gt;The Good&lt;/h3&gt;
&lt;p&gt;In Obsidian you have full control over the files it makes and you are able to organize them how you like. You can kinda/sorta use namespaces in Logseq to get something similar, but it&amp;rsquo;s not really. Plus I had a much easier time keeping files across my phone and my linux computer synced. Also, Obsidian syncs the plugins and theme setup as well. Which makes it more consistent across devices.&lt;/p&gt;
&lt;p&gt;There are so many plugins and some of them a really powerful. Plus there is one for Micro.blog called &lt;a href=&#34;https://github.com/otaviocc/obsidian-microblog&#34;&gt;Micro.Publish&lt;/a&gt;. I used it after writing up this up to upload it as a draft 😊.&lt;/p&gt;
&lt;h3 id=&#34;the-bad-1&#34;&gt;The Bad&lt;/h3&gt;
&lt;p&gt;I just haven&amp;rsquo;t been using Obsidian to write and connect things. There&amp;rsquo;s something to be said about just writing stuff down and not worrying where the file will physically end up, which is Logseqs&amp;rsquo; approach to knowledge management. My daily notes right now in Obsidian are really just my list of expenses and a couple of tasks. Even after spending a dedicated timr making sure i was using bullet points when note taking, it didn&amp;rsquo;t help.&lt;/p&gt;
&lt;h2 id=&#34;so-what-now&#34;&gt;So What Now?&lt;/h2&gt;
&lt;p&gt;I have no idea 😆. Half the purpose of writing this out was to help me figure it out. I am certain that I don&amp;rsquo;t want to use both. I want simple, and not wondering where I should put something. I have more cons listed for Logseq but when it came down to it, I did use it more.&lt;/p&gt;
&lt;p&gt;Feel free to leave me a comment down below if you&amp;rsquo;ve used either of these apps and what your thoughts are.&lt;/p&gt;
&lt;p&gt;Thanks for reading - Loura&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Session One - Portal Under the Stars - 1.1</title>
      <link>https://heyloura.com/2023/01/25/session-one-portal.html</link>
      <pubDate>Wed, 25 Jan 2023 16:02:57 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/01/25/session-one-portal.html</guid>
      <description>&lt;p&gt;This contain spoilers for the &lt;a href=&#34;https://goodman-games.com/store/dungeon-crawl-classics/&#34;&gt;Dungeon Crawl Classics&lt;/a&gt; level 0 funnel adventure &lt;a href=&#34;https://goodman-games.com/portal/&#34;&gt;The Portal Under the Stars by Goodman Games&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To go to the start of this adventure visit my post - &lt;a href=&#34;https://heyloura.com/2023/01/24/dungeon-crawler-classics.html&#34;&gt;Dungeon Crawler Classics - Solo Play&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;session-one&#34;&gt;Session One&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&#34;polaroid&#34;&gt;
  &lt;span class=&#34;polaroid-frame&#34;&gt;
    &lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/4503c44e68.png&#34; alt=&#34;portal in the trees during a starry night with a doorway&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;/span&gt;
  &lt;svg class=&#34;photo-dagger&#34; viewBox=&#34;0 0 40 40&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
  
  &lt;g transform=&#34;rotate(-8 20 20)&#34;&gt;
    
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;2.4&#34; fill=&#34;#d4a017&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;circle cx=&#34;20&#34; cy=&#34;6&#34; r=&#34;0.8&#34; fill=&#34;#b02a2a&#34;/&gt;
    
    &lt;rect x=&#34;18&#34; y=&#34;8.5&#34; width=&#34;4&#34; height=&#34;7&#34; fill=&#34;#6a3f18&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;10.5&#34; x2=&#34;22&#34; y2=&#34;10.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;12&#34; x2=&#34;22&#34; y2=&#34;12&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    &lt;line x1=&#34;18&#34; y1=&#34;13.5&#34; x2=&#34;22&#34; y2=&#34;13.5&#34; stroke=&#34;#3a2010&#34; stroke-width=&#34;0.3&#34;/&gt;
    
    &lt;rect x=&#34;14&#34; y=&#34;15.5&#34; width=&#34;12&#34; height=&#34;2&#34; rx=&#34;0.5&#34; fill=&#34;#a37a1a&#34; stroke=&#34;#5a3e08&#34; stroke-width=&#34;0.4&#34;/&gt;
    
    &lt;polygon points=&#34;18.5,17.5 21.5,17.5 21,34 20,36 19,34&#34; fill=&#34;#d8d8e0&#34; stroke=&#34;#3a3a45&#34; stroke-width=&#34;0.4&#34;/&gt;
    &lt;line x1=&#34;20&#34; y1=&#34;18.5&#34; x2=&#34;20&#34; y2=&#34;34&#34; stroke=&#34;#9a9aa6&#34; stroke-width=&#34;0.35&#34;/&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Being a peasant is hard but maybe your luck is about to turn around. The stars have aligned in a strange pattern and that old tale you heard so long ago maybe wasn&amp;rsquo;t as foolish as you thought. Sure enough there is a shimmering portal right in front of you, just outside of town near that old and strange rock formation. There are riches there, you&amp;rsquo;re sure of it. And you&amp;rsquo;re not so sure it&amp;rsquo;ll still be there if you take the time to wander back home and grab more supplies. It&amp;rsquo;s been a hard and long winter and didn&amp;rsquo;t the tale promise vast riches inside? You decide it&amp;rsquo;s time to take a chance and make it big. So you step through the strange bluish light and to your utter astonishment it looks like a good dozen or more of the town&amp;rsquo;s folk had the same idea as you. You shuffle closer towards them into the stone hallway and unconsciously group up next to some familiar faces. At least you don&amp;rsquo;t need to ransack the crazy war-wizard&amp;rsquo;s hideout alone.&lt;/p&gt;
&lt;h3 id=&#34;the-not-so-brave-adventure-party&#34;&gt;The Not So Brave Adventure Party&lt;/h3&gt;
&lt;p&gt;With some hushed arguments and a fair amount of shoving all sixteen brave-ish souls eventually formed four groups and one &amp;ldquo;lucky&amp;rdquo; soul was picked to march in front. You did notice that the crafty and more persuasive folks weren&amp;rsquo;t the ones out in front. They made themselves cozy in the back of their groups. Also, there were a few animals milling about as well. Who ever heard of a cow brought along in ransacking a dungeon? And was that a falcon on the elf&amp;rsquo;s arm? You grip your own &amp;ldquo;weapon&amp;rdquo;. It was better than nothing, and from the sounds of it your group was ready to begin exploring this hall and the strange door at the end of it.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Group One&lt;/th&gt;
          &lt;th&gt;Group Two&lt;/th&gt;
          &lt;th&gt;Group Three&lt;/th&gt;
          &lt;th&gt;Group Four&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Golda &lt;br/&gt; Woodcutter&lt;/td&gt;
          &lt;td&gt;Gared &lt;br/&gt; Caravan guard&lt;/td&gt;
          &lt;td&gt;Fred &lt;br/&gt; Dwarven miner&lt;/td&gt;
          &lt;td&gt;Thudle &lt;br/&gt; Dwarven miner&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Mara &lt;br/&gt; Halfling chicken butcher&lt;/td&gt;
          &lt;td&gt;Wisia &lt;br/&gt; Turnip farmer&lt;/td&gt;
          &lt;td&gt;Walter &lt;br/&gt; Rice farmer&lt;/td&gt;
          &lt;td&gt;Leth &lt;br/&gt; Fortune-teller&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Rime &lt;br/&gt; Butcher&lt;/td&gt;
          &lt;td&gt;Reda &lt;br/&gt; Dwarven miner&lt;/td&gt;
          &lt;td&gt;Oror &lt;br/&gt; Elven artisan&lt;/td&gt;
          &lt;td&gt;Mabell &lt;br/&gt; Fortune-teller&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Palard &lt;br/&gt; Halfling glovemaker&lt;/td&gt;
          &lt;td&gt;Browe &lt;br/&gt; Wheat farmer&lt;/td&gt;
          &lt;td&gt;Anelen &lt;br/&gt; Elven falconer&lt;/td&gt;
          &lt;td&gt;Clatte &lt;br/&gt; Wizard&amp;rsquo;s apprentice&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;area-11---the-portal-entrance&#34;&gt;Area 1.1 - The Portal Entrance&lt;/h3&gt;
&lt;p&gt;While you waited for anyone to do anything, you appreciated how the entrance faded from the stone ruins you came in from to seamlessly becoming solid flagstones under your feet. Even the starlight filtered in from behind you. Down the hallway you could see that there was a large solid wooden door. It appeared to be banded with iron and was decorated with jewels in an odd assortment of star shapes and some unreadable inscription. You&amp;rsquo;d need to get closer to the door to figure out if that pattern meant anything. Your group came up with a plan and from the muttering around you it sounds like the other groups did as well. Even though you all had a rough game plan, nobody wanted to take the first step further inward. Eventually Gared, leading group two began heading to the door.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Group&lt;/th&gt;
          &lt;th&gt;Initiative&lt;/th&gt;
          &lt;th&gt;Action One&lt;/th&gt;
          &lt;th&gt;Action Two&lt;/th&gt;
          &lt;th&gt;Action Three&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;One&lt;/td&gt;
          &lt;td&gt;17&lt;/td&gt;
          &lt;td&gt;inspect the entrance&lt;/td&gt;
          &lt;td&gt;go to door&lt;/td&gt;
          &lt;td&gt;inspect the door&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Two&lt;/td&gt;
          &lt;td&gt;18&lt;/td&gt;
          &lt;td&gt;go to the door&lt;/td&gt;
          &lt;td&gt;look for traps&lt;/td&gt;
          &lt;td&gt;try and open door&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Three&lt;/td&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;study the star shapes on door&lt;/td&gt;
          &lt;td&gt;inspect the hallway&lt;/td&gt;
          &lt;td&gt;check back on entrance&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Four&lt;/td&gt;
          &lt;td&gt;16&lt;/td&gt;
          &lt;td&gt;check hall for traps&lt;/td&gt;
          &lt;td&gt;inspect the door&lt;/td&gt;
          &lt;td&gt;open the door&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You watched as he jostled the door handle. Locked. Another group attempted to find hidden clues around the entrance, but came up empty (DC 14, rolled 5). There were no traps in the hallway, group four deduced this fact given that the second group waltzed right over to the door. But they double checked it anyway. The last group sent their best and brightest to decipher the meaning behind the door&amp;rsquo;s inscription (DC 20, rolled 13) but even they couldn&amp;rsquo;t make any sense of it. So everyone tried again, each replacing each other and trying anew. But once again all failed in their endeavor.&lt;/p&gt;
&lt;p&gt;At last Gared attempted to pry open the door with brute strength. As a caravan guard one would think he could handle breaking open a door, but alas, his muscles failed him. He made a good show of it to impress the others (DC 15 STR, rolled 3) but his terror at what might lie behind the door caused him to falter in his task. While the groups wandered about the hallway and argued over who should try forcing open the door again, Walter, once again near the entrance, had a sudden flash of insight. The stars on the door were constellations! And in fact, in just a couple of hours the sky outside would probably match that pattern.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re not sure whether Walter convinced the others to wait the couple of hours to try opening the door, or if it just took that long for Gared or anyone else to overcome their fear enough to try and break the door open again. But either way, when Gared finally grabbed the door handle, the door swung open effortlessly and beyond it lay another dark hallway.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Wearing my DM hat: Mon did I roll poorly for the characters. But luck saved the day and they got through unharmed by the trap on the door, which would have triggered if it had been forced open. The poor peasants have gained 1 XP. Below are the notes I took as I was working through&lt;/em&gt;&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/88328/2023/2fd5a86d29.jpg&#34; width=&#34;600&#34; height=&#34;685&#34; alt=&#34;&#34; /&gt;
</description>
    </item>
    
    <item>
      <title>Dungeon Crawler Classics - Trying Out Solo Play</title>
      <link>https://heyloura.com/2023/01/24/dungeon-crawler-classics.html</link>
      <pubDate>Tue, 24 Jan 2023 15:55:25 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2023/01/24/dungeon-crawler-classics.html</guid>
      <description>&lt;p&gt;I haven&amp;rsquo;t played a good table-top, dice slinging, rpg game in about six years. So the urge to play has been building for a while. But my schedule is absolutely packed to the brim and my old game friends also have schedules that are equally packed. There isn&amp;rsquo;t a way to fit in a gaming session with any regularity. Then Wizards of the Coast pissed off a huge portion of the D&amp;amp;D community with some rumored changes to their OGL and I decided to look around and see what else was out there. I came across several new-to-me rpg systems and I wanted to give them a try. Could I somehow play one by myself? Turns out many others have had the same thought and there are quite a few different ways to go about it.&lt;/p&gt;
&lt;p&gt;I could look for a system geared towards solo play or pick up an indie pdf that &amp;ldquo;solo-izes&amp;rdquo; a typical group play system. There are also random tables galore on the web that I could roll against and techniques of using dice to answer &amp;ldquo;yes/no&amp;rdquo; or likert scale questions to try and run my own campaign&amp;hellip; with myself.&lt;/p&gt;
&lt;p&gt;But what I wanted was to play &lt;a href=&#34;https://goodman-games.com/store/dungeon-crawl-classics/&#34;&gt;Dungeon Crawl Classics&lt;/a&gt; with the free pdf lite rules and the little adventure printed in the back. I did see another blog post of someone else trying this out. You can see it here &lt;a href=&#34;https://lonedimension.wordpress.com/2019/09/19/portal-under-the-stars-dcc-rpg/&#34;&gt;Portal under the Stars – DCC RPG&lt;/a&gt; but I didn&amp;rsquo;t read much of the post since I didn&amp;rsquo;t want to spoil the adventure.&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;m gonna give it a shot and jot down how I&amp;rsquo;m approaching solo play and what&amp;rsquo;s happening to my poor party as they enter the dungeon.&lt;/p&gt;
&lt;h2 id=&#34;solo-play-approach&#34;&gt;Solo Play Approach&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Dungeon Crawler Classics uses a dungeon against a randomized group of level 0 peasants to generate characters. This process is called the funnel. I used the &lt;a href=&#34;https://www.purplesorcerer.com/create_party.php&#34;&gt;Purple Sorcerer - 0-Level Party &amp;amp; Tourney Generator&lt;/a&gt; to roll up 16 characters and then used a random fantasy name generator to give them names. Any character that makes it out alive can become a proper level one character and is ready to have more adventures.&lt;/li&gt;
&lt;li&gt;I kept my characters grouped as they were on the random generator printout, which printed them out, four to a page.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m printed out the adventure and covered it with sticky notes. The only thing visible to start is the italicized player introduction text.&lt;/li&gt;
&lt;li&gt;My initial approach is to write down a series of actions (max 3) for each group that they would do based off of the introduction text/room text. I&amp;rsquo;ll also roll and record the initiative at the group level.
&lt;ul&gt;
&lt;li&gt;I determined the marching order for each group and assumed that the one in the lead is the one taking point on any action that is happening. I also am assuming that my group remains clustered together as they explore.&lt;/li&gt;
&lt;li&gt;Then I&amp;rsquo;ll reveal the next paragraph of text and try to resolve it with the actions I already planned out.&lt;/li&gt;
&lt;li&gt;Combat will interrupt my table of actions and take precedence. Based on what they characters were doing I&amp;rsquo;ll know if they are surprised or not (at the group level) and I already have initiative. If characters needs to make a decision, say to run one way or another or to attack back, I will roll a dice to determine what they do.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;session-play-logs&#34;&gt;Session Play Logs&lt;/h2&gt;
&lt;p&gt;I expect this adventure to take me a bit to finish. Both because I&amp;rsquo;m juggling 16 characters and because I&amp;rsquo;ll probably only be able to fit in 20-30 minutes of play time here and there.&lt;/p&gt;
&lt;p&gt;When I finish a session I&amp;rsquo;ll post them and then update this section with a link.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://heyloura.com/2023/01/25/session-one-portal.html&#34;&gt;Session One - Area 1.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Season 37 Episode 48 of My Life</title>
      <link>https://heyloura.com/2022/11/21/season-episode-of.html</link>
      <pubDate>Mon, 21 Nov 2022 11:50:56 -0400</pubDate>
      
      <guid>http://heyloura.micro.blog/2022/11/21/season-episode-of.html</guid>
      <description>&lt;p&gt;Some weeks really do pass by in a blur. I think it&amp;rsquo;s because I tend to &amp;ldquo;go-go-go&amp;rdquo; and then collapse down to rest at the end of the day. This week was once again no exception. There is finally some movement on our condo sale and my original plan on Monday, to attend an important town meeting, was waylaid by the need to quickly check all the fire alarms in the unit, repair bleach damage on the wood floors the tenants left and get every room broom clean for a mortgage lenders quick inspection the next day. Why the buyers waited to the day of the mortgage commitment clause in our agreement to say they needed an inspection is a source of much frustration on my part. Thank you Panera Bread for having an app to place an order for dinner otherwise the kids wouldn&amp;rsquo;t have gotten anything to eat until after 9pm and thank you to my husband for working with me to tackle &amp;ldquo;all the things&amp;rdquo;. Tuesday wasn&amp;rsquo;t much better since I had to get over to the condo during the work day to let them come and inspect the place. Luckily everything seemed to go without a hitch. But since things are moving forward, quickly, like in less then two weeks quick, we had a large influx of very important things that must be done as soon as possible.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not sure if it was Tuesday evening or Wednesday when my brain fully processed that Thanksgiving was basically a week away and since I&amp;rsquo;m hosting I better start to get my act together. I think I&amp;rsquo;ve got a tasty menu planned now and if being ridiculously overcharged for beets on Sunday is the biggest hitch I&amp;rsquo;ll count myself lucky. But that does mean that me tearing apart my daughter&amp;rsquo;s room a few weeks ago to repaint it wasn&amp;rsquo;t the brightest idea, timing-wise, that I&amp;rsquo;ve ever had. It did occur to me that finishing painting her room, assembling the new furniture for it, painting the trim on three windows in the my office space, cleaning the house, braving the crowds at the grocery store the weekend before Thanksgiving, and driving three hours to do a play date visit is probably too much for my husband and I. So I did take two of those things off that list 😆.&lt;/p&gt;
&lt;p&gt;The other highlight of the week was the aforementioned play date. Well, less of a playdate and more of a meetup for other kids that are also in the virtual homeschooling group my kids attend. It was tucked away in the woods by a lake with a large fire to keep everyone warm. The fire was much needed too, by the time we left I was a popsicle. But it was amazing for my kids to connect in-person with kids they&amp;rsquo;ve only interacted with over zoom meetings. There was running around, adventuring in the woods, laughing over snacks, and even a zombie apocalypse game for the kids. It made me feel a lot better about my choices to talk with others facing the same issues and exploring off-the-beaten-path way of educating children. This year homeschooling has been our best yet.&lt;/p&gt;
&lt;p&gt;Now, is the keep it real part of this weekly recap. It&amp;rsquo;s been an emotional week for me. Things in my immediate family feel irreparably broken. It&amp;rsquo;s hard to not write in my own value judgements since it is so personal and emotionally charged. But suffice it to say that after a hard year I was looking forward to a simple holiday with my parents. My parents declare that, in the name of fairness, they will invite all the children to holiday gatherings. Which means, given my boundaries around one of my siblings, I&amp;rsquo;m not attending. And may never get to attend again and man that sucks&amp;hellip; My parents are well within their rights to invite whomever they want and I&amp;rsquo;m well within my rights to maintain a hard boundary against an abusive sibling. But that&amp;rsquo;s a cold comfort to have. So I&amp;rsquo;ll host for my sister and my mother in law and try my best to have it light and fun for the kids. But damn it hurts.&lt;/p&gt;
&lt;p&gt;Okay, that over with, there were some other nice things that happened this week: A get together with a friend and her foster child at the park, movies and pizza for my kids and some of their cousins, getting a little further in the game Tunic (which is awesome by the way), figuring out how and why all my unit tests at work were failing, having a blast a tap dancing, going out for coffee with my sister, catching up with an old friend and being hopeful that once this condo sale goes through we can rekindle the friendship.&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s what&amp;rsquo;s been going on.&lt;/p&gt;
&lt;p&gt;Until next time,
Loura&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>