This service tests the validity of an RSS 2.0 feed, checking to see that it follows the rules of the RSS specification. For advice from the RSS Advisory Board on how to implement RSS and handle issues such as enclosures and HTML encoding, read the RSS Best Practices Profile. This checker is also a validator of Atom and RSS 1.0 feeds.
Use this tester regularly to ensure that your RSS feed continues to work well in the wide audience of RSS readers, podcast clients and other software that supports the format.
This is a valid Atom 1.0 feed.
This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.
line 54, column 0: (36 occurrences) [help]
<h2 id="shows" tabindex="-1">Shows <a class=&qu ...
line 56, column 0: (13 occurrences) [help]
<li><a href="https://michaelharley.net/watching/2026/a-knight- ...
line 56, column 0: (144 occurrences) [help]
<li><a href="https://michaelharley.net/watching/2026/a-knight- ...
line 157, column 0: (16 occurrences) [help]
<source type="image/webp" srcset="https://michaelh ...
line 159, column 0: (8 occurrences) [help]
<img src="https://michaelharley.net/assets/images/U0MJUKy8rS ...
line 159, column 0: (8 occurrences) [help]
<img src="https://michaelharley.net/assets/images/U0MJUKy8rS ...
<?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 (All content)</title> <subtitle>A digital garden on the open web.</subtitle> <link href="https://michaelharley.net/feed.xml" rel="self"/> <link href="https://michaelharley.net"/> <updated>2026-08-28T23:20:18Z</updated> <id>https://michaelharley.net/</id> <author> <name>Michael Harley</name> <email>michael@michaelharley.net</email> </author> <entry> <title>Trying (2026) — ★★★★☆</title> <link href="https://michaelharley.net/watching/2026/08/28/trying-s5/"/> <updated>2026-08-28T23:20:18Z</updated> <id>https://michaelharley.net/watching/2026/08/28/trying-s5/</id> <category term="Watch"/> <content type="html"><p><img src="https://michaelharley.net/watching/posters/98177_s5.jpg" alt="Trying poster" width="200" /></p><p><strong>TV-14</strong> · Series · Season 5 · Comedy</p><p><em>Together they&#39;re a family.</em></p><p>All Nikki and Jason want is a baby—the one thing they can&#39;t have. So they decide to adopt. With their dysfunctional friends, screwball families, and chaotic lives, will the adoption panel agree that they&#39;re ready to be parents?</p><p><a href="https://www.themoviedb.org/tv/98177">View on TMDB</a></p><hr /> <h2>My Rating</h2> <p><strong>Watched:</strong> August 28, 2026</p> <p><strong>Rating:</strong> ★★★★☆</p><p>Still enjoyed it, just not as much as the previous seasons.</p><p>—Mike</p><p><a href="mailto:michael@michaelharley.net?subject=Re:%20Trying">Reply via email</a></p></content> </entry> <entry> <title>🔗 India turns to private sector to ramp up missile production</title> <link href="https://michaelharley.net/links/2026/08/28/india-turns-to-private-sector-to-ramp-up-missile-production/"/> <updated>2026-08-28T21:14:58Z</updated> <id>https://michaelharley.net/links/2026/08/28/india-turns-to-private-sector-to-ramp-up-missile-production/</id> <category term="Link"/> <content type="html"><p>The challenges faced by the production of all these really expensive, precision weapons means there really needs to be multiple classes of weapons. Sure, the expensive, highly capable things for certain types of fighting but they also need something that is mass producible but still capable.</p> <p class="link-attribution"><a href="https://www.defensenews.com/global/asia-pacific/2026/08/28/india-turns-to-private-sector-to-ramp-up-missile-production/" target="_blank" rel="noopener noreferrer">Read on defensenews.com →</a></p><p><a href="mailto:michael@michaelharley.net?subject=Re:%20India%20turns%20to%20private%20sector%20to%20ramp%20up%20missile%20production">Reply via email</a></p></content> </entry> <entry> <title>🔗 CAST-1 Audio Casting: ESPHome Network Audio Player</title> <link href="https://michaelharley.net/links/2026/08/28/cast-1-audio-casting-esphome-network-audio-player/"/> <updated>2026-08-28T20:57:54Z</updated> <id>https://michaelharley.net/links/2026/08/28/cast-1-audio-casting-esphome-network-audio-player/</id> <category term="Link"/> <content type="html"><p>Apollo is building some pretty cool stuff. I use their TEMP-1 in my aquariums and fridges.</p> <p class="link-attribution"><a href="https://apolloautomation.com/blogs/news/meet-cast-1-audio-casting" target="_blank" rel="noopener noreferrer">Read on apolloautomation.com →</a></p><p><a href="mailto:michael@michaelharley.net?subject=Re:%20CAST-1%20Audio%20Casting:%20ESPHome%20Network%20Audio%20Player">Reply via email</a></p></content> </entry> <entry> <title>The best shows and movies of 2026 according to Mike and Rachelle, so far</title> <link href="https://michaelharley.net/posts/2026/08/28/the-best-shows-and-movies-of-2026-according-to-mike-and-rachelle-so-far/"/> <updated>2026-08-28T11:55:00Z</updated> <id>https://michaelharley.net/posts/2026/08/28/the-best-shows-and-movies-of-2026-according-to-mike-and-rachelle-so-far/</id> <category term="Post"/> <content type="html"><p>Rachelle and I are really good at watching TV and we have opinions about what we watch. Here are our favorite TV and movies from 2026 so far. You can see my <a href="https://michaelharley.net/rating-scale">rating scale</a> here. The ratings are mostly about how much we enjoyed it and have less to do with the quality.</p><h2 id="shows" tabindex="-1">Shows <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/28/the-best-shows-and-movies-of-2026-according-to-mike-and-rachelle-so-far/#shows" aria-label="Permalink to Shows">#</a></h2><ul><li><a href="https://michaelharley.net/watching/2026/a-knight-of-the-seven-kingdoms-s1/">A Knight of the Seven Kingdoms Season 1</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 5 out of 5 stars, all-time favorite"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg> <svg class="icon icon-heart" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5"></path></svg></span></li><li><a href="https://michaelharley.net/watching/2026/widows-bay-s1/">Widows Bay Season 1</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 5 out of 5 stars"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg></span></li></ul><p><strong>Honorable mentions:</strong></p><ul><li><a href="https://michaelharley.net/watching/2026/the-bear-s5/">The Bear Season 5</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 4 out of 5 stars"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star-empty" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg></span></li><li><a href="https://michaelharley.net/watching/2026/rooster-s1/">Rooster Season 1</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 4 out of 5 stars"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star-empty" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg></span></li><li><a href="https://michaelharley.net/watching/2026/dtf-st-louis-s1/">DTF St. Louis</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 4 out of 5 stars"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star-empty" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg></span></li><li><a href="https://michaelharley.net/watching/2026/jury-duty-presents-company-retreat-s2/">Jury Duty Presents: Company Retreat</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 4 out of 5 stars"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star-empty" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg></span></li></ul><h2 id="movies" tabindex="-1">Movies <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/28/the-best-shows-and-movies-of-2026-according-to-mike-and-rachelle-so-far/#movies" aria-label="Permalink to Movies">#</a></h2><ul><li><a href="https://michaelharley.net/watching/2026/the-odyssey/">The Odyssey</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 5 out of 5 stars, all-time favorite"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg> <svg class="icon icon-heart" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5"></path></svg></span></li><li><a href="https://michaelharley.net/watching/2026/obsession/">Obsession</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 5 out of 5 stars, all-time favorite"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg> <svg class="icon icon-heart" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5"></path></svg></span></li><li><a href="https://michaelharley.net/watching/2026/project-hail-mary/">Project Hail Mary</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 5 out of 5 stars"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg></span></li></ul><p><strong>Honorable mentions:</strong></p><ul><li><a href="https://michaelharley.net/watching/2026/the-drama/">The Drama</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 4 out of 5 stars"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star-empty" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg></span></li><li><a href="https://michaelharley.net/watching/2026/remarkably-bright-creatures/">Remarkably Bright Creatures</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 4 out of 5 stars"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star-empty" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg></span></li><li><a href="https://michaelharley.net/watching/2026/the-truth-and-tragedy-of-moriah-wilson/">The Truth and Tragedy of Moriah Wilson</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 4 out of 5 stars"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star-empty" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg></span></li><li><a href="https://michaelharley.net/watching/2026/rental-family/">Rental Family</a> - <span class="post-rating-inline" role="img" aria-label="My rating: 4 out of 5 stars"><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg><svg class="icon icon-star-empty" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg></span></li></ul><p>Do you have any must-watch TV or movies that aren't on this list? If yes, drop me a line.</p><p><a href="mailto:michael@michaelharley.net?subject=Re:%20The%20best%20shows%20and%20movies%20of%202026%20according%20to%20Mike%20and%20Rachelle,%20so%20far">Reply via email</a></p></content> </entry> <entry> <title>Some of our favorite smart home automations</title> <link href="https://michaelharley.net/posts/2026/08/27/some-of-our-favorite-smart-home-automations/"/> <updated>2026-08-27T11:55:00Z</updated> <id>https://michaelharley.net/posts/2026/08/27/some-of-our-favorite-smart-home-automations/</id> <category term="Post"/> <content type="html"><p>The best home automations are the ones that you don't think about. If you're visiting family or staying in a hotel, you notice that the automatic thing didn't happen. Here is our list!</p><ul><li><strong>Automatic lighting schedule:</strong> Lights come on when it's too dark and go off when it's light. When no one is in the room, the lights are off. Rarely having to reach for a light switch is nice. It's such a basic thing, and it's usually the first thing people automate, but yes, it's nice.</li><li><strong>Automatic curtain schedule:</strong> We have the <a href="https://www.aqara.com/en/product/curtain-driver-e1-track-version" target="_blank" rel="noopener noreferrer">Aqara Curtain Driver E1</a> on our street-facing curtains, and like with the lights, they're on an automatic schedule. They open and close at the right times, and it's not something we think about.</li><li><strong>Arriving home automations:</strong> We turned on presence detection in Home Assistant. That is, Home Assistant uses our phones to know when we're away or home. When someone arrives home, the locks automatically unlock so we can just come straight in. If it's after dark, Home Assistant turns on the lights for us.</li><li><strong>Bathroom motion lighting:</strong> The downstairs bathroom doesn't have a window or any natural light, so it's always dark. We have an automation that detects motion when someone walks in, and it turns on some toe-kick lights. Not bright but enough to use the bathroom without having to turn on the big light.</li><li><strong>Controlling the house with voice:</strong> This isn't an automation per se, but we like to voice control devices. It's &quot;Siri, open the curtains,&quot; for example, or &quot;Siri, turn off the kitchen&quot; as I'm walking to the sofa with my bowl of cereal.</li></ul><p>Ok so that's it! Those are the things we notice when we're not at home. What are your favorite smart home features?</p><p><a href="mailto:michael@michaelharley.net?subject=Re:%20Some%20of%20our%20favorite%20smart%20home%20automations">Reply via email</a></p></content> </entry> <entry> <title>🔗 We Are Seeing a Wave of Fake Porkbun Emails</title> <link href="https://michaelharley.net/links/2026/08/26/we-are-seeing-a-wave-of-fake-porkbun-emails/"/> <updated>2026-08-27T00:40:36Z</updated> <id>https://michaelharley.net/links/2026/08/26/we-are-seeing-a-wave-of-fake-porkbun-emails/</id> <category term="Link"/> <content type="html"><blockquote><p>If you have received an email claiming to be from Porkbun saying one of your domains is expiring, has already expired, or has been suspended over a payment problem, and something about it felt off, you were right.</p><p>A large phishing campaign is currently impersonating us.</p></blockquote><p>🤬🤬🤬</p> <p class="link-attribution"><a href="https://porkbun.com/blog/fake-porkbun-emails-august-2026/" target="_blank" rel="noopener noreferrer">Read on porkbun.com →</a></p><p><a href="mailto:michael@michaelharley.net?subject=Re:%20We%20Are%20Seeing%20a%20Wave%20of%20Fake%20Porkbun%20Emails">Reply via email</a></p></content> </entry> <entry> <title>How I use Home Assistant to automate and monitor my aquariums</title> <link href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/"/> <updated>2026-08-26T11:45:00Z</updated> <id>https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/</id> <category term="Post"/> <content type="html"><p>I feel the aquarium hobby is a retro hobby. Sure, the lights and filters have got much more expensive, and now rimless tanks are popular online, but the standard size tanks like the 40 breeder and the 75 gallon are the same footprint from decades past.</p><p>What <em>can</em> I automate? Can I improve monitoring and alerting? There are some off-the-shelf options like <a href="https://www.neptunesystems.com/" target="_blank" rel="noopener noreferrer">Neptune Systems Apex</a>, but what could a person do with <a href="https://www.home-assistant.io/" target="_blank" rel="noopener noreferrer">Home Assistant</a>? That's what I'm trying to figure out.</p><nav aria-label="Table of contents"> <ul> <li><a href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#hardware">Hardware</a></li> <li><a href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#lighting">Lighting</a></li> <li><a href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#feeding">Feeding</a></li> <li><a href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#heaters">Heaters</a></li> <li><a href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#leak-detection">Leak detection</a></li> <li><a href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#alerts">Alerts</a></li> <li><a href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#conclusion">Conclusion</a></li> </ul></nav><h2 id="hardware" tabindex="-1">Hardware <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#hardware" aria-label="Permalink to Hardware">#</a></h2><p>My home automation platform of choice is Home Assistant. This runs bare metal on a little mini PC NUC with the following specs:</p><ul><li><strong>System76 Meerkat</strong> (Intel NUC10i3FNB board)</li><li><strong>Intel Core i3-10110U</strong> @ 2.10GHz, 4 threads</li><li><strong>16 GB RAM</strong></li><li><strong>228 GB</strong> disk</li><li><strong>Home Assistant OS</strong></li><li><strong>Zigbee:</strong> <a href="https://www.home-assistant.io/connect/zbt-2/" target="_blank" rel="noopener noreferrer">ZBT-2</a> and ZHA</li><li><strong>Z-Wave:</strong> <a href="https://www.home-assistant.io/connect/zwa-2/" target="_blank" rel="noopener noreferrer">ZWA-2</a> and Z-Wave JS</li></ul><p>To enable all the automations I'm writing about here, each aquarium gets these smart devices. When relevant, I will call out the specific bit of aquarium gear I picked for how I need it to work with Home Assistant.</p><ul><li><strong>Power Strip:</strong> <a href="https://www.getzooz.com/zooz-zen20-power-strip/" target="_blank" rel="noopener noreferrer">Zooz Zen20 Power Strip</a>. This has 5 regular plugs and 2 USB plugs, all of which can be individually controlled. This runs on my Z-Wave network. Each aquarium gets one.</li><li><strong>Temperature Sensor:</strong> <a href="https://apolloautomation.com/products/temp-1" target="_blank" rel="noopener noreferrer">Apollo TEMP-1 Temperature Sensor</a>. This allows me to get the temperature into Home Assistant; it runs on ESPHome and connects via Wi-Fi. If aquariums are close enough together, a single sensor can have multiple probes.</li><li><strong>Water Leak Sensor:</strong> <a href="https://www.getzooz.com/zooz-zse42-water-leak-xs-sensor/" target="_blank" rel="noopener noreferrer">Zooz Water Leak Sensor</a>. At least one goes into each plant saucer/catch tray that I use with my canister filters.</li><li><strong>Smart Button:</strong> <a href="https://www.aqara.com/us/product/wireless-mini-switch/" target="_blank" rel="noopener noreferrer">Aqara Mini Switch</a>. I can use these buttons at the tanks to trigger automations without having to fish out my phone. Single press, double press and long press are all available to do things like toggle the lights or activate maintenance mode.</li><li><strong>Automatic Feeder:</strong> <a href="https://www.avastmarine.com/products/plank-mini-1" target="_blank" rel="noopener noreferrer">Avast Labs Plank MINI</a>. These feeders have no built-in schedules or batteries and that's what I like. When there's power to the unit, the corkscrew turns, dispensing food. To stop dispensing, turn off the power.</li><li><strong>Heater:</strong> <a href="https://www.bulkreefsupply.com/titanium-heater-element-bulk-reef-supply.html" target="_blank" rel="noopener noreferrer">Bulk Reef Supply Titanium Heater Element</a>. These do not have built-in thermostats and plug directly into the Zen20. When the plug is powered on, it heats. To stop the heat, turn off the power. Easy peasy. The smallest these go are 100W and it's what I use in my 20 gallon long aquariums. In the 75 gallon display tank, I use two 200W heaters.</li><li><strong>Filters:</strong> <a href="https://eheim.com/en_GB/aquatics/technology/external-filters/classic/" target="_blank" rel="noopener noreferrer">Eheim Classic Canister Filter</a> &amp; <a href="https://www.aquariumcoop.com/collections/aquarium-filtration/products/black-easy-flow-sponge-filter-coarse" target="_blank" rel="noopener noreferrer">Aquarium Co-Op Coarse Sponge Filter</a>. I like having both a canister and sponge filter in my tanks. If my canister is clogged and I don't notice, the sponge can carry things until I do. In the event of a power outage, I can run the air pump for the sponge filters off a battery pack for a good long time. Finally, having a seeded sponge filter at all times is nice for quickly spinning up a new tank.</li><li><strong>Air Pump:</strong> <a href="https://eheim.com/en_GB/aquatics/technology/air-pumps/air/" target="_blank" rel="noopener noreferrer">Eheim Air</a>. This pump has been the quietest in my experience.</li><li><strong>Lights:</strong> <a href="https://www.hygger-online.com/product/auto-on-off-led-aquarium-light/" target="_blank" rel="noopener noreferrer">Hygger HG999</a>. This is just a budget light but it's a good price and my plants seem happy. Works fine powering it off and on from the power plug.</li></ul><figure> <picture> <source type="image/webp" srcset="https://michaelharley.net/assets/images/U0MJUKy8rS-300.webp 300w, https://michaelharley.net/assets/images/U0MJUKy8rS-600.webp 600w, https://michaelharley.net/assets/images/U0MJUKy8rS-900.webp 900w, https://michaelharley.net/assets/images/U0MJUKy8rS-1200.webp 1200w, https://michaelharley.net/assets/images/U0MJUKy8rS-1600.webp 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <source type="image/jpeg" srcset="https://michaelharley.net/assets/images/U0MJUKy8rS-300.jpeg 300w, https://michaelharley.net/assets/images/U0MJUKy8rS-600.jpeg 600w, https://michaelharley.net/assets/images/U0MJUKy8rS-900.jpeg 900w, https://michaelharley.net/assets/images/U0MJUKy8rS-1200.jpeg 1200w, https://michaelharley.net/assets/images/U0MJUKy8rS-1600.jpeg 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <img src="https://michaelharley.net/assets/images/U0MJUKy8rS-1600.jpeg" width="1600" height="1205" alt="A well-decorated freshwater aquarium with green plants, driftwood, and a skull decoration on sandy substrate. Several small fish swim among the vegetation and ornaments under blue lighting." loading="lazy" decoding="async" /> </picture> <figcaption><p>Aquarium 2! This is my &quot;shrimp tank&quot;, which I put white cloud mountain minnows with. I'm rehoming the shrimpies and the minnows into a hillstream tank which is cycling now!<span class="fig-meta">Richmond, VA · August 2026</span></p> </figcaption></figure><h2 id="lighting" tabindex="-1">Lighting <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#lighting" aria-label="Permalink to Lighting">#</a></h2><p>Probably one of the easiest and most forgiving things to automate is the lighting schedule. I use <a href="https://www.hygger-online.com/product/auto-on-off-led-aquarium-light/" target="_blank" rel="noopener noreferrer">Hygger HG999</a> lights with my tanks and they're fine for the price. If I plug the light into a smart plug, then it's easy to set a simple schedule to turn the lights on and off. The HG999 does have its own little controller, but it restores its previous state on power restore. So I just turn it on for the first time, set the brightness I want, and control it with Home Assistant via the smart plug.</p><h3 id="helpers" tabindex="-1">Helpers <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#helpers" aria-label="Permalink to Helpers">#</a></h3><ul><li><strong>Lights On Time:</strong> Date and/or time. Time only. Example: 7:30 a.m.</li><li><strong>Lights Off Time:</strong> Date and/or time. Time only. Example: 4:30 p.m.</li><li><strong>Lights On:</strong> Template binary sensor. It converts Lights On Time/Lights Off Time into an on/off state that then drives the automations. Example: On</li></ul><h3 id="automations" tabindex="-1">Automations <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#automations" aria-label="Permalink to Automations">#</a></h3><p>Each tank gets two automations for lighting.</p><ul><li><strong>Lights On:</strong> When the Lights On template binary sensor turns On, this fires and turns the lights on.</li><li><strong>Lights Off:</strong> This is the off version! When the Lights On template binary sensor turns Off, this fires and turns the lights off.</li></ul><h3 id="dashboard" tabindex="-1">Dashboard <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#dashboard" aria-label="Permalink to Dashboard">#</a></h3><p>The dashboard gives me exactly one control for the lighting.</p><figure> <picture> <source type="image/webp" srcset="https://michaelharley.net/assets/images/EGbl9gV0_5-300.webp 300w, https://michaelharley.net/assets/images/EGbl9gV0_5-600.webp 600w, https://michaelharley.net/assets/images/EGbl9gV0_5-900.webp 900w, https://michaelharley.net/assets/images/EGbl9gV0_5-1200.webp 1200w, https://michaelharley.net/assets/images/EGbl9gV0_5-1600.webp 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <source type="image/jpeg" srcset="https://michaelharley.net/assets/images/EGbl9gV0_5-300.jpeg 300w, https://michaelharley.net/assets/images/EGbl9gV0_5-600.jpeg 600w, https://michaelharley.net/assets/images/EGbl9gV0_5-900.jpeg 900w, https://michaelharley.net/assets/images/EGbl9gV0_5-1200.jpeg 1200w, https://michaelharley.net/assets/images/EGbl9gV0_5-1600.jpeg 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <img src="https://michaelharley.net/assets/images/EGbl9gV0_5-1600.jpeg" width="1600" height="874" alt="Dashboard for Aquarium #1 showing status alerts including a dry leak and overdue water change, with controls for main power, filter, heater, light, and feeder, along with settings for temperature setpoint (75.0°F), feed schedule (8:45 AM), and other aquarium parameters." loading="lazy" decoding="async" /> </picture> <figcaption><p>I have controls on each tank dashboard to do a manual feed, to adjust when the feed happens, a feeder master switch and the feed seconds.</p> </figcaption></figure><h3 id="improvements" tabindex="-1">Improvements <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#improvements" aria-label="Permalink to Improvements">#</a></h3><p>I plan to add a WLED light strip to each tank. The Hygger lights have morning, evening and night modes, which basically set the colors at a dim level. It's really more aesthetic, but I would like to be able to replicate that with my setup because I think it's cool. Plus, it seems the sudden on of the main light startles the fish, so I'd like to ramp up in the morning and ramp down in the evenings.</p><figure> <picture> <source type="image/webp" srcset="https://michaelharley.net/assets/images/uhvUzOiDkE-300.webp 300w, https://michaelharley.net/assets/images/uhvUzOiDkE-600.webp 600w, https://michaelharley.net/assets/images/uhvUzOiDkE-900.webp 900w, https://michaelharley.net/assets/images/uhvUzOiDkE-1200.webp 1200w, https://michaelharley.net/assets/images/uhvUzOiDkE-1600.webp 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <source type="image/jpeg" srcset="https://michaelharley.net/assets/images/uhvUzOiDkE-300.jpeg 300w, https://michaelharley.net/assets/images/uhvUzOiDkE-600.jpeg 600w, https://michaelharley.net/assets/images/uhvUzOiDkE-900.jpeg 900w, https://michaelharley.net/assets/images/uhvUzOiDkE-1200.jpeg 1200w, https://michaelharley.net/assets/images/uhvUzOiDkE-1600.jpeg 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <img src="https://michaelharley.net/assets/images/uhvUzOiDkE-1600.jpeg" width="1600" height="1595" alt="A vibrant blue and red betta fish swims among green aquatic plants and brown leaf litter on the dark substrate of an aquarium." loading="lazy" decoding="async" /> </picture> <figcaption><p>Tina!<span class="fig-meta">Richmond, VA · August 2026</span></p> </figcaption></figure><h2 id="feeding" tabindex="-1">Feeding <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#feeding" aria-label="Permalink to Feeding">#</a></h2><p>Feeding the fish is one of my favorite things about fish keeping. So why then would I want to automate it? Well, mostly to see if I can. But secondarily, it means I don't <em>have</em> to feed the fish every day if I don't want. I let the autofeeders dispense the dry pellets and I will supplement with frozen treats when I'm in the mood. Plus, if I automate the feeding like this, then I don't need to recruit anyone to come feed the fish while I'm away.</p><p>I knew I wanted to use automatic feeders with my fish. In my research, most hobbyists seemed to dismiss the idea as pointless and maybe even dangerous. Most of the anecdotes I saw were people using cheap barrel feeders like the <a href="https://eheim.com/en_GB/aquatics/accessories/feeding/autofeeder/autofeeder" target="_blank" rel="noopener noreferrer">Eheim Autofeeder</a> while they were away, coming back to dead fish because the feeder dumped too much food into the aquarium.</p><p>Naively undeterred, I started experimenting with what was actually possible. I did try the cheap barrel feeders and yeah, they're not great. The dispensing bit is clunky and not very precise, plus there's no way to have a fasting day schedule with the barrel feeders I tried (Eheim and Aquarium Co-Op). That's where Home Assistant and the <a href="https://www.avastmarine.com/products/plank-mini-1" target="_blank" rel="noopener noreferrer">Avast Labs Plank MINI</a> come in. This is a dumb feeder. If I plug it up, it runs the motor that spins the auger to dispense food. I then power off the plug to stop it. Hell yeah.</p><p>It actually took me a long time to find this feeder because I didn't know what to type into the search bar. Avast makes a regular-sized Plank, which is expensive. The mini is also expensive compared to the battery powered barrel feeders but I just squint my eyes and hit the buy button. Buy once, cry once, I always say.</p><p>This automation could be dangerous for my fishy friends so I spent a fair amount of time thinking through the edge cases and how this could fail. Accidentally dumping the full canister of food into the tank because a run got stuck would be a critical incident. Let's try not to do that.</p><p>The other failure mode is less critical. That's the feeder not dispensing food when I think it is, so I've also built some automations and monitors to try to catch this failure.</p><h3 id="helpers-1" tabindex="-1">Helpers <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#helpers-1" aria-label="Permalink to Helpers">#</a></h3><ul><li><strong>Feeding Enabled:</strong> Toggle. This allows me to arm and disarm the automatic schedule, should I for some reason want to turn off the automatic feeder without having to go around disabling automations. Example: On</li><li><strong>Feed Time:</strong> Date and/or time. This is when the food drops. Example: 7:45 a.m.</li><li><strong>Feeder Seconds:</strong> Number. This is the number of seconds the motor should run. I ran a few test runs of the feeder to see how much it dispensed and I continue to tweak this as needed. Example: 35</li><li><strong>Feeder Active:</strong> Toggle. The automations and scripts set this helper during legitimate feeding paths. Example: Off</li><li><strong>Last Verified Feed:</strong> Date and/or time. I use this helper to work out whether a scheduled feed actually happened. Example: August 24, 2026 at 7:45 a.m.</li></ul><h3 id="automations-1" tabindex="-1">Automations <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#automations-1" aria-label="Permalink to Automations">#</a></h3><ul><li><strong>Feed:</strong> The Feed Time helper triggers this automation. When the time arrives, it toggles the Feeder Active helper on, powers the feeder on, and the auger starts to dispense food. It waits the number of seconds I set in Feeder Seconds, then it powers the feeder off and toggles the Feeder Active helper off.</li><li><strong>Cutoff:</strong> This automation monitors for every edge case that I could think of that would cause an outlet to be on when it shouldn't be, then turns off the feeder and sends out all the alerts to all the places. There are three triggers:<ul><li><strong>Overrun:</strong> If the outlet has been on past the max feed window, then this trigger executes. The max feed window is a hard-coded value of 120 seconds.</li><li><strong>Unexpected on:</strong> This trigger fires if the outlet came on with no feed running. A ghost Z-Wave command, a hand tapping the strip, a stale state restore. This branch only works because the automation switches the Feeder Active toggle helper on during a real feeding session. So the condition boils down to this: the plug on the feeder is powered on and the Feeder Active toggle helper is off.</li><li><strong>Startup recovery:</strong> This trigger fires if the outlet was already on when Home Assistant booted, which probably means HA rebooted mid-feed.</li></ul></li><li><strong>Feed Verify:</strong> This runs a few seconds into a feed and checks the outlet is actually drawing current. If it is, it stamps Last Verified Feed. A relay can report a perfectly clean feed into a dead outlet and this is the automation that catches it.</li><li><strong>Feed Watchdog:</strong> This runs 15 minutes after the feed was due and alerts me if nothing stamped Last Verified Feed today. This one is for a feed that never ran at all.</li></ul><h3 id="dashboard-1" tabindex="-1">Dashboard <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#dashboard-1" aria-label="Permalink to Dashboard">#</a></h3><figure> <picture> <source type="image/webp" srcset="https://michaelharley.net/assets/images/EGbl9gV0_5-300.webp 300w, https://michaelharley.net/assets/images/EGbl9gV0_5-600.webp 600w, https://michaelharley.net/assets/images/EGbl9gV0_5-900.webp 900w, https://michaelharley.net/assets/images/EGbl9gV0_5-1200.webp 1200w, https://michaelharley.net/assets/images/EGbl9gV0_5-1600.webp 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <source type="image/jpeg" srcset="https://michaelharley.net/assets/images/EGbl9gV0_5-300.jpeg 300w, https://michaelharley.net/assets/images/EGbl9gV0_5-600.jpeg 600w, https://michaelharley.net/assets/images/EGbl9gV0_5-900.jpeg 900w, https://michaelharley.net/assets/images/EGbl9gV0_5-1200.jpeg 1200w, https://michaelharley.net/assets/images/EGbl9gV0_5-1600.jpeg 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <img src="https://michaelharley.net/assets/images/EGbl9gV0_5-1600.jpeg" width="1600" height="874" alt="Dashboard for Aquarium #1 showing status alerts including a dry leak and overdue water change, with controls for main power, filter, heater, light, and feeder, along with settings for temperature setpoint (75.0°F), feed schedule (8:45 AM), and other aquarium parameters." loading="lazy" decoding="async" /> </picture> <figcaption><p>I have controls on each tank dashboard to do a manual feed, to adjust when the feed happens, a feeder master switch and the feed seconds.</p> </figcaption></figure><h2 id="heaters" tabindex="-1">Heaters <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#heaters" aria-label="Permalink to Heaters">#</a></h2><p>Aquarium heaters are notoriously unreliable. The general advice on them is that they're so unreliable that fish keepers should replace theirs proactively, every 2 or 3 years. The main thing is the cheaply made thermostats on the heaters can fail in the on position, cooking all the fish in the tank. Or the glass can break, causing an electrocution risk.</p><p><strong>Sources:</strong></p><ul><li><a href="https://www.bulkreefsupply.com/content/post/aquarium-heater-failure" target="_blank" rel="noopener noreferrer">Aquarium Heater Failures: How to Protect Your Reef Tank from Disaster</a></li><li><a href="https://aquariumscience.org/14-8-aquarium-heaters/" target="_blank" rel="noopener noreferrer">14.8. Aquarium Heaters</a></li><li><a href="https://advancedaquariumconcepts.com/best-aquarium-heater/" target="_blank" rel="noopener noreferrer">Heaters – The Ticking Timebomb in Every Tank</a></li></ul><p>Hobbyists recommend using a separate controller, like an <a href="https://www.inkbird.com/products/wifi-aquarium-temperature-controller-itc-306a" target="_blank" rel="noopener noreferrer">INKBIRD</a>. Then I'd just turn the thermostat up on the aquarium heater and let the INKBIRD control the temp. The INKBIRD is higher quality, one presumes, so is less likely to catastrophically fail. Instead of an INKBIRD, I decided to use Home Assistant as my controller.</p><p>To run the heaters, I use the <a href="https://www.getzooz.com/zooz-zen20-power-strip/" target="_blank" rel="noopener noreferrer">Zooz Zen20 Power Strip</a>, <a href="https://apolloautomation.com/products/temp-1" target="_blank" rel="noopener noreferrer">Apollo TEMP-1 Temperature Sensor</a>, and the <a href="https://www.bulkreefsupply.com/titanium-heater-element-bulk-reef-supply.html" target="_blank" rel="noopener noreferrer">Bulk Reef Supply Titanium Heater Element</a>. I'm choosing the BRS heater because it does not have a built-in thermostat. I power on its plug to run the heater and I turn off its plug to turn off the heater.</p><p>I've seen people say to get a standard aquarium heater and to set the temp a few degrees above the target so the external controller can drive the heater, but if the controller fails in some way, then the built-in thermostat can be the backstop. I reject that because if I don't trust the thermostat enough to run the heater, why would I trust it to be the backstop?</p><p>This is the most dangerous automation. A heater stuck in the on position can kill the fish in hours, so I've really spent a lot of time and energy to ensure I've accounted for the failure modes and edge cases that could cause the automations to fail. So far so good.</p><figure> <picture> <source type="image/webp" srcset="https://michaelharley.net/assets/images/amfwXSVtXP-300.webp 300w, https://michaelharley.net/assets/images/amfwXSVtXP-600.webp 600w, https://michaelharley.net/assets/images/amfwXSVtXP-900.webp 900w, https://michaelharley.net/assets/images/amfwXSVtXP-1200.webp 1200w, https://michaelharley.net/assets/images/amfwXSVtXP-1600.webp 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <source type="image/jpeg" srcset="https://michaelharley.net/assets/images/amfwXSVtXP-300.jpeg 300w, https://michaelharley.net/assets/images/amfwXSVtXP-600.jpeg 600w, https://michaelharley.net/assets/images/amfwXSVtXP-900.jpeg 900w, https://michaelharley.net/assets/images/amfwXSVtXP-1200.jpeg 1200w, https://michaelharley.net/assets/images/amfwXSVtXP-1600.jpeg 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <img src="https://michaelharley.net/assets/images/amfwXSVtXP-1600.jpeg" width="1600" height="1604" alt="A colorful fish with a reddish-orange chest and spotted gray-blue body swims in an aquarium among green aquatic plants, driftwood, and fallen leaves. The tank features dark water with hanging root systems visible at the top." loading="lazy" decoding="async" /> </picture> <figcaption><p>A male pearl gourami in the 75 gallon tank downstairs.<span class="fig-meta">Richmond, VA · August 2026</span></p> </figcaption></figure><h3 id="helpers-2" tabindex="-1">Helpers <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#helpers-2" aria-label="Permalink to Helpers">#</a></h3><p>If I were building this today, I'd just use the <a href="https://www.home-assistant.io/integrations/generic_thermostat/" target="_blank" rel="noopener noreferrer">Generic Thermostat</a> integration but I built this before I knew about the integration. There's little value that I can see to migrate to the integration so I'm just going to keep using my hand rolled solution.</p><ul><li><strong>Set Point:</strong> Number. This is the target temperature of the aquarium. Example: 78</li><li><strong>Hysteresis:</strong> Number. I didn't know what this meant before working on this project but hysteresis is the gap you deliberately leave between the point where something switches on and the point where it switches off, so it doesn't flap back and forth every time the measurement wobbles across a single number. If I set the hysteresis at 1, then at 77.5, the heater turns on. At 78.5 it turns off. Hysteresis is basically the band of the swing. Example: 1</li><li><strong>Call For Heat:</strong> Template binary sensor. It reads the temperature probe, then compares against the Set Point and half the Hysteresis, then returns true or false depending on the target temperature and the actual temperature. It also reads its own current state, which is what creates the band: once it's on it stays on until the top of the band, and once it's off it stays off until the bottom. If the sensor is not returning a value, say the probe got unplugged, then it falls back to false so a heater can't get stuck on.</li><li><strong>Maintenance Mode:</strong> Toggle. Every tank gets a helper that allows me to put the tank into maintenance mode. This stops the filters and disables the heater so it's not running during a water change. It also holds off the temperature alerts, the sensor offline alert and the filter watchdog, because none of those are news while I've got my hands in the tank. Example: Off</li><li><strong>Temp Offset Alert:</strong> Number. This is the maximum amount of temperature swing, compared to Set Point, allowed before the system starts alerting. Example: 3</li></ul><h3 id="automations-2" tabindex="-1">Automations <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#automations-2" aria-label="Permalink to Automations">#</a></h3><p>I use several classes of automations to run the heaters and verify everything is working correctly.</p><ul><li><strong>Heater On:</strong> There are three triggers for this automation. When Call For Heat flips to true, when Home Assistant restarts, and when Maintenance Mode turns off. This automation is gated on Call For Heat, so when Home Assistant restarts, if Call For Heat is off then nothing happens. It's also gated on Maintenance Mode. If it's on, then do nothing because I'm doing a dang water change.</li><li><strong>Heater Off:</strong> There are also three triggers for this automation. When Call For Heat flips to false, when Maintenance Mode turns on and when Home Assistant restarts. Both Heater On and Heater Off fire on a reboot, so this one also carries the appropriate conditions to let the correct mode win.</li><li><strong>Low Temperature Alert:</strong> This triggers when a tank has drifted below setpoint by more than the alert offset.</li><li><strong>High Temperature Alert:</strong> This triggers when a tank has drifted above setpoint by more than the alert offset.</li><li><strong>Heater Stuck On:</strong> This triggers if the relay reads off while the heater outlet is still drawing over 20W. This is a critical automation and I've experienced this exact condition.</li><li><strong>Temperature Sensor Offline:</strong> This triggers if the temperature sensor is offline for more than five minutes.</li></ul><h3 id="dashboard-2" tabindex="-1">Dashboard <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#dashboard-2" aria-label="Permalink to Dashboard">#</a></h3><figure> <picture> <source type="image/webp" srcset="https://michaelharley.net/assets/images/vK8PzhXfV4-300.webp 300w, https://michaelharley.net/assets/images/vK8PzhXfV4-600.webp 600w, https://michaelharley.net/assets/images/vK8PzhXfV4-900.webp 900w, https://michaelharley.net/assets/images/vK8PzhXfV4-1200.webp 1200w, https://michaelharley.net/assets/images/vK8PzhXfV4-1600.webp 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <source type="image/jpeg" srcset="https://michaelharley.net/assets/images/vK8PzhXfV4-300.jpeg 300w, https://michaelharley.net/assets/images/vK8PzhXfV4-600.jpeg 600w, https://michaelharley.net/assets/images/vK8PzhXfV4-900.jpeg 900w, https://michaelharley.net/assets/images/vK8PzhXfV4-1200.jpeg 1200w, https://michaelharley.net/assets/images/vK8PzhXfV4-1600.jpeg 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <img src="https://michaelharley.net/assets/images/vK8PzhXfV4-1600.jpeg" width="1600" height="875" alt="Dashboard for Aquarium #1 showing status indicators including temperature at 74.6°F, energy at 12W, and various system controls like main power, filter, heater, and light switches, along with settings for temperature setpoint and hysteresis levels." loading="lazy" decoding="async" /> </picture> <figcaption><p>The dashboard for aquarium 1. At the bottom are the controls and dials for the temperature automations and helpers.</p> </figcaption></figure><h2 id="leak-detection" tabindex="-1">Leak detection <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#leak-detection" aria-label="Permalink to Leak detection">#</a></h2><p>I have no idea if canister filters are more prone to leaking than hang-on-back filters, but if one of mine springs a leak, I'd like to know it. So at a minimum, each of my tanks gets a <a href="https://www.getzooz.com/zooz-zse42-water-leak-xs-sensor/" target="_blank" rel="noopener noreferrer">Zooz Water Leak Sensor</a> that goes into the leak tray of each filter. I have a holding/QT tank that uses an undergravel filter and a hang-on-back. For that one, I put the leak sensor right under the hang-on-back in case it overflows.</p><p>I treat leak detection alerts as critical, so they play no matter the time of day or night.</p><h3 id="helpers-3" tabindex="-1">Helpers <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#helpers-3" aria-label="Permalink to Helpers">#</a></h3><ul><li><strong>Leak Detected:</strong> Toggle. When a leak sensor detects water, the automation toggles this On.</li><li><strong>Leak Detected Time:</strong> Date and/or time. This records the date and time of an active leak.</li></ul><h3 id="automations-3" tabindex="-1">Automations <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#automations-3" aria-label="Permalink to Automations">#</a></h3><ul><li><strong>Leak Alert:</strong> This automation fires when a leak sensor detects water. It repeats every 5 minutes while the probe reads wet, capped at 12 passes, so an unanswered leak nags for an hour and then stops. Each pass plays a prerecorded clip at full volume and sends a high-priority push alert to my phone.</li><li><strong>Leak Latch:</strong> This automation fires when a leak sensor detects water. It turns on the Leak Detected helper and sets the Leak Detected Time helper. I do this so a leak detection must be manually cleared.</li><li><strong>Leak Reset:</strong> This is actually a script, but it's what resets the Leak Detected and Leak Detected Time helpers. I clear the leak from the dashboard.</li></ul><h3 id="dashboard-3" tabindex="-1">Dashboard <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#dashboard-3" aria-label="Permalink to Dashboard">#</a></h3><figure> <picture> <source type="image/webp" srcset="https://michaelharley.net/assets/images/efBb5NztRC-300.webp 300w, https://michaelharley.net/assets/images/efBb5NztRC-600.webp 600w, https://michaelharley.net/assets/images/efBb5NztRC-900.webp 900w, https://michaelharley.net/assets/images/efBb5NztRC-1200.webp 1200w, https://michaelharley.net/assets/images/efBb5NztRC-1600.webp 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <source type="image/jpeg" srcset="https://michaelharley.net/assets/images/efBb5NztRC-300.jpeg 300w, https://michaelharley.net/assets/images/efBb5NztRC-600.jpeg 600w, https://michaelharley.net/assets/images/efBb5NztRC-900.jpeg 900w, https://michaelharley.net/assets/images/efBb5NztRC-1200.jpeg 1200w, https://michaelharley.net/assets/images/efBb5NztRC-1600.jpeg 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <img src="https://michaelharley.net/assets/images/efBb5NztRC-1600.jpeg" width="1600" height="875" alt="Dashboard displaying status of six aquariums with temperature and energy readings, operational modes, leak status, and a shared light schedule showing lights on from 8:00 AM to 4:00 PM." loading="lazy" decoding="async" /> </picture> <figcaption><p>I show the leak status in several places in the UI. Here on the fish dashboard, plus the alert dashboard and each individual tank dashboard.</p> </figcaption></figure><h2 id="alerts" tabindex="-1">Alerts <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#alerts" aria-label="Permalink to Alerts">#</a></h2><p>Since Home Assistant is running important life support for my fishy companions, I've put a fair amount of thought into making my alerting system as robust as possible.</p><p>Everything related to life support gets both a voice announcement played loudly over our house speakers and a high-priority alert sent to my phone, with no consideration for hour of the day. If I have a water leak, then yes I want to be woken up so I can deal with it.</p><p>I prefer the Nabu Casa voices over the Piper voices, so I do use a cloud-based service for my TTS. What happens if there's a critical alert during an internet outage? The alert fails is what! To mitigate that, I made prerecorded announcements with the Nabu Casa voices, then I just cast the announcement over my local network to my media devices, no internet required.</p><figure> <picture> <source type="image/webp" srcset="https://michaelharley.net/assets/images/GlAWDuPWXk-300.webp 300w, https://michaelharley.net/assets/images/GlAWDuPWXk-600.webp 600w, https://michaelharley.net/assets/images/GlAWDuPWXk-900.webp 900w, https://michaelharley.net/assets/images/GlAWDuPWXk-1200.webp 1200w, https://michaelharley.net/assets/images/GlAWDuPWXk-1600.webp 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <source type="image/jpeg" srcset="https://michaelharley.net/assets/images/GlAWDuPWXk-300.jpeg 300w, https://michaelharley.net/assets/images/GlAWDuPWXk-600.jpeg 600w, https://michaelharley.net/assets/images/GlAWDuPWXk-900.jpeg 900w, https://michaelharley.net/assets/images/GlAWDuPWXk-1200.jpeg 1200w, https://michaelharley.net/assets/images/GlAWDuPWXk-1600.jpeg 1600w" sizes="(min-width: 30em) 50vw, 100vw" /> <img src="https://michaelharley.net/assets/images/GlAWDuPWXk-1600.jpeg" width="1600" height="906" alt="An orange and brown pleco catfish forages along the gravelly bottom of an aquarium, with aquatic plants, driftwood, and scattered pebbles visible in the tank." loading="lazy" decoding="async" /> </picture> <figcaption><p>Super Red Bristlenose in the 75 gallon display tank downstairs.<span class="fig-meta">Richmond, VA · August 2026</span></p> </figcaption></figure><h2 id="conclusion" tabindex="-1">Conclusion <a class="heading-anchor" href="https://michaelharley.net/posts/2026/08/26/how-i-use-home-assistant-to-automate-and-monitor-my-aquariums/#conclusion" aria-label="Permalink to Conclusion">#</a></h2><p>So what can I automate and monitor? A fair amount, but nothing really groundbreaking, it turns out. I'm happiest with my solution for the automatic feeders. All the rest of it is mostly just nice-to-haves.</p><p>When I first started, I thought I might be able to monitor my water parameters like pH, ammonia, nitrites and nitrates, but that still doesn't seem possible. I was hoping for some probes, connected via ESPHome and reporting to Home Assistant. Alas, I use the API Master Test Kit like everyone else.</p><p>I think dosing would be trivial if I had the right type of doser, like this <a href="https://fresh.bulkreefsupply.com/brs-2-part-doser-1-1-ml-per-minute-bundle.html" target="_blank" rel="noopener noreferrer">BRS model</a> or even an <a href="https://apolloautomation.com/products/pump-1-fluid-pump" target="_blank" rel="noopener noreferrer">Apollo PUMP-1 Fluid Pump</a> for close to half the price because both work from just being powered on or off from the switch. I just manually dose my tanks weekly, plus I run low-tech tanks, so it's not strictly necessary.</p><p>I run my aquariums like a fleet and I use <a href="https://www.home-assistant.io/docs/automation/using_blueprints/" target="_blank" rel="noopener noreferrer">blueprints</a> because if I need to adjust something, I don't want to make the same adjustment six different times. I've tried to create a system that I can replicate and stamp down when I add a new tank. Get the tank and hardware, run the onboarding script and boom, I have a tank!</p><p>Are you in the fish keeping hobby? If yes, I'd be curious how you do it. Are you strictly old school or do you have some automations? I'd be interested in hearing.</p><p><a href="mailto:michael@michaelharley.net?subject=Re:%20How%20I%20use%20Home%20Assistant%20to%20automate%20and%20monitor%20my%20aquariums">Reply via email</a></p></content> </entry> <entry> <title>Top of the Lake (2013) — ★★½☆☆</title> <link href="https://michaelharley.net/watching/2026/08/25/top-of-the-lake-s1/"/> <updated>2026-08-25T23:15:02Z</updated> <id>https://michaelharley.net/watching/2026/08/25/top-of-the-lake-s1/</id> <category term="Watch"/> <content type="html"><p><img src="https://michaelharley.net/watching/posters/46638_s1.jpg" alt="Top of the Lake poster" width="200" /></p><p><strong>TV-MA</strong> · Series · Season 1 · Crime, Drama, Mystery</p><p><em>No ordinary place. No ordinary crime.</em></p><p>A woman haunted by her past, Detective Robin Griffin, investigates complex and unsettling cases.</p><p><a href="https://www.themoviedb.org/tv/46638">View on TMDB</a></p><hr /> <h2>My Rating</h2> <p><strong>Watched:</strong> August 25, 2026</p> <p><strong>Rating:</strong> ★★½☆☆</p><p><a href="mailto:michael@michaelharley.net?subject=Re:%20Top%20of%20the%20Lake">Reply via email</a></p></content> </entry> <entry> <title>🔗 I Built the Writing App of My Dreams</title> <link href="https://michaelharley.net/links/2026/08/25/i-built-the-writing-app-of-my-dreams/"/> <updated>2026-08-25T14:20:24Z</updated> <id>https://michaelharley.net/links/2026/08/25/i-built-the-writing-app-of-my-dreams/</id> <category term="Link"/> <content type="html"><p class="link-attribution"><a href="https://justincox.com/blog/2026/08/i-built-the-writing-app-of-my-dreams/" target="_blank" rel="noopener noreferrer">Read on justincox.com →</a></p><p><a href="mailto:michael@michaelharley.net?subject=Re:%20I%20Built%20the%20Writing%20App%20of%20My%20Dreams">Reply via email</a></p></content> </entry> <entry> <title>My AR glasses daydream</title> <link href="https://michaelharley.net/posts/2026/08/25/my-ar-glasses-daydream/"/> <updated>2026-08-25T11:45:00Z</updated> <id>https://michaelharley.net/posts/2026/08/25/my-ar-glasses-daydream/</id> <category term="Post"/> <content type="html"><p>I love reading science fiction books. I especially love science fiction books that have a friendly and benevolent AI helping the protagonists. I really like it when the friendly and helpful AI <em>is</em> the protagonist. Characters in the books have implants in their heads that let them connect directly to The Feed. Many have some version of augmented reality glasses or vision that allows the friendly AI to superimpose digital overlays onto what they see. The books portray these things as a net good for humanity.</p><p>Andreas' <a href="https://82mhz.net/posts/2026/08/i-used-to-be-excited-about-new-tech-but-i-rarely-am-anymore/" target="_blank" rel="noopener noreferrer">post</a> has me thinking about how wrong sci-fi writers were when writing about the future and how people would use technology and their attitudes about it.</p><p>All you have to do is read the news to see many examples of people in real life being really mad about Meta glasses, &quot;AI&quot; especially, and technology in general.</p><p>I think the main disconnect between the imagined world and the real world is the capitalist. I personally would love to have AR glasses that worked well, but I do not trust any for-profit corporation to have my best interests in mind when they sell me the glasses. They're going to collect my data and sell it. They're going to give police access to whatever data and feeds the devices collect. They're going to prevent the glasses from doing things the big corporations don't like. And never mind the corporate side of that. It's possible someone could beat up a person wearing any sort of smart glasses out in public in today's environment because people hate those glasses so much.</p><p>If you will allow a nerd to daydream for a minute, imagine glasses that looked like normal glasses, very much in the shape and spirit of sunglasses. I imagine a digital overlay on the real world, like directions. Indicators would tell you where to go if you're trying to find something in a large office building, for example, or you're visiting a large new city. Having those instructions on the HUD instead of glancing down at your phone would be cool.</p><p>Imagine a translation overlay that could translate signs from local languages into yours. Imagine you're at a large venue, and you're trying to meet friends. Your friend could activate a &quot;find me&quot; mode that would let you find the big red arrow over their head by glancing around. And maybe there's the overlay map directions to your friend. Hell, any of the overlay apps on your phone would be better as an AR layer. Planets and stars, airplanes flying over, the sex offenders list! What about Pokemon Go as an AR app strapped to your face? Pretty much anything that <a href="https://www.tapsmart.com/features/best-of-arkit/" target="_blank" rel="noopener noreferrer">works on a phone</a> will work better in AR glasses.</p><p>I've heard of developers leaving tech to go live off grid and raise farm animals. Living on a farm with pet pigs does sound like a good time. But imagine living on a farm with your pet pigs and having an app on your face that can ID the plants for you when you want. Or identify snakes by looking at them, which is basically Google Lens functionality but on steroids. That seems cool to me.</p><p><a href="mailto:michael@michaelharley.net?subject=Re:%20My%20AR%20glasses%20daydream">Reply via email</a></p></content> </entry></feed> If you would like to create a banner that links to this page (i.e. this validation result), do the following:
Download the "valid Atom 1.0" banner.
Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)
Add this HTML to your page (change the image src attribute if necessary):
If you would like to create a text link instead, here is the URL you can use:
http://www.rssboard.org/rss-validator/check.cgi?url=https%3A//michaelharley.net/feed/feed.xml