{
	"version": "https://jsonfeed.org/version/1",
	"title": "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/09/16/guide-to-wildflowers-from-the.html",
				
				"content_html": "<p>Guide to wildflowers from the <a href=\"https://historicalbookimages.tumblr.com/post/827869825840922624/a-guide-to-the-wild-flowers-new-york-f-a\">Historical Book Images site:</a></p>\n<p><img src=\"https://64.media.tumblr.com/63d89499718118b583bd7f3baa720701/4350dbe90439be0c-ac/s1280x1920/87148cdd0436f75d2a93b6a5334344a348ca8524.jpg\" alt=\"Image description: Foxglove illustration from historical archives\"></p>\n",
				
				"date_published": "2026-09-16T07:07:54-04:00",
				"url": "https://nic.babarskis.blog/2026/09/16/guide-to-wildflowers-from-the.html"
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/09/13/i-made-an-extremely-niche.html",
				
				"content_html": "<p>I made an extremely niche meme about The Christian Post <a href=\"https://web.archive.org/web/20260912075459/https://www.christianpost.com/voices/christian-nationalism-already-failed-america-once.html\">publishing an opinion piece </a> condemning Christian Nationalism. Worth noting this was the default position of the politics editor they <a href=\"https://medium.com/arc-digital/how-the-christian-post-sold-its-soul-for-trump-4294662f7781\">cancelled</a> half a decade ago.</p>\n<img src=\"https://nic.babarskis.blog/uploads/2026/99ea7b228e.jpg\" width=\"501\" height=\"500\" alt=\"\">\n",
				
				"date_published": "2026-09-13T22:38:05-04:00",
				"url": "https://nic.babarskis.blog/2026/09/13/i-made-an-extremely-niche.html",
				"tags": ["Web Clippings","Faith","Web Whimsy"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/09/12/a-grainsocial-find-i-like.html",
				
				"content_html": "<p><a href=\"https://grain.social/profile/did:plc:oak3v2cegjy4rqxmtgri5fu4/gallery/3muxrrow3tq2w\">A Grain.Social find I like</a></p>\n",
				
				"date_published": "2026-09-12T12:41:35-04:00",
				"url": "https://nic.babarskis.blog/2026/09/12/a-grainsocial-find-i-like.html",
				"tags": ["Web Clippings"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/09/11/perusing-the-library-of-congresss.html",
				
				"content_html": "<p>Perusing the Library of Congress&rsquo;s <a href=\"https://guides.loc.gov/september11-newspapers/highlights\">September 11 research guide</a> this morning.</p>\n",
				
				"date_published": "2026-09-11T07:32:50-04:00",
				"url": "https://nic.babarskis.blog/2026/09/11/perusing-the-library-of-congresss.html",
				"tags": ["Web Clippings","Public Domain"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/09/09/no-mans-sky-releasing-yet.html",
				
				"content_html": "<p>No Man&rsquo;s Sky releasing yet another feature rich FREE update. Good god, will it ever end?</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=inZfjVQxC3o\">YouTube Video</a>\n    </p><button type=\"button\"\n    class=\"video-wrapper\"\n    aria-label=\"Play YouTube video\"\n    data-video-id=\"inZfjVQxC3o\"\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/inZfjVQxC3o/maxresdefault.jpg\"\n             alt=\"YouTube Thumbnail\"><p>\n          <a href=\"https://www.youtube.com/watch?v=inZfjVQxC3o\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube Video</a>\n        </p></div>\n  </noscript>\n",
				
				"date_published": "2026-09-09T14:57:20-04:00",
				"url": "https://nic.babarskis.blog/2026/09/09/no-mans-sky-releasing-yet.html",
				"tags": ["YouTube ","Web Whimsy"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/09/08/the-digital-corner-of-evangelical.html",
				
				"content_html": "<p>The digital corner of evangelical Protestantism I occupy has been <a href=\"https://micro.bradeast.org/2026/08/28/this-is-disappointing-see-dereks.html\">contending with a prominent apologists Trinitarian theological errors</a> and how best to describe the Doctrine&rsquo;s essence, so far <a href=\"https://bethfelkerjones.substack.com/p/repost-if-jesus-is-god-how-do-we\">this has been my favorite primer on the topic.</a></p>\n",
				
				"date_published": "2026-09-08T07:24:52-04:00",
				"url": "https://nic.babarskis.blog/2026/09/08/the-digital-corner-of-evangelical.html",
				"tags": ["Faith"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/09/07/enjoying-the-late-summer-bloom.html",
				
				"content_html": "<p>📷 Enjoying the late summer bloom at the MSU Botanical Gardens.</p>\n<div class=\"microblog_collection\"><img src=\"https://cdn.uploads.micro.blog/188083/2026/fc3508f7-ccde-4858-814c-a2dd6868ab2d-m.jpg\" alt=\"A monarch butterfly is perched on a vibrant yellow flower in a garden filled with lush greenery and other blooming yellow flowers.\" data-microblog-lightbox=\"https://cdn.uploads.micro.blog/188083/2026/fc3508f7-ccde-4858-814c-a2dd6868ab2d-xl.jpg\"><img src=\"https://cdn.uploads.micro.blog/188083/2026/2d8f5239-94a4-4a20-8fd4-efcc00a816c2-m.jpg\" alt=\"A colorful flower bed with red, pink, and purple flowers curves alongside a well-maintained grassy area bordered by a sidewalk and trees.\" data-microblog-lightbox=\"https://cdn.uploads.micro.blog/188083/2026/2d8f5239-94a4-4a20-8fd4-efcc00a816c2-xl.jpg\"><img src=\"https://cdn.uploads.micro.blog/188083/2026/a0c82de1-c34e-42dc-98dc-8f8a01740a6a-m.jpg\" alt=\"A young child is walking along a curved garden path surrounded by colorful flowers and lush greenery under a partly cloudy blue sky.\" data-microblog-lightbox=\"https://cdn.uploads.micro.blog/188083/2026/a0c82de1-c34e-42dc-98dc-8f8a01740a6a-xl.jpg\"><img src=\"https://cdn.uploads.micro.blog/188083/2026/9e5c3981-22d8-4014-9d05-73a40c4ad5ff-m.jpg\" alt=\"Bright pink flowers are prominently in the foreground of a garden scene where children and an adult walk along a stone pathway surrounded by lush greenery and a decorative sheep statue.\" data-microblog-lightbox=\"https://cdn.uploads.micro.blog/188083/2026/9e5c3981-22d8-4014-9d05-73a40c4ad5ff-xl.jpg\"></div>\n",
				
				"date_published": "2026-09-07T18:07:44-04:00",
				"url": "https://nic.babarskis.blog/2026/09/07/enjoying-the-late-summer-bloom.html",
				"tags": ["family"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/09/05/maybe-there-are-technical-requirements.html",
				
				"content_html": "<p>Maybe there are technical requirements of which I am ignorant, but I find it so annoying that Treasury went this route of paying a private sector vendor for identity and login management when <a href=\"login.gov\">login.gov</a> exists.</p>\n<img src=\"https://nic.babarskis.blog/uploads/2026/temporaryimage.png\" width=\"364\" height=\"600\" alt=\"Screenshot of email announcing the U.S. Department of the Treasury is announcing that starting September 13, 2026, TreasuryDirect will implement a new login process using the secure identity verification provider ID.me.\">\n",
				
				"date_published": "2026-09-05T18:32:03-04:00",
				"url": "https://nic.babarskis.blog/2026/09/05/maybe-there-are-technical-requirements.html"
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/09/05/im-starting-to-see-more.html",
				
				"content_html": "<p>I’m starting to see more think pieces on my feeds about 9/11, public figures are posting <a href=\"https://thewayofimprovement.blog/2026/08/06/evangelical-roundup-for-august-6-2026/\">outright islamaphobia,</a> I just walked past the Phi Kappa Psi house and they’re hosting some sort of rush activity while blasting Drops of Jupiter by Train. I feel like I time tunneled into 2003.</p>\n",
				
				"date_published": "2026-09-05T12:51:58-04:00",
				"url": "https://nic.babarskis.blog/2026/09/05/im-starting-to-see-more.html"
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/09/05/daniel-kolitz-i-think-of.html",
				
				"content_html": "<p><a href=\"https://thebaffler.com/salvos/paid-phones-kolitz\">Daniel Kolitz:</a></p>\n<blockquote>\n<p>I think of a sentence I wrote dozens of variants of in the waning days of my content-writing career, which went something like: “These AI tools aren’t meant to supplant the work of humans—instead, by automating routine busywork, they will free your employees up for the kind of creative thinking that actually drives innovation.” Even then I must have known the truth: that your average call center, say, has no use for a customer service staff that sits around “innovating” for half the business day (what would they be innovating, precisely?); that any time saved for the business would translate directly into fewer working hours for its employees (and fewer assignments for me).</p>\n</blockquote>\n",
				
				"date_published": "2026-09-05T10:51:28-04:00",
				"url": "https://nic.babarskis.blog/2026/09/05/daniel-kolitz-i-think-of.html",
				"tags": ["Web Clippings"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/09/04/its-a-damp-and-gloomy.html",
				
				"content_html": "<p>It&rsquo;s a damp and gloomy September Friday, and sometimes that calls for suburban/Warped Tour style emo music that&rsquo;s so saccharine it could melt your teeth:</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=UjjO3Jggl5M\">YouTube Video</a>\n    </p><button type=\"button\"\n    class=\"video-wrapper\"\n    aria-label=\"Play YouTube video\"\n    data-video-id=\"UjjO3Jggl5M\"\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/UjjO3Jggl5M/maxresdefault.jpg\"\n             alt=\"YouTube Thumbnail\"><p>\n          <a href=\"https://www.youtube.com/watch?v=UjjO3Jggl5M\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube Video</a>\n        </p></div>\n  </noscript>\n",
				
				"date_published": "2026-09-04T11:28:46-04:00",
				"url": "https://nic.babarskis.blog/2026/09/04/its-a-damp-and-gloomy.html",
				"tags": ["YouTube ","Web Clippings"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/09/01/rip-wendell-berry-for-the.html",
				
				"content_html": "<p>RIP Wendell Berry:</p>\n<blockquote>\n<p>For the sake of goodness, how much\nevil are you willing to do?\nFill in the following blanks\nwith the names of your favorite\nevils and acts of hatred.</p>\n</blockquote>\n<blockquote class=\"quoteback\" data-author=\"Jason A. Heppler\" data-avatar=\"https://micro.blog/jaheppler/avatar.jpg\" cite=\"https://updates.jasonheppler.org/2026/09/01/berry-had-a-way-of/\"><p>Berry had a way of cutting through to the core.</p>\n<img src=\"https://cdn.uploads.micro.blog/2634/2026/4d0c1745-d298-4d69-a412-0d0232346810-m.jpg\" width=\"399\" height=\"600\" alt=\"\" loading=\"lazy\">\n<footer>Jason A. Heppler <cite><a href=\"https://updates.jasonheppler.org/2026/09/01/berry-had-a-way-of/\" class=\"u-in-reply-to\">https://updates.jasonheppler.org/2026/09/01/berry-had-a-way-of/</a></cite></footer></blockquote><script src=\"https://cdn.micro.blog/quoteback.js\"></script>\n",
				
				"date_published": "2026-09-01T09:54:26-04:00",
				"url": "https://nic.babarskis.blog/2026/09/01/rip-wendell-berry-for-the.html",
				"tags": ["Web Clippings","Public Domain"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/09/01/this-site-is-the-digital.html",
				
				"content_html": "<p>This site is the digital equivalent of the junk drawer in your kitchen. An assortment of random items, many of which happen to be incredibly useful in very specific circumstances:</p>\n<blockquote class=\"quoteback\" data-author=\"Jim Mitchell\" data-avatar=\"https://micro.blog/jimmitchell@indieweb.social/avatar.jpg\" cite=\"https://indieweb.social/@jimmitchell/117196056500898382\"><p>🔖 Bookmarked <a href=\"https://www.normaltools.com/\"><span class=\"invisible\">https://www.</span><span>normaltools.com/</span><span class=\"invisible\"></span></a></p><p>Open a tool, do the thing, leave. No account, no download, and nothing between you and the answer.</p><p>I somehow managed to stumble on to this site this morning. The dev related tools are pretty handy, but I especially liked the band name generator tool. I think I might give it a go when I form my punk band.</p><footer>Jim Mitchell <cite><a href=\"https://indieweb.social/@jimmitchell/117196056500898382\" class=\"u-in-reply-to\">https://indieweb.social/@jimmitchell/117196056500898382</a></cite></footer></blockquote><script src=\"https://cdn.micro.blog/quoteback.js\"></script>\n",
				
				"date_published": "2026-09-01T09:49:04-04:00",
				"url": "https://nic.babarskis.blog/2026/09/01/this-site-is-the-digital.html",
				"tags": ["Open Web","Web Clippings"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/08/31/engrossing-shortform-video-documentary-on.html",
				
				"content_html": "<p>Engrossing short-form video documentary on the Phoenix fire department&rsquo;s efforts to implement new heat related life-saving interventions:</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=QcHuAtK_H_8\">YouTube Video</a>\n    </p><button type=\"button\"\n    class=\"video-wrapper\"\n    aria-label=\"Play YouTube video\"\n    data-video-id=\"QcHuAtK_H_8\"\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/QcHuAtK_H_8/maxresdefault.jpg\"\n             alt=\"YouTube Thumbnail\"><p>\n          <a href=\"https://www.youtube.com/watch?v=QcHuAtK_H_8\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube Video</a>\n        </p></div>\n  </noscript>\n",
				
				"date_published": "2026-08-31T14:21:04-04:00",
				"url": "https://nic.babarskis.blog/2026/08/31/engrossing-shortform-video-documentary-on.html",
				"tags": ["YouTube ","Web Clippings"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/08/28/strong-towns-cities-routinely-respond.html",
				
				"content_html": "<p><a href=\"https://www.strongtowns.org/journal/2026-8-24-a-mayor-willing-to-tell-his-city-the-truth\">Strong Towns:</a></p>\n<blockquote>\n<p>Cities routinely respond to financial stress by pursuing growth even more aggressively. The logic is simple. More homes mean more taxpayers, while more commercial development expands the tax base. If the city is short of money, the obvious response is to grow faster.</p>\n<p>Westlund recognizes the flaw in that logic. When each new increment of development creates more long-term expense than it produces in revenue, more growth doesn&rsquo;t solve the financial problem. It makes the problem larger.</p>\n</blockquote>\n",
				
				"date_published": "2026-08-28T06:22:27-04:00",
				"url": "https://nic.babarskis.blog/2026/08/28/strong-towns-cities-routinely-respond.html",
				"tags": ["Web Clippings"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/08/27/mcsweeneys-updating-their-first-draft.html",
				
				"content_html": "<p>McSweeney&rsquo;s updating their first draft of history:</p>\n<blockquote class=\"bluesky-embed\" data-bluesky-uri=\"at://did:plc:wf24ok2liiyzb633fe34dsel/app.bsky.feed.post/3mu35l5beho27\" data-bluesky-cid=\"bafyreigciqgclzhipbzcmsttub7vejli5mnf3l6zjobxpvphkpqzupf7cq\" data-bluesky-embed-color-mode=\"system\"><p lang=\"\">We were stuck in line waiting for gas at a Freedom Fuel Station, so this installment is a little late. Apologies! Anyway, you add another 90 atrocities to the list. #LestWeForgetTheHorrors\nbuff.ly/V207e2L<br><br><a href=\"https://bsky.app/profile/did:plc:wf24ok2liiyzb633fe34dsel/post/3mu35l5beho27?ref_src=embed\">[image or embed]</a></p>&mdash; McSweeney&#x27;s (<a href=\"https://bsky.app/profile/did:plc:wf24ok2liiyzb633fe34dsel?ref_src=embed\">[@mcsweeneys.net](http://mcsweeneys.net)</a>) <a href=\"https://bsky.app/profile/did:plc:wf24ok2liiyzb633fe34dsel/post/3mu35l5beho27?ref_src=embed\">August 27, 2026 at 11:21 AM</a></blockquote><script async src=\"https://embed.bsky.app/static/embed.js\" charset=\"utf-8\"></script>\n",
				
				"date_published": "2026-08-27T16:03:31-04:00",
				"url": "https://nic.babarskis.blog/2026/08/27/mcsweeneys-updating-their-first-draft.html",
				"tags": ["Web Clippings"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/08/27/how-some-people-feel-about.html",
				
				"content_html": "<p>🍎🍏How some people feel about sports teams is how I feel about apple varieties in harvest season: <em><a href=\"https://www.wkar.org/wkar-news/2026-08-27/michigan-apple-growers-expect-strong-harvest-as-crop-arrives-early\">Michigan apple growers expect strong harvest as crop arrives early.</a></em></p>\n",
				
				"date_published": "2026-08-27T15:59:31-04:00",
				"url": "https://nic.babarskis.blog/2026/08/27/how-some-people-feel-about.html",
				"tags": ["Web Clippings"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/08/25/from-nyts-parton-obituary-empathy.html",
				
				"content_html": "<p><a href=\"https://www.nytimes.com/2026/08/25/arts/music/dolly-parton-dead.html?rsrc=flt&amp;unlocked_article_code=1.8FA.SzTS.ZbeLHX4k12Ic&amp;smid=url-share\">From NYT&rsquo;s Parton obituary:</a></p>\n<blockquote>\n<p>Empathy was a hallmark of Ms. Parton’s songwriting, perhaps nowhere so much as in “Down From Dover” and “Daddy Come Get Me,” harrowing Southern gothic ballads about teen pregnancy and how patriarchy blames and victimizes young women.</p>\n<p>Assertive women populated Ms. Parton’s songs, whether through her proto-feminist rewrite of Jimmie Rodgers’s “Mule Skinner Blues (Blue Yodel No. 8)” or by advocating parity in the bedroom (“Touch Your Woman”) and in the workplace (“9 to 5”)&hellip;</p>\n<p>“Writing’s just as natural to me as getting up and cooking breakfast,” she told The Times in 2002. “I ain’t never far away from a pencil and paper or a tape recorder. I write every day, even when I’m on a plane, in the tub or on the bus. It burns in me.”</p>\n</blockquote>\n",
				
				"date_published": "2026-08-25T15:40:16-04:00",
				"url": "https://nic.babarskis.blog/2026/08/25/from-nyts-parton-obituary-empathy.html",
				"tags": ["Web Clippings"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/08/24/seeing-msu-students-return-always.html",
				
				"content_html": "<p>Seeing MSU students return always gets me to think back on those early college days when you’re anxiously trying to find some shared activity you can do with others to find friends and a pretense to join lunch or dinner tables.</p>\n<img src=\"https://nic.babarskis.blog/uploads/2026/c8cbce8752.jpg\" width=\"450\" height=\"600\" alt=\"\">\n",
				
				"date_published": "2026-08-24T18:13:05-04:00",
				"url": "https://nic.babarskis.blog/2026/08/24/seeing-msu-students-return-always.html"
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/08/24/corwin-smidt-on-what-mindset.html",
				
				"content_html": "<p><a href=\"https://sites.google.com/msu.edu/corwinsmidt\">Corwin Smidt</a> on what <a href=\"https://www.wkar.org/election-2026/2026-08-18/why-polls-got-the-michigan-democratic-senate-primary-so-wrong\">mindset you should take into an election booth:</a></p>\n<blockquote>\n<p>If people are sitting there trying to be strategic with their vote, they&rsquo;re only going to be unhappy. The vote that makes you happy is the vote that you should make. Trying to be the smart voter is not the way to do things&hellip;.It benefits you more to know whether you&rsquo;re going to like the candidate.</p>\n</blockquote>\n",
				
				"date_published": "2026-08-24T11:04:15-04:00",
				"url": "https://nic.babarskis.blog/2026/08/24/corwin-smidt-on-what-mindset.html",
				"tags": ["Web Clippings"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/08/24/boosting-because-id-like-to.html",
				
				"content_html": "<p>Boosting because I&rsquo;d like to see this plugin become a reality!</p>\n<blockquote class=\"quoteback\" data-author=\"Lauren\" data-avatar=\"https://micro.blog/flotisserie/avatar.jpg\" cite=\"https://flotisserie.micro.blog/2026/08/24/microbloggers-im-interested-in-turning.html\"><p>Micro.bloggers: I’m <a href=\"https://help.micro.blog/t/link-log-proposal/4436\">interested in turning the link log into a micro.blog app</a>, but I don’t have the skill or the will to make it happen. Where should I begin?</p>\n<footer>Lauren <cite><a href=\"https://flotisserie.micro.blog/2026/08/24/microbloggers-im-interested-in-turning.html\" class=\"u-in-reply-to\">https://flotisserie.micro.blog/2026/08/24/microbloggers-im-interested-in-turning.html</a></cite></footer></blockquote><script src=\"https://cdn.micro.blog/quoteback.js\"></script>\n",
				
				"date_published": "2026-08-24T10:50:57-04:00",
				"url": "https://nic.babarskis.blog/2026/08/24/boosting-because-id-like-to.html",
				"tags": ["Open Web"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/08/23/today-marks-the-th-anniversary.html",
				
				"content_html": "<p>Today marks the 37th anniversary of <a href=\"https://en.wikipedia.org/wiki/Baltic_Way\">The Baltic Way</a> (or Baltic Chain) where 2 million people joined hands across 419 miles to appeal for their right to self-governance and to resist authoritarianism. Their movement ultimately succeeded. Resist <a href=\"https://en.wikipedia.org/wiki/Authoritarianism\">authoritarianism</a>.</p>\n<p><img src=\"https://upload.wikimedia.org/wikipedia/commons/1/11/Airplane_over_the_Baltic_Way.jpeg?utm_source=en.wikipedia.org&amp;utm_campaign=index&amp;utm_content=thumbnail_unscaled\" alt=\"A historic black-and-white photograph capturing the 1989 Baltic Way demonstration, showing a human chain of people holding hands along the shoulder of a highway. Overhead, a biplane flies low along the length of the road, while a person in the left foreground raises a hand to wave toward the aircraft. Evergreen forests and parked vehicles line the roadway in the background\"></p>\n",
				
				"date_published": "2026-08-23T09:44:55-04:00",
				"url": "https://nic.babarskis.blog/2026/08/23/today-marks-the-th-anniversary.html",
				"tags": ["Web Clippings","Public Domain"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/08/20/featured-recently-on-the-library.html",
				
				"content_html": "<p>Featured recently on the Library of Congress&rsquo;s Headlines &amp; Heros blog: <a href=\"https://blogs.loc.gov/headlinesandheroes/2026/07/the-journalist-devoted-to-newspapers-authors-artists-and-publishers/\">The Journalist.</a> <a href=\"http://onthemedia.bsky.social\">@onthemedia.bsky.social</a> before podcasting or public radio.</p>\n<img src=\"https://nic.babarskis.blog/uploads/2026/firstissue.png\" width=\"600\" height=\"570\" alt=\"The front page of the inaugural issue of The Journalist newspaper, dated March 22, 1884, in New York, priced at Ten Cents. The ornate masthead features bold decorative typography at the top. Below, three columns of printed text frame a central engraved portrait of a man with a mustache, identified by a cursive signature underneath as Amos J. Cummings. The lead article on the left is titled A CASE OF PRESUMPTION.\">\n",
				
				"date_published": "2026-08-20T10:15:25-04:00",
				"url": "https://nic.babarskis.blog/2026/08/20/featured-recently-on-the-library.html",
				"tags": ["Web Clippings","Public Domain"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/08/19/i-consider-zettlrfosstodonorg-the-zotero.html",
				
				"content_html": "<p>I consider <a href=\"https://micro.blog/zettlr@fosstodon.org\">@zettlr@fosstodon.org</a> the &lsquo;Zotero&rsquo; of word processors. They use a Markdown approach in combination with Pandoc/LaTeX for document exporting. Comparable to Obsidian but optimized for academic writing. Integrates with <a href=\"https://micro.blog/zotero@fosstodon.org\">@zotero@fosstodon.org</a>. Check em out!</p>\n<blockquote class=\"quoteback\" data-author=\"Zettlr\" data-avatar=\"https://micro.blog/zettlr@fosstodon.org/avatar.jpg\" cite=\"https://fosstodon.org/@zettlr/117123288273197144\"><p>+++ ANNOUNCEMENT +++</p><p>We have just launched a complete overhaul over Zettlr’s aging documentation. It is now based on Vue, much faster, more efficient, and just in general a better experience.</p><p>Do you like the new design?</p><p>Learn more and share your thoughts on our blog: <a href=\"https://zettlr.com/post/a-new-documentation-for-zettlr\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">zettlr.com/post/a-new-document</span><span class=\"invisible\">ation-for-zettlr</span></a></p><footer>Zettlr <cite><a href=\"https://fosstodon.org/@zettlr/117123288273197144\" class=\"u-in-reply-to\">https://fosstodon.org/@zettlr/117123288273197144</a></cite></footer></blockquote><script src=\"https://cdn.micro.blog/quoteback.js\"></script>\n",
				
				"date_published": "2026-08-19T16:57:45-04:00",
				"url": "https://nic.babarskis.blog/2026/08/19/i-consider-zettlrfosstodonorg-the-zotero.html",
				"tags": ["Open Web","Research Clippings"]
			},
			{
				"id": "http://thebigbabooski.micro.blog/2026/08/18/the-michigan-secretary-of-states.html",
				
				"content_html": "<p><a href=\"https://www.newsblur.com/newsletters/story/10296204:e074ec\">The Michigan Secretary of State&rsquo;s Office has released the &lsquo;I voted&rsquo; sticker contest winners for the November 2026 election.</a> Delightful.</p>\n",
				
				"date_published": "2026-08-18T13:12:05-04:00",
				"url": "https://nic.babarskis.blog/2026/08/18/the-michigan-secretary-of-states.html",
				"tags": ["Web Clippings","Web Whimsy"]
			}
	]
}
