<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/feed/simple-rss.xslt" type="text/xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://miguelpimentel.do/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>MiguelPimentel.do</title>
    <link>https://miguelpimentel.do/</link>
    <atom:link href="https://miguelpimentel.do/rss.xml" rel="self" type="application/rss+xml"/>
    <description>Latest version of my personal web site using the Eleventy site generator.</description>
    <language>en</language>
      <item>
        <title>The Adopt-a-Drain Dashboard</title>
        <link>https://miguelpimentel.do/blog/2025-12-23-adopt-a-drain-introduction/</link>
        <description>&lt;p&gt;Every year, the City of Crystal, Minnesota, pays dues to participate in the &lt;a href=&quot;https://www.cleanwatermn.org/&quot;&gt;Clean Water MN&lt;/a&gt; and &lt;a href=&quot;https://mn.adopt-a-drain.org/&quot;&gt;Adopt-a-Drain&lt;/a&gt; programs. Recently, I was asked to justify these expenses to my manager, the City Engineer and Public Works Director. These programs are vital for our community outreach requirements under the MS4 (Municipal Separate Storm Sewer System) permit process, but it can be difficult to quantify their value during a budget review.&lt;/p&gt;
&lt;p&gt;The data exists in the form of CSV exports, but raw spreadsheets rarely tell a compelling story. To defend the program, I built a dashboard as a proof of concept (PoC). My goal was to demonstrate how we can turn static rows of volunteer data into a clear narrative of community impact.&lt;/p&gt;
&lt;h2 id=&quot;the-tooling-why-streamlit&quot;&gt;The Tooling: Why Streamlit?&lt;/h2&gt;
&lt;p&gt;When building a PoC, the priority is speed. I chose Python because of its robust data ecosystem, specifically using &lt;a href=&quot;https://streamlit.io/&quot;&gt;Streamlit&lt;/a&gt; for the interface. Streamlit allowed me to turn a Python script into a functional web app without the overhead of traditional frontend development.&lt;/p&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;info&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-info&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M12 16v-4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 8h.01&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Why use a PoC?&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;This wasn&#39;t meant for production. By choosing Streamlit, I could focus on data logic rather than server management, allowing me to present a working prototype to stakeholders in a matter of days.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;h2 id=&quot;managing-the-environment-with-uv&quot;&gt;Managing the Environment with &lt;code&gt;uv&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;For this project, I used &lt;a href=&quot;https://docs.astral.sh/uv/&quot;&gt;uv&lt;/a&gt; by Astral for package management. For the dev community, the draw here is speed and the elimination of &amp;quot;dependency hell.&amp;quot;&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;uv&lt;/code&gt;, I don&#39;t have to manually manage a &lt;code&gt;.venv&lt;/code&gt; folder. I can run the project with a single command:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;uv run streamlit run main.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; handles the environment in the background, ensuring that &lt;a href=&quot;https://pandas.pydata.org/&quot;&gt;Pandas&lt;/a&gt;, &lt;a href=&quot;https://plotly.com/&quot;&gt;Plotly&lt;/a&gt;, and Streamlit are all synced. This makes the transition from a local script to a shareable dashboard significantly smoother.&lt;/p&gt;
&lt;h2 id=&quot;processing-the-data-with-pandas&quot;&gt;Processing the Data with Pandas&lt;/h2&gt;
&lt;p&gt;The Adopt-a-Drain data consists of two primary CSV files: adoption records and cleaning logs. Using Pandas, I cleaned and aggregated this data to look for trends. One of the most effective tools for this was the &lt;code&gt;resample&lt;/code&gt; method.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@st&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cache_data&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_monthly_cleanings&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cleanings_df&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DataFrame&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; pd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Series&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Group cleaning events by month to see seasonal trends.&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; cleanings_df&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_index&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Cleaning Date&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;resample&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ME&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This allowed me to see exactly when our volunteers are most active. Unsurprisingly, activity spikes in the spring and fall, but seeing it on a chart helps us plan our outreach efforts and our MS4 reporting more effectively.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/KwVyRQtjac-666.avif 666w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/KwVyRQtjac-666.webp 666w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/KwVyRQtjac-666.png&quot; alt=&quot;Yearly Adoptions Plot&quot; width=&quot;666&quot; height=&quot;450&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/D4m-QMFWk7-666.avif 666w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/D4m-QMFWk7-666.webp 666w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/D4m-QMFWk7-666.png&quot; alt=&quot;Monthly Collected Amounts Plot&quot; width=&quot;666&quot; height=&quot;450&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;visualizing-impact&quot;&gt;Visualizing Impact&lt;/h2&gt;
&lt;p&gt;To justify the program&#39;s cost, I used Streamlit&#39;s &lt;code&gt;metric&lt;/code&gt; components to highlight three key numbers: total adoptions, total cleaning events, and the total weight of debris collected.&lt;/p&gt;
&lt;p&gt;Seeing that residents have prevented over &lt;strong&gt;2,800 lbs&lt;/strong&gt; of debris from entering our local waterways was an &amp;quot;aha&amp;quot; moment. While it felt incredible to see that number, I realized it wasn&#39;t about the code; it was about the power of a community working together. The dashboard simply made that collective effort visible.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/ceAucBAUza-538.avif 538w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/ceAucBAUza-538.webp 538w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/ceAucBAUza-538.png&quot; alt=&quot;Debris Distribution Plot&quot; width=&quot;538&quot; height=&quot;450&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I also included a simple geographic visualization using Plotly&#39;s &lt;code&gt;scatter_map&lt;/code&gt;. By mapping the coordinates of every cleaning, we can see exactly which neighborhoods are most engaged and which watersheds are being protected.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;fig &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; px&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;scatter_map&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    cleanings&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    lat&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Latitude&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    lon&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Longitude&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    hover_name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;User Display Name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    color_discrete_sequence&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;fuchsia&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    zoom&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    height&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;550&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/xNn-0X5ioW-538.avif 538w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/xNn-0X5ioW-538.webp 538w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/xNn-0X5ioW-538.png&quot; alt=&quot;Cleaning Locations Map&quot; width=&quot;538&quot; height=&quot;550&quot;&gt;&lt;/picture&gt;&lt;/p&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;tip&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-flame&quot;&gt;&lt;path d=&quot;M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Handling Sparse Data&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;Users often filter by year or watershed. I included defensive checks to ensure that if a filter returned no results, the app would display an &lt;code&gt;st.warning&lt;/code&gt; rather than a generic Python error. This keeps the demo professional when presenting to leadership.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;h2 id=&quot;looking-ahead&quot;&gt;Looking Ahead&lt;/h2&gt;
&lt;p&gt;This dashboard was a practical exercise in turning data into a tool for advocacy. It provided the visual evidence needed to support our continued participation in these clean water programs and simplified our permit reporting.&lt;/p&gt;
&lt;p&gt;Because this prototype successfully bridged the gap between raw data and city leadership, I&#39;ve been exploring more ways to use Python for civic data. This is the first of several projects I&#39;m working on, and I look forward to sharing more as they develop.&lt;/p&gt;
&lt;p&gt;You can visit the &lt;a href=&quot;https://adopt-a-drain.streamlit.app/&quot;&gt;Adopt-a-Drain Dashboard&lt;/a&gt;. The complete source code is available on &lt;a href=&quot;https://github.com/semanticdata/adopt-a-drain&quot;&gt;GitHub&lt;/a&gt;. If you&#39;re working with civic or environmental data, I hope this provides a useful starting point for your own visualizations.&lt;/p&gt;
</description>
        <pubDate>Tue, 23 Dec 2025 00:00:00 GMT</pubDate>
              <category>Python</category>
              <category>Streamlit</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2025-12-23-adopt-a-drain-introduction/</guid>
      </item>
      <item>
        <title>Adding Snow, Keeping Warm: Using &lt;is-land&gt; Responsibly</title>
        <link>https://miguelpimentel.do/blog/2025-12-17-adding-snow-fall-with-is-land/</link>
        <description>&lt;h2 id=&quot;the-digital-paradox&quot;&gt;The Digital Paradox&lt;/h2&gt;
&lt;p&gt;I just finished deploying a new feature on my website: snow. Digital, gentle, simulated snowfall. This is a strange project, because few things make me feel more physically taxed than the cold reality of winter.&lt;/p&gt;
&lt;p&gt;I grew up in the Dominican Republic. I know the feeling of humid, embracing air, where my lungs never hurt. But I&#39;ve lived in Minnesota for over ten years, and every winter, the sharp, dry air and intense cold bring a familiar sadness. It keeps me indoors and weighs me down.&lt;/p&gt;
&lt;p&gt;Knowing all that, why would I use code to invite this season onto my website?&lt;/p&gt;
&lt;p&gt;The answer is simple: Code is a powerful tool for &lt;em&gt;building your own reality.&lt;/em&gt; The act of coding this snow is a &lt;strong&gt;digital coping mechanism&lt;/strong&gt;—a way to engage with the beauty of the season on terms I create and fully control.&lt;/p&gt;
&lt;p&gt;I can&#39;t change the climate outside, but in my digital space, I can ensure the snow is serene, non-intrusive, and most important of all, predictable.&lt;/p&gt;
&lt;p&gt;The best part? This digital flurry allows me to finally appreciate the stunning aesthetic of a snowfall—the quiet, the movement—without having to zip up three layers of clothes. Since snow wasn&#39;t part of my upbringing, the novelty is still exciting. This is me, designing my own winter experience.&lt;/p&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;note&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-pencil&quot;&gt;&lt;path d=&quot;M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m15 5 4 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Note&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;I chose &lt;a href=&quot;https://github.com/zachleat/snow-fall&quot;&gt;@zachleat/snow-fall&lt;/a&gt; because my site is built on &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;, and I highly respect and trust &lt;a href=&quot;https://www.zachleat.com/&quot;&gt;Zach Leatherman&lt;/a&gt;&#39;s work. Read their &lt;a href=&quot;https://www.zachleat.com/web/snow-fall/&quot;&gt;blog post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;h2 id=&quot;respectful-flurry-accessibility-and-is-land&quot;&gt;Respectful Flurry: Accessibility and &lt;code&gt;&amp;lt;is-land&amp;gt;&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The snow might be serene, but the implementation had to be rigorous. If my code is meant to bring &lt;em&gt;me&lt;/em&gt; comfort, I must ensure it causes no discomfort for my visitors.&lt;/p&gt;
&lt;p&gt;Accessibility is always a priority for me, and this project gave me a great excuse to try out some modern deferral techniques.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The snow must be optional and respectful! The snow is not worth slowing the site down.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had two main points to tackle: performance and accessibility. Luckily, the awesome &lt;a href=&quot;https://www.11ty.dev/docs/plugins/is-land/&quot;&gt;&amp;lt;is-land&amp;gt;&lt;/a&gt; plugin for Eleventy allows you to smartly defer and initialize client-side components.&lt;/p&gt;
&lt;p&gt;I chose to follow Zach&#39;s excellent accessibility recommendation, tying the entire component to the user&#39;s motion preference:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;is-land&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;on:&lt;/span&gt;media&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;(prefers-reduced-motion: no-preference)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;snow-fall&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;snow-fall&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;is-land&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This ensures that if you struggle with motion on screens, the digital flurry never appears. This code isn&#39;t just technical compliance; it&#39;s an act of empathy. I know what it feels like to be overwhelmed by the environment, and I&#39;d like to respect your choice to control your digital space as well.&lt;/p&gt;
&lt;h2 id=&quot;my-winter-coded-on-my-own-terms&quot;&gt;My Winter, Coded on My Own Terms&lt;/h2&gt;
&lt;p&gt;The cold reality of winter still pushes me indoors. But the digital snow allows me to engage with the season&#39;s aesthetic joy from the warmth of my computer.&lt;/p&gt;
&lt;p&gt;This is a small, satisfying project that warms me internally. It&#39;s a way to acknowledge and transform the season&#39;s challenge through code. This is my winter, coded on my own terms.&lt;/p&gt;
</description>
        <pubDate>Wed, 17 Dec 2025 00:00:00 GMT</pubDate>
              <category>Eleventy</category>
              <category>Accessibility</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2025-12-17-adding-snow-fall-with-is-land/</guid>
      </item>
      <item>
        <title>Solving Blinking View Transitions (Featured on Piccalilli)</title>
        <link>https://miguelpimentel.do/blog/2025-12-11-solving-blinking-view-transitions/</link>
        <description>&lt;p&gt;I am humbled to share that my first article is now live on &lt;strong&gt;Piccalilli&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I’ve been a long-time reader of Andy Bell&#39;s work, so contributing to the platform is a genuine milestone for me. In this article, I tackle a specific, frustrating issue I ran into while working with the View Transitions API.&lt;/p&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;info&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-info&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M12 16v-4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 8h.01&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Read the full article&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;If you are experimenting with view transitions and seeing unexpected flashes or stutters, I wrote this breakdown to help you smooth them out.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://piccalil.li/blog/why-are-my-view-transitions-blinking&quot;&gt;Read &amp;quot;Why are my view transitions blinking?&amp;quot; on Piccalilli →&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</description>
        <pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate>
              <category>Piccalilli</category>
              <category>CSS</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2025-12-11-solving-blinking-view-transitions/</guid>
      </item>
      <item>
        <title>When Gratitude Rings</title>
        <link>https://miguelpimentel.do/blog/2025-12-09-when-gratitude-rings/</link>
        <description>&lt;p&gt;I took time off work that morning to be home for a house inspection. Not the fun kind of time off where you do something you&#39;ve been looking forward to, but the necessary kind where you&#39;re managing adult responsibilities that only happen during work hours.&lt;/p&gt;
&lt;p&gt;The inspection revealed problems I wasn&#39;t expecting. Nothing catastrophic, but enough new issues to shift my mental budget calculations—like the bedroom window needing new hardware, or potentially an entire unit replacement. By the time I got to work, I was in that particular flavor of bad mood where everything feels slightly harder than it should be.&lt;/p&gt;
&lt;p&gt;Then my phone rang. A resident had called City Hall asking specifically to speak with me. They left only a callback number.&lt;/p&gt;
&lt;p&gt;My brain immediately went to complaint mode. Of course someone was calling with another problem. That&#39;s how these days go, right? One thing goes wrong and suddenly everything piles on. I picked up the phone to call back, bracing for whatever issue was about to land on my desk.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;I just wanted to call and thank you.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That was &lt;em&gt;not&lt;/em&gt; what I expected.&lt;/p&gt;
&lt;h2 id=&quot;the-small-gesture-that-landed&quot;&gt;The Small Gesture That Landed&lt;/h2&gt;
&lt;p&gt;The resident explained that they&#39;d reported an issue a few weeks ago—specifically about recurring backyard flooding involving a utility easement. They&#39;d been worried it would just disappear into the void of municipal bureaucracy. But I&#39;d responded, explained what we were doing about it, and kept them updated on the timeline.&lt;/p&gt;
&lt;p&gt;They called specifically to tell me they felt better knowing someone was actually working on their problem. They weren&#39;t calling because it was fixed. They weren&#39;t even calling because significant progress had been made. They called because they felt heard.&lt;/p&gt;
&lt;p&gt;That phone call completely shifted my day. Not because it solved any of my morning&#39;s problems, but because it reminded me to be grateful for work that actually connects with people. It&#39;s easy to forget that when you&#39;re stuck in administrative tasks and project management. But moments like this pull you back to why municipal work matters in the first place.&lt;/p&gt;
&lt;p&gt;It was a powerful reminder that connection doesn&#39;t require a formal title or a paycheck. That gratitude can show up in the places you least expect it. But what happens when you actually seek out those positive interactions? Do they feel less valuable simply because you were already anticipating them?&lt;/p&gt;
&lt;h2 id=&quot;anticipating-connection-still-finding-surprise&quot;&gt;Anticipating Connection, Still Finding Surprise&lt;/h2&gt;
&lt;p&gt;A few weeks ago, I was volunteering as a driver for &lt;a href=&quot;https://www.mealsonwheelsamerica.org/&quot;&gt;Meals-on-Wheels&lt;/a&gt;, doing my usual route. I always look forward to these deliveries because the people are genuinely the kindest you&#39;ll meet. I knew the interactions would be positive.&lt;/p&gt;
&lt;p&gt;I handed over the meal to one of my regulars and was starting to turn away when they stopped me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;What&#39;s your name?&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That was it. They just wanted to know about me. Such a simple question, but I wasn&#39;t expecting it at all. Even when you&#39;re anticipating a good interaction, there are these small moments that catch you off guard. They didn&#39;t just want their meal. They wanted to know who I was.&lt;/p&gt;
&lt;p&gt;I&#39;m grateful for moments like that. They remind me that volunteering isn&#39;t just about delivering meals or checking boxes. It&#39;s about the brief connections you make with people who genuinely see you as more than just the person at the door.&lt;/p&gt;
&lt;p&gt;It&#39;s funny how that works. Sometimes you brace yourself for the worst and get surprised by kindness. Other times you&#39;re already expecting good and still get blown away by the smallest gestures. Both deserve equal appreciation.&lt;/p&gt;
&lt;h2 id=&quot;recognizing-what-actually-counts&quot;&gt;Recognizing What Actually Counts&lt;/h2&gt;
&lt;p&gt;We tend to only count the big wins. The completed projects. The major milestones. The things that make good headlines or look impressive on a resume.&lt;/p&gt;
&lt;p&gt;But I&#39;m learning to be more grateful for the other stuff. The phone call that makes someone&#39;s day better. The simple act of asking someone&#39;s name because you genuinely want to know. Following through on something small when it would&#39;ve been easy to let it slide.&lt;/p&gt;
&lt;p&gt;These moments don&#39;t show up in project completion reports. They don&#39;t get quantified anywhere. But they&#39;re often what people remember and what actually makes the work meaningful.&lt;/p&gt;
&lt;p&gt;The resident who called took time out of their day to express gratitude for something I&#39;d honestly forgotten about. The person receiving their meal delivery didn&#39;t just accept their food and close the door. They paused to make a human connection.&lt;/p&gt;
&lt;p&gt;I&#39;m grateful they did. Those small acknowledgments matter more than formal recognition ever could.&lt;/p&gt;
</description>
        <pubDate>Tue, 09 Dec 2025 00:00:00 GMT</pubDate>
              <category>Gratitude</category>
              <category>Volunteering</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2025-12-09-when-gratitude-rings/</guid>
      </item>
      <item>
        <title>VS Code Regex: Conditional Find and Replace</title>
        <link>https://miguelpimentel.do/blog/2025-12-07-vscode-regex/</link>
        <description>&lt;p&gt;I recently hit a wall optimizing an older Shopify theme. To fix our CLS score, I needed to inject &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; attributes into thousands of specific image tags. The catch? I had to target &lt;em&gt;only&lt;/em&gt; the legacy placeholder images that hadn&#39;t been fixed yet, ignoring everything else.&lt;/p&gt;
&lt;p&gt;I needed a surgical solution. I needed VS Code Regex. But like most developers, I only really &amp;quot;know&amp;quot; Regex for about 48 hours after I use it. The rest of the time, I have to re-learn it from scratch.&lt;/p&gt;
&lt;p&gt;If you are currently in that &amp;quot;re-learning&amp;quot; phase and just want the code, I respect your time. Here&#39;s the TL;DR:&lt;/p&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;tldr&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-clipboard-list&quot;&gt;&lt;rect width=&quot;8&quot; height=&quot;4&quot; x=&quot;8&quot; y=&quot;2&quot; rx=&quot;1&quot; ry=&quot;1&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 11h4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 16h4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 11h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 16h.01&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;TL;DR:&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;Find all &lt;code&gt;&amp;lt;img&lt;/code&gt; tags containing the specific Liquid placeholder string (ignoring messy whitespace), but &lt;em&gt;exclude&lt;/em&gt; those that already have &lt;code&gt;width=&amp;quot;1024&amp;quot; height=&amp;quot;1024&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enable &lt;strong&gt;Regex Mode&lt;/strong&gt; (&lt;code&gt;.*&lt;/code&gt; icon) in VS Code Search (&lt;code&gt;Ctrl+Shift+F&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Find Pattern:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-regex&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-regex&quot;&gt;&lt;span class=&quot;token group punctuation&quot;&gt;(&lt;/span&gt;&amp;lt;img&lt;span class=&quot;token group punctuation&quot;&gt;(?!&lt;/span&gt;&lt;span class=&quot;token char-class&quot;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token char-class-negation operator&quot;&gt;^&lt;/span&gt;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;width=&quot;1024&quot; height=&quot;1024&quot;&lt;span class=&quot;token group punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token group punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token group punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token char-class&quot;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token char-class-negation operator&quot;&gt;^&lt;/span&gt;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*?&lt;/span&gt;&lt;span class=&quot;token special-escape escape&quot;&gt;&#92;|&lt;/span&gt;&lt;span class=&quot;token char-set class-name&quot;&gt;&#92;s&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;image_url:&lt;span class=&quot;token char-set class-name&quot;&gt;&#92;s&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;width:&lt;span class=&quot;token char-set class-name&quot;&gt;&#92;s&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;1024,&lt;span class=&quot;token char-set class-name&quot;&gt;&#92;s&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;height:&lt;span class=&quot;token char-set class-name&quot;&gt;&#92;s&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;1024&lt;span class=&quot;token char-set class-name&quot;&gt;&#92;s&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token special-escape escape&quot;&gt;&#92;}&lt;/span&gt;&lt;span class=&quot;token special-escape escape&quot;&gt;&#92;}&lt;/span&gt;&lt;span class=&quot;token char-class&quot;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token char-class-negation operator&quot;&gt;^&lt;/span&gt;&quot;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;&quot;&lt;span class=&quot;token group punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token group punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token char-class&quot;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token char-class-negation operator&quot;&gt;^&lt;/span&gt;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*?&lt;/span&gt;&lt;span class=&quot;token group punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token group punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token escape&quot;&gt;&#92;/&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;?&lt;/span&gt;&gt;&lt;span class=&quot;token group punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;Replace Pattern:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-regex&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-regex&quot;&gt;&lt;span class=&quot;token anchor function&quot;&gt;$&lt;/span&gt;1&lt;span class=&quot;token anchor function&quot;&gt;$&lt;/span&gt;2 width=&quot;1024&quot; height=&quot;1024&quot;&lt;span class=&quot;token anchor function&quot;&gt;$&lt;/span&gt;3&lt;span class=&quot;token anchor function&quot;&gt;$&lt;/span&gt;4&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;h2 id=&quot;the-prerequisites&quot;&gt;The Prerequisites&lt;/h2&gt;
&lt;p&gt;To pull this off without corrupting your HTML, we rely on two fundamental regex concepts.&lt;/p&gt;
&lt;h3 id=&quot;1-capture-groups-and-backreferences&quot;&gt;1. Capture Groups and Backreferences&lt;/h3&gt;
&lt;p&gt;We use parentheses &lt;code&gt;()&lt;/code&gt; to capture specific parts of the image tag. In our replacement, we use &lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt;, etc., to paste those pieces back exactly where they were. This ensures we don&#39;t accidentally delete your &lt;code&gt;alt&lt;/code&gt; text or classes while injecting the new attributes.&lt;/p&gt;
&lt;h3 id=&quot;2-non-greedy-matching&quot;&gt;2. Non-Greedy Matching&lt;/h3&gt;
&lt;p&gt;Standard regex is &amp;quot;greedy.&amp;quot; If you search for &lt;code&gt;src=&amp;quot;.*&amp;quot;&lt;/code&gt;, it matches everything from the first quote to the last quote on the line. Adding a question mark (&lt;code&gt;.*?&lt;/code&gt;) makes it &amp;quot;non-greedy,&amp;quot; forcing it to stop at the &lt;em&gt;first&lt;/em&gt; closing quote. This is vital when parsing HTML.&lt;/p&gt;
&lt;h2 id=&quot;solving-the-exclusion-puzzle&quot;&gt;Solving the Exclusion Puzzle&lt;/h2&gt;
&lt;p&gt;The hardest part isn&#39;t finding the image tags. It&#39;s &lt;strong&gt;excluding&lt;/strong&gt; the ones you&#39;ve already fixed. We need to tell VS Code: &amp;quot;Find this image tag, but stop immediately if you see &lt;code&gt;width=&amp;quot;1024&amp;quot; height=&amp;quot;1024&amp;quot;&lt;/code&gt; anywhere inside it.&amp;quot;&lt;/p&gt;
&lt;p&gt;This requires a &lt;strong&gt;Negative Lookahead&lt;/strong&gt; &lt;code&gt;(?!…)&lt;/code&gt;. This logic acts as a bouncer. It stands at the door of your search match, peeks inside, and if it sees the forbidden string, it excludes the whole match.&lt;/p&gt;
&lt;h2 id=&quot;breaking-down-the-pattern&quot;&gt;Breaking Down The Pattern&lt;/h2&gt;
&lt;p&gt;Here is how the regex works, broken down by its Capture Groups.&lt;/p&gt;
&lt;pre class=&quot;language-regex&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-regex&quot;&gt;&lt;span class=&quot;token group punctuation&quot;&gt;(&lt;/span&gt;&amp;lt;img&lt;span class=&quot;token group punctuation&quot;&gt;(?!&lt;/span&gt;&lt;span class=&quot;token char-class&quot;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token char-class-negation operator&quot;&gt;^&lt;/span&gt;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;width=&quot;1024&quot; height=&quot;1024&quot;&lt;span class=&quot;token group punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token group punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token group punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token char-class&quot;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token char-class-negation operator&quot;&gt;^&lt;/span&gt;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*?&lt;/span&gt;&lt;span class=&quot;token special-escape escape&quot;&gt;&#92;|&lt;/span&gt;&lt;span class=&quot;token char-set class-name&quot;&gt;&#92;s&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;image_url:&lt;span class=&quot;token char-set class-name&quot;&gt;&#92;s&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;width:&lt;span class=&quot;token char-set class-name&quot;&gt;&#92;s&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;1024,&lt;span class=&quot;token char-set class-name&quot;&gt;&#92;s&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;height:&lt;span class=&quot;token char-set class-name&quot;&gt;&#92;s&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;1024&lt;span class=&quot;token char-set class-name&quot;&gt;&#92;s&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token special-escape escape&quot;&gt;&#92;}&lt;/span&gt;&lt;span class=&quot;token special-escape escape&quot;&gt;&#92;}&lt;/span&gt;&lt;span class=&quot;token char-class&quot;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token char-class-negation operator&quot;&gt;^&lt;/span&gt;&quot;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*&lt;/span&gt;&quot;&lt;span class=&quot;token group punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token group punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token char-class&quot;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token char-class-negation operator&quot;&gt;^&lt;/span&gt;&gt;&lt;span class=&quot;token char-class-punctuation punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;*?&lt;/span&gt;&lt;span class=&quot;token group punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token group punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token escape&quot;&gt;&#92;/&lt;/span&gt;&lt;span class=&quot;token quantifier number&quot;&gt;?&lt;/span&gt;&gt;&lt;span class=&quot;token group punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;note&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-pencil&quot;&gt;&lt;path d=&quot;M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m15 5 4 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Why &lt;code&gt;&#92;s*&lt;/code&gt; instead of spaces?&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;You&#39;ll notice the pattern uses &lt;code&gt;&#92;s*&lt;/code&gt; extensively. This token matches &amp;quot;zero or more whitespace characters&amp;quot; (including spaces, tabs, and newlines).&lt;/p&gt;
&lt;p&gt;Since legacy code often has inconsistent formatting—sometimes tight, sometimes loose—using &lt;code&gt;&#92;s*&lt;/code&gt; ensures we catch the tag regardless of how the previous developer hit the spacebar. Ask me how I know…&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Group&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Pattern Segment&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;$1&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;(&amp;lt;img(?![…]))&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;The Bouncer: Captures &lt;code&gt;&amp;lt;img&lt;/code&gt; and checks the exclusion rule. It scans until the closing bracket &lt;code&gt;&amp;gt;&lt;/code&gt; (&lt;code&gt;[^&amp;gt;]*&lt;/code&gt;) to ensure the attributes aren&#39;t already there.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;$2&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;([^&amp;gt;]*?|&#92;s*image_url…[^&amp;quot;]*&amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;The Anchor: This looks for the Liquid placeholder. It captures the entire &lt;code&gt;src&lt;/code&gt; attribute, including any trailing characters (like query strings) via &lt;code&gt;[^&amp;quot;]*&lt;/code&gt;, so we can safely append after it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;$3&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;([^&amp;gt;]*?)&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;The Remainder: Captures any other attributes (like &lt;code&gt;alt&lt;/code&gt; or &lt;code&gt;class&lt;/code&gt;) that might appear later in the tag.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;$4&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;(&#92;/?&amp;gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;The Closer: Captures the closing &lt;code&gt;&amp;gt;&lt;/code&gt; (or self-closing &lt;code&gt;/&amp;gt;&lt;/code&gt;) so we can close the tag properly.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;the-result&quot;&gt;The Result&lt;/h2&gt;
&lt;p&gt;We reconstruct the tag using the captured groups, injecting the new attributes exactly between the anchor (&lt;code&gt;$2&lt;/code&gt;) and the remainder (&lt;code&gt;$3&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Replace Pattern:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-regex&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-regex&quot;&gt;&lt;span class=&quot;token anchor function&quot;&gt;$&lt;/span&gt;1&lt;span class=&quot;token anchor function&quot;&gt;$&lt;/span&gt;2 width=&quot;1024&quot; height=&quot;1024&quot;&lt;span class=&quot;token anchor function&quot;&gt;$&lt;/span&gt;3&lt;span class=&quot;token anchor function&quot;&gt;$&lt;/span&gt;4&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Scenario&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Input Tag Example&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Outcome/Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Needs Fixing&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;img src=&amp;quot;file.jpg | image_url: … }}&amp;quot; alt=&amp;quot;x&amp;quot;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;MATCH: New attributes inserted properly.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Messy Spaces&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;img src=&amp;quot;f.jpg |image_url:width:1024…}}?v=1&amp;quot;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;MATCH: The pattern handles inconsistent spacing and query parameters (&#92;s* and [^&amp;quot;]*).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Already Fixed&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;img width=&amp;quot;1024&amp;quot; height=&amp;quot;1024&amp;quot; src=&amp;quot;file.jpg | ...&amp;quot;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;IGNORED: The negative lookahead prevents the match.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;safety-first&quot;&gt;Safety First&lt;/h2&gt;
&lt;p&gt;Regex is powerful, but it&#39;s also excellent at destroying codebases in milliseconds.&lt;/p&gt;
&lt;p&gt;Before you hit &amp;quot;Replace All,&amp;quot; &lt;strong&gt;commit your changes to Git.&lt;/strong&gt; If you make a mistake with your pattern, a simple &lt;code&gt;git checkout .&lt;/code&gt; is instant. If you don&#39;t have version control, you are stuck pressing &lt;code&gt;Ctrl+Z&lt;/code&gt; on 50 different files.&lt;/p&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;warning&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-alert-triangle&quot;&gt;&lt;path d=&quot;m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 9v4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 17h.01&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Review Before You Commit&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;Regex is precise but blind. It doesn&#39;t understand context.&lt;/p&gt;
&lt;p&gt;Don&#39;t just trust the &amp;quot;Replace All&amp;quot; button. Open your Source Control tab in VS Code and review the file diffs line-by-line. It is much easier to catch a stray matching character or a broken tag now than it is to revert a broken commit later.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Verify your matches, ensure your git status is clean, and &lt;em&gt;then&lt;/em&gt; let the regex do the heavy lifting.&lt;/p&gt;
</description>
        <pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate>
              <category>VSCode</category>
              <category>Regex</category>
              <category>Tutorial</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2025-12-07-vscode-regex/</guid>
      </item>
      <item>
        <title>When Being Wrong Goes Right</title>
        <link>https://miguelpimentel.do/blog/2025-09-15-when-being-wrong-goes-right/</link>
        <description>&lt;p&gt;A few weeks ago, I got the kind of news that should&#39;ve made me feel great but instead left me with a familiar knot in my stomach. The bids for our 2025 Sewer Rehabilitation Project had come in, and my estimates were high. Way high.&lt;/p&gt;
&lt;p&gt;I&#39;d estimated $65 per linear foot for the sewer liner work. The winning contractor came in at $42.90. The second-place bid was $51.31. In the project management world, being off by that much feels like failure, even when it&#39;s not.&lt;/p&gt;
&lt;p&gt;But here&#39;s the thing that took me a while to process: being &amp;quot;wrong&amp;quot; in this case created something amazing. Because my estimates were conservative, we suddenly had enough budget to add 1,395 additional feet of sewer rehabilitation work. The same project budget that I thought would cover 1,855 feet could now handle 3,250 feet. The city got significantly more infrastructure improvement for the same money.&lt;/p&gt;
&lt;p&gt;So why did I feel like I&#39;d messed up instead of celebrating a win?&lt;/p&gt;
&lt;h2 id=&quot;the-project-details&quot;&gt;The Project Details&lt;/h2&gt;
&lt;p&gt;Let me back up and explain what actually happened, because the numbers tell a story that&#39;s bigger than just one municipal project.&lt;/p&gt;
&lt;p&gt;The City of Crystal needed to rehabilitate aging sewer lines – the kind of invisible infrastructure work that keeps cities functioning but never makes headlines. We were planning to install 1,855 linear feet of 8-inch sewer liner to fix deteriorating vitrified clay pipes that were decades old.&lt;/p&gt;
&lt;p&gt;This was also Crystal&#39;s first major sewer rehabilitation project in years, which meant I needed to create the framework from scratch. I spent weeks consulting the City Engineers Association of Minnesota guidelines and working with colleagues from Le Sueur and Champlin to write new Standard Detail Specifications for Sewer Rehabilitation Procedures. It was important to get this right – not just for this project, but to establish standards for future work.&lt;/p&gt;
&lt;p&gt;As the project manager, I had to estimate costs for budgeting and to set a baseline for evaluating contractor bids. I researched similar projects, talked to other municipalities, and landed on $65 per linear foot. It felt reasonable – maybe even slightly conservative, but I wanted to make sure we had adequate budget.&lt;/p&gt;
&lt;p&gt;The project also included adding 550 feet of storm sewer liner work after we discovered a sinkhole near the original scope. This last-minute addition created some time pressure as we rushed to incorporate the additional work before the bid opening, but it didn&#39;t affect my core sewer rehabilitation estimates.&lt;/p&gt;
&lt;p&gt;When the bids opened, reality hit differently. The winning contractor bid $42.90 per linear foot. The runner-up was $51.31. Both were significantly lower than my estimate, and both were qualified, reputable contractors.&lt;/p&gt;
&lt;p&gt;The result? Instead of feeling constrained by budget, we could suddenly afford to add another 1,395 feet of sewer rehabilitation work that the city desperately needed. What started as one project became a much more comprehensive infrastructure improvement.&lt;/p&gt;
&lt;h2 id=&quot;the-pressure-to-be-perfect&quot;&gt;The Pressure to Be Perfect&lt;/h2&gt;
&lt;p&gt;Here&#39;s what I couldn&#39;t shake, though: the voice in my head that kept saying I should&#39;ve known better. That a good project manager would&#39;ve hit closer to the actual market price. That being off by 30-50% meant I wasn&#39;t doing my job well enough.&lt;/p&gt;
&lt;p&gt;This kind of thinking isn&#39;t unique to municipal engineering. There&#39;s this culture in project management – maybe in professional life generally – that treats precision as the ultimate goal. You&#39;re supposed to nail your estimates, predict outcomes accurately, and demonstrate that you truly understand your field through exact forecasting.&lt;/p&gt;
&lt;p&gt;For someone with rejection sensitive dysphoria, this pressure hits differently. RSD is this intense fear of being criticized or perceived as incompetent, and it&#39;s common with ADHD. It&#39;s not just feeling bad about mistakes – it&#39;s the overwhelming certainty that any error proves you don&#39;t belong in your role. When my estimates came in high, RSD whispered that everyone would think I didn&#39;t know what I was doing.&lt;/p&gt;
&lt;p&gt;The irony is almost funny: my &amp;quot;mistake&amp;quot; delivered objectively better outcomes for the city. More infrastructure repair, better use of taxpayer money, and the flexibility to address additional needs that emerged during the project. But my brain was stuck on the fact that I&#39;d been &amp;quot;wrong&amp;quot; about the market pricing.&lt;/p&gt;
&lt;h2 id=&quot;redefining-success&quot;&gt;Redefining Success&lt;/h2&gt;
&lt;p&gt;What if I&#39;ve been thinking about this all wrong, though? What if conservative estimates aren&#39;t character flaws but strategic wisdom?&lt;/p&gt;
&lt;p&gt;The truth is, I wasn&#39;t trying to predict the exact market price down to the penny. I was trying to ensure the city had adequate budget to complete necessary infrastructure work. Mission accomplished, in a bigger way than originally planned.&lt;/p&gt;
&lt;p&gt;There&#39;s a difference between being precise and being prepared. Precision aims to hit exact targets. Preparation builds in buffers for the unknown variables that always show up in real projects. Maybe my ADHD brain, which tends to think about worst-case scenarios and plan for multiple contingencies, actually serves me well in this context.&lt;/p&gt;
&lt;p&gt;This applies way beyond municipal engineering, too. How often do we beat ourselves up for overestimating how long a project will take, how much money we&#39;ll need, or how challenging something will be? We treat these &amp;quot;errors&amp;quot; as personal failings instead of recognizing them as useful caution.&lt;/p&gt;
&lt;p&gt;When I plan extra time for a task and finish early, that&#39;s not poor time management – that&#39;s creating space for unexpected complications or higher-quality work. When I budget more money than I end up spending, that&#39;s not wasteful planning – that&#39;s building financial flexibility for opportunities or emergencies.&lt;/p&gt;
&lt;p&gt;The fear of being wrong can actually prevent us from being usefully wrong. If I&#39;d tried to estimate exactly what contractors would bid, I might&#39;ve aimed for $45 per linear foot and left no room for additional work when the opportunity arose. The &amp;quot;mistake&amp;quot; of overestimating created possibilities that precision would&#39;ve eliminated.&lt;/p&gt;
&lt;p&gt;Sometimes the best thing you can be is strategically, beneficially wrong. Sometimes building in buffers serves everyone better than trying to hit bullseyes. And sometimes the thing that makes you feel like you failed is actually the thing that made everything work.&lt;/p&gt;
</description>
        <pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate>
              <category>ProjectManagement</category>
              <category>ADHD</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2025-09-15-when-being-wrong-goes-right/</guid>
      </item>
      <item>
        <title>My Actual Problem-Solving Rituals</title>
        <link>https://miguelpimentel.do/blog/2025-09-09-actual-problem-solving-rituals/</link>
        <description>&lt;p&gt;Picture this: I&#39;m staring at a stubborn piece of code that won&#39;t work, my browser has twelve tabs open, and I&#39;m genuinely stuck. What do I do? I put on my noise-canceling headphones and blast &amp;quot;Psychosocial&amp;quot; by Slipknot.&lt;/p&gt;
&lt;p&gt;Most productivity advice would tell you that&#39;s exactly wrong. Aggressive metal music while trying to solve complex problems? That sounds like a recipe for distraction, not focus. But here&#39;s the thing I&#39;ve learned about my brain since my ADHD diagnosis: what works for me doesn&#39;t always match what&#39;s supposed to work.&lt;/p&gt;
&lt;p&gt;I&#39;ve spent years figuring out my actual problem-solving rituals, the weird collection of habits that genuinely help me think through challenges. Some of them make sense, others probably look strange from the outside. All of them work better than the generic productivity advice I used to force myself to follow.&lt;/p&gt;
&lt;h2 id=&quot;fidgeting-as-focus&quot;&gt;Fidgeting as Focus&lt;/h2&gt;
&lt;p&gt;When I&#39;m stuck on something, my body knows before my brain does. I start unconsciously cracking my fingers, petting my beard, or playing with my hair. For the longest time, I thought these were bad habits I should stop. Turns out, they&#39;re part of how I think.&lt;/p&gt;
&lt;p&gt;There&#39;s something about that physical fidgeting that helps my brain work through problems. It&#39;s not nervous energy, it&#39;s thinking energy! When I try to sit perfectly still and focus, I actually get more distracted. But when I let myself fidget, my mind settles into a better thinking rhythm.&lt;/p&gt;
&lt;p&gt;The real breakthrough came when I noticed that productive procrastination actually works for me. When I&#39;m stuck on a work problem, sometimes the best thing I can do is fold laundry or clean the house. There&#39;s something about the repetitive, simple, physical tasks that lets my subconscious work on the real problem. I&#39;ll be organizing a closet and suddenly the solution to a Python function I&#39;ve been wrestling with just appears in my head.&lt;/p&gt;
&lt;h2 id=&quot;environment-tweaks&quot;&gt;Environment Tweaks&lt;/h2&gt;
&lt;p&gt;I have a headphone hierarchy for different types of thinking. Regular earphones are for when I need a soft disconnect. I remain aware of my surroundings but creating a small bubble of focus. Noise-canceling headphones are for when I need to disappear into deeper work.&lt;/p&gt;
&lt;p&gt;And then there&#39;s the music choice that surprises most people. When I need to concentrate or solve problems, I reach for Slipknot, System of a Down, All That Remains, Muse, Thirty Seconds to Mars. The more &amp;quot;aggressive&amp;quot; music actually helps me focus. I think it&#39;s because the intensity matches the mental effort I&#39;m putting in. Calm, ambient music makes my brain wander. But what others would consider &amp;quot;too much&amp;quot; seems to keep me locked in.&lt;/p&gt;
&lt;p&gt;I know it sounds counterintuitive. Friends have asked how I can think clearly with heavy music playing. But my ADHD brain craves stimulation, and the aggressive music provides just enough background intensity to keep me engaged without being distracting.&lt;/p&gt;
&lt;h2 id=&quot;when-problems-get-too-big&quot;&gt;When Problems Get Too Big&lt;/h2&gt;
&lt;p&gt;Sometimes a problem feels bigger than what I can hold in my head all at once. That&#39;s when I switch from trying to think my way through it to getting it out of my brain entirely.&lt;/p&gt;
&lt;p&gt;If I have too much swirling around mentally, I do a brain dump straight into Obsidian. No organization, no structure – just everything that&#39;s bouncing around in my head gets typed out in my daily journal. Once external, I can see patterns and priorities that were invisible when everything was just competing for mental space.&lt;/p&gt;
&lt;p&gt;For complex technical problems or big decisions, I &lt;em&gt;still&lt;/em&gt; reach for pen and paper. There&#39;s something about the physical act of writing that slows down my thinking in a good way. Digital tools are great for capturing and organizing, but when I really need to work through something step by step, handwriting forces me to be more deliberate.&lt;/p&gt;
&lt;p&gt;When I&#39;m procrastinating or jumping between tasks without making progress, I use pomodoro timers to create structure. I actually built &lt;a href=&quot;https://github.com/semanticdata/obsidian-pomodoro&quot;&gt;PomoBar&lt;/a&gt; as an Obsidian plugin because I needed a timer that stayed out of my way but was available when natural flow breaks down. Pen and paper is my backup plan when everything else stops working.&lt;/p&gt;
&lt;h2 id=&quot;what-doesnt-work&quot;&gt;What Doesn&#39;t Work&lt;/h2&gt;
&lt;p&gt;Here&#39;s what I&#39;ve learned about my ADHD brain and traditional productivity advice: most of it assumes a neurotypical brain that operates on predictable schedules and &lt;em&gt;consistent motivation levels&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;My motivation fluctuates throughout the day in ways I can&#39;t predict or control. Some mornings I wake up with laser focus and can tackle complex problems for hours. Other days, I struggle to concentrate on simple tasks until later in the day. The emotional rollercoaster is real! Rigid scheduling that doesn&#39;t account for these natural fluctuations just sets me up for failure and frustration.&lt;/p&gt;
&lt;p&gt;Time blocking is something I&#39;m experimenting with, but it only works when I build in flexibility. I can&#39;t schedule &amp;quot;deep work&amp;quot; from 9-11 AM and expect my brain to cooperate just because it&#39;s on the calendar. Instead, I try to match my planned tasks to whatever mental energy I actually have in the moment. Sometimes that means the task scheduled for the afternoon gets done in the morning, or vice versa.&lt;/p&gt;
&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;The biggest lesson I&#39;ve learned about problem-solving so far, is that the rituals that work for your specific brain matter more than following someone else&#39;s system. My combo can look chaotic from the outside, but it consistently helps me work through challenges better than any productivity methodology I&#39;ve tried to force myself into.&lt;/p&gt;
&lt;p&gt;Your problem-solving rituals might be completely different. Maybe you need silence and stillness. Maybe you think best while cooking or in the shower. Maybe you need collaborative conversation or complete isolation. The point isn&#39;t to copy what works for someone else, it&#39;s to pay attention to what actually works for you, even if it sounds weird to other people.&lt;/p&gt;
</description>
        <pubDate>Tue, 09 Sep 2025 00:00:00 GMT</pubDate>
              <category>MentalHealth</category>
              <category>ADHD</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2025-09-09-actual-problem-solving-rituals/</guid>
      </item>
      <item>
        <title>PomoBar for Obsidian</title>
        <link>https://miguelpimentel.do/blog/2025-08-17-pomobar-introduction/</link>
        <description>&lt;p&gt;After my ADHD diagnosis, the &lt;a href=&quot;https://en.wikipedia.org/wiki/Pomodoro_Technique&quot;&gt;Pomodoro Technique&lt;/a&gt; became essential for managing my focus. As someone who spends most of my day in &lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian&lt;/a&gt;, I wanted a timer that lived seamlessly within my note-taking environment without cluttering my workspace.&lt;/p&gt;
&lt;p&gt;That&#39;s how &lt;a href=&quot;https://semanticdata.github.io/obsidian-pomodoro/&quot;&gt;PomoBar&lt;/a&gt; was born: a minimalist Pomodoro timer that sits quietly in Obsidian&#39;s status bar, ready when I need it but invisible when I don&#39;t.&lt;/p&gt;
&lt;p&gt;PomoBar was one of those projects I built during my year of silence, focused on solving a real problem I faced daily, but never taking the time to document the process. Looking back, that was a mistake. The development journey taught me lessons about constraints, user experience, and the value of building tools you actually use.&lt;/p&gt;
&lt;h2 id=&quot;from-html-prototype-to-production-plugin&quot;&gt;From HTML Prototype to Production Plugin&lt;/h2&gt;
&lt;p&gt;Before diving into Obsidian plugin development, I built a standalone HTML version in &lt;a href=&quot;https://codepen.io/semanticdata/pen/PwwpZgE&quot;&gt;CodePen&lt;/a&gt; to test the concept. Working with familiar HTML, CSS, and JavaScript let me focus on the user experience without learning new APIs. The prototype had a full visual interface with buttons and progress rings – essentially a traditional web app.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/oRml9YlauU-482.avif 482w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/oRml9YlauU-482.webp 482w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/oRml9YlauU-482.png&quot; alt=&quot;PomoBar HTML Prototype&quot; width=&quot;482&quot; height=&quot;629&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;But when I moved to create the Obsidian plugin, everything changed. This was my first plugin and my first real TypeScript project. I was suddenly wrestling with type definitions, Obsidian&#39;s API patterns, and figuring out how to cram a full timer interface into a tiny status bar element.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/WuxovrFv5z-228.avif 228w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/WuxovrFv5z-228.webp 228w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/WuxovrFv5z-228.png&quot; alt=&quot;PomoBar Screenshot&quot; width=&quot;228&quot; height=&quot;34&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/7-u8jqbL_Y-225.avif 225w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/7-u8jqbL_Y-225.webp 225w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/7-u8jqbL_Y-225.png&quot; alt=&quot;PomoBar Screenshot&quot; width=&quot;225&quot; height=&quot;34&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-problem-with-existing-solutions&quot;&gt;The Problem with Existing Solutions&lt;/h2&gt;
&lt;p&gt;Before building PomoBar, I tried several Pomodoro apps and browser extensions. They all shared similar problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Context switching&lt;/strong&gt;: Alt+tabbing to external apps broke my concentration when I was finally focused&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visual clutter&lt;/strong&gt;: Most timers demanded screen real estate I couldn&#39;t spare&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Over-engineering&lt;/strong&gt;: Complex features I never used made simple tasks unnecessarily complicated&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I needed something that followed the Unix philosophy: do one thing and do it well. A timer that would stay out of my way but be instantly accessible when needed.&lt;/p&gt;
&lt;h2 id=&quot;architecture-decisions-building-for-maintainability&quot;&gt;Architecture Decisions: Building for Maintainability&lt;/h2&gt;
&lt;p&gt;What started as a &lt;a href=&quot;https://github.com/semanticdata/obsidian-pomodoro/blob/9e3828254aa1b61c6f98b70fb9c50df4508215c8/main.ts&quot;&gt;single-file experiment&lt;/a&gt; evolved into a properly structured project. I learned the hard way that even simple plugins benefit from clean architecture.&lt;/p&gt;
&lt;p&gt;The current structure separates concerns clearly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main.ts&lt;/code&gt;: Plugin lifecycle and Obsidian integration&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timer.ts&lt;/code&gt;: All timer logic and state management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SettingsTab.ts&lt;/code&gt;: Configuration interface&lt;/li&gt;
&lt;li&gt;&lt;code&gt;types.ts&lt;/code&gt;: TypeScript interfaces and type definitions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;constants.ts&lt;/code&gt;: Application constants and enums&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This modular approach made the codebase easier to test, debug, and extend. When I needed to add features like optional status bar icons or improved memory management, I could modify individual components without touching the core timer logic.&lt;/p&gt;
&lt;h2 id=&quot;design-philosophy-flexible-minimalism&quot;&gt;Design Philosophy: Flexible Minimalism&lt;/h2&gt;
&lt;p&gt;The core design principle for PomoBar remained radical simplicity, but with thoughtful flexibility:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A soft timer display in the status bar showing &lt;code&gt;MM:SS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Optional icon that changes based on timer state&lt;/li&gt;
&lt;li&gt;Left click to start/pause&lt;/li&gt;
&lt;li&gt;Middle click to cycle between work, short break, and long break&lt;/li&gt;
&lt;li&gt;Right click to reset (when paused)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The interface stays minimal, but users can customize duration settings and choose whether to show the timer icon. Smart defaults (25/5/15 minutes) work for most people, but the plugin adapts to different workflows.&lt;/p&gt;
&lt;h2 id=&quot;technical-deep-dives&quot;&gt;Technical Deep Dives&lt;/h2&gt;
&lt;p&gt;Building something simple sounds easy until you actually try it. What seemed like &amp;quot;just put a timer in the status bar&amp;quot; quickly revealed layers of complexity I hadn&#39;t anticipated.&lt;/p&gt;
&lt;h3 id=&quot;state-management-and-memory-safety&quot;&gt;State Management and Memory Safety&lt;/h3&gt;
&lt;p&gt;The timer tracks multiple pieces of state: current mode, remaining time, work interval count, and running status. Getting this right required careful attention to cleanup:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cleanup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Clean up any remaining intervals&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;registeredIntervals&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;intervalId &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clearInterval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;intervalId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;registeredIntervals&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JavaScript&#39;s &lt;code&gt;setInterval&lt;/code&gt; can create memory leaks if not handled correctly, especially in a plugin environment where code gets reloaded frequently during development. Obsidian&#39;s &lt;code&gt;registerInterval&lt;/code&gt; method helps, but proper manual cleanup ensures reliability.&lt;/p&gt;
&lt;h3 id=&quot;user-feedback-integration&quot;&gt;User Feedback Integration&lt;/h3&gt;
&lt;p&gt;Early feedback taught me important lessons about user expectations. A GitHub issue pointed out that users wanted the plugin to automatically cycle through the traditional Pomodoro sequence: &lt;em&gt;work&lt;/em&gt; → &lt;em&gt;short break&lt;/em&gt; → &lt;em&gt;work&lt;/em&gt; → &lt;em&gt;short break&lt;/em&gt; → &lt;em&gt;work&lt;/em&gt; → &lt;em&gt;long break&lt;/em&gt;. The user noted they were using &amp;quot;25/5 cycles with the occasional 15 extended break&amp;quot; and wanted the timer to default to 5-minute breaks instead of requiring manual selection each time.&lt;/p&gt;
&lt;p&gt;This feedback was really helpful. It highlighted a core workflow need I hadn&#39;t fully considered. Instead of adding buttons or dropdowns, I implemented automatic cycling while keeping the same three-click interaction model.&lt;/p&gt;
&lt;h3 id=&quot;typescript-in-practice&quot;&gt;TypeScript in Practice&lt;/h3&gt;
&lt;p&gt;Moving from vanilla JavaScript to TypeScript added complexity I hadn&#39;t expected, but the benefits became clear quickly:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PomodoroSettings&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  workTime&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  shortBreakTime&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  longBreakTime&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  intervalsBeforeLongBreak&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  showIcon&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;boolean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;TypeScript caught several bugs during development that would have been runtime errors in JavaScript. The type safety made refactoring safer and the code more self-documenting.&lt;/p&gt;
&lt;h2 id=&quot;modern-development-practices&quot;&gt;Modern Development Practices&lt;/h2&gt;
&lt;p&gt;Building PomoBar taught me the value of proper development tooling, even for small projects.&lt;/p&gt;
&lt;h3 id=&quot;build-system-and-tooling&quot;&gt;Build System and Tooling&lt;/h3&gt;
&lt;p&gt;I experimented with different build systems before settling on &lt;strong&gt;esbuild&lt;/strong&gt;. While I briefly tried &lt;strong&gt;Vite&lt;/strong&gt; for its development features, &lt;strong&gt;esbuild&lt;/strong&gt; proved more stable and performant for an Obsidian plugin. The build process handles TypeScript compilation, bundling, and development hot-reloading.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ESLint&lt;/strong&gt; and proper TypeScript configuration catch issues before they reach users. The development experience improved dramatically once I had reliable linting and type checking in place.&lt;/p&gt;
&lt;h3 id=&quot;testing-and-validation&quot;&gt;Testing and Validation&lt;/h3&gt;
&lt;p&gt;I added a &lt;strong&gt;Jest&lt;/strong&gt; test suite to verify timer logic, settings validation, and plugin lifecycle management. Testing Obsidian plugins requires mocking the API, but the effort pays off in confidence and easier refactoring.&lt;/p&gt;
&lt;p&gt;The settings validation alone prevented several user-facing bugs:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;validateAndUpdateSetting&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    value&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    settingProperty&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;workTime&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;shortBreakTime&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;longBreakTime&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    resetAction&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;resetTimer&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;resetPomodoroSession&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; numValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isNaN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;numValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; numValue &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; Number&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isInteger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;plugin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;settings&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;settingProperty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; numValue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;documentation-as-development-practice&quot;&gt;Documentation as Development Practice&lt;/h2&gt;
&lt;p&gt;One lesson from my year of building in silence: document as you build, not after. PomoBar now includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;README: Clear installation and usage instructions&lt;/li&gt;
&lt;li&gt;CHANGELOG: Detailed release notes for every version&lt;/li&gt;
&lt;li&gt;CONTRIBUTING: Short guide on how to contribute to the project&lt;/li&gt;
&lt;li&gt;Documentation site: Built with MkDocs for comprehensive user guides&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Writing documentation forces you to think clearly about user experience and API design. It also makes the project more welcoming to contributors and users.&lt;/p&gt;
&lt;h2 id=&quot;current-state-and-lessons-learned&quot;&gt;Current State and Lessons Learned&lt;/h2&gt;
&lt;p&gt;PomoBar today is a robust, well-tested plugin that hundreds of users use daily. What started as a simple timer evolved into a thoughtful tool that balances simplicity with reliability.&lt;/p&gt;
&lt;p&gt;The biggest lessons weren&#39;t about TypeScript syntax or Obsidian APIs. They were about building software people actually use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start with real problems&lt;/strong&gt;: Build something you need, not something that sounds interesting&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User feedback shapes everything&lt;/strong&gt;: GitHub issues taught me more about user needs than any amount of planning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple interfaces can hide complex implementations&lt;/strong&gt;: The three-click interaction model required careful state management underneath&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architecture matters even for small projects&lt;/strong&gt;: Clean separation of concerns makes everything easier&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;building-your-own-plugin&quot;&gt;Building Your Own Plugin&lt;/h2&gt;
&lt;p&gt;If you&#39;re interested in building Obsidian plugins, here&#39;s what I wish I&#39;d known starting out:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Start with a real need&lt;/strong&gt;: Build something you&#39;ll actually use daily&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learn TypeScript properly&lt;/strong&gt;: Don&#39;t just get by with &lt;code&gt;@ts-ignore&lt;/code&gt; comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set up proper tooling early&lt;/strong&gt;: ESLint, testing, and build processes pay off quickly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document as you build&lt;/strong&gt;: Future you will thank present you&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Listen to user feedback&lt;/strong&gt;: GitHub issues contain valuable insights about real workflows&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The complete &lt;a href=&quot;https://github.com/semanticdata/obsidian-pomodoro&quot;&gt;source code&lt;/a&gt; for PomoBar is available on GitHub, along with comprehensive documentation. If you decide to build your own plugin, I&#39;d love to hear what problems you&#39;re solving. Sometimes the best ideas come from scratching your own itch.&lt;/p&gt;
&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Building PomoBar taught me that effective tools don&#39;t need complex interfaces. Sometimes the software you forget you&#39;re using is exactly what you need.&lt;/p&gt;
&lt;p&gt;This project also taught me something about the value of writing alongside building. I shipped PomoBar months ago, but only now am I capturing the lessons learned and design decisions made. The technical details are still fresh, but some of the emotional journey – the frustration with existing tools, the satisfaction of solving my own problem – has already faded.&lt;/p&gt;
&lt;p&gt;Writing about projects after the fact is harder than writing during development, but it&#39;s still valuable. The technical lessons remain clear even if some of the emotional journey has faded. This is my reminder to document the process, not just the results.&lt;/p&gt;
</description>
        <pubDate>Sun, 17 Aug 2025 00:00:00 GMT</pubDate>
              <category>Obsidian</category>
              <category>Typescript</category>
              <category>JavaScript</category>
              <category>Pomodoro</category>
              <category>ADHD</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2025-08-17-pomobar-introduction/</guid>
      </item>
      <item>
        <title>Building in Silence</title>
        <link>https://miguelpimentel.do/blog/2025-07-31-building-in-silence/</link>
        <description>&lt;h2 id=&quot;acknowledging-the-gap&quot;&gt;Acknowledging the Gap&lt;/h2&gt;
&lt;p&gt;I haven&#39;t published a blog post in almost a year. Not because I stopped learning or stopped building – quite the opposite, actually. I&#39;ve been deep in project mode, head down, solving problems and shipping code. Somewhere along the way, I forgot that building without writing is like learning without teaching. You miss half the value.&lt;/p&gt;
&lt;p&gt;The last year has been about creating rather than documenting. While that focus led to some projects I&#39;m genuinely proud of, it also created documentation debt that I&#39;m only now realizing I need to pay back.&lt;/p&gt;
&lt;h2 id=&quot;what-i-ve-been-building&quot;&gt;What I&#39;ve Been Building&lt;/h2&gt;
&lt;p&gt;PomoBar came first. After an ADHD diagnosis, I needed better focus tools. The Pomodoro Technique worked, existing timers felt clunky and broke my concentration. So I built a minimalist timer that lives in Obsidian&#39;s status bar – my first real TypeScript project and first published Obsidian plugin.&lt;/p&gt;
&lt;p&gt;The Adopt-a-Drain and Traffic Studies Dashboards came from a bigger change – switching jobs in August 2024. After four years as an Assistant Contract Administrator at Metro Transit, I moved to the City of Crystal as an Engineering Project Manager. Better work-life balance, shorter commute, and the chance to work directly with residents rather than just high-level stakeholders.&lt;/p&gt;
&lt;p&gt;The new role gave me something I hadn&#39;t expected: flexibility to propose solutions. When I saw CSV files full of volunteer cleaning data and traffic study spreadsheets that nobody had time to analyze, I built demos on my own time. Python, Streamlit, and Plotly turned those proof-of-concepts into approved work projects. Suddenly I was the person responsible for all traffic studies reporting in the city, armed with dashboards that actually made the data useful.&lt;/p&gt;
&lt;p&gt;It&#39;s been validating – proving to myself that I can be an effective Project Manager without the college degree I never finished. The technical skills I&#39;d been developing as a hobby became genuinely valuable tools for municipal work.&lt;/p&gt;
&lt;p&gt;Meanwhile, my Digital Garden evolved. I&#39;ve been rethinking my approach to personal knowledge management – not just what tools I use, how I structure and connect ideas. Less collecting, more connecting.&lt;/p&gt;
&lt;h2 id=&quot;lessons-from-the-silence&quot;&gt;Lessons From the Silence&lt;/h2&gt;
&lt;p&gt;When you&#39;re deep in creation mode, writing about projects feels like a distraction from making progress. That&#39;s exactly backward. Writing forces you to clarify your thinking, identify what you actually learned, and solidify those lessons before moving to the next shiny problem.&lt;/p&gt;
&lt;p&gt;I fell into perfectionist thinking without realizing it. Every project felt like it needed a comprehensive technical deep dive, complete with code samples and detailed tutorials. So I wrote nothing instead of writing something.&lt;/p&gt;
&lt;p&gt;Projects without accompanying writing lose their teaching value – both for others and for future me. I can barely remember why I made certain architectural decisions in PomoBar, and it&#39;s only been a few months.&lt;/p&gt;
&lt;p&gt;Starting a new role while deep in project mode created intense learning – new systems, new responsibilities, new technical challenges. The mental energy required to establish myself professionally while pursuing Python projects was helpful overall, more taxing than expected. The building focus became both an escape and a way to prove my capabilities in a new environment.&lt;/p&gt;
&lt;p&gt;The biggest lesson: shorter posts are perfectly fine. Not everything needs to be a 3,000-word technical tutorial. Sometimes a brief reflection or a quick tip is exactly what&#39;s needed.&lt;/p&gt;
&lt;h2 id=&quot;getting-back-to-writing&quot;&gt;Getting Back to Writing&lt;/h2&gt;
&lt;p&gt;This post is intentionally shorter than what I had in mind. It&#39;s my reminder that consistency beats perfection every time. I&#39;d rather publish brief, useful thoughts regularly than comprehensive pieces never.&lt;/p&gt;
&lt;p&gt;Explaining a project to others forces you to understand it differently. Teaching clarifies your own thinking. The act of putting ideas into words reveals gaps in your logic and surfaces your actual insights.&lt;/p&gt;
&lt;p&gt;Building in public isn&#39;t just about the code – it&#39;s about the process, the decisions, the dead ends, and the small wins. Those stories often matter more than the final implementation details.&lt;/p&gt;
&lt;h2 id=&quot;moving-forward&quot;&gt;Moving Forward&lt;/h2&gt;
&lt;p&gt;The restless curiosity that drove me to start blogging in the first place is still there. Still generating ideas, still jumping between interests, still needing an outlet for scattered thoughts. The transition from regional transit projects to municipal data work hasn&#39;t slowed this down – working directly with residents and being involved with generational projects like the Blue Line Extension has given me even more to process.&lt;/p&gt;
&lt;p&gt;The goal isn&#39;t to write about every project or document every learning experience. It&#39;s to maintain the habit of reflection, of turning experience into insight, of sharing the process rather than just the results.&lt;/p&gt;
&lt;p&gt;Sometimes that means short posts. Sometimes longer technical dives. Either way, it means showing up and putting words on the page.&lt;/p&gt;
&lt;p&gt;I&#39;m back to writing. Not because I have everything figured out – writing is how I figure things out.&lt;/p&gt;
</description>
        <pubDate>Thu, 31 Jul 2025 00:00:00 GMT</pubDate>
              <category>Blogging</category>
              <category>Obsidian</category>
              <category>Python</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2025-07-31-building-in-silence/</guid>
      </item>
      <item>
        <title>10 Fun Facts About the Dominican Republic</title>
        <link>https://miguelpimentel.do/blog/2024-09-12-dominican-fun-facts/</link>
        <description>&lt;p&gt;After eight years away from the Dominican Republic, I returned in winter 2023. Walking through familiar streets in my hometown of Bonao, sitting in Santo Domingo&#39;s colonial plazas, and hearing the sounds I&#39;d grown up with felt like rediscovering a country I thought I knew completely. That visit reminded me how much of my homeland&#39;s story remains untold to the outside world.&lt;/p&gt;
&lt;p&gt;These facts come from a country I lived in for most of my life, experienced firsthand, and want to share with those who&#39;ve never been there.&lt;/p&gt;
&lt;h2 id=&quot;1-cigua-palmera-our-national-bird&quot;&gt;1. Cigua Palmera: Our National Bird&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/G7pzXuhJ4F-2400.webp&quot; alt=&quot;Palmchat&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2400&quot; height=&quot;1600&quot;&gt;&lt;/p&gt;
&lt;p&gt;Growing up in Bonao, my friends and I would spot Cigua Palmeras in our school courtyard. These small, chattering birds build massive communal nests that look like apartment complexes wedged into palm trees. The scientific name is Dulus dominicus, and they exist nowhere else on Earth except on the island of Hispaniola.&lt;/p&gt;
&lt;p&gt;Cigua Palmeras (known in English as Palmchats) are intensely social, building nests that can house dozens of families. Their nests can weigh hundreds of pounds and last for years, passed down through bird generations like family homes. When hurricanes come through, these communal structures often survive better than individual nests.&lt;/p&gt;
&lt;h2 id=&quot;2-larimar-found-only-here&quot;&gt;2. Larimar: Found Only Here&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/FCRQaEBCHZ-4288.webp&quot; alt=&quot;Larimar&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4288&quot; height=&quot;2848&quot;&gt;&lt;/p&gt;
&lt;p&gt;Larimar exists only in the Dominican Republic, specifically in the southwestern province of Barahona. This blue variety of pectolite ranges from pale sky blue to deep ocean blue, and Dominicans discovered it in 1974. The name combines &amp;quot;Lari&amp;quot; (from the discoverer&#39;s daughter Larissa) and &amp;quot;mar&amp;quot; (sea in Spanish).&lt;/p&gt;
&lt;p&gt;The stone forms in volcanic cavities and requires hand-mining from mountainous terrain. Dominican miners rappel into cave systems to extract the mineral. The blue coloration comes from copper substitution, and no two pieces are identical. In jewelry shops across the country, you&#39;ll find Larimar set in gold, worn by locals and sold to visitors.&lt;/p&gt;
&lt;h2 id=&quot;3-taino-petroglyphs-in-cave-systems&quot;&gt;3. Taíno Petroglyphs in Cave Systems&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/_sPITzvRNm-4032.webp&quot; alt=&quot;Taíno pictograph&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4032&quot; height=&quot;3024&quot;&gt;&lt;/p&gt;
&lt;p&gt;I first entered the Cueva de las Maravillas (Cave of Wonders) on a school trip as a kid. Walking into that cave system for the first time meant seeing stalactites and stalagmites, but more importantly, seeing the drawings left by the Taíno people who lived on our island centuries before Columbus.&lt;/p&gt;
&lt;p&gt;The Taíno petroglyphs and pictographs show faces, ceremonial scenes, and symbols that archaeologists believe represent their spiritual beliefs and daily life. The cave stays cool year-round, protected from hurricanes and time.&lt;/p&gt;
&lt;h2 id=&quot;4-hispaniolan-solenodon-an-ancient-mammal&quot;&gt;4. Hispaniolan Solenodon: An Ancient Mammal&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/HDRhOed58F-720.webp&quot; alt=&quot;Hispaniolan Solenodon&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;720&quot; height=&quot;584&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Hispaniolan solenodon (Solenodon paradoxus) looks like something from another era because it has remained virtually unchanged for millions of years. This nocturnal mammal is one of the few venomous mammals on Earth. Its saliva contains toxins that help it hunt insects and small prey.&lt;/p&gt;
&lt;p&gt;Most Dominicans never see solenodons because they&#39;re nocturnal and increasingly rare due to habitat loss and predation by introduced species like cats and dogs. They survive in the mountain forests of the Dominican Republic and Haiti.&lt;/p&gt;
&lt;h2 id=&quot;5-first-european-settlement-la-isabela&quot;&gt;5. First European Settlement: La Isabela&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/8J7dbEpwF8-745.webp&quot; alt=&quot;Taíno fishermen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;745&quot; height=&quot;640&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Dominican Republic hosted the first permanent European settlement in the Americas. La Isabela, established by Christopher Columbus in 1493, predates Jamestown by over a century.&lt;/p&gt;
&lt;p&gt;When Columbus established La Isabela on the northern coast, the Taíno people already had sophisticated societies, agriculture, and trade networks. La Isabela failed as a settlement due to disease, poor planning, and conflicts with indigenous populations, leading to its abandonment. Its establishment marked the beginning of Spanish colonization in the Americas.&lt;/p&gt;
&lt;h2 id=&quot;6-santo-domingo-oldest-continuously-inhabited-european-city&quot;&gt;6. Santo Domingo: Oldest Continuously Inhabited European City&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/coMYmrcf5K-2400.webp&quot; alt=&quot;Santo Domingo as depicted circa 1665&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2400&quot; height=&quot;1771&quot;&gt;&lt;/p&gt;
&lt;p&gt;Santo Domingo, founded in 1498, is the oldest continuously inhabited European-established city in the Americas. Walking through its colonial zone, you&#39;re moving through 500+ years of continuous history.&lt;/p&gt;
&lt;p&gt;The city contains the first cathedral, first hospital, first university, and first palace built by Europeans in the New World. The Cathedral of Santo Domingo, completed in 1540, is where many Dominicans mark important life events. Santo Domingo was a major Spanish colonial capital, governing territories that extended far beyond the island.&lt;/p&gt;
&lt;h2 id=&quot;7-pico-duarte-the-caribbeans-highest-peak&quot;&gt;7. Pico Duarte: The Caribbean&#39;s Highest Peak&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/BFRvMrBpcc-1776.webp&quot; alt=&quot;Pico Duarte&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1776&quot; height=&quot;1000&quot;&gt;&lt;/p&gt;
&lt;p&gt;At 3,098 meters (10,164 feet), Pico Duarte is the tallest mountain in the Caribbean. The climb takes you through multiple climate zones, from tropical lowlands to pine forests to alpine conditions at the summit. During December and January, temperatures at the peak can drop below freezing.&lt;/p&gt;
&lt;p&gt;The peak is named after Juan Pablo Duarte, one of the founding fathers of Dominican independence. The Dominican Republic contains mountains, valleys, deserts, and forests alongside its coastline.&lt;/p&gt;
&lt;h2 id=&quot;8-lake-enriquillo-below-sea-level&quot;&gt;8. Lake Enriquillo: Below Sea Level&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/HLsZ5LGJM1-1200.webp&quot; alt=&quot;Lake Enriquillo&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot;&gt;&lt;/p&gt;
&lt;p&gt;Lake Enriquillo sits 44 meters (144 feet) below sea level, making it the lowest point in the Caribbean. This hypersaline lake, three times saltier than the ocean, supports a unique ecosystem.&lt;/p&gt;
&lt;p&gt;American crocodiles live in Lake Enriquillo. Flamingos feed in its salty waters. The lake expands and contracts based on rainfall, sometimes growing large enough to threaten nearby communities, sometimes shrinking to expose vast salt flats. Within a few hours&#39; drive, you can go from the Caribbean&#39;s highest peak to its lowest point.&lt;/p&gt;
&lt;h2 id=&quot;9-carnaval-february-celebrations&quot;&gt;9. Carnaval: February Celebrations&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/o7S6w7QRC3-1128.webp&quot; alt=&quot;Carnaval in the Dominican Republic&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1128&quot; height=&quot;752&quot;&gt;&lt;/p&gt;
&lt;p&gt;Dominican Carnaval happens every February, climaxing on Independence Day (February 27th). Growing up in Bonao, Carnaval came to our doorstep. The parade route ran right in front of my grandparents&#39; house, so we&#39;d sit on the sidewalk and watch the entire spectacle unfold.&lt;/p&gt;
&lt;p&gt;The masks are the centerpiece. Diablos Cojuelos (limping devils) are the most iconic characters, with elaborate horned masks and colorful costumes. Each region has distinct characters: Roba la Gallina (steals the chicken), La Ciguapa (a mythical woman from Dominican folklore), and Los Taínos (representing our indigenous heritage).&lt;/p&gt;
&lt;p&gt;The Diablos Cojuelos carry vejigas (inflated bladders) to playfully hit spectators. Dominican Carnaval blends African, Spanish, and Taíno influences. For Dominican families, Carnaval is cultural transmission. Children learn about Dominican mythology and history through these characters.&lt;/p&gt;
&lt;h2 id=&quot;10-humpback-whales-in-samana-bay&quot;&gt;10. Humpback Whales in Samaná Bay&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/adb7EWnKdC-1100.webp&quot; alt=&quot;Humpback whale breacking in Samana Bay&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1100&quot; height=&quot;688&quot;&gt;&lt;/p&gt;
&lt;p&gt;Every year from January to March, humpback whales migrate to Samaná Bay&#39;s warm, shallow waters to mate and give birth. This migration is one of the longest animal journeys on Earth. These whales travel from feeding grounds near Greenland and Iceland to breed in Dominican waters.&lt;/p&gt;
&lt;p&gt;Samaná Bay provides warm, shallow, and protected conditions for whale calves to be born and gain strength before the journey north. The whale watching industry in Samaná employs hundreds of Dominicans. Local boat operators, many of whom grew up fishing these same waters, now guide visitors to observe whales.&lt;/p&gt;
&lt;h2 id=&quot;coming-home&quot;&gt;Coming Home&lt;/h2&gt;
&lt;p&gt;Returning to the Dominican Republic after eight years away, I found much infrastructure development alongside things that remained unchanged: the sound of nature in the morning, the taste of mangoes from trees I remembered as a child, family gatherings that stretch late into the night, and lots of dancing.&lt;/p&gt;
&lt;p&gt;The Dominican Republic contains Caribbean beaches and mountain peaks, ancient Taíno caves and colonial cathedrals, endemic birds and migrating whales. For those who&#39;ve never been there, these facts offer a glimpse into a country beyond any single image. For those of us who call it home, they&#39;re reminders of why part of us always remains Dominican.&lt;/p&gt;
</description>
        <pubDate>Thu, 12 Sep 2024 00:00:00 GMT</pubDate>
              <category>DominicanRepublic</category>
              <category>Culture</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2024-09-12-dominican-fun-facts/</guid>
      </item>
      <item>
        <title>Publish a Logseq Graph to GitHub Pages</title>
        <link>https://miguelpimentel.do/blog/2024-07-22-publish-logseq-github/</link>
        <description>&lt;p&gt;Logseq is a powerful open-source knowledge management tool that emphasizes bidirectional linking and block-level editing. Sharing your graph publicly can be a great way to showcase your knowledge or collaborate with others.&lt;/p&gt;
&lt;h2 id=&quot;what-you-ll-build-achieve&quot;&gt;What You&#39;ll Build/Achieve&lt;/h2&gt;
&lt;p&gt;You&#39;ll publish your Logseq graph as a live website accessible to anyone on the internet using GitHub Pages and automated workflows.&lt;/p&gt;
&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub account&lt;/li&gt;
&lt;li&gt;Logseq graph in a GitHub repository&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;1-open-repository-settings&quot;&gt;1. Open Repository Settings&lt;/h2&gt;
&lt;p&gt;Navigate to your repository on GitHub and click the &lt;strong&gt;Settings&lt;/strong&gt; tab at the top.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/2iAxIS9c2H-505.avif 505w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/2iAxIS9c2H-505.webp 505w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/2iAxIS9c2H-505.png&quot; alt=&quot;repository settings&quot; width=&quot;505&quot; height=&quot;63&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;2-configure-github-pages&quot;&gt;2. Configure GitHub Pages&lt;/h2&gt;
&lt;p&gt;In the left sidebar, click &lt;strong&gt;Pages&lt;/strong&gt; under the &lt;em&gt;Code and automation&lt;/em&gt; section.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/y-a_eNg8zq-662.avif 662w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/y-a_eNg8zq-662.webp 662w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/y-a_eNg8zq-662.png&quot; alt=&quot;source branch&quot; width=&quot;662&quot; height=&quot;730&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;3-set-build-source&quot;&gt;3. Set Build Source&lt;/h2&gt;
&lt;p&gt;Under &lt;strong&gt;Build and deployment&lt;/strong&gt;, change the &lt;strong&gt;Source&lt;/strong&gt; from &amp;quot;Deploy from a branch&amp;quot; to &lt;strong&gt;&amp;quot;GitHub Actions&amp;quot;&lt;/strong&gt;. This enables automated publishing whenever you update your graph.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/MfP5H2yTom-662.avif 662w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/MfP5H2yTom-662.webp 662w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/MfP5H2yTom-662.png&quot; alt=&quot;source actions&quot; width=&quot;662&quot; height=&quot;757&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;4-access-github-actions&quot;&gt;4. Access GitHub Actions&lt;/h2&gt;
&lt;p&gt;Click the &lt;strong&gt;Actions&lt;/strong&gt; tab at the top of your repository.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/Ky4l0ZiuIj-504.avif 504w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/Ky4l0ZiuIj-504.webp 504w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/Ky4l0ZiuIj-504.png&quot; alt=&quot;repository actions&quot; width=&quot;504&quot; height=&quot;60&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;5-run-the-publishing-workflow&quot;&gt;5. Run the Publishing Workflow&lt;/h2&gt;
&lt;p&gt;In the left sidebar, click your workflow (e.g., &amp;quot;Validate and Publish Logseq Graph to GitHub Pages&amp;quot;). Click &lt;strong&gt;Run workflow&lt;/strong&gt; on the right, then click the blue &lt;strong&gt;Run workflow&lt;/strong&gt; button.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/0p77WSRTbp-328.avif 328w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/0p77WSRTbp-328.webp 328w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/0p77WSRTbp-328.png&quot; alt=&quot;action summary&quot; width=&quot;328&quot; height=&quot;322&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/4TasP4dTJm-1240.avif 1240w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/4TasP4dTJm-1240.webp 1240w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/4TasP4dTJm-1240.png&quot; alt=&quot;action runs&quot; width=&quot;1240&quot; height=&quot;459&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;6-wait-for-completion&quot;&gt;6. Wait for Completion&lt;/h2&gt;
&lt;p&gt;The first run takes several minutes (10+ minutes) as it sets up the publishing environment. Subsequent runs will be much faster (1-2 minutes).&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/HhdxRP-7Od-920.avif 920w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/HhdxRP-7Od-920.webp 920w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/HhdxRP-7Od-920.png&quot; alt=&quot;action duration&quot; width=&quot;920&quot; height=&quot;415&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/bTg6HSGm1e-858.avif 858w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/bTg6HSGm1e-858.webp 858w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/bTg6HSGm1e-858.png&quot; alt=&quot;action faster&quot; width=&quot;858&quot; height=&quot;410&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;7-set-repository-website-url&quot;&gt;7. Set Repository Website URL&lt;/h2&gt;
&lt;p&gt;Return to your repository&#39;s main page and click the ⚙ (gear) icon next to &amp;quot;About&amp;quot;. Under &lt;strong&gt;Website&lt;/strong&gt;, click &amp;quot;Use your GitHub Pages website&amp;quot; to auto-populate your site URL.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/GB9CYtBA6v-337.avif 337w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/GB9CYtBA6v-337.webp 337w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/GB9CYtBA6v-337.png&quot; alt=&quot;repository sidebar&quot; width=&quot;337&quot; height=&quot;293&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/UFTxB1ZmrD-629.avif 629w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/UFTxB1ZmrD-629.webp 629w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/UFTxB1ZmrD-629.png&quot; alt=&quot;repository details&quot; width=&quot;629&quot; height=&quot;516&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/F8VSjqnN22-630.avif 630w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/F8VSjqnN22-630.webp 630w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/F8VSjqnN22-630.png&quot; alt=&quot;repository url&quot; width=&quot;630&quot; height=&quot;517&quot;&gt;&lt;/picture&gt;&lt;/p&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;note&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-pencil&quot;&gt;&lt;path d=&quot;M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m15 5 4 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Note&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;This is a good time to add a description to your project if you haven&#39;t already.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;h2 id=&quot;verification&quot;&gt;Verification&lt;/h2&gt;
&lt;p&gt;You&#39;ll know it worked when you can visit your GitHub Pages URL (typically &lt;code&gt;https://your-username.github.io/repository-name/&lt;/code&gt;) and see your published Logseq graph.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://miguelpimentel.do/assets/img/OgIhmPuVBl-328.avif 328w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://miguelpimentel.do/assets/img/OgIhmPuVBl-328.webp 328w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://miguelpimentel.do/assets/img/OgIhmPuVBl-328.png&quot; alt=&quot;repository details filled&quot; width=&quot;328&quot; height=&quot;268&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;common-issues&quot;&gt;Common Issues&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If your workflow fails on first run, check that your workflow has proper permissions.&lt;/li&gt;
&lt;li&gt;If the site shows 404 error, wait a few more minutes after workflow completion - GitHub Pages can take time to propagate.&lt;/li&gt;
&lt;li&gt;If changes to graph don&#39;t appear on website, make sure to push your changes to GitHub and re-run the workflow.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 22 Jul 2024 00:00:00 GMT</pubDate>
              <category>Tutorial</category>
              <category>Logseq</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2024-07-22-publish-logseq-github/</guid>
      </item>
      <item>
        <title>Comparing SSD and NVMe Technologies</title>
        <link>https://miguelpimentel.do/blog/2023-07-27-comparing-ssd-nvme/</link>
        <description>&lt;p&gt;The main goal of this post was to aid in selecting SSD, and NVMe drives during a Micro Center sale. But I&#39;ll try to give an overview of what to look for next time you find yourself in the same position.&lt;/p&gt;
&lt;h2 id=&quot;storage-technologies&quot;&gt;Storage Technologies&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;MLC V-NAND is the best option.&lt;/li&gt;
&lt;li&gt;TLC is equivalent to V-NAND, and viceversa.&lt;/li&gt;
&lt;li&gt;QLC is cheap but a &lt;em&gt;little&lt;/em&gt; less reliable.&lt;/li&gt;
&lt;li&gt;3D NAND is your basic entry point to SSDs.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;3d-nand&quot;&gt;3D NAND&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The most basic of modern SSD technologies. Great for throwing on cheap systems, home servers, anything non-critical really.&lt;/li&gt;
&lt;li&gt;It is not recommended to host your Operating System on 3D NAND, or QLC.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;quad-level-cell-qlc&quot;&gt;Quad Level Cell (QLC)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;QLC (Quad Level Cell) is cheaper to manufacture than TLC (Triple Level Cell).&lt;/li&gt;
&lt;li&gt;QLC is much slower and less durable to constant writing than TLC.&lt;/li&gt;
&lt;li&gt;It is not recommended to host your Operating System on 3D NAND, or QLC.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;triple-level-cell-tlc&quot;&gt;Triple Level Cell (TLC)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;TLC is more reliable when compared to QLC.&lt;/li&gt;
&lt;li&gt;MLC is a Triple Level Cell based Samsung technology.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;multi-level-cell-mlc&quot;&gt;Multi Level Cell (MLC)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MLC is a Triple Level Cell based Samsung technology.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-are-ssds-scored&quot;&gt;How Are SSDs Scored&lt;/h2&gt;
&lt;h3 id=&quot;storage&quot;&gt;Storage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1 point per GB
&lt;ul&gt;
&lt;li&gt;Less accurate the bigger the SSD&lt;/li&gt;
&lt;li&gt;3 TB and higher drives scale exp/log instead of linearly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;price&quot;&gt;Price&lt;/h3&gt;
&lt;p&gt;Based on price per $1. Selected $0.10 as the baseline after averaging some calculations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 point for every $0.01 / GB below $0.10&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;technology-coefficient&quot;&gt;Technology Coefficient&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;3D NAND Coefficient = 0.5 (Big Penalty)&lt;/li&gt;
&lt;li&gt;QLC Coefficient = 0.75 (Small Penalty)&lt;/li&gt;
&lt;li&gt;TLC Coefficient = 1.0 (No Change)&lt;/li&gt;
&lt;li&gt;MLC V-NAND coefficient = 1.25 (Small Advantage)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;nvme-m-2-2280-m-key&quot;&gt;NVMe M.2 2280 M Key&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th data-label=&quot;Brand&quot;&gt;Brand&lt;/th&gt;
      &lt;th data-label=&quot;Storage&quot;&gt;Storage&lt;/th&gt;
      &lt;th data-label=&quot;Price&quot;&gt;Price&lt;/th&gt;
      &lt;th data-label=&quot;Notes&quot;&gt;Notes&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;970 EVO Plus&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;500 GB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$35&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;MLC V-NAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;970 EVO Plus&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;2 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$100&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;MLC V-NAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;970 EVO Plus&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;1 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$50&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;V-NAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;980&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;1 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$50&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;MLC V-NAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;980 Pro&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;2 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$120&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;MLC V-NAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;980 Pro&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;1 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$70&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;V-NAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;990 PRO&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;1 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$80&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;MLC V-NAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Crucial P3&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;1 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$40&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;3D NAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Inland&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;500 GB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$23&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;QLC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Inland&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;1 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$40&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;QLC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Inland&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;2 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$70&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;QLC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Performance&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;1 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$55&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;TLC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Prime&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;500 GB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$30&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;TLC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Prime&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;1 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$50&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;TLC&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;ssd&quot;&gt;SSD&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th data-label=&quot;Brand&quot;&gt;Brand&lt;/th&gt;
      &lt;th data-label=&quot;Storage&quot;&gt;Storage&lt;/th&gt;
      &lt;th data-label=&quot;Price&quot;&gt;Price&lt;/th&gt;
      &lt;th data-label=&quot;Notes&quot;&gt;Notes&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Inland&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;1 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$50&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;TLC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Inland&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;512 GB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$25&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;TLC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Platinum&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;2 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$80&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;TLC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Platinum&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;1 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$43&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;TLC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Professional&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;256 GB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$20&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;3D NAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;Professional&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;125 GB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$15&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;TLC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;870 EVO&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;1 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$50&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;MLC V-NAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;870 EVO&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;4 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$220&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;MLC V-NAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;870 EVO&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;500 GB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$40&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;MLC V-NAND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Brand&quot;&gt;870 QVO&lt;/td&gt;
      &lt;td data-label=&quot;Storage&quot;&gt;1 TB&lt;/td&gt;
      &lt;td data-label=&quot;Price&quot;&gt;$70&lt;/td&gt;
      &lt;td data-label=&quot;Notes&quot;&gt;QLC V-NAND&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;final-scores&quot;&gt;Final Scores&lt;/h2&gt;
&lt;h3 id=&quot;nvme&quot;&gt;NVMe&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th data-label=&quot;Description&quot;&gt;Description&lt;/th&gt;
      &lt;th data-label=&quot;$ / GB&quot;&gt;$ / GB&lt;/th&gt;
      &lt;th data-label=&quot;Coef&quot;&gt;Coef&lt;/th&gt;
      &lt;th data-label=&quot;Score&quot;&gt;Score&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;970 500 GB $35 MLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.070&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1.25&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;629&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;970 2 TB $100 MLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.050&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1.25&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;2506&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;970 1 TB $100 MLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.103&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1.25&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1250&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;980 1 TB $50 V&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.050&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1005&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;980P 2 TB $120 MLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.060&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1.25&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;2505&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;980P 1 TB $70 V&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.070&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1003&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;990P 1 TB $80 MLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.080&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1.25&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1253&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Crucial 1 TB $40 3D&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.040&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;0.5&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;503&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Inland 500 GB $23 QLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.046&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;0.75&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;379&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Inland 1 TB $40 QLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.040&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;0.75&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;755&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Inland 2 TB $70 QLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.035&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;0.75&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1505&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Performance 1 TB $55 TLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.055&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1005&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Prime 500 GB $30 TLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.060&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;504&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Prime 1 TB $50 TLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.050&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1005&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;*&lt;em&gt;Higher is better.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;ssd-2&quot;&gt;SSD&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th data-label=&quot;Description&quot;&gt;Description&lt;/th&gt;
      &lt;th data-label=&quot;$ / GB&quot;&gt;$ / GB&lt;/th&gt;
      &lt;th data-label=&quot;Coef&quot;&gt;Coef&lt;/th&gt;
      &lt;th data-label=&quot;Score&quot;&gt;Score&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Inland 1TB $50 TLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.050&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1005&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Inland 512GB $25 TLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.049&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;517&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Platinum 2TB $80 TLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.040&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;2006&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Platinum 1TB $43 TLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.043&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1006&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Professional 256GB $20 3D&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.078&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;0.5&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;129&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;Professional 125GB $15 3D&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.120&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;0.5&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;970 500 GB $35 MLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.070&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1.25&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;629&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;970 2 TB $100 MLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.050&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1.25&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;2506&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;970 1 TB $100 MLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.103&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1.25&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1250&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;980 1 TB $50 V&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.050&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1005&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;980P 2 TB $120 MLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.060&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1.25&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;2505&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;980P 1 TB $70 V&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.070&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1003&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Description&quot;&gt;990P 1 TB $80 MLC&lt;/td&gt;
      &lt;td data-label=&quot;$ / GB&quot;&gt;0.080&lt;/td&gt;
      &lt;td data-label=&quot;Coef&quot;&gt;1.25&lt;/td&gt;
      &lt;td data-label=&quot;Score&quot;&gt;1253&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;*&lt;em&gt;Higher is better.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusions&quot;&gt;Conclusions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cheap system? Get &lt;strong&gt;any&lt;/strong&gt; of these.&lt;/li&gt;
&lt;li&gt;Secondary drive? Get any &lt;strong&gt;QLC&lt;/strong&gt; or better.&lt;/li&gt;
&lt;li&gt;OS Drive? Get any &lt;strong&gt;TLC&lt;/strong&gt; or better.&lt;/li&gt;
&lt;li&gt;Extra cash? Premium for reliability? Get any &lt;strong&gt;Samsung&lt;/strong&gt; from the list.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 27 Jul 2023 00:00:00 GMT</pubDate>
              <category>Hardware</category>
              <category>SSD</category>
              <category>NVME</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2023-07-27-comparing-ssd-nvme/</guid>
      </item>
      <item>
        <title>Aurora Borealis Reference Guide</title>
        <link>https://miguelpimentel.do/blog/2023-07-11-aurora-borealis/</link>
        <description>&lt;p&gt;Wednesday, July 12th, 2023, was supposed to feature high solar activity, allowing for an incredibly large area of the northern United States to witness the Auroras as long as the light pollution was low enough.&lt;/p&gt;
&lt;p&gt;Solar activity stayed at normal levels, so only the usual locations were able to see the lights, causing me to cancel my plans. Nevertheless, I wanted to share them here.&lt;/p&gt;
&lt;h2 id=&quot;light-pollution&quot;&gt;Light Pollution&lt;/h2&gt;
&lt;p&gt;Take a look at these locations sorted by distance.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th data-label=&quot;Location&quot;&gt;Location&lt;/th&gt;
      &lt;th data-label=&quot;Distance&quot;&gt;Distance&lt;/th&gt;
      &lt;th data-label=&quot;Travel Time&quot;&gt;Travel Time&lt;/th&gt;
      &lt;th data-label=&quot;Rank*&quot;&gt;Rank*&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Location&quot;&gt;Minneapolis&lt;/td&gt;
      &lt;td data-label=&quot;Distance&quot;&gt;16 miles&lt;/td&gt;
      &lt;td data-label=&quot;Travel Time&quot;&gt;25 minutes&lt;/td&gt;
      &lt;td data-label=&quot;Rank*&quot;&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Location&quot;&gt;Bloomington&lt;/td&gt;
      &lt;td data-label=&quot;Distance&quot;&gt;2 miles&lt;/td&gt;
      &lt;td data-label=&quot;Travel Time&quot;&gt;5 minutes&lt;/td&gt;
      &lt;td data-label=&quot;Rank*&quot;&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Location&quot;&gt;Chaska&lt;/td&gt;
      &lt;td data-label=&quot;Distance&quot;&gt;15 miles&lt;/td&gt;
      &lt;td data-label=&quot;Travel Time&quot;&gt;20 minutes&lt;/td&gt;
      &lt;td data-label=&quot;Rank*&quot;&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Location&quot;&gt;Farmington&lt;/td&gt;
      &lt;td data-label=&quot;Distance&quot;&gt;24 miles&lt;/td&gt;
      &lt;td data-label=&quot;Travel Time&quot;&gt;35 minutes&lt;/td&gt;
      &lt;td data-label=&quot;Rank*&quot;&gt;3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Location&quot;&gt;Jordan&lt;/td&gt;
      &lt;td data-label=&quot;Distance&quot;&gt;22 miles&lt;/td&gt;
      &lt;td data-label=&quot;Travel Time&quot;&gt;25 minutes&lt;/td&gt;
      &lt;td data-label=&quot;Rank*&quot;&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Location&quot;&gt;Norwood&lt;/td&gt;
      &lt;td data-label=&quot;Distance&quot;&gt;35 miles&lt;/td&gt;
      &lt;td data-label=&quot;Travel Time&quot;&gt;40 minutes&lt;/td&gt;
      &lt;td data-label=&quot;Rank*&quot;&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Location&quot;&gt;Gaylord&lt;/td&gt;
      &lt;td data-label=&quot;Distance&quot;&gt;55 miles&lt;/td&gt;
      &lt;td data-label=&quot;Travel Time&quot;&gt;60 minutes&lt;/td&gt;
      &lt;td data-label=&quot;Rank*&quot;&gt;6&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Location&quot;&gt;Rapidan&lt;/td&gt;
      &lt;td data-label=&quot;Distance&quot;&gt;75 miles&lt;/td&gt;
      &lt;td data-label=&quot;Travel Time&quot;&gt;75 minutes&lt;/td&gt;
      &lt;td data-label=&quot;Rank*&quot;&gt;7&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Location&quot;&gt;Chengwatana&lt;/td&gt;
      &lt;td data-label=&quot;Distance&quot;&gt;95 miles&lt;/td&gt;
      &lt;td data-label=&quot;Travel Time&quot;&gt;90 minutes&lt;/td&gt;
      &lt;td data-label=&quot;Rank*&quot;&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td data-label=&quot;Location&quot;&gt;Sacred Heart&lt;/td&gt;
      &lt;td data-label=&quot;Distance&quot;&gt;105 miles&lt;/td&gt;
      &lt;td data-label=&quot;Travel Time&quot;&gt;120 minutes&lt;/td&gt;
      &lt;td data-label=&quot;Rank*&quot;&gt;9&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;* Higher Rank is considered better.&lt;/p&gt;
&lt;h2 id=&quot;tips-to-get-a-better-look&quot;&gt;Tips to Get a Better Look&lt;/h2&gt;
&lt;p&gt;Viewing the aurora depends on four important factors.&lt;/p&gt;
&lt;h3 id=&quot;1-geomagnetic-activity&quot;&gt;1. Geomagnetic Activity&lt;/h3&gt;
&lt;p&gt;If the geomagnetic field is active, then the aurora will be brighter and further from the poles. Geomagnetic activity is driven by solar activity and solar coronal holes and thus it waxes and wanes with time. The level of geomagnetic activity is indicated by the planetary K index or Kp. The Kp index ranges from 0 to 9.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For Kp in the range 0 to 2, the aurora will be far north, quite dim in intensity, and not very active.&lt;/li&gt;
&lt;li&gt;For Kp in the range of 3 to 5, the aurora will move further from the poles, it will become brighter and there will be more auroral activity (motion and formations). If you are in the right place, these aurora can be quite pleasing to look at.&lt;/li&gt;
&lt;li&gt;For Kp in the range 6 to 7, the aurora will move even further from the poles and will become quite bright and active. At this geomagnetic activity level, it might be possible to see the aurora from the northern edge of the United States.&lt;/li&gt;
&lt;li&gt;For Kp in the range 8 to 9, the aurora will move even further towards the equator and it will become very bright and very active. These are the events that create the best aurora and the extended auroral oval will be observable by the most people. At these levels, aurora may be seen directly overhead from the northern states of the USA.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It should be noted that the relationship between Kp and auroral latitude are approximate and represent averages. There will be times when these relationships do not hold up exactly.&lt;/p&gt;
&lt;p&gt;There is an approximate relationship between Kp and the equatorward extent of the auroral oval. This relationship holds true in geomagnetic latitude, not geographic. At Kp = 0, the equator ward edge of the auroral oval is approximately 66 degrees. And it moves equatorward about 2 degrees for each level of Kp. So for Kp = 1, the aurora would move down to 64 degrees, for Kp=2, it would move to 62 degrees, etc… until reaching Kp of 9 at 48 degrees magnetic latitude.&lt;/p&gt;
&lt;h3 id=&quot;2-location&quot;&gt;2. Location&lt;/h3&gt;
&lt;p&gt;Go towards the magnetic poles. The north magnetic pole is currently about 400 km (250 miles) from the geographic pole and is located in the islands of north east Canada. Find a place where you can see to the north ( or south if you are in the southern hemisphere). Given the right vantage point, say for example on top of a hill in the northern hemisphere with an unobstructed view toward the north, a person can see aurora even when it is 1000 km (600 miles) further north. It should be noted that if you are in the right place under the aurora, you can see very nice auroral displays even with low geomagnetic activity (Kp = 3 or 4).&lt;/p&gt;
&lt;h3 id=&quot;3-it-must-be-dark&quot;&gt;3. It Must Be Dark&lt;/h3&gt;
&lt;p&gt;Go out at night. Get away from city lights. The full moon will also diminish the apparent brightness of the aurora (not the actual brightness). One caveat that people often neglect to think of is that the high latitudes where aurora occur are also latitudes where it doesn&#39;t get dark in the summer. So combining a summer vacation to the arctic with aurora watching usually doesn&#39;t work. The aurora may still be there but it is only visible when it is dark.&lt;/p&gt;
&lt;h3 id=&quot;4-timing&quot;&gt;4. Timing&lt;/h3&gt;
&lt;p&gt;Best aurora is usually within an hour or two of midnight (between 10 PM and 2 AM local time). These hours of active aurora expand towards evening and morning as the level of geomagnetic activity increases. There may be aurora in the evening and morning but it is usually not as active and therefore, not as visually appealing.&lt;/p&gt;
&lt;p&gt;The best Seasons for aurora watching are around the spring and fall equinoxes. Due to subtleties in the way the solar wind interacts with Earth&#39;s magnetosphere, there is a tendency towards larger geomagnetic storms, and thus better auroras, to occur near the equinoxes. However, the number of hours of darkness decreases (increases) rapidly near the spring (fall) equinox so this caveat must be considered for those traveling to see the aurora.&lt;/p&gt;
&lt;p&gt;Below are maps showing the most southern extent of where aurora might be observable for different levels of the geomagnetic Kp index (and the NOAA G scale). It should be noted that the aurora can often be observed hundreds of kilometers (miles) equatorward of the actual aurora so these figures do not indicate where the aurora may be but rather the point from which it may be observed.&lt;/p&gt;
&lt;h2 id=&quot;aurora-forecast&quot;&gt;Aurora Forecast&lt;/h2&gt;
&lt;h3 id=&quot;july-12th-2023&quot;&gt;July 12th, 2023&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/T_Tb1nGWI6-960.webp&quot; alt=&quot;alt=&amp;quot;NOAA Space Weather Prediction Center - G-Kp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;960&quot; height=&quot;660&quot;&gt;
G is NOAA Geomagnetic Storm Index (0–5)&lt;br&gt;
Kp is Planetary K Index (0–9)&lt;/p&gt;
&lt;h3 id=&quot;september-18th-2023&quot;&gt;September 18th, 2023&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/ci3-i8TkpJ-1920.webp&quot; alt=&quot;aurora forecast for 2023-09-18&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1080&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;additional-resources&quot;&gt;Additional Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.gi.alaska.edu/monitors/aurora-forecast&quot;&gt;Aurora Forecast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.swpc.noaa.gov/content/aurora-dashboard-experimental&quot;&gt;Aurora Dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.swpc.noaa.gov/phenomena&quot;&gt;Space Weather Phenomena&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.swpc.noaa.gov/content/aurora-tutorial&quot;&gt;Dive Deeper Into the Science of the Aurora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 11 Jul 2023 00:00:00 GMT</pubDate>
              <category>Astronomy</category>
              <category>Nature</category>
              <category>Minnesota</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2023-07-11-aurora-borealis/</guid>
      </item>
      <item>
        <title>Being a Firefighter Does Not Save You From Burnout</title>
        <link>https://miguelpimentel.do/blog/2023-07-05-on-burnout/</link>
        <description>&lt;p&gt;My life took a sharp turn early last year. I am a very private person. You will not find me sharing my personal life on social media. That said, these last 18 months have changed me profoundly, and I feel like I need to write these feelings down. This post&#39;s threshold of success is helping one other person navigate difficult times.&lt;/p&gt;
&lt;p&gt;Burning out is something I had little experience with. A mental image of what it looks like when you burn out was all I had. My only context coming from watching online influencers post articles/videos about how bad it can be. I never really learned what it looks like before you burn out, how you get to there, what the signs are. After three and a half years of being a volunteer firefighter, I burned out. It did not catch me by surprise; I had been struggling mentally for some time. Every day, telling myself that it would be different, that it would change. That feeling went away eventually, leaving me with too much to handle.&lt;/p&gt;
&lt;h2 id=&quot;what-being-a-volunteer-firefighter-means&quot;&gt;What Being a Volunteer Firefighter Means&lt;/h2&gt;
&lt;p&gt;Depends on where the question is being asked. Volunteer, or sometimes paid-on-call firefighters make up more than 70% of registered fire departments. Minnesota sits at more than 85% volunteer fire departments, according to the &lt;a href=&quot;https://apps.usfa.fema.gov/registry/summary&quot;&gt;National Fire Department Registry&lt;/a&gt;. Our setting is Bloomington, Minnesota in the US.&lt;/p&gt;
&lt;p&gt;Here are some quick facts on being a volunteer/paid-on-call firefighter for the fourth-largest city (by population) in Minnesota a few of years before:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bloomington has 6 fire stations spread somewhat evenly over the city.&lt;/li&gt;
&lt;li&gt;To be eligible, you need to live within 4 minutes of your nearest fire station.&lt;/li&gt;
&lt;li&gt;You carry a pager around, when specific tones play, you are being asked to respond. This meant stopping anything you were doing, driving to the station, and responding to the incident in a fire vehicle.&lt;/li&gt;
&lt;li&gt;Depending on incident time, one, two, three, or all six stations can be paged together to respond. For example, medicals calls involve 1 station responding with 1 truck, while residential fire calls start a 3 station response immediately.&lt;/li&gt;
&lt;li&gt;You need to respond to at least 30% of the calls that were assigned to your station. These meant emergency calls during your work hours, weekends, holidays count against you.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;learning-what-being-homesick-was-all-about&quot;&gt;Learning What Being Homesick Was All About&lt;/h2&gt;
&lt;p&gt;During the pandemic, the emergency medical calls went through the roof. The Police Department was unable to keep up with the large number of incidents, so the city came to rely on the approximate 100 volunteer Fire Department to pick up the slack. This meant those working normal 8 to 5 jobs had a harder time keeping up with their 30% minimum. Without going into details, it was difficult.&lt;/p&gt;
&lt;p&gt;At the time, I was not in a good place mentally. Lots of things were lingering in the back of my mind. Everything has been made worse since I became woefully aware that I was homesick. I had planned to go visit for winter in 2020, but that option was quickly taken off the table. For context, I moved to the United States in Summer 2015, and to this day, due to one reason or another, I have yet to return.&lt;/p&gt;
&lt;p&gt;The later half of 2021 overwhelmed me. Several things accumulated over time, some went under the radar and were never addressed until it was too late, and others were willfully ignored. Struggling to maintain my sanity and mental health, I decided to take a 90-day leave of absence from the fire department. My plans were to spend the extra time looking after my mental health. Unfortunately, nothing improved.&lt;/p&gt;
&lt;p&gt;When the time came to rejoin, I opted to extend my leave as much as I could. I opted for another 90-day leave of absence, the maximum time allowed before needing to rejoin or separate. Again, nothing improved. I was just not in a good place mentally. A few days before needing to rejoin after 6 months of leave, I broke a bone in my hand.&lt;/p&gt;
&lt;h2 id=&quot;how-did-this-happen&quot;&gt;How Did This Happen&lt;/h2&gt;
&lt;p&gt;Distracted, I went to move a glass/ceramic base from my desk to the kitchen. It made it a good foot before I accidentally dropped it on a dog bowl on the floor. (we fed the dogs in weird places back them) It slipped from my hands and fell on the bowl and shattered. This was &lt;em&gt;not&lt;/em&gt; the first time this had happened. I… struggle to describe what my feelings at the time were. My brain approved the decision to punch something. When tasked with finding something to punch, once again, my regretful train of thought took me outside, to the patio where I proceeded to turn around and punch the side of the house. The factors considered at the time were overwritten by rage.&lt;/p&gt;
&lt;h2 id=&quot;being-stubborn-is-not-the-same-as-being-naive&quot;&gt;Being Stubborn is Not the Same as Being Naive&lt;/h2&gt;
&lt;p&gt;So it happened. I punched the side of the house. &lt;em&gt;&lt;strong&gt;Pain.&lt;/strong&gt;&lt;/em&gt; Broke a bone in my hand, unbeknownst to me, of course. I managed to convince myself that it was a minor injury and I didn&#39;t need to be seen by a doctor. The hand hurt, but I chose to ignore it because my pride was in danger! (it wasn&#39;t) I went about my business for &lt;em&gt;three days&lt;/em&gt; before the pain overtook my pride. After the initial triage, and x-rays were completed, the doctor returned to the room with x-rays of my hand and informed me that I had a boxer&#39;s fracture in my right hand. My brain could no longer hold the spell it had me under. I wasn&#39;t being naive, I was being stubborn.&lt;/p&gt;
&lt;p&gt;Unfortunately, having used all the time permitted for a leave of absence, and lacking the ability to rejoin due to my right hand being broken, I quit the fire department.&lt;/p&gt;
&lt;h2 id=&quot;accepting-help-is-the-hardest-part&quot;&gt;Accepting Help is the Hardest Part&lt;/h2&gt;
&lt;p&gt;It does get tough sometimes, life can weight a lot more than what you can handle. What we often forget is to look around, to look for the people that are willing and lovingly ready to help. My biggest mistake was thinking I had no support, when it really was the complete opposite. I am in a &lt;strong&gt;much&lt;/strong&gt; better place now. I have others to thank for that. The road back is long, but I have friends and family right beside me. It has been a long time, but I finally feel like I am moving forward.&lt;/p&gt;
</description>
        <pubDate>Wed, 05 Jul 2023 00:00:00 GMT</pubDate>
              <category>MentalHealth</category>
              <category>Firefighting</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2023-07-05-on-burnout/</guid>
      </item>
      <item>
        <title>Unlock the Sidebar Width in Firefox</title>
        <link>https://miguelpimentel.do/blog/2023-06-25-unlock-firefox-sidebar/</link>
        <description>&lt;p&gt;This post will guide you through unlocking the sidebar width in Firefox. It will let you resize it beyond what is possible by default. We will be setting both the maximum, and the minimum width. You will have a chance to customize these values once at the right step.&lt;/p&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;info&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-info&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M12 16v-4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 8h.01&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Why Would Anyone Want to Do This?&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To enhance the use of the Firefox &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/side-view/&quot;&gt;Side View&lt;/a&gt; extension.&lt;/li&gt;
&lt;li&gt;To compliment the use of one of my Firefox sidebar &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/user/17772574/&quot;&gt;extensions&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;callout&quot; data-callout=&quot;tldr&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-clipboard-list&quot;&gt;&lt;rect width=&quot;8&quot; height=&quot;4&quot; x=&quot;8&quot; y=&quot;2&quot; rx=&quot;1&quot; ry=&quot;1&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 11h4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 16h4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 11h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 16h.01&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;TL;DR:&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;about:support&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Locate your &lt;em&gt;Profile Folder&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Open your &lt;em&gt;Profile Folder&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Create a new folder called &lt;code&gt;chrome&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Inside the &lt;code&gt;chrome&lt;/code&gt; folder, create a new file called &lt;code&gt;userChrome.css&lt;/code&gt; (includes the file extension).&lt;/li&gt;
&lt;li&gt;Copy and paste this in it: &lt;code&gt;#sidebar-box { max-width: 40% !important; min-width: 300px !important; }&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Customize the width to your preference.&lt;/li&gt;
&lt;li&gt;Open &lt;code&gt;about:config&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Find &lt;code&gt;toolkit.legacyUserProfileCustomizations.stylesheets&lt;/code&gt; and change its value to &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Restart Firefox.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/div&gt;&lt;h2 id=&quot;step-by-step-instructions&quot;&gt;Step-by-Step Instructions&lt;/h2&gt;
&lt;h3 id=&quot;1-open-about-support&quot;&gt;1. Open &lt;code&gt;about:support&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;In a new tab, navigate to &lt;code&gt;about:support&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/0fh1dOT-q1-1092.webp&quot; alt=&quot;about:support screenshot&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1092&quot; height=&quot;499&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-locate-the-profile-folder&quot;&gt;2. Locate the Profile Folder&lt;/h3&gt;
&lt;p&gt;Under &lt;em&gt;Application Basics&lt;/em&gt;, find &lt;strong&gt;Profile Folder&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;3-open-profile-folder&quot;&gt;3. Open Profile Folder&lt;/h3&gt;
&lt;p&gt;Locate and click the &lt;strong&gt;Open Folder&lt;/strong&gt; button next to it. You&#39;ll find it next to an address similar to:&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://miguelpimentel.do/blog/2023-06-25-unlock-firefox-sidebar/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;pre class=&quot;language-plaintext&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;%appdata%&#92;Mozilla&#92;Firefox&#92;Profiles&#92;your-profile-id.default-release&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/G2uV0aryUr-1092.webp&quot; alt=&quot;application basics screenshot&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1092&quot; height=&quot;499&quot;&gt;&lt;/p&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;note&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-pencil&quot;&gt;&lt;path d=&quot;M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m15 5 4 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Note&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;In Windows, &lt;code&gt;%appdata%&lt;/code&gt; is equivalent to:&lt;br&gt;
&lt;code&gt;C:&#92;Users&#92;your-username&#92;AppData&#92;Roaming&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;h3 id=&quot;4-create-new-folder-chrome&quot;&gt;4. Create New Folder &lt;code&gt;chrome&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Inside your &lt;em&gt;Firefox Profile Folder&lt;/em&gt;, create a new folder named &lt;code&gt;chrome&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;5-create-userchrome-css&quot;&gt;5. Create &lt;code&gt;userChrome.css&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Inside the newly created &lt;code&gt;chrome&lt;/code&gt; folder, create a new file named &lt;code&gt;userChrome.css&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;6-copy-and-paste-its-contents&quot;&gt;6. Copy and Paste Its Contents&lt;/h3&gt;
&lt;p&gt;Copy the following code, and paste as content inside &lt;code&gt;useChrome.css&lt;/code&gt; and save:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#sidebar-box&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 40% &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;7-customize-the-width&quot;&gt;7. Customize the Width&lt;/h3&gt;
&lt;p&gt;You may change the units to any length you find more convenient.&lt;/p&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;tip&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-flame&quot;&gt;&lt;path d=&quot;M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Tip&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;You should take the time to play around with these units to find what fits your use case better.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;h3 id=&quot;8-open-about-config&quot;&gt;8. Open &lt;code&gt;about:config&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;In a new tab, navigate to &lt;code&gt;about:config&lt;/code&gt;, and search for:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;toolkit.legacyUserProfileCustomizations.stylesheets
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;9-change-the-value&quot;&gt;9. Change the Value&lt;/h3&gt;
&lt;p&gt;Change its value from &lt;code&gt;false&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miguelpimentel.do/assets/img/DWCtibbXhX-1092.webp&quot; alt=&quot;about:config screenshot&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1092&quot; height=&quot;169&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;10-restart-firefox&quot;&gt;10. Restart Firefox&lt;/h3&gt;
&lt;p&gt;Finally, restart Firefox for the changes to take effect.&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;In Windows, &lt;code&gt;%appdata%&lt;/code&gt; is equivalent to: &lt;code&gt;C:&#92;Users&#92;your-username&#92;AppData&#92;Roaming&lt;/code&gt;. &lt;a href=&quot;https://miguelpimentel.do/blog/2023-06-25-unlock-firefox-sidebar/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
        <pubDate>Sun, 25 Jun 2023 00:00:00 GMT</pubDate>
              <category>Firefox</category>
              <category>CSS</category>
              <category>Tutorial</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2023-06-25-unlock-firefox-sidebar/</guid>
      </item>
      <item>
        <title>Blogging to Tame the Monkey Mind</title>
        <link>https://miguelpimentel.do/blog/2023-04-11-monkey-mind/</link>
        <description>&lt;p&gt;Last week, I came across Danny Guo’s &lt;a href=&quot;https://www.dannyguo.com/blog/why-i-blog&quot;&gt;Why I Blog&lt;/a&gt; post, and it inspired me to write this.&lt;/p&gt;
&lt;p&gt;The term &lt;a href=&quot;https://en.wikipedia.org/wiki/Monkey_mind&quot;&gt;monkey mind&lt;/a&gt; is a Buddhist term meaning: restless, unsettled, incontrollable. The original analogy comes from describing the human mind as being full of drunken monkeys, constantly screeching, fighting, distracting, and creating general mental chaos. I’ll go over what helps &lt;em&gt;me&lt;/em&gt; keep the monkeys at bay. I hope some of this resonates with you and your monkeys as well.&lt;/p&gt;
&lt;h2 id=&quot;clear-my-mind&quot;&gt;Clear My Mind&lt;/h2&gt;
&lt;p&gt;My brain seems to always find distractions for me to tangent off to. Sitting down and making an effort to write everything rushing through my head has been an important mechanism to reduce my stress levels. This concept of dumping your brain by writing isn’t new, but it was to me.&lt;/p&gt;
&lt;p&gt;It took me some time to mold the raw output into something I could use. In my case, it started within my journal. Using the left page for brain dump, and the right page to process it down to simple tasks, references, and other tagged entries. Small details like leaving space between entries allow me to go back and add an entry in a much closer position relative to other similar ones.&lt;/p&gt;
&lt;h2 id=&quot;share-knowledge&quot;&gt;Share Knowledge&lt;/h2&gt;
&lt;p&gt;When I think of sharing knowledge, the image of me boring my friends to death on a topic they aren’t interested in comes to mind. It is my goal to minimize those kinds of situations. I find it easier to talk about a topic in person if I have already “talked” about it on the blog. I can actually debate the idea, without feeling the need to interject at every interaction.&lt;/p&gt;
&lt;p&gt;A sure way to tell whether you know a topic, comes from being able to teach it to someone else. I am &lt;em&gt;horrible&lt;/em&gt; at keeping explanations simple. I am &lt;em&gt;terrible&lt;/em&gt; at controlling my impulse to talk when engaged in conversation. Sharing &lt;em&gt;knowledge&lt;/em&gt; via these posts helps my overall mental state. It reduces the amount of fleeting ideas going back and forth, and provides me with an opportunity to turn those into actionable ideas instead of letting them grow old and irrelevant.&lt;/p&gt;
&lt;h2 id=&quot;document-my-learning&quot;&gt;Document My Learning&lt;/h2&gt;
&lt;p&gt;Recently, I have been down the rabbit-hole that is Personal Knowledge Management (PKM) tools and apps. Jumping from app to app, looking for something that “&lt;em&gt;works&lt;/em&gt;” for you. It’s fun! But, it is stupid easy to lose sight of your initial goal and turn that curiosity into wasted efforts.&lt;/p&gt;
&lt;p&gt;By making a public commitment (even if nobody reads it), I am imposing a healthy amount of pressure on myself to be more open and honest about how I use my time. Keeping yourself accountable is &lt;em&gt;hard work&lt;/em&gt;. Any amount of effort to curb “mindless wonder” helps tremendously.&lt;/p&gt;
&lt;h2 id=&quot;starting-a-blog&quot;&gt;Starting a Blog&lt;/h2&gt;
&lt;p&gt;Blogging pushes me to refine my better ideas. Expanding a fleeting thought into a blog post has a liberating feeling. It’s not even related to others reading your post. You don’t need an audience to start. The same way you should &lt;em&gt;just&lt;/em&gt; journal, you should &lt;em&gt;just&lt;/em&gt; blog.&lt;/p&gt;
&lt;p&gt;Comes from the same idea that producing content is and should be a priority over consuming it. Find what topics make you want to write. Compile your reference material. List articles you’ve read, blogs you have enjoyed, reference that weird website you know and talk about why.&lt;/p&gt;
&lt;p&gt;Avoid getting stuck on details. You can change your hosting provider later. The first thing you’d need to consider is whether you’ll be using a custom domain. I highly suggest you do so, as it makes for easier &lt;em&gt;platform changes&lt;/em&gt;. My personal recommendation is to start writing anywhere. Pick a platform and focus on writing about things you are interested in.&lt;/p&gt;
&lt;p&gt;Here are a few places to start:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bearblog.dev/&quot;&gt;Bearblog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.com/&quot;&gt;WordPress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.blogger.com/&quot;&gt;Blogger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/&quot;&gt;Medium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mataroa.blog/&quot;&gt;Mataroa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://prose.sh/&quot;&gt;Prose.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/&quot;&gt;DEV Community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 11 Apr 2023 00:00:00 GMT</pubDate>
              <category>Blogging</category>
              <category>MentalHealth</category>
              <category>PKM</category>
        <dc:creator>Miguel Pimentel</dc:creator>
        <guid>https://miguelpimentel.do/blog/2023-04-11-monkey-mind/</guid>
      </item>
  </channel>
</rss>