<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="/feed.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Michael Harley (Posts only)</title>
  <subtitle>Blog posts from Michael Harley.</subtitle>
  <link href="https://michaelharley.net/posts/feed.xml" rel="self"/>
  <link href="https://michaelharley.net/posts/"/>
  <updated>2026-06-12T12:02:06Z</updated>
  <id>https://michaelharley.net/posts/</id>
  <author>
    <name>Michael Harley</name>
    <email>michael@michaelharley.net</email>
  </author>
      <entry>
        <title>Rolling my own bubbles.town widget</title>
        <link href="https://michaelharley.net/posts/2026/06/12/rolling-my-own-bubblestown-widget/"/>
        <updated>2026-06-12T12:02:06Z</updated>
        <id>https://michaelharley.net/posts/2026/06/12/rolling-my-own-bubblestown-widget/</id>
        <content type="html">
          &lt;p&gt;Andreas &lt;a href=&quot;https://www.splitbrain.org/blog/2026-06/12-psa_bubbles.town_has_a_widget&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;blogged&lt;/a&gt; about adding the &lt;a href=&quot;https://bubbles.town/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;bubbles.town&lt;/a&gt; widget to his blog. He used the vote widget provided by bubbles.town, which is just a bit of JavaScript you put on your pages. It&#39;s &lt;a href=&quot;https://bubbles.town/embed&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;well documented&lt;/a&gt; and dead simple, so if you just want this on your site with no fuss, that&#39;s the way to go.&lt;/p&gt;
&lt;p&gt;I use &lt;a href=&quot;https://11ty.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;11ty&lt;/a&gt; as my blogging platform and I could just use the same JavaScript snippet on my site but I wanted to make something that&#39;s a bit more in the spirit of a static site. It&#39;s a tiny script, so yeah, I&#39;m being a bit of a purist about it. But I like keeping my pages free of other people&#39;s JavaScript and the third-party requests that come along with it. Plus, I wanted to style the widget a bit differently than their widget does. Here is how I did that.&lt;/p&gt;
&lt;h2 id=&quot;what-the-widget-actually-does&quot; tabindex=&quot;-1&quot;&gt;What the widget actually does &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/06/12/rolling-my-own-bubblestown-widget/#what-the-widget-actually-does&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First I poked at what the widget actually does. I&#39;m no JavaScript wizard, but it didn&#39;t take much. When the page loads, the script calls a small API on bubbles.town, &lt;code&gt;GET /api/vote-count?url=...&lt;/code&gt;, gets back the vote count for that URL, draws it on the page, and links out to bubbles.town so you can go vote.&lt;/p&gt;
&lt;p&gt;That last bit is the important part. The &lt;em&gt;voting&lt;/em&gt; never happens on my site. It&#39;s just a link over to bubbles. The JavaScript is really only there to paint a number.&lt;/p&gt;
&lt;p&gt;And a number I can fetch myself.&lt;/p&gt;
&lt;h2 id=&quot;fetching-it-at-build-time&quot; tabindex=&quot;-1&quot;&gt;Fetching it at build time &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/06/12/rolling-my-own-bubblestown-widget/#fetching-it-at-build-time&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So instead of shipping a script that makes every visitor&#39;s browser phone bubbles.town on every page load, I call that same endpoint once, when my site builds. 11ty makes this easy. I added a little computed field to my posts that hits the API:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bubblesSignal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;url&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;const&lt;/span&gt; res &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://bubbles.town/api/vote-count?url=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&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;res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ok&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 keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;                 &lt;span class=&quot;token comment&quot;&gt;// not on bubbles&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; count &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 keyword&quot;&gt;await&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&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;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; count &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;Then I render the result straight into the page like any other bit of data. No &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;, no third-party request when you load the post, just a plain link with the count baked right in:&lt;/p&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;bubblesSignal&lt;/span&gt; &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 operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bubbles-vote&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://bubbles.town/entry/{{ bubblesSignal.id }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&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 variable&quot;&gt;bubblesSignal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;count&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 variable&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;bubbles&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&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 variable&quot;&gt;endif&lt;/span&gt; &lt;span class=&quot;token operator&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;It sits right next to the likes and reposts I already pull in from Mastodon and Bluesky (those are static too, but that&#39;s a post for another day). And because it&#39;s my own little chunk of markup, I got to style it however I liked. A small amber triangle, my own fonts, and it picks up dark mode for free. Nice.&lt;/p&gt;
&lt;h2 id=&quot;the-one-annoying-wrinkle&quot; tabindex=&quot;-1&quot;&gt;The one annoying wrinkle &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/06/12/rolling-my-own-bubblestown-widget/#the-one-annoying-wrinkle&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There was one snag. bubbles only knows about posts it&#39;s imported from your RSS feed, so it returns a 404 for anything it hasn&#39;t seen. My build runs every few minutes and wipes its cache each time, so my first lazy version re-hit bubbles for &lt;em&gt;every&lt;/em&gt; post on &lt;em&gt;every&lt;/em&gt; build. Rude. Sorry, bubbles.&lt;/p&gt;
&lt;p&gt;My first fix was a little cache that remembered the misses too, so a 404 wouldn&#39;t get re-checked for a day. It worked, but it had a dumb side effect: a brand-new post would get stamped &amp;quot;not on bubbles&amp;quot; and then sit there for a whole day before its count showed up, even after bubbles had actually imported it.&lt;/p&gt;
&lt;p&gt;So I looked at &lt;em&gt;which&lt;/em&gt; posts were the permanent misses, and it was obvious in hindsight. They were all my reply posts, the little &amp;quot;Re:&amp;quot; ones I send off as webmentions. Those don&#39;t go in my main RSS feed, so bubbles never sees them, so they&#39;ll never have a count. No point ever asking. (Anything from before I joined bubbles is the same deal, it was never going to be indexed, so those get filtered out by date up front.)&lt;/p&gt;
&lt;p&gt;So now I just skip those by rule and let every real post fetch live. A new post picks up its count on the next build after bubbles imports it, no babysitting required. The cache went from &amp;quot;a clever pile of 404s&amp;quot; down to &amp;quot;the counts I&#39;ve already looked up.&amp;quot; Good enough is good enough.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/06/12/rolling-my-own-bubblestown-widget/#conclusion&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So that&#39;s it. The same little upvote counter Andreas added, but with no JavaScript shipped to my readers, no third-party request when you load a post, and styled to match the rest of my site. I get the signal, bubbles still gets the vote, and my pages stay nice and quiet.&lt;/p&gt;
&lt;p&gt;If you&#39;re running a static site and you&#39;re on bubbles.town, are you using their widget, or did you roll your own? I&#39;d love to see how you did it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;mailto:michael@michaelharley.net?subject=Re:%20Rolling%20my%20own%20bubbles.town%20widget&quot;&gt;Reply via email&lt;/a&gt; · &lt;a href=&quot;https://infosec.exchange/@michaelharley/116737043049426438&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Mastodon&lt;/a&gt; · &lt;a href=&quot;https://bsky.app/profile/michaelharley.net/post/3mo3p74t2ce2l&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Bluesky&lt;/a&gt;&lt;/p&gt;
        </content>
      </entry>
      <entry>
        <title>Re: No, I Won&#39;t Buy You A Coffee</title>
        <link href="https://michaelharley.net/posts/2026/06/11/re-no-i-wont-buy-you-a-coffee/"/>
        <updated>2026-06-11T11:17:58Z</updated>
        <id>https://michaelharley.net/posts/2026/06/11/re-no-i-wont-buy-you-a-coffee/</id>
        <content type="html">
          &lt;p&gt;Well, not to be left out of the great buy me a coffee debate, I thought I&#39;d add my two cents.&lt;/p&gt;
&lt;p&gt;The original, at HakkerBlog, &lt;a href=&quot;https://hakkerman.eu/blog/i-wont-buy-you-a-coffee/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;No, I Won&#39;t Buy You A Coffee&lt;/a&gt;, is a pretty cynical take on the topic of asking for contributions. I hardly think that someone posting their &lt;em&gt;buy me a coffee&lt;/em&gt; link on their blog qualifies as &amp;quot;rampant capitalization&amp;quot;. That&#39;s silly.&lt;/p&gt;
&lt;p&gt;Gordon posted a response, &lt;a href=&quot;https://www.gordonmclean.co.uk/2026/06/11/yes-buy-me-a-coffee/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Yes, buy me a coffee&lt;/a&gt; which takes the other position.&lt;/p&gt;
&lt;p&gt;The Buy Me a Coffee links in general feel a bit like a throw back these days. It&#39;s something I&#39;d see a lot 10 years ago when everyone was trying to do the &#39;grow your audience&#39; thing. I think I&#39;ve only ever sent a coffee once or twice myself.&lt;/p&gt;
&lt;p&gt;Today the links feel a bit archaic to me and slightly off putting but I&#39;m not offended nor discouraged from coming back to the site. I don&#39;t include them on my own site because I just don&#39;t care about any of that. My writing isn&#39;t going to make any money so I&#39;d rather just use that real estate on the page for something else or nothing!&lt;/p&gt;
&lt;p&gt;As The Dude might say, that&#39;s just, like, my opinion, man. What&#39;s yours?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;mailto:michael@michaelharley.net?subject=Re:%20Re:%20No,%20I%20Won&amp;#39;t%20Buy%20You%20A%20Coffee&quot;&gt;Reply via email&lt;/a&gt; · &lt;a href=&quot;https://infosec.exchange/@michaelharley/116731203782801058&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Mastodon&lt;/a&gt; · &lt;a href=&quot;https://bsky.app/profile/michaelharley.net/post/3mnz47qccoh2w&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Bluesky&lt;/a&gt;&lt;/p&gt;
        </content>
      </entry>
      <entry>
        <title>My site now supports webmentions</title>
        <link href="https://michaelharley.net/posts/2026/06/10/my-site-now-supports-webmentions/"/>
        <updated>2026-06-10T22:12:32Z</updated>
        <id>https://michaelharley.net/posts/2026/06/10/my-site-now-supports-webmentions/</id>
        <content type="html">
          &lt;p&gt;Ok you guys, I did it. I finally have &lt;a href=&quot;https://indieweb.org/Webmention&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;webmentions&lt;/a&gt; working on my website. It&#39;s something I&#39;ve always wanted to do but it seemed too complicated with my setup. I use a static site generator (SSG), &lt;a href=&quot;https://www.11ty.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;11ty&lt;/a&gt;, to build my site. Bloggers who use SSGs often host their sites on something like Github pages, Netlify or something similar so they have access to a CI/CD pipeline which does the building for the site. I host my site on a VPS running Caddy and I just rsync my files to my server. No automatic build server.&lt;/p&gt;
&lt;p&gt;I recently setup a homelab server though! I bought a used Intel NUC from eBay and loaded up Proxmox on it. So now, I have a poor man&#39;s build server! Yay.&lt;/p&gt;
&lt;p&gt;Anywho, all that to say, my site now supports webmentions. It collects likes, boosts, bookmarks, mentions, and replies, whether they come from someone&#39;s own website or from Mastodon and Bluesky and shows them in the footer of the blog post. Hell yeah.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;mailto:michael@michaelharley.net?subject=Re:%20My%20site%20now%20supports%20webmentions&quot;&gt;Reply via email&lt;/a&gt; · &lt;a href=&quot;https://infosec.exchange/@michaelharley/116728117072612754&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Mastodon&lt;/a&gt; · &lt;a href=&quot;https://bsky.app/profile/michaelharley.net/post/3mnxqe36eqq2n&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Bluesky&lt;/a&gt;&lt;/p&gt;
        </content>
      </entry>
      <entry>
        <title>My KeePass and Syncthing setup</title>
        <link href="https://michaelharley.net/posts/2026/05/23/my-keepass-and-syncthing-setup/"/>
        <updated>2026-05-23T11:04:26Z</updated>
        <id>https://michaelharley.net/posts/2026/05/23/my-keepass-and-syncthing-setup/</id>
        <content type="html">
          &lt;p&gt;I&#39;ve seen a few people talking about KeePass and Syncthing and hosting their own passwords, so I thought I&#39;d use this as an opportunity to provide a simple overview of my own setup. I&#39;ve been using some combination of KeePass and Syncthing &lt;a href=&quot;https://michaelharley.net/posts/2021/10/04/i-ve-changed-from-using-1-password-to-kee-pass-for-password-management/&quot;&gt;since 2021&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;syncthing&quot; tabindex=&quot;-1&quot;&gt;Syncthing &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/05/23/my-keepass-and-syncthing-setup/#syncthing&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My Syncthing topology is a simple star topology. I have a Proxmox LXC set up as the star hub. Then my laptop, workstation and Android phone sync to the LXC (infra).&lt;/p&gt;
&lt;picture&gt;
        &lt;source type=&quot;image/webp&quot; srcset=&quot;https://michaelharley.net/assets/images/GT30Xv9fLX-300.webp 300w, https://michaelharley.net/assets/images/GT30Xv9fLX-600.webp 600w, https://michaelharley.net/assets/images/GT30Xv9fLX-900.webp 900w, https://michaelharley.net/assets/images/GT30Xv9fLX-1200.webp 1200w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
  &lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://michaelharley.net/assets/images/GT30Xv9fLX-300.jpeg 300w, https://michaelharley.net/assets/images/GT30Xv9fLX-600.jpeg 600w, https://michaelharley.net/assets/images/GT30Xv9fLX-900.jpeg 900w, https://michaelharley.net/assets/images/GT30Xv9fLX-1200.jpeg 1200w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
        &lt;img src=&quot;https://michaelharley.net/assets/images/GT30Xv9fLX-1200.jpeg&quot; width=&quot;1200&quot; height=&quot;921&quot; alt=&quot;A diagram showing a syncing topology with three devices connected through a central &#39;infra&#39; hub. The phone syncs Camera, KeePass, and Notes to infra; the laptop syncs Camera, Pictures, Documents, KeePass, Notes, and Books (Books only) with infra; and the workstation syncs Camera, Pictures, Documents, KeePass, Notes, and Books with infra.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
      &lt;/picture&gt;
&lt;h2 id=&quot;keepassxc&quot; tabindex=&quot;-1&quot;&gt;KeePassXC &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/05/23/my-keepass-and-syncthing-setup/#keepassxc&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;m using KeePassXC on my Linux computers, and I find the application to be basic but serviceable. I use the browser extension for Firefox and that mostly works pretty well. It&#39;s not as full-featured or polished as 1Password, but it stores passwords just fine. One of the main things I miss from 1Password is the different data types. That&#39;s probably my #1 request!&lt;/p&gt;
&lt;p&gt;I have augmented KeePassXC with a couple scripts.&lt;/p&gt;
&lt;h3 id=&quot;new-masked-email&quot; tabindex=&quot;-1&quot;&gt;New masked email &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/05/23/my-keepass-and-syncthing-setup/#new-masked-email&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;1Password has this &#39;masked email&#39; feature, and it connects to Fastmail to create masked emails. Well, I like that feature, but I don&#39;t have 1Password, so I made my own version.&lt;/p&gt;
&lt;p&gt;This script takes a URL from a website and generates a masked email with a bit of randomness tacked in. It accepts the URL in basically any format and pulls the domain out for me.&lt;/p&gt;
&lt;p&gt;Then it saves the new masked email to my KeePass file via keepassxc-cli and copies it to my clipboard, ready to paste into the new site I&#39;m registering for. So the workflow is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Run script, paste in URL.&lt;/li&gt;
&lt;li&gt;Script prompts for KeePass password.&lt;/li&gt;
&lt;li&gt;Script adds a new entry to KeePass and copies the masked email to my clipboard.&lt;/li&gt;
&lt;li&gt;I flip back to my browser and paste in the email.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-euo&lt;/span&gt; pipefail

&lt;span class=&quot;token assign-left variable&quot;&gt;KDBX&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$HOME&lt;/span&gt;/KeePass/password-file.kdbx&quot;&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;keepassxc-cli&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; flatpak run &lt;span class=&quot;token parameter variable&quot;&gt;--command&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;keepassxc-cli org.keepassxc.KeePassXC &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&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;

&lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-rp&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Domain or URL (e.g. amazon.com, https://infosec.pub/): &quot;&lt;/span&gt; input

&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 punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-z&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$input&lt;/span&gt;&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;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Error: domain is required&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;2&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Strip protocol, path, port, query string, and whitespace → extract registrable domain&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$input&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s|^[a-zA-Z]*://||; s|[:/&#92;?].*||; s|[[:space:]]||g&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Keep last two parts (or three for two-letter TLDs like .co.uk, .com.au)&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;tld&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$host&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-oP&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#92;.[a-z]{2,3}&#92;.[a-z]{2}$&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&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 punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$tld&lt;/span&gt;&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;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$host&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-oP&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;[^.]+&#92;.[a-z]{2,3}&#92;.[a-z]{2}$&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$host&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-oP&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;[^.]+&#92;.[^.]+$&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;head&lt;/span&gt; /dev/urandom &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-dc&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;a-z0-9&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$domain&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s|&#92;.[^.]*$||&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${name}&lt;/span&gt;.&lt;span class=&quot;token variable&quot;&gt;${random}&lt;/span&gt;@my-sekrit-domain.com&quot;&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Email:  &lt;span class=&quot;token variable&quot;&gt;$email&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;entry&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Logins/&lt;span class=&quot;token variable&quot;&gt;$domain&lt;/span&gt; (&lt;span class=&quot;token variable&quot;&gt;$random&lt;/span&gt;)&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Entry:  &lt;span class=&quot;token variable&quot;&gt;$entry&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;

keepassxc-cli &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$KDBX&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$entry&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$email&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--url&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://&lt;span class=&quot;token variable&quot;&gt;$domain&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-L&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-U&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; --every-group

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$email&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; wl-copy
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Copied email to clipboard: &lt;span class=&quot;token variable&quot;&gt;$email&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;resolve-keepass-sync-conflicts&quot; tabindex=&quot;-1&quot;&gt;Resolve KeePass sync conflicts &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/05/23/my-keepass-and-syncthing-setup/#resolve-keepass-sync-conflicts&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Others have mentioned sync conflicts with KeePass and Syncthing, and I&#39;ve hit that a few times myself. To help me resolve this, I wrote a little bash script that uses keepassxc-cli to merge sync conflicts. So when I notice I have a sync conflict, this is the workflow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Script scans my KeePass folder for conflict files.&lt;/li&gt;
&lt;li&gt;Lists every conflict file it found and asks me to confirm.&lt;/li&gt;
&lt;li&gt;Prompts me for my master password once.&lt;/li&gt;
&lt;li&gt;Backs up my main DB, then merges each conflict file in turn.&lt;/li&gt;
&lt;li&gt;Archives the merged conflict files under &lt;code&gt;.stversions/&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This has worked pretty well for me the 5 or 6 times I&#39;ve used it.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Merge Syncthing conflict .kdbx files into the main KeePass DB.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Uses `keepassxc-cli merge --same-credentials` — one password prompt,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# per-entry newest-wins resolution.&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-euo&lt;/span&gt; pipefail

&lt;span class=&quot;token assign-left variable&quot;&gt;KEEPASS_DIR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${KEEPASS_DIR&lt;span class=&quot;token operator&quot;&gt;:-&lt;/span&gt;$HOME&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;KeePass}&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;MAIN_DB&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${MAIN_DB&lt;span class=&quot;token operator&quot;&gt;:-&lt;/span&gt;$KEEPASS_DIR&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;password-file.kdbx}&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;ARCHIVE_DIR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$KEEPASS_DIR&lt;/span&gt;/.stversions&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;KPXC&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;flatpak run &lt;span class=&quot;token parameter variable&quot;&gt;--command&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;keepassxc-cli org.keepassxc.KeePassXC&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;red&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 builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#92;033[31m%s&#92;033[0m&#92;n&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$*&lt;/span&gt;&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;
&lt;span class=&quot;token function-name function&quot;&gt;grn&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 builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#92;033[32m%s&#92;033[0m&#92;n&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$*&lt;/span&gt;&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;
&lt;span class=&quot;token function-name function&quot;&gt;ylw&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 builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#92;033[33m%s&#92;033[0m&#92;n&#39;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$*&lt;/span&gt;&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;

&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 parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$MAIN_DB&lt;/span&gt;&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; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; red &lt;span class=&quot;token string&quot;&gt;&quot;Main DB not found: &lt;span class=&quot;token variable&quot;&gt;$MAIN_DB&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&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; pgrep &lt;span class=&quot;token parameter variable&quot;&gt;-x&lt;/span&gt; keepassxc &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;/dev/null &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; pgrep &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;org.keepassxc.KeePassXC&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;/dev/null&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
  ylw &lt;span class=&quot;token string&quot;&gt;&quot;WARNING: KeePassXC GUI is running. Merge will write to disk, but the GUI&quot;&lt;/span&gt;
  ylw &lt;span class=&quot;token string&quot;&gt;&quot;will not reflect changes until you close and reopen the database.&quot;&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-rp&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Continue anyway? [y/N] &quot;&lt;/span&gt; ans
  &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 string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ans&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=~&lt;/span&gt; ^&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Yy&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 operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Aborted.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&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;fi&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;mapfile&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; conflicts &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$KEEPASS_DIR&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-maxdepth&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-name&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;*.sync-conflict-*.kdbx&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sort&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 punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${&lt;span class=&quot;token operator&quot;&gt;#&lt;/span&gt;conflicts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;@&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;}&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&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;then&lt;/span&gt;
  grn &lt;span class=&quot;token string&quot;&gt;&quot;No sync-conflict files found in &lt;span class=&quot;token variable&quot;&gt;$KEEPASS_DIR&lt;/span&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Found &lt;span class=&quot;token variable&quot;&gt;${&lt;span class=&quot;token operator&quot;&gt;#&lt;/span&gt;conflicts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;@&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;}&lt;/span&gt; conflict file(s):&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${conflicts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;@&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;}&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;  - &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;basename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$f&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-rp&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Merge all into &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;basename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$MAIN_DB&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;? [y/N] &quot;&lt;/span&gt; ans
&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 string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ans&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=~&lt;/span&gt; ^&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Yy&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 operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Aborted.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&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 function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ARCHIVE_DIR&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;stamp&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +%Y%m%d-%H%M%S&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;backup&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ARCHIVE_DIR&lt;/span&gt;/password-file~pre-merge-&lt;span class=&quot;token variable&quot;&gt;${stamp}&lt;/span&gt;.kdbx&quot;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$MAIN_DB&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$backup&lt;/span&gt;&quot;&lt;/span&gt;
grn &lt;span class=&quot;token string&quot;&gt;&quot;Backup: &lt;span class=&quot;token variable&quot;&gt;$backup&lt;/span&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;merged&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;failed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;conflict&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${conflicts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;@&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;}&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Merging: &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;basename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$conflict&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${KPXC&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;@&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;}&lt;/span&gt;&quot;&lt;/span&gt; merge --same-credentials &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$MAIN_DB&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$conflict&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;mv&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$conflict&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ARCHIVE_DIR&lt;/span&gt;/&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;basename&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$conflict&lt;/span&gt;&quot;&lt;/span&gt; .kdbx&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;~merged-&lt;span class=&quot;token variable&quot;&gt;${stamp}&lt;/span&gt;.kdbx&quot;&lt;/span&gt;
    grn &lt;span class=&quot;token string&quot;&gt;&quot;  merged&quot;&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;((&lt;/span&gt;merged&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
    red &lt;span class=&quot;token string&quot;&gt;&quot;  FAILED — conflict file left in place&quot;&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;((&lt;/span&gt;failed&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt;
grn &lt;span class=&quot;token string&quot;&gt;&quot;Merged: &lt;span class=&quot;token variable&quot;&gt;$merged&lt;/span&gt;&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; &lt;span class=&quot;token variable&quot;&gt;$failed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-gt&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&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 operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; red &lt;span class=&quot;token string&quot;&gt;&quot;Failed: &lt;span class=&quot;token variable&quot;&gt;$failed&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;keepassdx&quot; tabindex=&quot;-1&quot;&gt;KeePassDX &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/05/23/my-keepass-and-syncthing-setup/#keepassdx&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I use KeePassDX on my Android phone, and it works fine. It&#39;s nothing special, but it gets me to all my passwords. FWIW, I&#39;m a computer-oriented person and what I do with passwords on the phone is 99% just logging in to services or sites.&lt;/p&gt;
&lt;p&gt;What do you use for your passwords?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;mailto:michael@michaelharley.net?subject=Re:%20My%20KeePass%20and%20Syncthing%20setup&quot;&gt;Reply via email&lt;/a&gt; · &lt;a href=&quot;https://infosec.exchange/@michaelharley/116623600068067877&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Mastodon&lt;/a&gt; · &lt;a href=&quot;https://bsky.app/profile/michaelharley.net/post/3mnxtv2jyjk2x&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Bluesky&lt;/a&gt;&lt;/p&gt;
        </content>
      </entry>
      <entry>
        <title>I&#39;m against gerrymandering, but I voted Yes in Virginia</title>
        <link href="https://michaelharley.net/posts/2026/04/19/i-m-against-gerrymandering-but-i-voted-yes-in-virginia/"/>
        <updated>2026-04-19T18:25:17Z</updated>
        <id>https://michaelharley.net/posts/2026/04/19/i-m-against-gerrymandering-but-i-voted-yes-in-virginia/</id>
        <content type="html">
          &lt;p&gt;Rachelle and I voted early yesterday morning. The only thing on the ballot was &lt;a href=&quot;https://www.npr.org/2026/04/16/nx-s1-5786663/voters-in-virginia-could-have-one-of-the-final-words-in-trumps-redistricting-fight&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;redrawing the Virginia congressional voting map&lt;/a&gt;. Yes means you&#39;re in favor of redistricting, and No means you&#39;re not.&lt;/p&gt;
&lt;p&gt;I voted Yes.&lt;/p&gt;
&lt;p&gt;I&#39;m not in favor of gerrymandering as a principle, but that&#39;s not really the question. The real question is: should Democrats be allowed to redraw districts now that they&#39;re in power in Virginia?&lt;/p&gt;
&lt;p&gt;In the current US political environment, it seems naive of me to vote my principles because I don&#39;t feel there are equally principled people on the other side of the aisle. It feels like there are no longer opportunities to politely disagree about things. I hate that it feels like we&#39;re in a fight for our democracy. I don&#39;t know how to lower the temperature.&lt;/p&gt;
&lt;p&gt;The obvious answer to our winner-take-all gerrymandering problem is &lt;a href=&quot;https://en.wikipedia.org/wiki/Proportional_representation&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;proportional representation&lt;/a&gt;. The rest of the world will chuckle and mutter &amp;quot;no shit,&amp;quot; but this is a novel idea for us Americans. I would 100% vote for implementing a proportional system in the US. However, I will not allow my vote to be used for my own destruction&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://michaelharley.net/posts/2026/04/19/i-m-against-gerrymandering-but-i-voted-yes-in-virginia/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;.&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;With apologies to Joseph Goebbels, who in 1928 mocked democracies for being &amp;quot;the big joke&amp;quot; that &amp;quot;gives its mortal enemies the tools to its own destruction.&amp;quot; Cited in Richard J. Evans, &lt;em&gt;The Coming of the Third Reich&lt;/em&gt; (2003), p. 451. &lt;a href=&quot;https://michaelharley.net/posts/2026/04/19/i-m-against-gerrymandering-but-i-voted-yes-in-virginia/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;p&gt;&lt;a href=&quot;mailto:michael@michaelharley.net?subject=Re:%20I&amp;#39;m%20against%20gerrymandering,%20but%20I%20voted%20Yes%20in%20Virginia&quot;&gt;Reply via email&lt;/a&gt; · &lt;a href=&quot;https://infosec.exchange/@michaelharley/116432786374818287&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Mastodon&lt;/a&gt;&lt;/p&gt;
        </content>
      </entry>
      <entry>
        <title>Trip Report: Saturday biking around Richmond, VA</title>
        <link href="https://michaelharley.net/posts/2026/04/12/trip-report-saturday-biking-around-richmond-va/"/>
        <updated>2026-04-12T15:43:51Z</updated>
        <id>https://michaelharley.net/posts/2026/04/12/trip-report-saturday-biking-around-richmond-va/</id>
        <content type="html">
          &lt;p&gt;Today was such a beautiful day in Richmond, and I decided to enjoy it by taking a tour around the city on my ebike.&lt;/p&gt;
&lt;p&gt;Since I&#39;m in the market for a new bike shop, I rode out to &lt;a href=&quot;https://www.kulwheels.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Kul Wheels&lt;/a&gt; as they&#39;re an official bike shop of my bike brand, &lt;a href=&quot;https://www.aventon.com/collections/ebikes&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Aventon&lt;/a&gt;. Bonus points because they&#39;re right on the &lt;a href=&quot;https://www.virginiacapitaltrail.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Virginia Capital Trail&lt;/a&gt;. There were lots of people on the trail today, and it was a really pleasant 5-mile ride out to their shop. They were pretty busy with lots of people renting bikes, but Jake took the time to chat with me and I certainly got some good vibes.&lt;/p&gt;
&lt;p&gt;The next stop on my tour was heading out to &lt;a href=&quot;https://jamesriverpark.org/explore-the-park-pony-pasture/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pony Pasture&lt;/a&gt;. The route from the bike shop to Pony Pasture took me back along the Virginia Capital Trail, and I took a quick detour through &lt;a href=&quot;https://en.wikipedia.org/wiki/Belle_Isle_(Richmond,_Virginia)&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Belle Isle&lt;/a&gt; and then over to the Forest Hill side of Richmond. I find myself gravitating to this side of the city when I&#39;m on my bike. I blame &lt;a href=&quot;https://www.theveilbrewing.com/rva-fh&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;The Veil&lt;/a&gt;. The beer is good, and they have a nice outside area, plus they have a bike rack!&lt;/p&gt;
&lt;p&gt;After stopping at The Veil for lunch, I packed up and headed home on the last leg of my tour. Despite my battery dropping below 20%, I still felt pretty good, even if a bit tired. I was within 2 miles of home when I felt a tire losing air. With 2-inch tires, the bike starts to get pretty bouncy. I pulled over to assess the situation and sure enough, the rear was nearly all the way flat. I don&#39;t carry a spare tube, so I called Rachelle to pick me up. I was a little bummed to not be able to get home, but sometimes that&#39;s just the way things go.&lt;/p&gt;
&lt;p&gt;Please enjoy these photos from my ride.&lt;/p&gt;
&lt;picture&gt;
        &lt;source type=&quot;image/webp&quot; srcset=&quot;https://michaelharley.net/assets/images/034y8zKH1W-300.webp 300w, https://michaelharley.net/assets/images/034y8zKH1W-600.webp 600w, https://michaelharley.net/assets/images/034y8zKH1W-900.webp 900w, https://michaelharley.net/assets/images/034y8zKH1W-1200.webp 1200w, https://michaelharley.net/assets/images/034y8zKH1W-1600.webp 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
  &lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://michaelharley.net/assets/images/034y8zKH1W-300.jpeg 300w, https://michaelharley.net/assets/images/034y8zKH1W-600.jpeg 600w, https://michaelharley.net/assets/images/034y8zKH1W-900.jpeg 900w, https://michaelharley.net/assets/images/034y8zKH1W-1200.jpeg 1200w, https://michaelharley.net/assets/images/034y8zKH1W-1600.jpeg 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
        &lt;img src=&quot;https://michaelharley.net/assets/images/034y8zKH1W-1600.jpeg&quot; width=&quot;1600&quot; height=&quot;1205&quot; alt=&quot;An electric bike parked on a hillside overlook with a sprawling cityscape in the background, featuring downtown buildings, residential areas, and green vegetation along the observation point.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
      &lt;/picture&gt;
&lt;picture&gt;
        &lt;source type=&quot;image/webp&quot; srcset=&quot;https://michaelharley.net/assets/images/SRDn1VlUmW-300.webp 300w, https://michaelharley.net/assets/images/SRDn1VlUmW-600.webp 600w, https://michaelharley.net/assets/images/SRDn1VlUmW-900.webp 900w, https://michaelharley.net/assets/images/SRDn1VlUmW-1200.webp 1200w, https://michaelharley.net/assets/images/SRDn1VlUmW-1600.webp 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
  &lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://michaelharley.net/assets/images/SRDn1VlUmW-300.jpeg 300w, https://michaelharley.net/assets/images/SRDn1VlUmW-600.jpeg 600w, https://michaelharley.net/assets/images/SRDn1VlUmW-900.jpeg 900w, https://michaelharley.net/assets/images/SRDn1VlUmW-1200.jpeg 1200w, https://michaelharley.net/assets/images/SRDn1VlUmW-1600.jpeg 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
        &lt;img src=&quot;https://michaelharley.net/assets/images/SRDn1VlUmW-1600.jpeg&quot; width=&quot;1600&quot; height=&quot;1205&quot; alt=&quot;A waterfront promenade with a black metal railing overlooks a calm blue river, with a city skyline visible across the water in the background. Several people are scattered along the grassy park area on the right, enjoying the scenic riverside setting on a clear day.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
      &lt;/picture&gt;
&lt;picture&gt;
        &lt;source type=&quot;image/webp&quot; srcset=&quot;https://michaelharley.net/assets/images/dyhOye1b1z-300.webp 300w, https://michaelharley.net/assets/images/dyhOye1b1z-600.webp 600w, https://michaelharley.net/assets/images/dyhOye1b1z-900.webp 900w, https://michaelharley.net/assets/images/dyhOye1b1z-1200.webp 1200w, https://michaelharley.net/assets/images/dyhOye1b1z-1600.webp 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
  &lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://michaelharley.net/assets/images/dyhOye1b1z-300.jpeg 300w, https://michaelharley.net/assets/images/dyhOye1b1z-600.jpeg 600w, https://michaelharley.net/assets/images/dyhOye1b1z-900.jpeg 900w, https://michaelharley.net/assets/images/dyhOye1b1z-1200.jpeg 1200w, https://michaelharley.net/assets/images/dyhOye1b1z-1600.jpeg 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
        &lt;img src=&quot;https://michaelharley.net/assets/images/dyhOye1b1z-1600.jpeg&quot; width=&quot;1600&quot; height=&quot;1205&quot; alt=&quot;A KUL Wheels electric bikes shop with a white building displaying Sales Service signage. Multiple electric bicycles are parked outside on the pavement, with a yellow tent canopy and customers visible near the entrance.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
      &lt;/picture&gt;
&lt;picture&gt;
        &lt;source type=&quot;image/webp&quot; srcset=&quot;https://michaelharley.net/assets/images/8KFh023fI5-300.webp 300w, https://michaelharley.net/assets/images/8KFh023fI5-600.webp 600w, https://michaelharley.net/assets/images/8KFh023fI5-900.webp 900w, https://michaelharley.net/assets/images/8KFh023fI5-1200.webp 1200w, https://michaelharley.net/assets/images/8KFh023fI5-1600.webp 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
  &lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://michaelharley.net/assets/images/8KFh023fI5-300.jpeg 300w, https://michaelharley.net/assets/images/8KFh023fI5-600.jpeg 600w, https://michaelharley.net/assets/images/8KFh023fI5-900.jpeg 900w, https://michaelharley.net/assets/images/8KFh023fI5-1200.jpeg 1200w, https://michaelharley.net/assets/images/8KFh023fI5-1600.jpeg 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
        &lt;img src=&quot;https://michaelharley.net/assets/images/8KFh023fI5-1600.jpeg&quot; width=&quot;1600&quot; height=&quot;1205&quot; alt=&quot;A winding asphalt path curves through a grassy, tree-lined area with a city skyline visible in the distance and a road with vehicles parallel to the path on the right.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
      &lt;/picture&gt;
&lt;picture&gt;
        &lt;source type=&quot;image/webp&quot; srcset=&quot;https://michaelharley.net/assets/images/j9MEPP1c1Z-300.webp 300w, https://michaelharley.net/assets/images/j9MEPP1c1Z-600.webp 600w, https://michaelharley.net/assets/images/j9MEPP1c1Z-900.webp 900w, https://michaelharley.net/assets/images/j9MEPP1c1Z-1200.webp 1200w, https://michaelharley.net/assets/images/j9MEPP1c1Z-1600.webp 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
  &lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://michaelharley.net/assets/images/j9MEPP1c1Z-300.jpeg 300w, https://michaelharley.net/assets/images/j9MEPP1c1Z-600.jpeg 600w, https://michaelharley.net/assets/images/j9MEPP1c1Z-900.jpeg 900w, https://michaelharley.net/assets/images/j9MEPP1c1Z-1200.jpeg 1200w, https://michaelharley.net/assets/images/j9MEPP1c1Z-1600.jpeg 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
        &lt;img src=&quot;https://michaelharley.net/assets/images/j9MEPP1c1Z-1600.jpeg&quot; width=&quot;1600&quot; height=&quot;1205&quot; alt=&quot;A public park area beneath highway overpasses features a paved pathway, green grass, young trees, and three rust-colored abstract metal sculptures. Concrete pillars support the elevated highways above.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
      &lt;/picture&gt;
&lt;picture&gt;
        &lt;source type=&quot;image/webp&quot; srcset=&quot;https://michaelharley.net/assets/images/DYsgmb6ZnR-300.webp 300w, https://michaelharley.net/assets/images/DYsgmb6ZnR-600.webp 600w, https://michaelharley.net/assets/images/DYsgmb6ZnR-900.webp 900w, https://michaelharley.net/assets/images/DYsgmb6ZnR-1200.webp 1200w, https://michaelharley.net/assets/images/DYsgmb6ZnR-1600.webp 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
  &lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://michaelharley.net/assets/images/DYsgmb6ZnR-300.jpeg 300w, https://michaelharley.net/assets/images/DYsgmb6ZnR-600.jpeg 600w, https://michaelharley.net/assets/images/DYsgmb6ZnR-900.jpeg 900w, https://michaelharley.net/assets/images/DYsgmb6ZnR-1200.jpeg 1200w, https://michaelharley.net/assets/images/DYsgmb6ZnR-1600.jpeg 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
        &lt;img src=&quot;https://michaelharley.net/assets/images/DYsgmb6ZnR-1600.jpeg&quot; width=&quot;1600&quot; height=&quot;1205&quot; alt=&quot;A wide river with rocky outcrops and forested banks stretches across the landscape, viewed from a concrete bridge or structure on the left side under clear blue sky.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
      &lt;/picture&gt;
&lt;picture&gt;
        &lt;source type=&quot;image/webp&quot; srcset=&quot;https://michaelharley.net/assets/images/sPmLkRKISj-300.webp 300w, https://michaelharley.net/assets/images/sPmLkRKISj-600.webp 600w, https://michaelharley.net/assets/images/sPmLkRKISj-900.webp 900w, https://michaelharley.net/assets/images/sPmLkRKISj-1200.webp 1200w, https://michaelharley.net/assets/images/sPmLkRKISj-1600.webp 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
  &lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://michaelharley.net/assets/images/sPmLkRKISj-300.jpeg 300w, https://michaelharley.net/assets/images/sPmLkRKISj-600.jpeg 600w, https://michaelharley.net/assets/images/sPmLkRKISj-900.jpeg 900w, https://michaelharley.net/assets/images/sPmLkRKISj-1200.jpeg 1200w, https://michaelharley.net/assets/images/sPmLkRKISj-1600.jpeg 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
        &lt;img src=&quot;https://michaelharley.net/assets/images/sPmLkRKISj-1600.jpeg&quot; width=&quot;1600&quot; height=&quot;1205&quot; alt=&quot;View from a railing overlooking a wide river at flood stage, with exposed tree stumps and vegetation islands visible in the water. A highway bridge spans across the river in the background under a clear blue sky with forested banks on both sides.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
      &lt;/picture&gt;
&lt;picture&gt;
        &lt;source type=&quot;image/webp&quot; srcset=&quot;https://michaelharley.net/assets/images/cCmlLevgmy-300.webp 300w, https://michaelharley.net/assets/images/cCmlLevgmy-600.webp 600w, https://michaelharley.net/assets/images/cCmlLevgmy-900.webp 900w, https://michaelharley.net/assets/images/cCmlLevgmy-1200.webp 1200w, https://michaelharley.net/assets/images/cCmlLevgmy-1600.webp 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
  &lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://michaelharley.net/assets/images/cCmlLevgmy-300.jpeg 300w, https://michaelharley.net/assets/images/cCmlLevgmy-600.jpeg 600w, https://michaelharley.net/assets/images/cCmlLevgmy-900.jpeg 900w, https://michaelharley.net/assets/images/cCmlLevgmy-1200.jpeg 1200w, https://michaelharley.net/assets/images/cCmlLevgmy-1600.jpeg 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
        &lt;img src=&quot;https://michaelharley.net/assets/images/cCmlLevgmy-1600.jpeg&quot; width=&quot;1600&quot; height=&quot;1205&quot; alt=&quot;A pedestrian walkway runs between massive concrete bridge pillars spanning a river, with metal railings on both sides and a few people visible in the distance. Green trees line the riverbanks under a clear blue sky.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
      &lt;/picture&gt;
&lt;picture&gt;
        &lt;source type=&quot;image/webp&quot; srcset=&quot;https://michaelharley.net/assets/images/y_vTOSUejO-300.webp 300w, https://michaelharley.net/assets/images/y_vTOSUejO-600.webp 600w, https://michaelharley.net/assets/images/y_vTOSUejO-900.webp 900w, https://michaelharley.net/assets/images/y_vTOSUejO-1200.webp 1200w, https://michaelharley.net/assets/images/y_vTOSUejO-1600.webp 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
  &lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://michaelharley.net/assets/images/y_vTOSUejO-300.jpeg 300w, https://michaelharley.net/assets/images/y_vTOSUejO-600.jpeg 600w, https://michaelharley.net/assets/images/y_vTOSUejO-900.jpeg 900w, https://michaelharley.net/assets/images/y_vTOSUejO-1200.jpeg 1200w, https://michaelharley.net/assets/images/y_vTOSUejO-1600.jpeg 1600w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
        &lt;img src=&quot;https://michaelharley.net/assets/images/y_vTOSUejO-1600.jpeg&quot; width=&quot;1600&quot; height=&quot;1205&quot; alt=&quot;A scenic riverside area with large boulders in the foreground and an informational sign about Hollywood Rapids visible in the lower right. In the background, people explore rocky outcrops along the flowing river, with forested hills and houses visible across the water under a partly cloudy sky.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
      &lt;/picture&gt;
&lt;picture&gt;
        &lt;source type=&quot;image/webp&quot; srcset=&quot;https://michaelharley.net/assets/images/VLMtUrPI22-300.webp 300w, https://michaelharley.net/assets/images/VLMtUrPI22-600.webp 600w, https://michaelharley.net/assets/images/VLMtUrPI22-900.webp 900w, https://michaelharley.net/assets/images/VLMtUrPI22-1200.webp 1200w, https://michaelharley.net/assets/images/VLMtUrPI22-1542.webp 1542w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
  &lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://michaelharley.net/assets/images/VLMtUrPI22-300.jpeg 300w, https://michaelharley.net/assets/images/VLMtUrPI22-600.jpeg 600w, https://michaelharley.net/assets/images/VLMtUrPI22-900.jpeg 900w, https://michaelharley.net/assets/images/VLMtUrPI22-1200.jpeg 1200w, https://michaelharley.net/assets/images/VLMtUrPI22-1542.jpeg 1542w&quot; sizes=&quot;(min-width: 30em) 50vw, 100vw&quot; /&gt;
        &lt;img src=&quot;https://michaelharley.net/assets/images/VLMtUrPI22-1542.jpeg&quot; width=&quot;1542&quot; height=&quot;2048&quot; alt=&quot;A hand wearing a black glove holds a chocolate and vanilla swirl ice cream cone in a waffle cone. In the blurred background, a bicycle and parked cars are visible on a residential street.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
      &lt;/picture&gt;
&lt;p&gt;&lt;a href=&quot;mailto:michael@michaelharley.net?subject=Re:%20Trip%20Report:%20Saturday%20biking%20around%20Richmond,%20VA&quot;&gt;Reply via email&lt;/a&gt; · &lt;a href=&quot;https://infosec.exchange/@michaelharley/116392586031421165&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Mastodon&lt;/a&gt;&lt;/p&gt;
        </content>
      </entry>
      <entry>
        <title>Re: On AI-enhanced Writing</title>
        <link href="https://michaelharley.net/posts/2026/04/10/re-on-ai-enhanced-writing/"/>
        <updated>2026-04-10T11:02:55Z</updated>
        <id>https://michaelharley.net/posts/2026/04/10/re-on-ai-enhanced-writing/</id>
        <content type="html">
          &lt;p&gt;This post is in response to &lt;a href=&quot;https://enocc.com/blog/2026-04-09-on-ai-enhanced-writing.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;On AI-enhanced Writing&lt;/a&gt;. Pablo goes into a point by point critique of Arun Venkatesan&#39;s post, &lt;a href=&quot;https://arun.is/blog/ai-enhanced-writing/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ai-enhanced writing process&lt;/a&gt; [sic].&lt;/p&gt;
&lt;p&gt;I know I have a minority opinion on this, but why not judge the thing that&#39;s produced instead of judging &lt;em&gt;how&lt;/em&gt; it was produced? Only Arun can judge if what they&#39;ve produced, with the help of whatever tools and technologies they choose, hits the mark of what was intended and if they&#39;re happy with the output.&lt;/p&gt;
&lt;p&gt;It&#39;s one thing to say a certain workflow for writing doesn&#39;t work for each of us in our own personal writing. But this is an exercise to try to determine how much AI use is too much AI use when trying to come up with &lt;a href=&quot;https://mastodon.social/@powRSS/116378396948299560&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;anti-AI policies&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There have been lazy, bad writers way before AI entered the chat. I think it&#39;s a mistake to categorically consider all AI-assisted writing/code/whatever as &#39;slop&#39;. Could Arun&#39;s writing be better if they went to school, pursued an education that &lt;em&gt;heavily emphasized writing as a skill&lt;/em&gt; and practiced all the techniques that Pablo considers to be part of the writing process? Maybe, but that&#39;s just, like, his opinion, man.&lt;/p&gt;
&lt;p&gt;Pablo&#39;s response feels a bit like gatekeeping in my mind, and I see it often in these discussions. Good writers and developers don&#39;t like that other people are not putting in the hard work and time to learn how to be better writers or developers.&lt;/p&gt;
&lt;p&gt;But to bring all this back to my point: disallow content from lazy, bad writers because the writing produced is lazy and bad, not because AI was used in some way to help.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;mailto:michael@michaelharley.net?subject=Re:%20Re:%20On%20AI-enhanced%20Writing&quot;&gt;Reply via email&lt;/a&gt; · &lt;a href=&quot;https://infosec.exchange/@michaelharley/116380140307815442&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Mastodon&lt;/a&gt;&lt;/p&gt;
        </content>
      </entry>
      <entry>
        <title>My Experience as a Juror on a Cold Case Rape Trial</title>
        <link href="https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/"/>
        <updated>2026-03-18T10:01:01Z</updated>
        <id>https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/</id>
        <content type="html">
          &lt;p&gt;I was selected to be a juror on a cold case rape from August of 1992. The victim had just graduated college and was staying with her mom over the summer while she waited for her own apartment to be made ready.&lt;/p&gt;
&lt;p&gt;The prosecution alleged Maurice L. Muhammad entered through a first floor bedroom window around 2 a.m. on August 31st, 1992 and raped the victim, threatening her with a gun if she didn&#39;t comply.&lt;/p&gt;
&lt;p&gt;Muhammad was charged with three felonies. I can&#39;t link to the court cases directly as the system doesn&#39;t seem to provide that as an option, but the case number is &lt;strong&gt;CR24F02424-00&lt;/strong&gt;. You can search it from the &lt;a href=&quot;https://eapps.courts.state.va.us/ocis/landing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Online Case Information System 2.0&lt;/a&gt; if you&#39;re so inclined. If you search by case number and select &lt;em&gt;Richmond City Circuit Court&lt;/em&gt; from the court dropdown, you&#39;ll find it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rape&lt;/li&gt;
&lt;li&gt;Burglary while armed with a deadly weapon&lt;/li&gt;
&lt;li&gt;Use of a firearm in the commission of a felony&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This case was made possible by the Virginia Sexual Assault Kit Initiative (SAKI), a grant-funded program through the Virginia Attorney General&#39;s office that has funded the retesting of thousands of rape kits from decades past. The victim&#39;s kit was collected in 1992 but never tested. In 1992, DNA testing required a known sample to compare against, and there were no searchable databases yet. When the kit was finally retested under SAKI, the DNA matched Muhammad.&lt;/p&gt;
&lt;h2 id=&quot;day-one&quot; tabindex=&quot;-1&quot;&gt;Day One &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#day-one&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As I explained in my jury duty post, we had a very long first day as we went through the jury selection process. Two people testified starting at around 4 p.m. on the first day.&lt;/p&gt;
&lt;h3 id=&quot;the-victim&quot; tabindex=&quot;-1&quot;&gt;The Victim &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#the-victim&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The first person called by the prosecution was the victim. Her testimony was pretty raw and I felt awful on her behalf. She was testifying to the fact that she was raped, but there wasn&#39;t anything in her testimony that linked the rape to Muhammad. She didn&#39;t have much recall about specifics, which is understandable as it was a traumatic event and it happened over 30 years ago.&lt;/p&gt;
&lt;p&gt;She testified she left her first floor window open because it was August in Richmond, VA and they did not have AC. She said she woke up and someone was standing beside her bed. She testified the intruder patted his side, and she took that to mean he had a gun. She then testified he raped her. I believe what happened to the victim met the legal definition of rape.&lt;/p&gt;
&lt;h3 id=&quot;examining-physician&quot; tabindex=&quot;-1&quot;&gt;Examining Physician &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#examining-physician&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The key piece of evidence in this case was the PERK (Physical Evidence Recovery Kit), Virginia&#39;s term for what is commonly called a rape kit. The examining physician collected a vaginal cervical swab from the victim, which contained male DNA. In 1992 there was nothing to compare the DNA against because there were no suspects. Decades later, retested under SAKI, it matched Muhammad when the DNA sample was run against the DNA database.&lt;/p&gt;
&lt;p&gt;The doctor was able to testify that she collected the swab. She didn&#39;t have any personal recollection, but she was able to testify that the paperwork and signature from the 1992 documents were hers.&lt;/p&gt;
&lt;h2 id=&quot;day-two&quot; tabindex=&quot;-1&quot;&gt;Day Two &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#day-two&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The second day was a very long day. We were there for about 11 hours and all the witnesses kind of run together in my head now as I sit here to recollect my experience.&lt;/p&gt;
&lt;h3 id=&quot;the-er-nurse&quot; tabindex=&quot;-1&quot;&gt;The ER Nurse &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#the-er-nurse&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The ER nurse testified that she helped the attending physician collect the PERK. The doctor did the internal swab, and the nurse helped pack everything into the kit and also helped collect other pieces like external swabs.&lt;/p&gt;
&lt;p&gt;This is where a major part of the defense team&#39;s strategy rested. The paperwork from 1992 seemed to indicate that only two swabs were collected and stored from the kit. Later observations at the various steps seemed to indicate there were four swabs. The defense&#39;s conjecture was that we can&#39;t be sure envelopes didn&#39;t get mixed up over the past 30-plus years, given how long it&#39;s been and how often the kit was moved and processed by different people over the years.&lt;/p&gt;
&lt;h3 id=&quot;the-detective-from-1992&quot; tabindex=&quot;-1&quot;&gt;The Detective from 1992 &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#the-detective-from-1992&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The detective from 1992 wasn&#39;t a very good witness. She didn&#39;t bring her glasses and was having a hard time reading the records they were asking her to testify to. The judge ended up loaning his readers to her, but they didn&#39;t seem strong enough. She had no personal recollection of the case, but according to the paperwork and her testimony, she was the person who collected the PERK from the ER and took it to the lab for testing.&lt;/p&gt;
&lt;p&gt;This was important for the prosecution because it speaks to the chain of custody.&lt;/p&gt;
&lt;h3 id=&quot;the-evidence-room-manager&quot; tabindex=&quot;-1&quot;&gt;The Evidence Room Manager &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#the-evidence-room-manager&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This was the person who runs the police evidence warehouse system. She testified to processes and paperwork. Her testimony was there for chain of custody, I think.&lt;/p&gt;
&lt;h3 id=&quot;the-experts&quot; tabindex=&quot;-1&quot;&gt;The Experts &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#the-experts&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There were several expert witnesses who testified. They were mostly testifying about the process and the science behind all of it. The experts included a forensic nurse and a forensic scientist, and they were mostly speaking to the procedures and science of forensics.&lt;/p&gt;
&lt;p&gt;To a person, the experts came across as great witnesses. They were all highly credentialed and qualified, well spoken, articulate, and obviously real experts in their respective fields.&lt;/p&gt;
&lt;h3 id=&quot;the-lab-techs&quot; tabindex=&quot;-1&quot;&gt;The Lab Techs &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#the-lab-techs&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There were many people involved in both processing and testing the kit from 1992 and the people who retested it starting in 2022. No one really had any personal recollection of doing any of this work, but everything is documented, so the techs were mostly testifying that the paperwork had their signature and speaking to the processes and how the chain of custody worked.&lt;/p&gt;
&lt;p&gt;The defense made a point to highlight how complex the process is and how many steps are involved. They showed that some testing happens in batches. For example, at a certain step in the process, six different samples were run at the same time as our case. The implication was that there&#39;s an opportunity for cross contamination.&lt;/p&gt;
&lt;p&gt;The two lab people who made the biggest impression on me were Ms. Friese from DLI and Ms. Cooley from the Virginia lab. They seemed really smart and knowledgeable.&lt;/p&gt;
&lt;h3 id=&quot;det-m-anhstrom&quot; tabindex=&quot;-1&quot;&gt;Det. M. Anhstrom &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#det-m-anhstrom&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Det. Anhstrom was the detective who got the case once the PERK was retested as part of the SAKI initiative. He came across as a good witness. He was gruff, no nonsense, and matter of fact. Combined with his imposing physical presence, he makes an impression. I would enjoy watching a TV show or reading a book with a character based on him.&lt;/p&gt;
&lt;p&gt;He testified to the chain of custody, as he was the person who retrieved the PERK from the evidence location and sent it to the lab for retesting.&lt;/p&gt;
&lt;h2 id=&quot;day-three&quot; tabindex=&quot;-1&quot;&gt;Day Three &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#day-three&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We were expecting to wrap up on the third day. The prosecution recalled three witnesses to ask follow-up questions, but then we were excused while the lawyers and judge took care of some pre-closing business.&lt;/p&gt;
&lt;p&gt;After lunch, we heard closing arguments from the lawyers, received our instructions from the judge, and were asked to begin our deliberations.&lt;/p&gt;
&lt;p&gt;This is when they unsealed the two alternate jurors selected at the beginning of the trial and dismissed them. This was really abrupt. We&#39;d just spent the majority of three days with these people, getting to know them, and they just left. We didn&#39;t get a chance to say goodbye or good luck or anything.&lt;/p&gt;
&lt;h2 id=&quot;deliberations&quot; tabindex=&quot;-1&quot;&gt;Deliberations &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#deliberations&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The prosecution&#39;s case was based entirely on the DNA from the PERK collected in 1992. The prosecution introduced no other evidence, the victim did not identify the perpetrator, and no fingerprints were introduced. No other testimony or evidence about Muhammad was introduced at all.&lt;/p&gt;
&lt;p&gt;The defense did its best to introduce reasonable doubt. It has been over 30 years since the PERK was collected. The evidence was handled by many different people. There were several mistakes in the paperwork at multiple stages. The defense argued that since mistakes were documented with the handling of the DNA evidence, and since the current investigation didn&#39;t test and compare the victim&#39;s DNA to the DNA from the kit, we can&#39;t be sure that Muhammad&#39;s DNA came from the PERK collected in 1992.&lt;/p&gt;
&lt;p&gt;Ultimately, we did not think the doubt introduced by the defense rose to the level of reasonable doubt. I personally didn&#39;t think it was reasonable to conclude that the police and labs positively matched Muhammad&#39;s DNA but that it somehow came from a different case. Because that&#39;s the only explanation that would make any sort of sense.&lt;/p&gt;
&lt;p&gt;We voted and all agreed the prosecution proved the DNA from the kit belonged to Muhammad and that it was the same DNA recovered during the PERK collection in 1992. While the defense did introduce some doubt, it wasn&#39;t reasonable doubt. We found him guilty on the rape charge.&lt;/p&gt;
&lt;p&gt;We voted and all agreed the prosecution did not prove beyond a reasonable doubt that Muhammad was armed with a firearm. The only evidence introduced was the victim&#39;s testimony that she felt the perpetrator pat his side to imply he had a gun. The victim&#39;s testimony was spotty and her recollection of events wasn&#39;t very strong, as she often answered &amp;quot;I don&#39;t recall&amp;quot; when asked about details. We found him not guilty on the gun charges.&lt;/p&gt;
&lt;p&gt;We voted and all agreed that if we found Muhammad guilty of rape, then he must by extension also be guilty of the burglary charge.&lt;/p&gt;
&lt;h2 id=&quot;final-thoughts&quot; tabindex=&quot;-1&quot;&gt;Final Thoughts &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#final-thoughts&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Going through this experience as a juror felt important and I took my duty very seriously. I felt the other jurors did as well. We carefully examined the evidence and considered the testimony. We tried to steelman the defense&#39;s assertions to see if we could find our way to reasonable doubt, but we just couldn&#39;t. I truly felt the prosecution proved beyond a reasonable doubt that the DNA from the PERK collected in 1992 belonged to Muhammad.&lt;/p&gt;
&lt;h3 id=&quot;the-judge&quot; tabindex=&quot;-1&quot;&gt;The Judge &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#the-judge&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The judge for our case was the Hon. Tracy W. J. Thorne-Begland. I was struck by how patient he seemed in explaining all the rules and details. He had an air of authority and calmness without ever seeming flustered or frustrated. I think he runs a very tight ship.&lt;/p&gt;
&lt;h3 id=&quot;the-prosecution&quot; tabindex=&quot;-1&quot;&gt;The Prosecution &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#the-prosecution&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I&#39;ve been unable to locate the prosecuting attorneys from online resources. That makes sense because I imagine there is some risk to them if people want to cause them harm. My failure to name them here is purely because I can&#39;t find them online, and I never made a note of their names in my trial notes.&lt;/p&gt;
&lt;p&gt;My impression is that they were well prepared and worked well together. They were professional and courteous. I did notice a few unguarded moments from the attorney who was asking most of the questions. When there was an objection, the attorneys would approach the bench and whisper to the judge. I noticed this mostly at the end of the second day. While she was listening to the defense&#39;s objections, her feelings were all over her face. She needed someone to give her a nudge to remind her to fix her face.&lt;/p&gt;
&lt;p&gt;The same attorney also had a habit of asking long, compound questions with qualifying statements, and I sometimes lost the thread of what she was asking.&lt;/p&gt;
&lt;p&gt;During closing arguments, she would point at Mr. Muhammad repeatedly, and it just felt contrived and theatrical. It made me uncomfortable, but maybe that&#39;s a me thing.&lt;/p&gt;
&lt;h3 id=&quot;the-defense&quot; tabindex=&quot;-1&quot;&gt;The Defense &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/18/my-experience-as-a-juror-on-a-cold-case-rape-trial/#the-defense&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The defense attorneys were Samantha Mier and Julia Snyder. They also seemed well prepared and worked well together. Mier did opening arguments and was very attentive in observing the jury. Snyder did almost all the cross examinations and the closing arguments.&lt;/p&gt;
&lt;p&gt;During the trial, we had no idea they were public defenders until the very last day, when Det. Anhstrom mentioned he opened the evidence box for the &#39;&lt;em&gt;public defenders&lt;/em&gt;&#39;. Even then, it wasn&#39;t clear that these attorneys were the public defenders.&lt;/p&gt;
&lt;p&gt;Maybe I&#39;m projecting here, but public defenders are often portrayed in movies and TV as under qualified, overworked people who are barely able to represent their clients. That was not the impression these attorneys gave. I genuinely thought they were private attorneys.&lt;/p&gt;
&lt;p&gt;After the trial, I did some searching and discovered that Muhammad had previous charges and was listed on the sex offender registry. Based on my searching, I&#39;m nearly positive he was already incarcerated at the time of the trial. That never came up during the trial, and I assume the defense worked hard to keep it from biasing the jury. The only small clue we had was that Mr. Muhammad was wearing white gym socks with his suit. In retrospect, that seemed like a tell.&lt;/p&gt;
&lt;p&gt;In conclusion, I honestly feel that Muhammad got a fair trial. What stays with me is how impactful the rape kits are. Evidence collected over 30 years ago, carefully preserved through decades of moves and transfers and hands, ultimately led to the identification and conviction of a rapist.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;mailto:michael@michaelharley.net?subject=Re:%20My%20Experience%20as%20a%20Juror%20on%20a%20Cold%20Case%20Rape%20Trial&quot;&gt;Reply via email&lt;/a&gt; · &lt;a href=&quot;https://infosec.exchange/@michaelharley/116249610204560112&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Mastodon&lt;/a&gt; · &lt;a href=&quot;https://bsky.app/profile/michaelharley.net/post/3mhdaedcuxv24&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Bluesky&lt;/a&gt;&lt;/p&gt;
        </content>
      </entry>
      <entry>
        <title>I Was Called for Jury Duty in Richmond, VA. Here&#39;s What I Wish I&#39;d Known.</title>
        <link href="https://michaelharley.net/posts/2026/03/13/i-was-called-for-jury-duty-in-richmond-va-heres-what-i-wish-i-d-known/"/>
        <updated>2026-03-13T09:55:10Z</updated>
        <id>https://michaelharley.net/posts/2026/03/13/i-was-called-for-jury-duty-in-richmond-va-heres-what-i-wish-i-d-known/</id>
        <content type="html">
          &lt;p&gt;Welp, it finally happened. I was called for Jury Duty. I think I must be a weirdo because I was curious and, honestly, looking forward to the opportunity to experience it.&lt;/p&gt;
&lt;h2 id=&quot;tl-dr&quot; tabindex=&quot;-1&quot;&gt;TL;DR &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/13/i-was-called-for-jury-duty-in-richmond-va-heres-what-i-wish-i-d-known/#tl-dr&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If I could send past me an email, this is what I&#39;d want to know.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When you first call in, you get an older recording and it&#39;s slightly out of date. I recommend listening to it at least once all the way through, but on the following check-ins you can just press 1 to go straight to see if you&#39;ve been selected.&lt;/li&gt;
&lt;li&gt;The instructions for jury duty say plastic containers only, but you can bring stainless steel insulated water bottles and coffee mugs. I think the main thing they&#39;re trying to keep out is glass.&lt;/li&gt;
&lt;li&gt;Bring some snacks. There are vending machines on LL, but the jury selection part happened on the 3rd floor, and once we went up, we did not have access to them. The jury selection part ran late for our group, so it was very late in the afternoon before they ordered us Jimmy John&#39;s on the first day. Other than breakfast, I had a Coke and a granola bar the whole day.&lt;/li&gt;
&lt;li&gt;Lunch was Jimmy John&#39;s. Plan accordingly.&lt;/li&gt;
&lt;li&gt;Pizza was served on our late day.&lt;/li&gt;
&lt;li&gt;Bring some magazines or a book because there&#39;s lots of waiting.&lt;/li&gt;
&lt;li&gt;If you can, leave your phone and smartwatch in the car or at home. If you bring one in, they&#39;ll ask you to turn it off and place it into a locked pouch that you carry on your person. This makes it inaccessible until you get the pouch unlocked on your way out.&lt;/li&gt;
&lt;li&gt;Wear an analog watch. Not all the rooms we waited in had clocks.&lt;/li&gt;
&lt;li&gt;The letter says to show up to room LL 2, but there is no room LL 2. The recording says LL 3, and this was the correct room. LL stands for lower level. Once you&#39;re through security, catch the elevator down one floor to LL and that&#39;s pretty much where you need to be. LL 3 is well marked.&lt;/li&gt;
&lt;li&gt;You&#39;re paid $50 per day, but it can take weeks for the money to come.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;the-process&quot; tabindex=&quot;-1&quot;&gt;The Process &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/13/i-was-called-for-jury-duty-in-richmond-va-heres-what-i-wish-i-d-known/#the-process&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For me, there were two distinct phases: onboarding and jury trial selection.&lt;/p&gt;
&lt;h3 id=&quot;onboarding&quot; tabindex=&quot;-1&quot;&gt;Onboarding &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/13/i-was-called-for-jury-duty-in-richmond-va-heres-what-i-wish-i-d-known/#onboarding&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I received a questionnaire via USPS from the City of Richmond with instructions to fill it in and return it. A few weeks later, I received another letter instructing me to call in every Monday after 4:30 p.m. to see if my name had been selected. On the second week, my name was picked and the recording instructed me on where and when to report.&lt;/p&gt;
&lt;p&gt;I didn&#39;t know what to expect other than the instructions on the letter and in the phone recording. I knew I couldn&#39;t bring electronics or pocket knives or really anything. I walked in with my wallet and the key fob for the van and pretty much nothing else.&lt;/p&gt;
&lt;p&gt;I checked in by showing a photo ID and was assigned my jury number and given my proof of attendance. We were shown a presentation and watched a video. I didn&#39;t find this part very informative, if I&#39;m honest.&lt;/p&gt;
&lt;p&gt;At this point, all jurors moved up to the third floor into an empty court room where the initial pool of 24 jurors were randomly selected. The entire group, selected and unselected jurors, then moved to the actual court room with the lawyers, judge and defendant.  The 24 selected jurors were seated in front of the railing while the unselected jurors were seated behind the rail in the audience gallery.&lt;/p&gt;
&lt;h2 id=&quot;voir-dire&quot; tabindex=&quot;-1&quot;&gt;Voir Dire &lt;a class=&quot;heading-anchor&quot; href=&quot;https://michaelharley.net/posts/2026/03/13/i-was-called-for-jury-duty-in-richmond-va-heres-what-i-wish-i-d-known/#voir-dire&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pronounced roughly like &amp;quot;vwar deer&amp;quot; (it&#39;s French, meaning &amp;quot;to speak the truth&amp;quot;).&lt;/p&gt;
&lt;p&gt;This is the process where the judge and attorneys from both sides question potential jurors to determine who will actually sit on the case. They&#39;re looking to identify any biases or conflicts of interest that might affect your ability to be impartial. Either side can have jurors dismissed, either &amp;quot;for cause&amp;quot; (a specific reason) or through a limited number of &amp;quot;peremptory challenges,&amp;quot; where they can dismiss someone without giving a reason.&lt;/p&gt;
&lt;p&gt;We were told about the case so we knew it was a rape case.&lt;/p&gt;
&lt;p&gt;The judge started off with his questions, which were more general in nature. For example:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Raise your right hand if you speak English.&lt;/li&gt;
&lt;li&gt;Do you know or are you related to anyone in law enforcement?&lt;/li&gt;
&lt;li&gt;Do you recognize any of your fellow jurors?&lt;/li&gt;
&lt;li&gt;Do you recognize any of the lawyers in the case?&lt;/li&gt;
&lt;li&gt;The defendant can remain silent. Must you hear from the defendant to form an opinion on innocence or guilt?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The lawyers&#39; questions were more specific. For example:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Have you or anyone close to you been the victim of sexual assault?&lt;/li&gt;
&lt;li&gt;Do you apply any special weight to DNA evidence?&lt;/li&gt;
&lt;li&gt;Does anyone have any special training with regard to DNA?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After each round of questions, one from the judge and one each from the prosecution and defense, they would step out into the hall and confer among themselves. They&#39;d return, and then some jurors would be asked to move back behind the rail and were replaced by previously unselected but available jurors.&lt;/p&gt;
&lt;p&gt;Eventually the 24 were whittled down to 14, which is 12 jurors and 2 alternates. No one knows who the alternates are, as the court randomly selects and seals that information until the jury goes back for deliberation.&lt;/p&gt;
&lt;p&gt;At this point, the other jurors went back to the jury waiting area on LL, while we took a quick break and prepared to start hearing evidence.&lt;/p&gt;
&lt;p&gt;I&#39;ll write about my experience as a juror in a separate post, but this marks the end of onboarding and selection.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;mailto:michael@michaelharley.net?subject=Re:%20I%20Was%20Called%20for%20Jury%20Duty%20in%20Richmond,%20VA.%20Here&amp;#39;s%20What%20I%20Wish%20I&amp;#39;d%20Known.&quot;&gt;Reply via email&lt;/a&gt; · &lt;a href=&quot;https://infosec.exchange/@michaelharley/116221347719018923&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Mastodon&lt;/a&gt; · &lt;a href=&quot;https://bsky.app/profile/michaelharley.net/post/3mgwoq23eze2n&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Bluesky&lt;/a&gt;&lt;/p&gt;
        </content>
      </entry>
      <entry>
        <title>My Smart Home Setup 2026</title>
        <link href="https://michaelharley.net/posts/2026/03/03/my-smart-home-setup-2026/"/>
        <updated>2026-03-03T11:39:06Z</updated>
        <id>https://michaelharley.net/posts/2026/03/03/my-smart-home-setup-2026/</id>
        <content type="html">
          &lt;p&gt;I last wrote about &lt;a href=&quot;https://michaelharley.net/posts/2023/10/22/my-smart-home-setup-2023/&quot;&gt;my smart home setup&lt;/a&gt; all the way back in 2023, so I&#39;ve taken the time to fully update my setup. This time around, I&#39;ve decided to do it as a &lt;a href=&quot;https://slashpages.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;slash page&lt;/a&gt; and I&#39;ll just update the page as needed.&lt;/p&gt;
&lt;p&gt;Link -&amp;gt; &lt;a href=&quot;https://michaelharley.net/smarthome/&quot;&gt;/smarthome/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;mailto:michael@michaelharley.net?subject=Re:%20My%20Smart%20Home%20Setup%202026&quot;&gt;Reply via email&lt;/a&gt; · &lt;a href=&quot;https://infosec.exchange/@michaelharley/116165365962332498&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Mastodon&lt;/a&gt; · &lt;a href=&quot;https://bsky.app/profile/michaelharley.net/post/3mg5t6ibd322n&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Discuss on Bluesky&lt;/a&gt;&lt;/p&gt;
        </content>
      </entry>
</feed>