{
  "version": "https://jsonfeed.org/version/1",
  "title": "Web Whimsy on Nic Babarskis",
  "icon": "https://avatars.micro.blog/avatars/2024/47/1685639.jpg",
  "home_page_url": "https://nic.babarskis.blog/",
  "feed_url": "https://nic.babarskis.blog/feed.json",
  "items": [
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/29/tea-anemone-by-tatsuya-tanaka.html",
        
        "content_html": "<p><a href=\"https://miniature-calendar.com/260427\">Tea Anemone</a> by Tatsuya Tanaka at Miniature Calendar:</p>\n<p><img src=\"https://miniature-calendar.com/wp-content/uploads/2026/04/260427mon.jpg\" alt=\"A miniature diorama by Tatsuya Tanaka featuring a bamboo matcha whisk (chasen) stood upright to resemble a sea anemone. Several tiny clownfish figures are nestled within the whisk&rsquo;s bristles. To the left, a miniature scuba diver in an orange suit &ldquo;swims&rdquo; through the air, trailing small bubbles. The background includes a ceramic matcha bowl and a plate of colorful dango (pink, white, and green rice dumplings), all set against a soft teal backdrop that mimics water.\"></p>\n",
        "date_published": "2026-04-29T21:06:23-04:00",
        "url": "https://nic.babarskis.blog/2026/04/29/tea-anemone-by-tatsuya-tanaka.html",
        "tags": ["Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/25/the-eldest-shares-her-mom.html",
        
        "content_html": "<p>The eldest shares her mom and grandmothers' interest.</p>\n<img src=\"https://nic.babarskis.blog/uploads/2026/img-2752.jpg\" width=\"600\" height=\"800\" alt=\"\">\n",
        "date_published": "2026-04-25T18:34:44-04:00",
        "url": "https://nic.babarskis.blog/2026/04/25/the-eldest-shares-her-mom.html",
        "tags": ["family","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/23/to-the-extent-i-pay.html",
        
        "content_html": "<p>To the extent I pay attention to Home and Garden trends I always got the impression the platonic ideal for lawn maintenance was a golf course fairway.</p>\n<p>Meanwhile I’m out here weedmaxxing</p>\n<p><img src=\"https://nic.babarskis.blog/uploads/2026/81bf593692d043b7b6cc96ca905dc7b4.jpg\"><img src=\"https://nic.babarskis.blog/uploads/2026/0771af5994f941c68b14042684d0ab23.jpg\"><img src=\"https://nic.babarskis.blog/uploads/2026/6080a94d8e5a4a27aacd53d7d0a2e52c.jpg\"><img src=\"https://nic.babarskis.blog/uploads/2026/161bd99983e74d5c8f9f9facccb0d70b.jpg\"></p>\n",
        "date_published": "2026-04-23T11:01:36-04:00",
        "url": "https://nic.babarskis.blog/2026/04/23/to-the-extent-i-pay.html",
        "tags": ["family","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/15/spring-progress-the-maple-awakens.html",
        
        "content_html": "<p>Spring Progress 📸 2026.04.08 The maple awakens #SP26.3</p>\n<p><img src=\"https://nic.babarskis.blog/uploads/2026/img-2691.jpg\" alt=\"Auto-generated description: A tree with budding red flowers is set against a backdrop of a suburban street and a clear blue sky.\"></p>\n",
        "date_published": "2026-04-15T19:35:07-04:00",
        "url": "https://nic.babarskis.blog/2026/04/15/spring-progress-the-maple-awakens.html",
        "tags": ["Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/15/public-domain-review-highlighting-works.html",
        
        "content_html": "<p>Public Domain Review highlighting works that feature Notre Dame today:</p>\n<blockquote class=\"quoteback\" data-author=\"The Public Domain Review\" data-avatar=\"https://micro.blog/publicdomainrev@mastodon.social/avatar.jpg\" cite=\"https://mastodon.social/@publicdomainrev/116408559908239505\"><p>Highlights from the many centuries of artworks to feature the Notre-Dame de Paris — which caught fire 5 years ago <a href=\"https://mastodon.social/tags/onthisday\" class=\"mention hashtag\">#<span>onthisday</span></a> — from its illuminated punctuation of medieval skylines to grainy detailed studies at the birth of photography: <a href=\"https://publicdomainreview.org/collection/the-notre-dame-cathedral-in-art-1460-1921\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">publicdomainreview.org/collect</span><span class=\"invisible\">ion/the-notre-dame-cathedral-in-art-1460-1921</span></a></p><div class=\"microblog_collection\">\n<img src=\"https://cdn.micro.blog/photos/1000x/https%3A%2F%2Ffiles.mastodon.social%2Fmedia_attachments%2Ffiles%2F116%2F408%2F559%2F710%2F148%2F524%2Foriginal%2Ffd7bca5f92a03e23.jpg\" alt=\"\" loading=\"lazy\"><img src=\"https://cdn.micro.blog/photos/1000x/https%3A%2F%2Ffiles.mastodon.social%2Fmedia_attachments%2Ffiles%2F116%2F408%2F559%2F756%2F300%2F787%2Foriginal%2F9de0ad951cb7d57d.jpg\" alt=\"\" loading=\"lazy\"><img src=\"https://cdn.micro.blog/photos/1000x/https%3A%2F%2Ffiles.mastodon.social%2Fmedia_attachments%2Ffiles%2F116%2F408%2F559%2F818%2F519%2F886%2Foriginal%2Fd2fb74f15cfc6793.jpg\" alt=\"\" loading=\"lazy\"><img src=\"https://cdn.micro.blog/photos/1000x/https%3A%2F%2Ffiles.mastodon.social%2Fmedia_attachments%2Ffiles%2F116%2F408%2F559%2F879%2F277%2F831%2Foriginal%2Fbec0a371a1b8b1d6.jpg\" alt=\"\" loading=\"lazy\">\n</div><footer>The Public Domain Review <cite><a href=\"https://mastodon.social/@publicdomainrev/116408559908239505\" class=\"u-in-reply-to\">https://mastodon.social/@publicdomainrev/116408559908239505</a></cite></footer></blockquote><script src=\"https://cdn.micro.blog/quoteback.js\"></script>\n",
        "date_published": "2026-04-15T10:34:38-04:00",
        "url": "https://nic.babarskis.blog/2026/04/15/public-domain-review-highlighting-works.html",
        "tags": ["Public Domain","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/13/how-to-eat-french-fries.html",
        
        "content_html": "<p><a href=\"https://miniature-calendar.com/260410\">&lsquo;How to Eat French Fries&rsquo; by Tatsuya Tanaka at Miniature Calendar:</a></p>\n<p><img src=\"https://miniature-calendar.com/wp-content/uploads/2026/04/260410fri.jpg\" alt=\"A miniature art photograph by Tatsuya Tanaka. A tiny figure of a woman in a yellow tracksuit with a black stripe—reminiscent of &ldquo;The Bride&rdquo; from Kill Bill—stands in a combat pose with a katana. She is surrounded by &ldquo;severed&rdquo; French fries scattered on a white surface, with red ketchup at the broken ends to mimic blood. In the background, a large red carton of fries and a small container of ketchup are visible under dramatic lighting.\"></p>\n",
        "date_published": "2026-04-13T21:52:44-04:00",
        "url": "https://nic.babarskis.blog/2026/04/13/how-to-eat-french-fries.html",
        "tags": ["Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/12/per-my-last-post-the.html",
        
        "content_html": "<p>Per my last post, <a href=\"https://youtu.be/e2oZtvjg5oA?si=w3TqMQP-Tbs8Kpya\">the Castlevania 2 &lsquo;Bloody Tears&rsquo; theme</a> goes harder than it has a right too.</p>\n<blockquote class=\"quoteback\" data-author=\"Nic Babarskis\" data-avatar=\"https://micro.blog/thebigbabooski/avatar.jpg\" cite=\"https://nic.babarskis.blog/2026/04/12/somehow-was-able-to-get.html\">\n<p>Somehow was able to get classic video game soundtracks into the 5-year-olds music rotation (its a delicate inception, but worth the respite from the usual playlists) and every time <a href=\"https://www.youtube.com/watch?v=Zqa2mgjbOIM\">Dire Dire Docks</a> comes on I think of <a href=\"https://youtu.be/bFexVk2U-EA?si=eeYfswn11ShZIRVM\">the Northernlion commentary.</a></p>\n<footer>Nic Babarskis <cite><a href=\"https://nic.babarskis.blog/2026/04/12/somehow-was-able-to-get.html\" class=\"u-in-reply-to\">https://nic.babarskis.blog/2026/04/12/somehow-was-able-to-get.html</a></cite></footer>\n</blockquote><script src=\"https://cdn.micro.blog/quoteback.js\"></script>\n",
        "date_published": "2026-04-12T23:11:18-04:00",
        "url": "https://nic.babarskis.blog/2026/04/12/per-my-last-post-the.html",
        "tags": ["YouTube ","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/12/somehow-was-able-to-get.html",
        
        "content_html": "<p>Somehow was able to get classic video game soundtracks into the 5-year-olds music rotation (its a delicate inception, but worth the respite from the usual playlists) and every time <a href=\"https://www.youtube.com/watch?v=Zqa2mgjbOIM\">Dire Dire Docks</a> comes on I think of <a href=\"https://youtu.be/bFexVk2U-EA?si=eeYfswn11ShZIRVM\">the Northernlion commentary.</a></p>\n",
        "date_published": "2026-04-12T23:07:12-04:00",
        "url": "https://nic.babarskis.blog/2026/04/12/somehow-was-able-to-get.html",
        "tags": ["family","YouTube ","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/06/the-toddler-is-experiencing-some.html",
        
        "content_html": "<p>The toddler is experiencing some sort of sleep regression.</p>\n<p><img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Thomas_C._Lea_III_-_That_Two-Thousand_Yard_Stare_-_Original.jpg/1280px-Thomas_C._Lea_III_-_That_Two-Thousand_Yard_Stare_-_Original.jpg\" alt=\" &ldquo;That 2,000 Yard Stare&rdquo; - Thomas Lee, 1944, World War II. Army Art Collection, U.S. Army Center of Military History\"></p>\n",
        "date_published": "2026-04-06T06:45:13-04:00",
        "url": "https://nic.babarskis.blog/2026/04/06/the-toddler-is-experiencing-some.html",
        "tags": ["family","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/03/ongoing-artemis-mission-updates-on.html",
        
        "content_html": "<p>Ongoing Artemis 2 mission updates on <a href=\"https://www.nasa.gov/blogs/missions/\">this blog</a>.</p>\n",
        "date_published": "2026-04-03T08:03:23-04:00",
        "url": "https://nic.babarskis.blog/2026/04/03/ongoing-artemis-mission-updates-on.html",
        "tags": ["Open Web","Web Clippings","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/01/the-artemis-launch-has-me.html",
        
        "content_html": "<p>The Artemis launch has me thinking about Mass Effect space exploration so here&rsquo;s the links to each game&rsquo;s galaxy map music:</p>\n<ul>\n<li>\n<p><a href=\"https://www.youtube.com/watch?v=7ZoFw9uXJwk\">ME 1</a></p>\n</li>\n<li>\n<p><a href=\"https://www.youtube.com/watch?v=jqvcqe9KOW0&amp;t=11s\">ME 2</a></p>\n</li>\n<li>\n<p><a href=\"https://www.youtube.com/watch?v=DS6FQsgXfxk\">ME 3</a></p>\n</li>\n<li>\n<p><a href=\"https://www.youtube.com/watch?v=T3mCj2u3XSY\">ME-A</a></p>\n</li>\n</ul>\n",
        "date_published": "2026-04-01T21:39:11-04:00",
        "url": "https://nic.babarskis.blog/2026/04/01/the-artemis-launch-has-me.html",
        "tags": ["YouTube ","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/01/perhaps-youve-been-warned-to.html",
        
        "content_html": "<p>Perhaps you’ve been warned to watch for “woke” Michigan companies but have you been informed about:</p>\n<img src=\"https://nic.babarskis.blog/uploads/2026/9c52aa9ade.jpg\" width=\"449\" height=\"600\" alt=\"\">\n",
        "date_published": "2026-04-01T20:30:10-04:00",
        "url": "https://nic.babarskis.blog/2026/04/01/perhaps-youve-been-warned-to.html",
        "tags": ["Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/04/01/when-youve-been-forced-for.html",
        
        "content_html": "<p>When you’ve been forced (for better or worse) to live through “interesting times:”</p>\n<img src=\"https://nic.babarskis.blog/uploads/2026/a3eb7d019e.jpg\">\n",
        "date_published": "2026-04-01T20:28:17-04:00",
        "url": "https://nic.babarskis.blog/2026/04/01/when-youve-been-forced-for.html",
        "tags": ["family","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/03/26/feists-let-it-die-is.html",
        
        "content_html": "<p>🎵 Feist&rsquo;s <em>Let It Die</em> is an <a href=\"https://album.link/bm3wpvxrgvckb\">undefeated album</a>.</p>\n",
        "date_published": "2026-03-26T12:56:24-04:00",
        "url": "https://nic.babarskis.blog/2026/03/26/feists-let-it-die-is.html",
        "tags": ["Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/03/10/come-here-quick-falling-frontier.html",
        
        "content_html": "<p>Come here quick!! <a href=\"https://youtu.be/msj-iui56so\">Falling Frontier just dropped another gameplay trailer!</a></p>\n",
        "date_published": "2026-03-10T20:01:51-04:00",
        "url": "https://nic.babarskis.blog/2026/03/10/come-here-quick-falling-frontier.html",
        "tags": ["YouTube ","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/02/11/when-your-franchise-has-to.html",
        
        "content_html": "<p>When your franchise has to reach up to touch rock bottom you accept any crack of light that manifests.</p>\n<img src=\"https://nic.babarskis.blog/uploads/2026/3a941dbd42.jpg\">\n",
        "date_published": "2026-02-11T08:54:00-04:00",
        "url": "https://nic.babarskis.blog/2026/02/11/when-your-franchise-has-to.html",
        "tags": ["Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/02/05/abbey-toast-by-tatsuya-tanaka.html",
        
        "content_html": "<p><a href=\"https://miniature-calendar.com/260204\">&lsquo;Abbey Toast&rsquo; by Tatsuya Tanaka posted to Miniature-Calendar:</a></p>\n<p><img src=\"https://miniature-calendar.com/wp-content/uploads/2026/02/260204wed.jpg\" alt=\"A miniaturized remix of The Beatles Abbey Road album photo with toast and broccoli substituting as the street\"></p>\n",
        "date_published": "2026-02-05T01:10:00-04:00",
        "url": "https://nic.babarskis.blog/2026/02/05/abbey-toast-by-tatsuya-tanaka.html",
        "tags": ["Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/01/20/onion-pond-by-miniaturecalendar.html",
        
        "content_html": "<p><a href=\"https://miniature-calendar.com/260120\">Onion Pond by Miniature-Calendar:</a></p>\n<p><img src=\"https://miniature-calendar.com/wp-content/uploads/2026/01/260120tue1.jpg\" alt=\"A miniature diorama featuring several whole yellow onions arranged to look like a cluster of hills or islands. In the center, a halved onion lies flat, its smooth, concentric inner layers serving as the surface of a pond. A tiny model boat with two miniature figures is positioned on the &ldquo;pond,&rdquo; and several small, green model evergreen trees are tucked between the onions, completing the scenic, whimsical landscape\"></p>\n",
        "date_published": "2026-01-20T13:31:00-04:00",
        "url": "https://nic.babarskis.blog/2026/01/20/onion-pond-by-miniaturecalendar.html",
        "tags": ["Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2026/01/13/dusttodigital-now-has-a-streaming.html",
        
        "content_html": "<p><a href=\"https://www.dust-digital.com/about\">Dust-to-Digital</a> now has a <a href=\"https://dust-digital.com/\">24/7 streaming radio station</a>.</p>\n",
        "date_published": "2026-01-13T09:40:00-04:00",
        "url": "https://nic.babarskis.blog/2026/01/13/dusttodigital-now-has-a-streaming.html",
        "tags": ["Open Web","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/12/25/apropos-for-today-an-excerpt.html",
        
        "content_html": "<p>Apropos for today, an excerpt from <a href=\"https://youtu.be/t8Ax6KXnQZI?si=glrM-mZIpYG33YWM\">&lsquo;The Darkling Thrush&rsquo;</a> which I was introduced too through yesterday&rsquo;s <a href=\"https://www.yourclassical.org/story/2025/12/03/a-festival-of-nine-lessons-and-carols\">Festival of Nine Lessons and Carols:</a></p>\n<blockquote>\n<p>So little cause for carolings</p>\n</blockquote>\n<blockquote>\n<p>Of such ecstatic sound</p>\n</blockquote>\n<blockquote>\n<p>Was written on terrestrial things</p>\n</blockquote>\n<blockquote>\n<p>Afar or nigh around,</p>\n</blockquote>\n<blockquote>\n<p>That I could think there trembled through</p>\n</blockquote>\n<blockquote>\n<p>His happy good-night air</p>\n</blockquote>\n<blockquote>\n<p>Some blessed Hope, whereof he knew</p>\n</blockquote>\n<blockquote>\n<p>And I was unaware.</p>\n</blockquote>\n",
        "date_published": "2025-12-25T12:30:00-04:00",
        "url": "https://nic.babarskis.blog/2025/12/25/apropos-for-today-an-excerpt.html",
        "tags": ["YouTube ","Faith","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/12/01/what-a-delight-to-discover.html",
        
        "content_html": "<p>What a delight to discover that Robert Glasper <a href=\"https://www.youtube.com/watch?v=Cvd2SypKdIM&amp;list=PLIh86OChcGjYuaw7K86o-JfRzYa8VQxXV\">made a Christmas album</a>.</p>\n\n<style>\n:root {\n   \n  --yt-aspect-ratio-16-9: 56.25%;\n\n   \n  --yt-bg-black: #000;\n  --yt-play-button-bg: rgba(255, 0, 0, 0.8);\n  --yt-play-button-bg-hover: rgba(255, 0, 0, 1);\n  --yt-play-button-icon: #fff;\n  --yt-overlay-bg: rgba(0, 0, 0, 0.85);\n  --yt-overlay-text: #fff;\n  --yt-focus-outline: #e53935;\n\n   \n  --yt-play-button-width: 68px;\n  --yt-play-button-height: 48px;\n  --yt-play-button-border-radius: 12px;\n\n   \n  --yt-focus-outline-width: 3px;\n  --yt-focus-outline-offset: 4px;\n\n   \n  --yt-transition-duration: 0.2s;\n  --yt-transition-timing: ease-in-out;\n}\n\n.video-wrapper {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  padding-bottom: var(--yt-aspect-ratio-16-9);\n  margin: 0;\n  height: 0;\n  max-width: 100%;\n  overflow: hidden;\n  background-color: var(--yt-bg-black);\n  cursor: pointer;\n  outline: none;\n  border: none;\n  color: inherit;\n  font: inherit;\n  text-align: inherit;\n  appearance: none;\n  -webkit-appearance: none;\n}\n\n.video-wrapper[data-is-loaded=\"true\"] {\n  cursor: auto;\n}\n\n.video-wrapper:focus-visible {\n  outline: var(--yt-focus-outline-width) solid var(--yt-focus-outline);\n  outline-offset: var(--yt-focus-outline-offset);\n}\n\n.video-thumbnail {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  margin: auto;\n  max-width: 100%;\n  max-height: 100%;\n  width: auto;\n  height: auto;\n  object-fit: contain;\n  object-position: center;\n  background-color: var(--yt-bg-black);\n  z-index: 1;\n  transition: opacity var(--yt-transition-duration) var(--yt-transition-timing);\n}\n\n.video-wrapper:hover .video-thumbnail {\n  opacity: 0.9;\n}\n\n.video-overlay {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  background: var(--yt-overlay-bg);\n  color: var(--yt-overlay-text);\n  text-align: center;\n  font-size: 0.85em;\n  padding: 0.5em 1em;\n  z-index: 2;\n  pointer-events: auto;\n}\n\n.video-play-button {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  width: var(--yt-play-button-width);\n  height: var(--yt-play-button-height);\n  background-color: var(--yt-play-button-bg);\n  border-radius: var(--yt-play-button-border-radius);\n  z-index: 3;\n  pointer-events: none;\n  transition: all var(--yt-transition-duration) var(--yt-transition-timing);\n}\n\n.video-wrapper:hover .video-play-button {\n  background-color: var(--yt-play-button-bg-hover);\n  transform: translate(-50%, -50%) scale(1.1);\n}\n\n.video-wrapper:active .video-play-button {\n  transform: translate(-50%, -50%) scale(1.05);\n}\n\n.video-play-button::before {\n  content: '';\n  position: absolute;\n  left: 26px;\n  top: 14px;\n  width: 0;\n  height: 0;\n  border-left: 18px solid var(--yt-play-button-icon);\n  border-top: 12px solid transparent;\n  border-bottom: 12px solid transparent;\n}\n\n.video-wrapper iframe {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: none;\n  z-index: 4;\n}\n\n.video-noscript {\n  display: block;\n  max-width: 100%;\n  background-color: var(--yt-bg-black);\n  color: inherit;\n  text-align: center;\n  padding: 0;\n  margin-top: 0.5em;\n}\n\n.video-noscript img {\n  display: block;\n  width: 100%;\n  height: auto;\n}\n\n.video-noscript a {\n  display: inline-block;\n  padding: 0.75em 1em;\n  color: inherit;\n  text-decoration: underline;\n}\n\n.yt-text-link {\n  display: none;\n}\n</style>\n\n<script>\n(function(){\n  'use strict';\n\n  \n  const CONSTANTS = {\n    VIDEO_ID_LENGTH: 11,\n    MAX_INPUT_LENGTH: 2048,\n    VIDEO_ID_PATTERN: /^[a-zA-Z0-9_-]{11}$/,\n    PLAYLIST_PREFIXES: /^(PL|OL|UU|LL|FL)/i,\n    ALLOWED_URL_CHARS: /^[a-zA-Z0-9_\\-?=&#:/.]+$/,\n    TIME_FORMATS: {\n      HOURS: 3600,\n      MINUTES: 60,\n      SECONDS: 1\n    },\n    YOUTUBE_NOCOOKIE_DOMAIN: 'https://www.youtube-nocookie.com',\n    YOUTUBE_IMG_DOMAIN: 'https://img.youtube.com',\n    EMBED_PARAMS: 'autoplay=1&mute=1'\n  };\n\n  \n\n  function validateInput(input, maxLength = CONSTANTS.MAX_INPUT_LENGTH) {\n    if (!input || typeof input !== 'string') return '';\n\n    const trimmed = input.trim();\n\n    if (trimmed.length > maxLength) {\n      console.warn(`Input exceeds maximum length of ${maxLength}`);\n      return '';\n    }\n\n    \n    if (!CONSTANTS.ALLOWED_URL_CHARS.test(trimmed)) {\n      console.warn('Input contains invalid characters');\n      return '';\n    }\n\n    return trimmed;\n  }\n\n  \n\n  function parseStartValue(value) {\n    if (!value) return 0;\n\n    \n    if (/^\\d+$/.test(value)) {\n      const parsed = parseInt(value, 10);\n      return isNaN(parsed) ? 0 : Math.max(0, parsed);\n    }\n\n    \n    let total = 0;\n    let matched = false;\n    const regex = /(\\d+)(h|m|s)/gi;\n    let match;\n\n    while ((match = regex.exec(value)) !== null) {\n      matched = true;\n      const num = parseInt(match[1], 10);\n      if (isNaN(num)) continue;\n\n      const unit = match[2].toLowerCase();\n      if (unit === 'h') total += num * CONSTANTS.TIME_FORMATS.HOURS;\n      else if (unit === 'm') total += num * CONSTANTS.TIME_FORMATS.MINUTES;\n      else if (unit === 's') total += num * CONSTANTS.TIME_FORMATS.SECONDS;\n    }\n\n    return matched ? Math.max(0, total) : 0;\n  }\n\n  \n\n  function extractStartTime(queryString) {\n    if (!queryString) return 0;\n\n    try {\n      const cleanQuery = queryString.startsWith('?') || queryString.startsWith('#')\n        ? queryString.slice(1)\n        : queryString;\n\n      const params = new URLSearchParams(cleanQuery);\n\n      \n      return parseStartValue(params.get('start')) ||\n             parseStartValue(params.get('t')) ||\n             parseStartValue(params.get('time_continue')) ||\n             0;\n    } catch (e) {\n      console.warn('Failed to parse query parameters:', e);\n      return 0;\n    }\n  }\n\n  \n\n  function parseId(raw) {\n    const validated = validateInput(raw);\n    if (!validated) {\n      return { type: 'unknown', id: '', start: 0 };\n    }\n\n    let startSeconds = 0;\n    let normalized = validated;\n\n    \n    const queryIndex = normalized.indexOf('?');\n    if (queryIndex !== -1) {\n      startSeconds = extractStartTime(normalized.slice(queryIndex + 1));\n      normalized = normalized.slice(0, queryIndex);\n    }\n\n    \n    const hashIndex = normalized.indexOf('#');\n    if (hashIndex !== -1) {\n      startSeconds = startSeconds || extractStartTime(normalized.slice(hashIndex + 1));\n      normalized = normalized.slice(0, hashIndex);\n    }\n\n    \n    if (CONSTANTS.PLAYLIST_PREFIXES.test(normalized)) {\n      return { type: 'playlist', id: normalized, start: startSeconds };\n    }\n\n    \n    if (CONSTANTS.VIDEO_ID_PATTERN.test(normalized)) {\n      return { type: 'video', id: normalized, start: startSeconds };\n    }\n\n    \n    const listMatch = normalized.match(/list=([^&]+)/);\n    if (listMatch && listMatch[1]) {\n      return { type: 'playlist', id: listMatch[1], start: startSeconds };\n    }\n\n    console.warn('Unable to parse video/playlist ID:', raw);\n    return { type: 'unknown', id: '', start: startSeconds };\n  }\n\n  \n\n  function validateThumbnailUrl(thumbUrl) {\n    if (!thumbUrl) return '';\n\n    let cleaned = thumbUrl.trim();\n\n    \n    const markdownMatch = cleaned.match(/^\\[[^\\]]*\\]\\(([^)]+)\\)$/);\n    if (markdownMatch) {\n      cleaned = markdownMatch[1].trim();\n    }\n\n    \n    try {\n      const url = new URL(cleaned, document.baseURI);\n\n      \n      if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n        console.warn('Thumbnail URL must use http or https protocol');\n        return '';\n      }\n\n      return url.href;\n    } catch (e) {\n      console.warn('Invalid thumbnail URL:', e);\n      return '';\n    }\n  }\n\n  \n\n  function getPlaylistPlaceholder() {\n    const svg = `<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1280 720'>` +\n                `<rect width='100%' height='100%' fill='#000'/>` +\n                `<rect x='220' y='260' width='840' height='60' fill='#fff'/>` +\n                `<rect x='220' y='340' width='660' height='60' fill='#fff'/>` +\n                `</svg>`;\n    return 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);\n  }\n\n  /**\n   * Sets up thumbnail for video wrapper\n   * @param {HTMLImageElement} thumbnail - Thumbnail element\n   * @param {Object} kind - Parsed video/playlist info\n   * @param {string} customThumb - Custom thumbnail URL\n   */\n  function setupThumbnail(thumbnail, kind, customThumb) {\n    if (!thumbnail) return;\n\n    if (customThumb) {\n      // Use custom thumbnail\n      thumbnail.onerror = null;\n      thumbnail.src = customThumb;\n    } else if (kind.type === 'playlist') {\n      // Use playlist placeholder\n      thumbnail.src = getPlaylistPlaceholder();\n    } else if (kind.type === 'video' && kind.id) {\n      // Use YouTube thumbnail with fallback\n      thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/maxresdefault.jpg`;\n      thumbnail.onerror = () => {\n        thumbnail.onerror = null;\n        thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/0.jpg`;\n      };\n    }\n    // For unknown type, keep the default placeholder\n  }\n\n  /**\n   * Creates embed URL for video or playlist\n   * @param {Object} kind - Parsed video/playlist info\n   * @returns {string} Embed URL or empty string if invalid\n   */\n  function createEmbedUrl(kind) {\n    if (kind.type === 'playlist' && kind.id) {\n      return `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/videoseries?list=${encodeURIComponent(kind.id)}&${CONSTANTS.EMBED_PARAMS}`;\n    } else if (kind.type === 'video' && kind.id) {\n      let url = `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/${encodeURIComponent(kind.id)}?${CONSTANTS.EMBED_PARAMS}`;\n      if (kind.start > 0) {\n        url += `&start=${Math.floor(kind.start)}`;\n      }\n      return url;\n    }\n    return '';\n  }\n\n  /**\n   * Creates and loads iframe embed\n   * @param {HTMLElement} wrapper - Video wrapper element\n   * @param {Object} kind - Parsed video/playlist info\n   * @param {string} title - Video title\n   */\n  function loadEmbed(wrapper, kind, title) {\n    if (wrapper.dataset.isLoaded === 'true') return;\n\n    const embedUrl = createEmbedUrl(kind);\n    if (!embedUrl) {\n      console.error('Unable to create embed URL - invalid video/playlist ID');\n      // Show error message to user\n      wrapper.innerHTML = '<div style=\"padding: 2em; text-align: center; color: #fff;\">Unable to load video. Please check the video ID.</div>';\n      return;\n    }\n\n    // Create iframe\n    const iframe = document.createElement('iframe');\n    iframe.setAttribute('allowfullscreen', '');\n    iframe.setAttribute('loading', 'lazy');\n    iframe.setAttribute('allow', 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture');\n    iframe.setAttribute('title', title ? `YouTube video player: ${title}` : 'YouTube video player');\n    iframe.src = embedUrl;\n\n    \n    const replacement = document.createElement('div');\n    replacement.className = wrapper.className;\n    replacement.dataset.listenersAdded = 'true';\n    replacement.dataset.isLoaded = 'true';\n    replacement.appendChild(iframe);\n\n    wrapper.replaceWith(replacement);\n  }\n\n  \n\n  function enhanceEmbeds() {\n    const wrappers = document.querySelectorAll('.video-wrapper');\n\n    wrappers.forEach(wrapper => {\n      \n      if (wrapper.dataset.listenersAdded === 'true') return;\n      wrapper.dataset.listenersAdded = 'true';\n\n      \n      const rawVideoId = wrapper.dataset.videoId || '';\n      const rawThumbUrl = wrapper.dataset.thumb || '';\n      const videoTitle = wrapper.dataset.videoTitle || '';\n\n      \n      const kind = parseId(rawVideoId);\n      const safeThumb = validateThumbnailUrl(rawThumbUrl);\n\n      \n      const thumbnail = wrapper.querySelector('.video-thumbnail');\n      setupThumbnail(thumbnail, kind, safeThumb);\n\n      \n      const loadHandler = () => loadEmbed(wrapper, kind, videoTitle);\n\n      wrapper.addEventListener('click', loadHandler);\n\n      const overlay = wrapper.querySelector('.video-overlay');\n      if (overlay) overlay.addEventListener('click', loadHandler);\n      if (thumbnail) thumbnail.addEventListener('click', loadHandler);\n\n      \n      wrapper.addEventListener('keydown', (e) => {\n        if (e.key === 'Enter' || e.key === ' ') {\n          e.preventDefault();\n          loadHandler();\n        }\n      });\n    });\n  }\n\n  \n  enhanceEmbeds();\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', enhanceEmbeds);\n  }\n})();\n</script><p class=\"yt-text-link\">\n      <a href=\"https://www.youtube.com/playlist?list=PLIh86OChcGjYuaw7K86o-JfRzYa8VQxXV\">YouTube Playlist</a>\n    </p><button type=\"button\"\n    class=\"video-wrapper\"\n    aria-label=\"Play YouTube video\"\n    data-video-id=\"PLIh86OChcGjYuaw7K86o-JfRzYa8VQxXV\"\n    data-thumb=\"\"\n    ><img\n      class=\"video-thumbnail\"\n      src=\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20viewBox=%270%200%201280%20720%27%3E%3Crect%20width=%27100%25%25%27%20height=%27100%25%25%27%20fill=%27%23000%27/%3E%3C/svg%3E\"\n      alt=\"YouTube Thumbnail\"\n      loading=\"lazy\"\n      decoding=\"async\"><div class=\"video-play-button\"></div>\n  </button><noscript>\n    <div class=\"video-noscript\"><img src=\"data:image/svg&#43;xml;charset=utf-8,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20viewBox=%270%200%201280%20720%27%3E%3Crect%20width=%27100%25%25%27%20height=%27100%25%25%27%20fill=%27%23000%27/%3E%3Crect%20x=%27220%27%20y=%27260%27%20width=%27840%27%20height=%2760%27%20fill=%27%23fff%27/%3E%3Crect%20x=%27220%27%20y=%27340%27%20width=%27660%27%20height=%2760%27%20fill=%27%23fff%27/%3E%3C/svg%3E\"\n             alt=\"YouTube Thumbnail\"><p>\n          <a href=\"https://www.youtube.com/playlist?list=PLIh86OChcGjYuaw7K86o-JfRzYa8VQxXV\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube Playlist</a>\n        </p></div>\n  </noscript>\n",
        "date_published": "2025-12-01T23:09:00-04:00",
        "url": "https://nic.babarskis.blog/2025/12/01/what-a-delight-to-discover.html",
        "tags": ["YouTube ","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/11/22/yo-you-can-watch-pretty.html",
        
        "content_html": "<p>Yo! You can watch pretty much the <a href=\"https://archive.org/details/ReadingRainbowTVSeries\">entire Reading Rainbow archive through the Internet Archive.</a></p>\n<iframe src=\"https://archive.org/embed/ReadingRainbowTVSeries&playlist=1\" width=\"640\" height=\"580\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen></iframe>\n",
        "date_published": "2025-11-22T19:38:00-04:00",
        "url": "https://nic.babarskis.blog/2025/11/22/yo-you-can-watch-pretty.html",
        "tags": ["Open Web","Web Clippings","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/11/22/treasure-of-life-from-miniature.html",
        
        "content_html": "<p><a href=\"https://miniature-calendar.com/251122\">Treasure of Life from Miniature Calendar:</a></p>\n<p><img src=\"https://miniature-calendar.com/wp-content/uploads/2025/11/251122sat.jpg\" alt=\"A picture of a miniature showing two adults reclining in bed reading. The bed is made from a ring box and the ring sits at the foot of the bed\"></p>\n",
        "date_published": "2025-11-22T10:08:00-04:00",
        "url": "https://nic.babarskis.blog/2025/11/22/treasure-of-life-from-miniature.html",
        "tags": ["Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/11/21/chicago-transit-authoritys-slow-tv.html",
        "title": "Chicago Transit Authority’s slow TV ‘Ride the Rails’ videos remind me why I love the Brown Line",
        "content_html": "<p>My family has maintained a relationship to Chicago’s Brown Line.</p>\n<p>For the years that we lived in central Illinois my parents would periodically take my sister and I to the city for a day or weekend excursion. Ostensibly we were there to visit my grandmother in Bridgeport (a Red Line stop) or my cousins in the suburbs, but we would also find an excuse to take the bikes down to the lakefront for a ride from the Adler Planetarium to the Lincoln Park zoo, or a jaunt up and down lake shore drive. We’d also ride the El. We’d take the Brown Line to Sedgwick and eat at the <a href=\"https://oldjerusalemrestaurant.net/?y_source=1_MTA5MjA5ODUzNy03MTUtbG9jYXRpb24ud2Vic2l0ZQ%253D%253D\">Old Jerusalem Restaurant.</a></p>\n<p>When I lived in Wheaton I’d keep up the pattern and find excuses to take the Brown Line to Old Town or Lincoln Park. My future spouse lived not far from the Diversey stop for a time.</p>\n<p>The CTA <a href=\"https://youtube.com/playlist?list=PL0-sTc_CuqtXDvfQIx_Za5kG8nB4nz8FU&amp;si=KawfhckFN383vJEA\">maintains a playlist of ‘Ride the Rails’ videos.</a> The production values have improved incrementally over time. I find it comforting to pull one up and ride along for a couple stops. The familiar “doors closing” cadence and the click-clack of the tracks acts a bit like a breathe prayer. The Brown Line remains my favorite.</p>\n",
        "date_published": "2025-11-21T22:33:00-04:00",
        "url": "https://nic.babarskis.blog/2025/11/21/chicago-transit-authoritys-slow-tv.html",
        "tags": ["YouTube ","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/11/03/could-we-make-cosmodromepunk-a.html",
        "title": "Could we make CosmodromePunk a thing?",
        "content_html": "<p>The artistic director of <a href=\"https://youtu.be/RwV4RyGOJZM?si=qJD2F11_lQmN57H3\">this film</a> would go on to lead artistic direction for the first Ghost in the Shell film. I wouldn&rsquo;t call it&rsquo;s aesthetic vision cyberpunk though. I&rsquo;d propose something else, like cassettepunk, or maybe CosmodromePunk. I think a lot of the videos <a href=\"https://www.youtube.com/@hanahakiblank\">this YT channel</a> makes could fall into that aesthetic.</p>\n\n<style>\n:root {\n   \n  --yt-aspect-ratio-16-9: 56.25%;\n\n   \n  --yt-bg-black: #000;\n  --yt-play-button-bg: rgba(255, 0, 0, 0.8);\n  --yt-play-button-bg-hover: rgba(255, 0, 0, 1);\n  --yt-play-button-icon: #fff;\n  --yt-overlay-bg: rgba(0, 0, 0, 0.85);\n  --yt-overlay-text: #fff;\n  --yt-focus-outline: #e53935;\n\n   \n  --yt-play-button-width: 68px;\n  --yt-play-button-height: 48px;\n  --yt-play-button-border-radius: 12px;\n\n   \n  --yt-focus-outline-width: 3px;\n  --yt-focus-outline-offset: 4px;\n\n   \n  --yt-transition-duration: 0.2s;\n  --yt-transition-timing: ease-in-out;\n}\n\n.video-wrapper {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  padding-bottom: var(--yt-aspect-ratio-16-9);\n  margin: 0;\n  height: 0;\n  max-width: 100%;\n  overflow: hidden;\n  background-color: var(--yt-bg-black);\n  cursor: pointer;\n  outline: none;\n  border: none;\n  color: inherit;\n  font: inherit;\n  text-align: inherit;\n  appearance: none;\n  -webkit-appearance: none;\n}\n\n.video-wrapper[data-is-loaded=\"true\"] {\n  cursor: auto;\n}\n\n.video-wrapper:focus-visible {\n  outline: var(--yt-focus-outline-width) solid var(--yt-focus-outline);\n  outline-offset: var(--yt-focus-outline-offset);\n}\n\n.video-thumbnail {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  margin: auto;\n  max-width: 100%;\n  max-height: 100%;\n  width: auto;\n  height: auto;\n  object-fit: contain;\n  object-position: center;\n  background-color: var(--yt-bg-black);\n  z-index: 1;\n  transition: opacity var(--yt-transition-duration) var(--yt-transition-timing);\n}\n\n.video-wrapper:hover .video-thumbnail {\n  opacity: 0.9;\n}\n\n.video-overlay {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  background: var(--yt-overlay-bg);\n  color: var(--yt-overlay-text);\n  text-align: center;\n  font-size: 0.85em;\n  padding: 0.5em 1em;\n  z-index: 2;\n  pointer-events: auto;\n}\n\n.video-play-button {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  width: var(--yt-play-button-width);\n  height: var(--yt-play-button-height);\n  background-color: var(--yt-play-button-bg);\n  border-radius: var(--yt-play-button-border-radius);\n  z-index: 3;\n  pointer-events: none;\n  transition: all var(--yt-transition-duration) var(--yt-transition-timing);\n}\n\n.video-wrapper:hover .video-play-button {\n  background-color: var(--yt-play-button-bg-hover);\n  transform: translate(-50%, -50%) scale(1.1);\n}\n\n.video-wrapper:active .video-play-button {\n  transform: translate(-50%, -50%) scale(1.05);\n}\n\n.video-play-button::before {\n  content: '';\n  position: absolute;\n  left: 26px;\n  top: 14px;\n  width: 0;\n  height: 0;\n  border-left: 18px solid var(--yt-play-button-icon);\n  border-top: 12px solid transparent;\n  border-bottom: 12px solid transparent;\n}\n\n.video-wrapper iframe {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: none;\n  z-index: 4;\n}\n\n.video-noscript {\n  display: block;\n  max-width: 100%;\n  background-color: var(--yt-bg-black);\n  color: inherit;\n  text-align: center;\n  padding: 0;\n  margin-top: 0.5em;\n}\n\n.video-noscript img {\n  display: block;\n  width: 100%;\n  height: auto;\n}\n\n.video-noscript a {\n  display: inline-block;\n  padding: 0.75em 1em;\n  color: inherit;\n  text-decoration: underline;\n}\n\n.yt-text-link {\n  display: none;\n}\n</style>\n\n<script>\n(function(){\n  'use strict';\n\n  \n  const CONSTANTS = {\n    VIDEO_ID_LENGTH: 11,\n    MAX_INPUT_LENGTH: 2048,\n    VIDEO_ID_PATTERN: /^[a-zA-Z0-9_-]{11}$/,\n    PLAYLIST_PREFIXES: /^(PL|OL|UU|LL|FL)/i,\n    ALLOWED_URL_CHARS: /^[a-zA-Z0-9_\\-?=&#:/.]+$/,\n    TIME_FORMATS: {\n      HOURS: 3600,\n      MINUTES: 60,\n      SECONDS: 1\n    },\n    YOUTUBE_NOCOOKIE_DOMAIN: 'https://www.youtube-nocookie.com',\n    YOUTUBE_IMG_DOMAIN: 'https://img.youtube.com',\n    EMBED_PARAMS: 'autoplay=1&mute=1'\n  };\n\n  \n\n  function validateInput(input, maxLength = CONSTANTS.MAX_INPUT_LENGTH) {\n    if (!input || typeof input !== 'string') return '';\n\n    const trimmed = input.trim();\n\n    if (trimmed.length > maxLength) {\n      console.warn(`Input exceeds maximum length of ${maxLength}`);\n      return '';\n    }\n\n    \n    if (!CONSTANTS.ALLOWED_URL_CHARS.test(trimmed)) {\n      console.warn('Input contains invalid characters');\n      return '';\n    }\n\n    return trimmed;\n  }\n\n  \n\n  function parseStartValue(value) {\n    if (!value) return 0;\n\n    \n    if (/^\\d+$/.test(value)) {\n      const parsed = parseInt(value, 10);\n      return isNaN(parsed) ? 0 : Math.max(0, parsed);\n    }\n\n    \n    let total = 0;\n    let matched = false;\n    const regex = /(\\d+)(h|m|s)/gi;\n    let match;\n\n    while ((match = regex.exec(value)) !== null) {\n      matched = true;\n      const num = parseInt(match[1], 10);\n      if (isNaN(num)) continue;\n\n      const unit = match[2].toLowerCase();\n      if (unit === 'h') total += num * CONSTANTS.TIME_FORMATS.HOURS;\n      else if (unit === 'm') total += num * CONSTANTS.TIME_FORMATS.MINUTES;\n      else if (unit === 's') total += num * CONSTANTS.TIME_FORMATS.SECONDS;\n    }\n\n    return matched ? Math.max(0, total) : 0;\n  }\n\n  \n\n  function extractStartTime(queryString) {\n    if (!queryString) return 0;\n\n    try {\n      const cleanQuery = queryString.startsWith('?') || queryString.startsWith('#')\n        ? queryString.slice(1)\n        : queryString;\n\n      const params = new URLSearchParams(cleanQuery);\n\n      \n      return parseStartValue(params.get('start')) ||\n             parseStartValue(params.get('t')) ||\n             parseStartValue(params.get('time_continue')) ||\n             0;\n    } catch (e) {\n      console.warn('Failed to parse query parameters:', e);\n      return 0;\n    }\n  }\n\n  \n\n  function parseId(raw) {\n    const validated = validateInput(raw);\n    if (!validated) {\n      return { type: 'unknown', id: '', start: 0 };\n    }\n\n    let startSeconds = 0;\n    let normalized = validated;\n\n    \n    const queryIndex = normalized.indexOf('?');\n    if (queryIndex !== -1) {\n      startSeconds = extractStartTime(normalized.slice(queryIndex + 1));\n      normalized = normalized.slice(0, queryIndex);\n    }\n\n    \n    const hashIndex = normalized.indexOf('#');\n    if (hashIndex !== -1) {\n      startSeconds = startSeconds || extractStartTime(normalized.slice(hashIndex + 1));\n      normalized = normalized.slice(0, hashIndex);\n    }\n\n    \n    if (CONSTANTS.PLAYLIST_PREFIXES.test(normalized)) {\n      return { type: 'playlist', id: normalized, start: startSeconds };\n    }\n\n    \n    if (CONSTANTS.VIDEO_ID_PATTERN.test(normalized)) {\n      return { type: 'video', id: normalized, start: startSeconds };\n    }\n\n    \n    const listMatch = normalized.match(/list=([^&]+)/);\n    if (listMatch && listMatch[1]) {\n      return { type: 'playlist', id: listMatch[1], start: startSeconds };\n    }\n\n    console.warn('Unable to parse video/playlist ID:', raw);\n    return { type: 'unknown', id: '', start: startSeconds };\n  }\n\n  \n\n  function validateThumbnailUrl(thumbUrl) {\n    if (!thumbUrl) return '';\n\n    let cleaned = thumbUrl.trim();\n\n    \n    const markdownMatch = cleaned.match(/^\\[[^\\]]*\\]\\(([^)]+)\\)$/);\n    if (markdownMatch) {\n      cleaned = markdownMatch[1].trim();\n    }\n\n    \n    try {\n      const url = new URL(cleaned, document.baseURI);\n\n      \n      if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n        console.warn('Thumbnail URL must use http or https protocol');\n        return '';\n      }\n\n      return url.href;\n    } catch (e) {\n      console.warn('Invalid thumbnail URL:', e);\n      return '';\n    }\n  }\n\n  \n\n  function getPlaylistPlaceholder() {\n    const svg = `<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1280 720'>` +\n                `<rect width='100%' height='100%' fill='#000'/>` +\n                `<rect x='220' y='260' width='840' height='60' fill='#fff'/>` +\n                `<rect x='220' y='340' width='660' height='60' fill='#fff'/>` +\n                `</svg>`;\n    return 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);\n  }\n\n  /**\n   * Sets up thumbnail for video wrapper\n   * @param {HTMLImageElement} thumbnail - Thumbnail element\n   * @param {Object} kind - Parsed video/playlist info\n   * @param {string} customThumb - Custom thumbnail URL\n   */\n  function setupThumbnail(thumbnail, kind, customThumb) {\n    if (!thumbnail) return;\n\n    if (customThumb) {\n      // Use custom thumbnail\n      thumbnail.onerror = null;\n      thumbnail.src = customThumb;\n    } else if (kind.type === 'playlist') {\n      // Use playlist placeholder\n      thumbnail.src = getPlaylistPlaceholder();\n    } else if (kind.type === 'video' && kind.id) {\n      // Use YouTube thumbnail with fallback\n      thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/maxresdefault.jpg`;\n      thumbnail.onerror = () => {\n        thumbnail.onerror = null;\n        thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/0.jpg`;\n      };\n    }\n    // For unknown type, keep the default placeholder\n  }\n\n  /**\n   * Creates embed URL for video or playlist\n   * @param {Object} kind - Parsed video/playlist info\n   * @returns {string} Embed URL or empty string if invalid\n   */\n  function createEmbedUrl(kind) {\n    if (kind.type === 'playlist' && kind.id) {\n      return `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/videoseries?list=${encodeURIComponent(kind.id)}&${CONSTANTS.EMBED_PARAMS}`;\n    } else if (kind.type === 'video' && kind.id) {\n      let url = `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/${encodeURIComponent(kind.id)}?${CONSTANTS.EMBED_PARAMS}`;\n      if (kind.start > 0) {\n        url += `&start=${Math.floor(kind.start)}`;\n      }\n      return url;\n    }\n    return '';\n  }\n\n  /**\n   * Creates and loads iframe embed\n   * @param {HTMLElement} wrapper - Video wrapper element\n   * @param {Object} kind - Parsed video/playlist info\n   * @param {string} title - Video title\n   */\n  function loadEmbed(wrapper, kind, title) {\n    if (wrapper.dataset.isLoaded === 'true') return;\n\n    const embedUrl = createEmbedUrl(kind);\n    if (!embedUrl) {\n      console.error('Unable to create embed URL - invalid video/playlist ID');\n      // Show error message to user\n      wrapper.innerHTML = '<div style=\"padding: 2em; text-align: center; color: #fff;\">Unable to load video. Please check the video ID.</div>';\n      return;\n    }\n\n    // Create iframe\n    const iframe = document.createElement('iframe');\n    iframe.setAttribute('allowfullscreen', '');\n    iframe.setAttribute('loading', 'lazy');\n    iframe.setAttribute('allow', 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture');\n    iframe.setAttribute('title', title ? `YouTube video player: ${title}` : 'YouTube video player');\n    iframe.src = embedUrl;\n\n    \n    const replacement = document.createElement('div');\n    replacement.className = wrapper.className;\n    replacement.dataset.listenersAdded = 'true';\n    replacement.dataset.isLoaded = 'true';\n    replacement.appendChild(iframe);\n\n    wrapper.replaceWith(replacement);\n  }\n\n  \n\n  function enhanceEmbeds() {\n    const wrappers = document.querySelectorAll('.video-wrapper');\n\n    wrappers.forEach(wrapper => {\n      \n      if (wrapper.dataset.listenersAdded === 'true') return;\n      wrapper.dataset.listenersAdded = 'true';\n\n      \n      const rawVideoId = wrapper.dataset.videoId || '';\n      const rawThumbUrl = wrapper.dataset.thumb || '';\n      const videoTitle = wrapper.dataset.videoTitle || '';\n\n      \n      const kind = parseId(rawVideoId);\n      const safeThumb = validateThumbnailUrl(rawThumbUrl);\n\n      \n      const thumbnail = wrapper.querySelector('.video-thumbnail');\n      setupThumbnail(thumbnail, kind, safeThumb);\n\n      \n      const loadHandler = () => loadEmbed(wrapper, kind, videoTitle);\n\n      wrapper.addEventListener('click', loadHandler);\n\n      const overlay = wrapper.querySelector('.video-overlay');\n      if (overlay) overlay.addEventListener('click', loadHandler);\n      if (thumbnail) thumbnail.addEventListener('click', loadHandler);\n\n      \n      wrapper.addEventListener('keydown', (e) => {\n        if (e.key === 'Enter' || e.key === ' ') {\n          e.preventDefault();\n          loadHandler();\n        }\n      });\n    });\n  }\n\n  \n  enhanceEmbeds();\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', enhanceEmbeds);\n  }\n})();\n</script><p class=\"yt-text-link\">\n      <a href=\"https://www.youtube.com/watch?v=RwV4RyGOJZM\">YouTube Video</a>\n    </p><button type=\"button\"\n    class=\"video-wrapper\"\n    aria-label=\"Play YouTube video\"\n    data-video-id=\"RwV4RyGOJZM\"\n    data-thumb=\"\"\n    ><img\n      class=\"video-thumbnail\"\n      src=\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20viewBox=%270%200%201280%20720%27%3E%3Crect%20width=%27100%25%25%27%20height=%27100%25%25%27%20fill=%27%23000%27/%3E%3C/svg%3E\"\n      alt=\"YouTube Thumbnail\"\n      loading=\"lazy\"\n      decoding=\"async\"><div class=\"video-play-button\"></div>\n  </button><noscript>\n    <div class=\"video-noscript\"><img src=\"https://img.youtube.com/vi/RwV4RyGOJZM/maxresdefault.jpg\"\n             alt=\"YouTube Thumbnail\"><p>\n          <a href=\"https://www.youtube.com/watch?v=RwV4RyGOJZM\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube Video</a>\n        </p></div>\n  </noscript>\n",
        "date_published": "2025-11-03T12:38:00-04:00",
        "url": "https://nic.babarskis.blog/2025/11/03/could-we-make-cosmodromepunk-a.html",
        "tags": ["YouTube ","Web Clippings","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/10/26/parents-leave-all-sorts-of.html",
        
        "content_html": "<p>Parents leave all sorts of small indelible marks on their children that last a lifetime, and from my mom I&rsquo;ve held onto an affection for <a href=\"https://www.youtube.com/watch?v=bDgOwX72fLI\">Bruce Hornsby &amp; The Range</a>.</p>\n\n<style>\n:root {\n   \n  --yt-aspect-ratio-16-9: 56.25%;\n\n   \n  --yt-bg-black: #000;\n  --yt-play-button-bg: rgba(255, 0, 0, 0.8);\n  --yt-play-button-bg-hover: rgba(255, 0, 0, 1);\n  --yt-play-button-icon: #fff;\n  --yt-overlay-bg: rgba(0, 0, 0, 0.85);\n  --yt-overlay-text: #fff;\n  --yt-focus-outline: #e53935;\n\n   \n  --yt-play-button-width: 68px;\n  --yt-play-button-height: 48px;\n  --yt-play-button-border-radius: 12px;\n\n   \n  --yt-focus-outline-width: 3px;\n  --yt-focus-outline-offset: 4px;\n\n   \n  --yt-transition-duration: 0.2s;\n  --yt-transition-timing: ease-in-out;\n}\n\n.video-wrapper {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  padding-bottom: var(--yt-aspect-ratio-16-9);\n  margin: 0;\n  height: 0;\n  max-width: 100%;\n  overflow: hidden;\n  background-color: var(--yt-bg-black);\n  cursor: pointer;\n  outline: none;\n  border: none;\n  color: inherit;\n  font: inherit;\n  text-align: inherit;\n  appearance: none;\n  -webkit-appearance: none;\n}\n\n.video-wrapper[data-is-loaded=\"true\"] {\n  cursor: auto;\n}\n\n.video-wrapper:focus-visible {\n  outline: var(--yt-focus-outline-width) solid var(--yt-focus-outline);\n  outline-offset: var(--yt-focus-outline-offset);\n}\n\n.video-thumbnail {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  margin: auto;\n  max-width: 100%;\n  max-height: 100%;\n  width: auto;\n  height: auto;\n  object-fit: contain;\n  object-position: center;\n  background-color: var(--yt-bg-black);\n  z-index: 1;\n  transition: opacity var(--yt-transition-duration) var(--yt-transition-timing);\n}\n\n.video-wrapper:hover .video-thumbnail {\n  opacity: 0.9;\n}\n\n.video-overlay {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  background: var(--yt-overlay-bg);\n  color: var(--yt-overlay-text);\n  text-align: center;\n  font-size: 0.85em;\n  padding: 0.5em 1em;\n  z-index: 2;\n  pointer-events: auto;\n}\n\n.video-play-button {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  width: var(--yt-play-button-width);\n  height: var(--yt-play-button-height);\n  background-color: var(--yt-play-button-bg);\n  border-radius: var(--yt-play-button-border-radius);\n  z-index: 3;\n  pointer-events: none;\n  transition: all var(--yt-transition-duration) var(--yt-transition-timing);\n}\n\n.video-wrapper:hover .video-play-button {\n  background-color: var(--yt-play-button-bg-hover);\n  transform: translate(-50%, -50%) scale(1.1);\n}\n\n.video-wrapper:active .video-play-button {\n  transform: translate(-50%, -50%) scale(1.05);\n}\n\n.video-play-button::before {\n  content: '';\n  position: absolute;\n  left: 26px;\n  top: 14px;\n  width: 0;\n  height: 0;\n  border-left: 18px solid var(--yt-play-button-icon);\n  border-top: 12px solid transparent;\n  border-bottom: 12px solid transparent;\n}\n\n.video-wrapper iframe {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: none;\n  z-index: 4;\n}\n\n.video-noscript {\n  display: block;\n  max-width: 100%;\n  background-color: var(--yt-bg-black);\n  color: inherit;\n  text-align: center;\n  padding: 0;\n  margin-top: 0.5em;\n}\n\n.video-noscript img {\n  display: block;\n  width: 100%;\n  height: auto;\n}\n\n.video-noscript a {\n  display: inline-block;\n  padding: 0.75em 1em;\n  color: inherit;\n  text-decoration: underline;\n}\n\n.yt-text-link {\n  display: none;\n}\n</style>\n\n<script>\n(function(){\n  'use strict';\n\n  \n  const CONSTANTS = {\n    VIDEO_ID_LENGTH: 11,\n    MAX_INPUT_LENGTH: 2048,\n    VIDEO_ID_PATTERN: /^[a-zA-Z0-9_-]{11}$/,\n    PLAYLIST_PREFIXES: /^(PL|OL|UU|LL|FL)/i,\n    ALLOWED_URL_CHARS: /^[a-zA-Z0-9_\\-?=&#:/.]+$/,\n    TIME_FORMATS: {\n      HOURS: 3600,\n      MINUTES: 60,\n      SECONDS: 1\n    },\n    YOUTUBE_NOCOOKIE_DOMAIN: 'https://www.youtube-nocookie.com',\n    YOUTUBE_IMG_DOMAIN: 'https://img.youtube.com',\n    EMBED_PARAMS: 'autoplay=1&mute=1'\n  };\n\n  \n\n  function validateInput(input, maxLength = CONSTANTS.MAX_INPUT_LENGTH) {\n    if (!input || typeof input !== 'string') return '';\n\n    const trimmed = input.trim();\n\n    if (trimmed.length > maxLength) {\n      console.warn(`Input exceeds maximum length of ${maxLength}`);\n      return '';\n    }\n\n    \n    if (!CONSTANTS.ALLOWED_URL_CHARS.test(trimmed)) {\n      console.warn('Input contains invalid characters');\n      return '';\n    }\n\n    return trimmed;\n  }\n\n  \n\n  function parseStartValue(value) {\n    if (!value) return 0;\n\n    \n    if (/^\\d+$/.test(value)) {\n      const parsed = parseInt(value, 10);\n      return isNaN(parsed) ? 0 : Math.max(0, parsed);\n    }\n\n    \n    let total = 0;\n    let matched = false;\n    const regex = /(\\d+)(h|m|s)/gi;\n    let match;\n\n    while ((match = regex.exec(value)) !== null) {\n      matched = true;\n      const num = parseInt(match[1], 10);\n      if (isNaN(num)) continue;\n\n      const unit = match[2].toLowerCase();\n      if (unit === 'h') total += num * CONSTANTS.TIME_FORMATS.HOURS;\n      else if (unit === 'm') total += num * CONSTANTS.TIME_FORMATS.MINUTES;\n      else if (unit === 's') total += num * CONSTANTS.TIME_FORMATS.SECONDS;\n    }\n\n    return matched ? Math.max(0, total) : 0;\n  }\n\n  \n\n  function extractStartTime(queryString) {\n    if (!queryString) return 0;\n\n    try {\n      const cleanQuery = queryString.startsWith('?') || queryString.startsWith('#')\n        ? queryString.slice(1)\n        : queryString;\n\n      const params = new URLSearchParams(cleanQuery);\n\n      \n      return parseStartValue(params.get('start')) ||\n             parseStartValue(params.get('t')) ||\n             parseStartValue(params.get('time_continue')) ||\n             0;\n    } catch (e) {\n      console.warn('Failed to parse query parameters:', e);\n      return 0;\n    }\n  }\n\n  \n\n  function parseId(raw) {\n    const validated = validateInput(raw);\n    if (!validated) {\n      return { type: 'unknown', id: '', start: 0 };\n    }\n\n    let startSeconds = 0;\n    let normalized = validated;\n\n    \n    const queryIndex = normalized.indexOf('?');\n    if (queryIndex !== -1) {\n      startSeconds = extractStartTime(normalized.slice(queryIndex + 1));\n      normalized = normalized.slice(0, queryIndex);\n    }\n\n    \n    const hashIndex = normalized.indexOf('#');\n    if (hashIndex !== -1) {\n      startSeconds = startSeconds || extractStartTime(normalized.slice(hashIndex + 1));\n      normalized = normalized.slice(0, hashIndex);\n    }\n\n    \n    if (CONSTANTS.PLAYLIST_PREFIXES.test(normalized)) {\n      return { type: 'playlist', id: normalized, start: startSeconds };\n    }\n\n    \n    if (CONSTANTS.VIDEO_ID_PATTERN.test(normalized)) {\n      return { type: 'video', id: normalized, start: startSeconds };\n    }\n\n    \n    const listMatch = normalized.match(/list=([^&]+)/);\n    if (listMatch && listMatch[1]) {\n      return { type: 'playlist', id: listMatch[1], start: startSeconds };\n    }\n\n    console.warn('Unable to parse video/playlist ID:', raw);\n    return { type: 'unknown', id: '', start: startSeconds };\n  }\n\n  \n\n  function validateThumbnailUrl(thumbUrl) {\n    if (!thumbUrl) return '';\n\n    let cleaned = thumbUrl.trim();\n\n    \n    const markdownMatch = cleaned.match(/^\\[[^\\]]*\\]\\(([^)]+)\\)$/);\n    if (markdownMatch) {\n      cleaned = markdownMatch[1].trim();\n    }\n\n    \n    try {\n      const url = new URL(cleaned, document.baseURI);\n\n      \n      if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n        console.warn('Thumbnail URL must use http or https protocol');\n        return '';\n      }\n\n      return url.href;\n    } catch (e) {\n      console.warn('Invalid thumbnail URL:', e);\n      return '';\n    }\n  }\n\n  \n\n  function getPlaylistPlaceholder() {\n    const svg = `<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1280 720'>` +\n                `<rect width='100%' height='100%' fill='#000'/>` +\n                `<rect x='220' y='260' width='840' height='60' fill='#fff'/>` +\n                `<rect x='220' y='340' width='660' height='60' fill='#fff'/>` +\n                `</svg>`;\n    return 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);\n  }\n\n  /**\n   * Sets up thumbnail for video wrapper\n   * @param {HTMLImageElement} thumbnail - Thumbnail element\n   * @param {Object} kind - Parsed video/playlist info\n   * @param {string} customThumb - Custom thumbnail URL\n   */\n  function setupThumbnail(thumbnail, kind, customThumb) {\n    if (!thumbnail) return;\n\n    if (customThumb) {\n      // Use custom thumbnail\n      thumbnail.onerror = null;\n      thumbnail.src = customThumb;\n    } else if (kind.type === 'playlist') {\n      // Use playlist placeholder\n      thumbnail.src = getPlaylistPlaceholder();\n    } else if (kind.type === 'video' && kind.id) {\n      // Use YouTube thumbnail with fallback\n      thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/maxresdefault.jpg`;\n      thumbnail.onerror = () => {\n        thumbnail.onerror = null;\n        thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/0.jpg`;\n      };\n    }\n    // For unknown type, keep the default placeholder\n  }\n\n  /**\n   * Creates embed URL for video or playlist\n   * @param {Object} kind - Parsed video/playlist info\n   * @returns {string} Embed URL or empty string if invalid\n   */\n  function createEmbedUrl(kind) {\n    if (kind.type === 'playlist' && kind.id) {\n      return `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/videoseries?list=${encodeURIComponent(kind.id)}&${CONSTANTS.EMBED_PARAMS}`;\n    } else if (kind.type === 'video' && kind.id) {\n      let url = `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/${encodeURIComponent(kind.id)}?${CONSTANTS.EMBED_PARAMS}`;\n      if (kind.start > 0) {\n        url += `&start=${Math.floor(kind.start)}`;\n      }\n      return url;\n    }\n    return '';\n  }\n\n  /**\n   * Creates and loads iframe embed\n   * @param {HTMLElement} wrapper - Video wrapper element\n   * @param {Object} kind - Parsed video/playlist info\n   * @param {string} title - Video title\n   */\n  function loadEmbed(wrapper, kind, title) {\n    if (wrapper.dataset.isLoaded === 'true') return;\n\n    const embedUrl = createEmbedUrl(kind);\n    if (!embedUrl) {\n      console.error('Unable to create embed URL - invalid video/playlist ID');\n      // Show error message to user\n      wrapper.innerHTML = '<div style=\"padding: 2em; text-align: center; color: #fff;\">Unable to load video. Please check the video ID.</div>';\n      return;\n    }\n\n    // Create iframe\n    const iframe = document.createElement('iframe');\n    iframe.setAttribute('allowfullscreen', '');\n    iframe.setAttribute('loading', 'lazy');\n    iframe.setAttribute('allow', 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture');\n    iframe.setAttribute('title', title ? `YouTube video player: ${title}` : 'YouTube video player');\n    iframe.src = embedUrl;\n\n    \n    const replacement = document.createElement('div');\n    replacement.className = wrapper.className;\n    replacement.dataset.listenersAdded = 'true';\n    replacement.dataset.isLoaded = 'true';\n    replacement.appendChild(iframe);\n\n    wrapper.replaceWith(replacement);\n  }\n\n  \n\n  function enhanceEmbeds() {\n    const wrappers = document.querySelectorAll('.video-wrapper');\n\n    wrappers.forEach(wrapper => {\n      \n      if (wrapper.dataset.listenersAdded === 'true') return;\n      wrapper.dataset.listenersAdded = 'true';\n\n      \n      const rawVideoId = wrapper.dataset.videoId || '';\n      const rawThumbUrl = wrapper.dataset.thumb || '';\n      const videoTitle = wrapper.dataset.videoTitle || '';\n\n      \n      const kind = parseId(rawVideoId);\n      const safeThumb = validateThumbnailUrl(rawThumbUrl);\n\n      \n      const thumbnail = wrapper.querySelector('.video-thumbnail');\n      setupThumbnail(thumbnail, kind, safeThumb);\n\n      \n      const loadHandler = () => loadEmbed(wrapper, kind, videoTitle);\n\n      wrapper.addEventListener('click', loadHandler);\n\n      const overlay = wrapper.querySelector('.video-overlay');\n      if (overlay) overlay.addEventListener('click', loadHandler);\n      if (thumbnail) thumbnail.addEventListener('click', loadHandler);\n\n      \n      wrapper.addEventListener('keydown', (e) => {\n        if (e.key === 'Enter' || e.key === ' ') {\n          e.preventDefault();\n          loadHandler();\n        }\n      });\n    });\n  }\n\n  \n  enhanceEmbeds();\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', enhanceEmbeds);\n  }\n})();\n</script><p class=\"yt-text-link\">\n      <a href=\"https://www.youtube.com/watch?v=bDgOwX72fLI\">YouTube Video</a>\n    </p><button type=\"button\"\n    class=\"video-wrapper\"\n    aria-label=\"Play YouTube video\"\n    data-video-id=\"bDgOwX72fLI\"\n    data-thumb=\"\"\n    ><img\n      class=\"video-thumbnail\"\n      src=\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20viewBox=%270%200%201280%20720%27%3E%3Crect%20width=%27100%25%25%27%20height=%27100%25%25%27%20fill=%27%23000%27/%3E%3C/svg%3E\"\n      alt=\"YouTube Thumbnail\"\n      loading=\"lazy\"\n      decoding=\"async\"><div class=\"video-play-button\"></div>\n  </button><noscript>\n    <div class=\"video-noscript\"><img src=\"https://img.youtube.com/vi/bDgOwX72fLI/maxresdefault.jpg\"\n             alt=\"YouTube Thumbnail\"><p>\n          <a href=\"https://www.youtube.com/watch?v=bDgOwX72fLI\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube Video</a>\n        </p></div>\n  </noscript>\n",
        "date_published": "2025-10-26T19:52:43-04:00",
        "url": "https://nic.babarskis.blog/2025/10/26/parents-leave-all-sorts-of.html",
        "tags": ["YouTube ","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/10/18/this-morning-i-saw-a.html",
        
        "content_html": "<p>This morning I saw a senior citizen with a cane, on the curb, in an inflatable animal costume, with signage promoting the No Kings rally happening downtown later today. Punching all the squares on my U.S.-in-2025 bingo card.</p>\n",
        "date_published": "2025-10-18T12:47:10-04:00",
        "url": "https://nic.babarskis.blog/2025/10/18/this-morning-i-saw-a.html",
        "tags": ["Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/10/14/this-site-is-so-delightful.html",
        
        "content_html": "<p>This site is so delightful. <a href=\"https://miniature-calendar.com/251014\">https://miniature-calendar.com/251014</a></p>\n",
        "date_published": "2025-10-14T10:28:14-04:00",
        "url": "https://nic.babarskis.blog/2025/10/14/this-site-is-so-delightful.html",
        "tags": ["Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/06/02/hanahaki-blank-continuing-to-evoke.html",
        
        "content_html": "<p><a href=\"https://youtu.be/OgcV4LhEQ6E?si=HjilgmW8Mzjqc1ol\">Hanahaki Blank continuing to evoke the golden age of hand drawn anime:</a></p>\n<p>&ndash;</p>\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/OgcV4LhEQ6E?si=-WdtSaBiaiSmBcRZ\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n",
        "date_published": "2025-06-02T11:25:38-04:00",
        "url": "https://nic.babarskis.blog/2025/06/02/hanahaki-blank-continuing-to-evoke.html",
        "tags": ["YouTube ","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/05/28/taking-a-python-intro-course.html",
        
        "content_html": "<p>Taking a Python Intro course this summer and turns out if you need to code late into the evening Olde Pine is a great companion:</p>\n<p>&ndash;</p>\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/WqYVapE7KTA?si=s5u4tOFriB4yJvCA\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n<p>&ndash;</p>\n<iframe style=\"border-radius:12px\" src=\"https://open.spotify.com/embed/track/3XY1XnhE0QjPUZqpIb7GDn?utm_source=generator\" width=\"100%\" height=\"152\" frameborder=\"0\" allowfullscreen=\"\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" loading=\"lazy\"></iframe>\n",
        "date_published": "2025-05-28T22:19:33-04:00",
        "url": "https://nic.babarskis.blog/2025/05/28/taking-a-python-intro-course.html",
        "tags": ["YouTube ","Research Clippings","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/05/14/i-took-amazon-immolating-million.html",
        
        "content_html": "<p>I took Amazon immolating $700 million dollars to distill a pure moment that evokes Tolkein at his best–as I remember him when read to me in my childhood–so good job I guess?</p>\n<p>It really is best viewed on a big screen with a good sound system:</p>\n<p>&ndash;</p>\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/M8Zas_YRD3g?si=r32pxBs__qBXmETO\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n",
        "date_published": "2025-05-14T11:30:00-04:00",
        "url": "https://nic.babarskis.blog/2025/05/14/i-took-amazon-immolating-million.html",
        "tags": ["YouTube ","Web Clippings","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/03/30/theres-very-specific-vibes-video.html",
        
        "content_html": "<p>There&rsquo;s very specific vibes video that features 80s and 90s anime that exudes what I&rsquo;d call a <a href=\"https://youtube.com/shorts/KofY0oCVpcA?si=9mD9X-RDlPOdFc6b\">#vhspunk aesthetic</a>–before the iPhone with its black mirror imposed a glass sheen on tech products. The video style is typified by <a href=\"https://www.youtube.com/@hanahakiblank\">Hanahaki Blank&rsquo;s</a> youtube channel. Its the perfect delta of the beauty of hand drawn animation, late 20th century nostaligia, and technophilia.</p>\n<p>&ndash;</p>\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/cFfpmC0Kv5w?si=ZNAMzDvcO9_KxpNi\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n",
        "date_published": "2025-03-30T21:46:09-04:00",
        "url": "https://nic.babarskis.blog/2025/03/30/theres-very-specific-vibes-video.html",
        "tags": ["YouTube ","Web Clippings","Web Whimsy"]
      },
      {
        "id": "http://thebigbabooski.micro.blog/2025/03/19/pssst-you-can-buy-bsky.html",
        
        "content_html": "<p>Pssst, you can buy BSKY CEO’s SXSW “A World Without Caesars” t-shirt <a href=\"https://worldwithoutcaesars.com/\">here.</a></p>\n<p>Hat tip to <a href=\"https://micro.blog/manton\">@manton</a> for the link.</p>\n",
        "date_published": "2025-03-19T08:09:51-04:00",
        "url": "https://nic.babarskis.blog/2025/03/19/pssst-you-can-buy-bsky.html",
        "tags": ["Open Web","Web Clippings","Web Whimsy"]
      }
  ]
}
