<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Coding on The Thumbs Up Blog</title><link>https://thumbsup.me/tags/coding/</link><description>Recent content in Coding on The Thumbs Up Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 06 Mar 2026 12:00:00 +0000</lastBuildDate><atom:link href="https://thumbsup.me/tags/coding/index.xml" rel="self" type="application/rss+xml"/><item><title>I built custom social cards for my blog</title><link>https://thumbsup.me/posts/building-custom-social-post-embed-cards/</link><pubDate>Fri, 06 Mar 2026 12:00:00 +0000</pubDate><guid>https://thumbsup.me/posts/building-custom-social-post-embed-cards/</guid><description>&lt;p&gt;Hey friends 👋&lt;/p&gt;
&lt;p&gt;One of the coolest things about this new blog project is that I feel like I’m in control and can make it look and act however I want. I’ve blogged, microblogged, and written newsletters on a lot of different platforms over the years, and that has meant having to accept a variety of different limitations.&lt;/p&gt;
&lt;p&gt;One thing that no platform does well, in my opinion, is social post embed cards. For years, Twitter was the only card you would find. Later, Mastodon became a bit more common, and more recently Bluesky. Most platforms support one, maybe two of these natively. But few support all of the ones I use. For example, almost no platform supports embedding posts from Farcaster, where I feel like some of my best posts can be found.&lt;/p&gt;</description><content:encoded>
<![CDATA[<p>Hey friends 👋</p>
<p>One of the coolest things about this new blog project is that I feel like I’m in control and can make it look and act however I want. I’ve blogged, microblogged, and written newsletters on a lot of different platforms over the years, and that has meant having to accept a variety of different limitations.</p>
<p>One thing that no platform does well, in my opinion, is social post embed cards. For years, Twitter was the only card you would find. Later, Mastodon became a bit more common, and more recently Bluesky. Most platforms support one, maybe two of these natively. But few support all of the ones I use. For example, almost no platform supports embedding posts from Farcaster, where I feel like some of my best posts can be found.</p>
<p>What’s more, even if its possible to embed a platform’s official embed cards, they often have their own styling that doesn&rsquo;t match my theme. It&rsquo;s a nitpick, sure, but it&rsquo;s something I care about.</p>
<p>Something you might care about are the privacy implications of embedded post cards. You see, because the post&rsquo;s data is fetched and served to readers on page load, they can leak IP addresses, geolocation data, device information, and more. They may even contain tracking pixels, cookies, and scripts that feed the surveillance capital machine.</p>
<h2 id="why-not-just-use-screenshots">Why not just use screenshots?</h2>
<p>Honestly, screenshots are a solid option. They capture a post at a specific moment in time, which means that even if the post is altered later, you still have evidence of what was once written. This is certainly preferable for journalistic endeavours.</p>
<p>I have used screenshots many times over the years, but here’s my issue with them: they&rsquo;re inelegant. Screenshots are great for evidence, bug reports, or tutorials. They are not ideal for engaging your reader or encouraging them to visit your other content on platforms external to your blog.</p>
<p>That’s what social cards are: an invitation for people to discover your microblogging content in its natural context and, hopefully, to follow you on that platform.</p>
<h2 id="so-i-built-my-own">So I built my own</h2>
<p>Like most of what you see on this site, these custom cards are a combination of my intermediate knowledge of HTML and CSS, my unrelenting design vision, and a long evening with Claude and a bottle of red wine.</p>


    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #eed49f;border-radius:0 8px 8px 0;background:#2a2518;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Warning</p>
        <p>If you have an issue with AI-assisted coding, that&rsquo;s fine, but it won&rsquo;t change that Claude was used to make these. I clearly marked the GitHub repo and you&rsquo;re welcome to not use them, or even to make your own version. If they&rsquo;re better, I&rsquo;ll switch to yours and recommend them on the blog even!</p>
    </blockquote><p>When I build things for this site, I will make what I can open source so that anyone who wants to repurpose those things for their own needs can do so. Just keep in mind that I&rsquo;m building things to be used with <a href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo</a> so you will probably have to make tweaks to get it to work on Astro or other static site builders.</p>
<h2 id="features">Features</h2>
<p>My custom cards feature:</p>
<ul>
<li>Subtle <strong>hover animations</strong> inspired by the official Bluesky embed cards</li>
<li>Working <strong>links in posts</strong></li>
<li><strong>Link embed cards</strong> (rendered at build)</li>
<li>Image support (with <strong>lightbox</strong> for viewing embedded images)</li>
<li><strong>Carousels</strong> for multi-image, multi-link, or mixed posts</li>
<li><strong>Timestamps</strong> for posts which can be shown in the reader&rsquo;s local timezone.</li>
</ul>
<p>Omitted, intentionally from my cards are:</p>
<ul>
<li><strong>Interactions</strong>: these would pose potential tracking risks if functional, or would be inaccurate to the point of serving no real function, if rendered at build</li>
<li><strong>Hashtag clusters</strong> can help your post be seen, but they can be quite ugly. My custom cards render hashtags only when they are in the body text. Clusters are hidden. This may cause some posts to render weirdly, if for example every other word in the post&rsquo;s text is a hashtag. The fix is simple though: don&rsquo;t write your posts that way.</li>
<li>Videos (both embeds and video files): these cards cache post images at build time. Doing this with video would be a waste of space and would slow down the site. Depending on the browser, they might not even work. Embedded YouTube, Vimeo etc, would pose the same tracking issue as interactions, so they just render standard link cards.</li>
</ul>
<h2 id="examples">Examples</h2>
<p>Without further ado, here are some posts rendered for demonstration purposes. The particular content is not intended to be relevant to this post or to sway you to follow me on these platforms—though you&rsquo;re certainly welcome to.</p>
<p>Here is an example of a Bluesky post, aka <em>skeet</em>, featuring a link card and text link.</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 12px;">
      <img src="/bafkreibgh5plexjezogpjq57pio2sak7j3wh4vochlvqe2rgrstcllkt3a_9238490725036088118_hu_b4d32d4817ee037.webp" style="width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0; object-fit: cover;" />
      <div style="display: flex; flex-direction: column; line-height: 1.2;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem;">pckt.blog</span>
        <span style="color: var(--color-neso-fg3); font-size: 0.9rem;">@pckt.blog</span>
      </div>
    </div>
    <a href="https://bsky.app/profile/pckt.blog/post/3mg4kf7sskk2c" target="_blank" style="color: #0085ff; align-self: flex-start; margin-top: 2px; transition: transform 0.2s ease-in-out; display: flex; flex-shrink: 0;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 48 48" fill="currentColor" style="display: block;"><path d="M10.971 6.76c5.274 4.008 10.947 12.134 13.03 16.495 2.082-4.36 7.754-12.487 13.028-16.495C40.834 3.868 47 1.63 47 8.75c0 1.422-.805 11.946-1.278 13.654-1.642 5.94-7.625 7.455-12.947 6.538 9.303 1.603 11.67 6.912 6.559 12.221-9.707 10.083-13.952-2.53-15.04-5.761-.2-.593-.293-.87-.294-.634-.001-.236-.095.041-.294.634-1.088 3.231-5.332 15.845-15.04 5.761-5.11-5.309-2.744-10.618 6.56-12.22-5.323.916-11.307-.599-12.948-6.539C1.805 20.697 1 10.172 1 8.75c0-7.12 6.166-4.882 9.97-1.99h.001Z"/></svg>
    </a>
  </div>

  <div style="font-size: 1.05rem; line-height: 1.5; margin-bottom: 12px; color: var(--color-neso-fg1);">tell your friends about <a href="https://pckt.blog" target="_blank" rel="noopener noreferrer" style="color:#0085ff;text-decoration:none;">pckt.blog</a> 😌
  </div><a href="https://pckt.blog" target="_blank" rel="noopener noreferrer" style="display: block; margin-top: 8px; margin-bottom: 16px; border: 1px solid var(--color-neso-deco2); border-radius: 10px; overflow: hidden; text-decoration: none; color: inherit;"><img src="https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:revjuqmkvrw6fnkxppqtszpv/bafkreid5m6mgdc5xe25ov7ke474kesshz2sre5m2g6ba43mjm2wm5opguy" alt="pckt.blog" style="width: 100%; height: 180px; object-fit: cover; display: block; margin: 0 !important;"><div style="padding: 10px 14px;">
      <div style="font-weight: 600; font-size: 0.95rem; color: var(--color-neso-fg1); margin-bottom: 3px;">pckt.blog</div><div style="font-size: 0.85rem; color: var(--color-neso-fg3); margin-bottom: 4px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;">A distraction-free space to write and share your story. Just you, and your words.</div><div style="font-size: 0.8rem; color: var(--color-neso-fg3);">pckt.blog</div>
    </div>
  </a><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2026-03-03T00:50:18Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Mar 3, 2026 at 12:50 AM UTC</time>
    <a href="https://bsky.app/profile/pckt.blog/post/3mg4kf7sskk2c" target="_blank" style="color: #0085ff; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#33a1ff'" onmouseout="this.style.color='#0085ff'">View on Bluesky</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>

<p>Here is a Mastodon post, aka <em>toot</em>,  from my web friend elle. This post features both an image and truncated text link.</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 12px;">
      <img src="/54d91f4e135ca096_31224995573741215_hu_81a096866cc15bf0.webp" style="width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0; object-fit: cover;" />
      <div style="display: flex; flex-direction: column; line-height: 1.2;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem;">elle</span>
        <span style="color: var(--color-neso-fg3); font-size: 0.9rem;">@e11e@mastodon.social</span>
      </div>
    </div>
    <a href="https://mastodon.online/@e11e@mastodon.social/115425817496799926" target="_blank" style="color: #6364ff; align-self: flex-start; margin-top: 2px; transition: transform 0.2s ease-in-out; display: flex; flex-shrink: 0;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 79 75" fill="currentColor" style="display: block;"><path d="M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z"/></svg>
    </a>
  </div><div style="font-size: 1.05rem; line-height: 1.6; margin-bottom: 12px; color: var(--color-neso-fg1);">
    <p style="margin:0 0 0.9em 0;">with the way things are going, my next computer is going to have to be a cyberdeck made from random parts i pick up in a huaqiangbei e-market (⌒_⌒;)</p><p style="margin:0 0 0.9em 0;">wrote a new blog about my linux adventures, building a computer, and homepage updates lately: <a style="text-decoration:none;" href="https://ellesho.me/page/website/now/#serial-experiments" rel="nofollow noopener" translate="no" target="_blank">ellesho.me/page/website/now/#s…</a></p>
  </div><div style="display: flex; gap: 8px; margin-top: 8px; margin-bottom: 12px; overflow: hidden;"><img src="/9dda2a87c9095581_7000177280922803335_hu_139bd7ab5a3435db.webp" alt="elle&#39;s linux setup running on a pi 4 and ipad mini" onclick="window.__scLb&&window.__scLb(this.src)" style="flex: 1 1 0%; min-width: 0; border-radius: 8px; display: block; margin: 0 !important; cursor: pointer; height: auto; width: 100%;" loading="lazy"></div><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2025-10-23T22:23:18Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Oct 23, 2025 at 10:23 PM UTC</time>
    <a href="https://mastodon.online/@e11e@mastodon.social/115425817496799926" target="_blank" style="color: #6364ff; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#8A8BFF'" onmouseout="this.style.color='#6364ff'">View on Mastodon</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>

<p>Here is an example of a Farcaster post, aka <em>cast</em>, which features two images. Posts with two images crop them to fill two equal spaces. Posts with more than two render as a carousel of images.</p>
<p>Try clicking an image to see it in a lightbox preview!</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 10px; min-width: 0;">
      <img src="/original_10245280551282026412_hu_81f4ab19ec4e089a.webp" style="width: 40px; height: 40px; border-radius: 50%; flex-shrink: 0; object-fit: cover; margin: 0 !important;" />
      <div style="display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem; white-space: nowrap;">Thumbs Up</span><span style="color: var(--color-neso-fg3); font-size: 0.85rem;">in</span>
        <span style="display: inline-flex; align-items: center; gap: 4px; background: var(--color-neso-deco3); border-radius: 999px; padding: 2px 8px 2px 4px; font-size: 0.85rem; font-weight: 600; color: var(--color-neso-fg2); white-space: nowrap;"><img src="/pDxhPYZ_14998524118284003293_hu_8a13167fef0bc034.webp" style="width: 16px; height: 16px; border-radius: 50%; object-fit: cover; flex-shrink: 0; margin: 0 !important;" />Bluesky</span></div>
    </div>
    <a href="https://farcaster.xyz/thumbsup.eth/0x385d912a" target="_blank" style="color: #6A3CFF; align-self: flex-start; margin-top: 2px; transition: transform 0.2s; display: flex; flex-shrink: 0; width: 28px; height: 28px;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 200 175" fill="currentColor" xmlns="http://www.w3.org/2000/svg" style="display: block; margin: 0 !important;"><path d="M200 0V23.6302H176.288V47.2404H183.553V47.2483H200V175H160.281L160.256 174.883L139.989 79.3143C138.057 70.2043 133 61.9616 125.751 56.0995C118.502 50.2376 109.371 47.0108 100.041 47.0108H99.9613C90.631 47.0108 81.5 50.2376 74.251 56.0995C67.0023 61.9616 61.9453 70.2073 60.013 79.3143L39.7223 175H0V47.2453H16.4475V47.2404H23.7114V23.6302H0V0H200Z"/></svg>
    </a>
  </div>

  <div style="font-size: 1.05rem; line-height: 1.5; margin-bottom: 12px; color: var(--color-neso-fg1);">My blog is officially syndicating to ATproto thanks to the standard.site lexicon. This is a blog hosted on a regular old server in Iceland, not on a PDS, and not on leaflet or pckt's own CMS. <br><br>These links just take you to my site unfortunatley, they dont create an RSS reader like experience, but it's still awesome!
  </div><div style="display: flex; gap: 8px; margin-top: 8px; margin-bottom: 16px; overflow: hidden;"><img src="/original_16303224617586663852_hu_1af686fa55947296.webp" onclick="window.__scLb&&window.__scLb(this.src)" style="flex: 1 1 0%; min-width: 0; border-radius: 8px; display: block; margin: 0 !important; cursor: pointer; height: 250px; object-fit: cover;" loading="lazy"><img src="/original_11274760543635195863_hu_439f6a89488f69e0.webp" onclick="window.__scLb&&window.__scLb(this.src)" style="flex: 1 1 0%; min-width: 0; border-radius: 8px; display: block; margin: 0 !important; cursor: pointer; height: 250px; object-fit: cover;" loading="lazy"></div><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2026-03-01T20:59:10Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Mar 1, 2026 at 8:59 PM UTC</time>
    <a href="https://farcaster.xyz/thumbsup.eth/0x385d912a" target="_blank" style="color: #6A3CFF; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#8C66FF'" onmouseout="this.style.color='#6A3CFF'">View on Farcaster</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>
<h2 id="thoughts">Thoughts?</h2>
<p>I think they look great. And what’s cool is that, if you hit that theme toggle at the top of the page, you’ll see how they can be completely re-themed with just plain old CSS. That means you can make them look right at home wherever you use them.</p>
<p>Speaking of which, you can check out the code for these custom cards, review, clone, fork, etc at <a href="https://github.com/thumbsupdotme/social-cards" target="_blank" rel="noopener noreferrer">this GitHub repo</a>. This is my first time using GitHub or any of these platforms, so be kind if I&rsquo;ve made any newbie mistakes. And again, as indicated on the repo itself, this code is &ldquo;co-authored by Claude.&rdquo;</p>
<p>These cards are a perfect example what I want to do with this new website: make my own custom, privacy-preserving, modular components and then give them, and my writing, away for free to whoever wants it.</p>
<p>If that sounds like your kind of thing, subscribe to the RSS feed, follow me on socials, and come back every once in a while for a visit. And if you want to help beta-test another of my custom components, you could try out the tip buttons at the bottom of this post 💚</p>
]]></content:encoded></item></channel></rss>