<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="https://andrew.marcuse.info/">
    <script src="https://www.rss.style/js/rss-style.js" xmlns="http://www.w3.org/1999/xhtml"></script>
    <channel>
        <atom:link href="https://andrew.marcuse.info/blog/rss.xml" rel="self" type="application/rss+xml" />
        <copyright>Copyright © 2025 by Andrew Marcuse<!-- COPYRIGHTYEAR --></copyright>
        <description>Andrew Marcuse's Blog</description>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>Jekyll (unknown)</generator>
        <image>
            <link>https://andrew.marcuse.info/blog/</link>
            <title>Andrew Marcuse</title>
            <url>https://andrew.marcuse.info/favicon.png</url>
        </image>
        <language>en</language>
        <lastBuildDate>Thu, 05 Feb 2026 23:51:58 +0000</lastBuildDate>
        <link>https://andrew.marcuse.info/blog/</link>
        <managingEditor>fileformat@gmail.com (Andrew Marcuse)</managingEditor>
        <pubDate>Thu, 05 Feb 2026 23:51:58 +0000</pubDate>
        <title>Andrew Marcuse</title>
        <ttl>1440</ttl>
        <webMaster>fileformat@gmail.com (Andrew Marcuse)</webMaster>
        <item>
            <guid>https://andrew.marcuse.info/blog/2026/2026-01-04-rss-style-using-javascript.html</guid>
            <link>https://andrew.marcuse.info/blog/2026/2026-01-04-rss-style-using-javascript.html</link>
            <pubDate>Sun, 04 Jan 2026 00:00:00 -0600</pubDate>
            <title>RSS.Style switched from XSLT to Javascript</title>
            <description><![CDATA[<p>I originally wrote <a href="https://www.rss.style/">RSS.Style</a> using XSLT, but Google, as the malevolent friend of the open web, is deprecating XSLT (<a href="https://news.ycombinator.com/item?id=45954560">flamewar on Hacker News</a>).  So I switched to JavaScript, which (as far as I can tell) works everywhere.</p>

<p>It is pretty easy to add: just a single line to the XML of your RSS/Atom feed: you don’t need to host the script (though you can if you want to: it is MIT licensed).</p>

<p>I feel that RSS and Atom are being held back by the poor (or non-existant) user experience for new users.  Try to put yourself in a new user’s place:</p>

<ul>
  <li>You are reading an interesting blog post, and want to read more from that author.</li>
  <li>You see an orange icon next to a “follow” or “subscribe” link.  That sounds promising!</li>
  <li>You click it.</li>
  <li>You get a wall of XML text.  Or worse: a “Save As” dialog!</li>
  <li>You have no idea what to do next.</li>
  <li>You give up and move on to the next cat video.</li>
</ul>

<p>Or even worse:</p>

<ul>
  <li>You are reading an interesting blog post, and want to read more from that author.</li>
  <li>You don’t see any “follow” or “subscribe” links.</li>
  <li>You look for Facebook/LinkedIn/etc links, and try to follow them there.</li>
  <li>So much for the open web.</li>
</ul>

<p>For some reason, technical people just don’t seem to get this.  RSS and Atom are not just for technical people.  They are for everyone.  So the user experience needs to be simple and easy to understand.</p>
]]></description>
        </item>
        <item>
            <guid>https://andrew.marcuse.info/blog/2025/2025-11-28-tabulator.html</guid>
            <link>https://andrew.marcuse.info/blog/2025/2025-11-28-tabulator.html</link>
            <pubDate>Fri, 28 Nov 2025 00:00:00 -0600</pubDate>
            <title>Tabulator Rave</title>
            <description><![CDATA[<p>I used the <a href="https://tabulator.info/">Tabulator</a> JavaScript library for a recent project at work, and was blown away by how flexible and easy to use it is.</p>

<p>I ended up cranking out a whole bunch of sites using it:</p>

<ul>
  <li><a href="https://www.unicodesearch.org/">UnicodeSearch.org</a> - the complete Unicode character database (over 150,000 characters) with instant filtering and searching.</li>
  <li><a href="https://www.emojisearch.org/">EmojiSearch.org</a> - the complete list of emoji (over 5,000 when you include variations) with both native Emoji and preview images.</li>
  <li><a href="https://iso-3166-1.fileformat.info/">ISO-3166-1</a> - the standard list of countries.</li>
  <li><a href="https://iso-3166-2.fileformat.info/">ISO-3166-2</a> - the standard list of country subdivisions.</li>
  <li><a href="https://iso-4217.fileformat.info/">ISO-4217</a> - the standard list of currencies.</li>
  <li><a href="https://iso-639-2.fileformat.info/">ISO-639-2</a> - the standard list of languages.</li>
  <li><a href="https://iso-639-3.fileformat.info/">ISO-639-3</a> - the extended list of languages.</li>
</ul>

<p>I did have Github Copilot going, but it mostly helped with boilerplate.</p>
]]></description>
        </item>
        <item>
            <guid>https://andrew.marcuse.info/blog/2025/2025-06-10-luhn-calculator.html</guid>
            <link>https://andrew.marcuse.info/blog/2025/2025-06-10-luhn-calculator.html</link>
            <pubDate>Tue, 10 Jun 2025 00:00:00 -0600</pubDate>
            <title>Luhn Calculator</title>
            <description><![CDATA[<p>I recently started work at a company(<a href="https://www.fiserv.com/">Fiserv</a>) that has quarterly Hack Weeks where you can work on anything you want.  I wanted to brush up on my front-end skills, so I made a <a href="https://luhn.fiserv.com/">Luhn Calculator</a> to calculate numbers which pass a <a href="https://en.wikipedia.org/wiki/Luhn_algorithm">Luhn algorithm</a> check.  Very useful if you need a random credit card number for testing!</p>

<p class="pt-3 d-flex justify-content-center w-100">
	<a href="https://luhn.fiserv.com/"><img alt="Screenshot of the Luhn Calculator" class="border border-1 border-secondary border-opacity-50" src="/images/blog/luhn-calculator.png" /></a>
</p>
]]></description>
        </item>
        <item>
            <guid>https://andrew.marcuse.info/blog/2025/2025-03-22-feed-analyzer.html</guid>
            <link>https://andrew.marcuse.info/blog/2025/2025-03-22-feed-analyzer.html</link>
            <pubDate>Sat, 22 Mar 2025 00:00:00 -0600</pubDate>
            <title>RSS/Atom Feed Analyzer</title>
            <description><![CDATA[<p>While working on <a href="https://www.rss.style/">RSS Style</a>, I discovered that a lot of RSS/Atom feeds in the wild are <i>(cough)</i> sub-optimal.</p>

<p>The W3C has a <a href="https://validator.w3.org/feed/">Feed Validation Service</a>, but it only looks at the feed itself, not at the linked pages.  And a lot of the problems that it finds are about things in the content which can mask more serious errors.</p>

<p>Anyhow, give it a try at <a href="https://www.rss.style/feed-analyzer.html">https://www.rss.style/feed-analyzer.html</a>.</p>

<p>RSS.Style has a <a href="https://www.rss.style/#examples">list of high-profile feeds</a> that you can try (and feel better about having problems in your own feed).</p>
]]></description>
        </item>
        <item>
            <guid>https://andrew.marcuse.info/blog/2025/2025-02-16-sitemap-viewer.html</guid>
            <link>https://andrew.marcuse.info/blog/2025/2025-02-16-sitemap-viewer.html</link>
            <pubDate>Sun, 16 Feb 2025 00:00:00 -0600</pubDate>
            <title>Sitemap.xml Viewer</title>
            <description><![CDATA[<p>I am thinking of using <a href="https://mui.com/material-ui/">Material UI</a> for a future project and wanted to try it out in an actual project, so I built a
sitemap viewer that reads a <code class="language-plaintext highlighter-rouge">sitemap.xml</code> file (and any linked files) and displays them in an outline.</p>

<p>It works pretty well (IMHO) as long as you have paid attention to your URLs when you built your website.</p>

<p>Links:</p>
<ul>
  <li><a href="https://sitemap-viewer.fileformat.info/">Sitemap.xml Viewer</a> - the viewer!</li>
  <li><a href="https://www.sitemap.style/">Sitemap.style</a> - instructions for how to integrate it into your website: just download a file and add a single line to the XML.</li>
  <li><a href="https://www.sitemap.style/viewer-integration">Viewer parameters</a> - to customize the viewer’s sorting and toolbar.</li>
  <li><a href="https://resolve.rs/sitemap.xml">Demo</a> - a live demonstration at one of my other side projects.</li>
  <li><a href="https://github.com/FileFormatInfo/sitemap-viewer?tab=readme-ov-file#credits">Source</a> - the source code including a list of all the tools I used.</li>
</ul>
]]></description>
        </item>
        <item>
            <guid>https://andrew.marcuse.info/blog/2025/2025-02-01-docker-image-sizes.html</guid>
            <link>https://andrew.marcuse.info/blog/2025/2025-02-01-docker-image-sizes.html</link>
            <pubDate>Sat, 01 Feb 2025 00:00:00 -0600</pubDate>
            <title>Docker image sizes</title>
            <description><![CDATA[<p>As part of <a href="https://www.regexplanet.com/">RegexPlanet</a>, I have implemented the same basic functionality (a straightforward <a href="https://github.com/regexplanet/regexplanet-next/blob/main/CONTRIBUTING.md#backend-api">JSON API</a>) with multiple technologies.  I originally did them where-ever was easiest, but have been migrating them all to run in Docker, and it is interesting to compare the size of the Docker images.</p>

<table class="table table-striped table-bordered">
	<thead>
		<tr>
			<th>Technology</th>
			<th class="text-center">Image Size</th>
			<th>Notes</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-bun/blob/main/Dockerfile">Bun</a></td>
			<td class="text-center">113 MB</td>
			<td>bun's own distroless image</td>
		</tr>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-deno/blob/main/Dockerfile">Deno</a></td>
			<td class="text-center">111 MB</td>
			<td>distroless/cc with a static binary</td>
		</tr>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-go/blob/main/Dockerfile">Go</a></td>
			<td class="text-center">&ensp;&ensp;9 MB</td>
			<td>scratch</td>
		</tr>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-java/blob/main/Dockerfile">Java</a></td>
			<td class="text-center">212 MB</td>
			<td>distroless/java21-debian12 <i><span class="text-body-secondary">(updated 2024-04-03)</span></i></td>
		</tr>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-dotnet/blob/main/Dockerfile">.Net</a></td>
			<td class="text-center">178 MB</td>
			<td>chiseled-extra</td>
		</tr>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-nodejs/blob/main/Dockerfile">Node.js</a></td>
			<td class="text-center">152 MB</td>
			<td>distroless/nodejs22-debian12</td>
		</tr>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-perl/blob/main/Dockerfile">Perl</a></td>
			<td class="text-center">233 MB</td>
			<td>debian-slim + Apache (it runs via CGI)</td>
		</tr>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-php/blob/main/Dockerfile">PHP</a></td>
			<td class="text-center">&ensp;51 MB</td>
			<td>chainguard/php (running the built-in PHP webserver which isn't recommended)</td>
		</tr>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-python3/blob/main/Dockerfile">Python</a></td>
			<td class="text-center">&ensp;60 MB</td>
			<td>distroless/python3-debian12</td>
		</tr>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-ruby/blob/main/Dockerfile">Ruby</a></td>
			<td class="text-center">124 MB</td>
			<td>chainguard/ruby</td>
		</tr>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-rust/blob/main/Dockerfile">Rust</a></td>
			<td class="text-center">&ensp;&ensp;5 MB</td>
			<td>scratch</td>
		</tr>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-swift/blob/main/Dockerfile">Swift</a></td>
			<td class="text-center">271 MB</td>
			<td>ubuntu-noble (standard Vapor Dockerfile)</td>
		</tr>
		<tr>
			<td><a href="https://github.com/regexplanet/regexplanet-tcl/blob/main/Dockerfile">tcl</a></td>
			<td class="text-center">211 MB</td>
			<td>debian-slim + Apache (it runs via CGI)</td>
		</tr>
	</tbody>
</table>

<p>Images were all built with Docker v24.0.7 for amd64.</p>
]]></description>
        </item>
        <item>
            <guid>https://andrew.marcuse.info/blog/2024/2024-12-11-logo-apis.html</guid>
            <link>https://andrew.marcuse.info/blog/2024/2024-12-11-logo-apis.html</link>
            <pubDate>Wed, 11 Dec 2024 00:00:00 -0600</pubDate>
            <title>Comparison of Logo APIs</title>
            <description><![CDATA[<p>This is a review of available logo APIs.  The focus is on getting an icon (aka logomark) for displaying next to the text company name.</p>

<p>It does not include sites that just have a lot of logos to look at, such as all the <a href="https://logosear.ch/sources/index.html">websites indexed by LogoSear.ch</a>.</p>

<p>I also made a <a href="https://resolve.rs/info/logo-api-comparison.html">logo API comparison page</a> for the ones with free tiers.</p>

<h2 id="abstractapi">AbstractAPI</h2>

<ul>
  <li><a href="https://www.abstractapi.com/api/company-enrichment">https://www.abstractapi.com/api/company-enrichment</a></li>
  <li>Lookup by domain</li>
  <li>No public pricing</li>
</ul>

<h2 id="api-ninjas">API Ninjas</h2>

<ul>
  <li><a href="https://api-ninjas.com/api/logo">https://api-ninjas.com/api/logo</a></li>
  <li>Lookup by name or ticker</li>
  <li>Paid: $238/year for 200K/month</li>
</ul>

<h2 id="benzinga">Benzinga</h2>

<ul>
  <li><a href="https://www.benzinga.com/apis/cloud-product/company-logo-api/">https://www.benzinga.com/apis/cloud-product/company-logo-api/</a></li>
  <li>Lookup by ticker</li>
  <li>Several variations of the logo, including vector and light/dark (but docs say only PNG)</li>
  <li>No public pricing for the API.  <a href="https://www.benzinga.com/pro/pricing">Pro pricing</a> is $37/month, but that’s looks like something different.</li>
</ul>

<h2 id="bigpicture">BigPicture</h2>

<ul>
  <li><a href="https://docs.bigpicture.io/api/#company-api">https://docs.bigpicture.io/api/#company-api</a></li>
  <li>Lookup by domain</li>
  <li>Blog is dead (Cloudfront 502 error)</li>
  <li>Free: 1K lookups (total)</li>
  <li>Paid: contact sales</li>
</ul>

<h2 id="branddev">Brand.dev</h2>

<ul>
  <li><a href="https://brand.dev/">https://brand.dev/</a></li>
  <li>Lookup by domain</li>
  <li>Also has lookup by “Transaction Identifier”, but no details</li>
  <li>Also returns brand colors</li>
  <li>Free: 100 API calls/month</li>
  <li>Paid: starts at $348/year for 1000 calls</li>
</ul>

<h2 id="brandfetch">BrandFetch</h2>

<ul>
  <li><a href="https://brandfetch.com/developers">https://brandfetch.com/developers</a></li>
  <li>Also: extra level with more data, colors</li>
  <li>Also: transaction enrichment API (call for pricing)</li>
  <li>Images in webp (although some mentions of SVG)</li>
  <li>Free: no attribution, 1M/month</li>
  <li>Paid: $1200/year for 2.5K/month</li>
</ul>

<h2 id="brandkey">Brandkey</h2>

<ul>
  <li><a href="https://brandkey.io/">https://brandkey.io/</a></li>
  <li>Lookup by domain</li>
  <li>Includes colors, “metadata”</li>
  <li>Free: 25/month</li>
  <li>Paid: $1200/year for 10K/month</li>
</ul>

<h2 id="brandy">Brandy</h2>

<ul>
  <li><a href="https://logoapi.dev/">https://logoapi.dev/</a></li>
  <li>Is this a part of <a href="https://flowlet.app/">flowlet</a>?  The example uses a flowlet hostname.</li>
  <li>Lookup by domain</li>
  <li>Includes colors, fonts</li>
  <li>Pay-as-you-go: $5/1K</li>
</ul>

<h2 id="clearbit">Clearbit</h2>

<ul>
  <li><a href="https://clearbit.com/">https://clearbit.com/</a></li>
  <li>Purchased by Hubspot</li>
  <li>No longer accepting new customers: sending people to <a href="https://www.logo.dev/">logo.dev</a></li>
</ul>

<h2 id="companieslogos">CompaniesLogos</h2>

<ul>
  <li><a href="https://companieslogo.com/logo-api/">https://companieslogo.com/logo-api/</a></li>
  <li>Lookup by ticker</li>
  <li>8650 logos</li>
  <li>Free: no</li>
  <li>Paid: $588/year.  Higher tiers for high-res, dark mode, SVGs, etc.</li>
</ul>

<h2 id="companyenrich">CompanyEnrich</h2>

<ul>
  <li><a href="https://companyenrich.com/logo-api">https://companyenrich.com/logo-api</a></li>
  <li>Lookup by domain</li>
  <li>Separate API to lookup by name</li>
  <li>Free: 200/month</li>
  <li>Paid: $588/year</li>
</ul>

<h2 id="cufinder">CUFinder</h2>

<ul>
  <li><a href="https://cufinder.io/enrichment-engine/logo-api">https://cufinder.io/enrichment-engine/logo-api</a></li>
  <li>Lookup by domain</li>
  <li>Free: with attribution</li>
</ul>

<h2 id="eodhd">EODHD</h2>

<ul>
  <li><a href="https://eodhd.com/financial-apis-blog/40000-company-logos">https://eodhd.com/financial-apis-blog/40000-company-logos</a></li>
  <li>Lookup by ticker</li>
  <li>40K logos, 200x200 PNGs</li>
  <li>Paid: $399/year (one-time download for addition fee)</li>
</ul>

<h2 id="factset">Factset</h2>

<ul>
  <li><a href="https://developer.factset.com/api-catalog/company-logo-api">https://developer.factset.com/api-catalog/company-logo-api</a></li>
  <li>Lookup by ticker</li>
  <li>No public pricing</li>
</ul>

<h2 id="fulio">Ful.io</h2>

<ul>
  <li><a href="https://ful.io/api-list/company-logo-finder">https://ful.io/api-list/company-logo-finder</a></li>
  <li>Lookup by domain</li>
  <li>Separate API for company name to domain</li>
  <li>Example has broken URLs</li>
  <li>Paid: $3000/year for 2.5K/month</li>
</ul>

<h2 id="klazify">Klazify</h2>

<ul>
  <li><a href="https://www.klazify.com/">https://www.klazify.com/</a></li>
  <li>Lookup by domain</li>
  <li>Also: has categorization (=IAB v3 topics)</li>
  <li>Paid: starts at $1068/year for 2K/month</li>
</ul>

<h2 id="logodev">Logo.dev</h2>

<ul>
  <li><a href="https://www.logo.dev/">https://www.logo.dev/</a></li>
  <li>lookup by domain or stock symbol</li>
  <li>Also: API for brand name to domain</li>
  <li>Also: API for domain to social media handles</li>
  <li>Free: attribution required</li>
  <li>Paid: $300/year</li>
</ul>

<h2 id="logointern">LogoIntern</h2>

<ul>
  <li><a href="https://logointern.com/">https://logointern.com/</a></li>
  <li>Lookup by name or stock ticker</li>
  <li>“1M+ logos”</li>
  <li>Geared towards users making slideshows: Unclear if they have an API</li>
  <li>Paid: $875 for 5 users</li>
</ul>

<h2 id="parget">Parget</h2>

<ul>
  <li><a href="https://www.parqet.com/api/logos">https://www.parqet.com/api/logos</a></li>
  <li>lookup only by stock symbol</li>
  <li>“400,000+” logos</li>
  <li>Free: attribution required</li>
  <li>Paid: 3000 EUR/year</li>
</ul>

<h2 id="peopledatalabs">PeopleDataLabs</h2>

<ul>
  <li><a href="https://www.peopledatalabs.com/company-enrichment-api">https://www.peopledatalabs.com/company-enrichment-api</a></li>
  <li>Lookup by name, domain or ticker</li>
  <li>They have logos for <a href="https://docs.peopledatalabs.com/docs/company-stats">45%</a> of companies in their database.</li>
  <li>They do not <a href="https://docs.peopledatalabs.com/docs/company-data-field-bundles">document</a> <code class="language-plaintext highlighter-rouge">logo_url</code> as being base or premium, so not sure if free can be used</li>
  <li>Free: 100/month (only base fields)</li>
  <li>Paid: 1K/month for $960/year</li>
</ul>

<h2 id="proxycurl-nubela">Proxycurl (Nubela)</h2>

<ul>
  <li><a href="https://nubela.co/proxycurl/docs#company-api-company-profile-picture-endpoint">https://nubela.co/proxycurl/docs#company-api-company-profile-picture-endpoint</a></li>
  <li>Company lookup by domain or name</li>
  <li>2nd (free) API call to get logo (by LinkedIn URL)</li>
  <li>Free: no</li>
  <li>Paid: 15K for $588/year</li>
</ul>

<h2 id="ritekit">RiteKit</h2>

<ul>
  <li><a href="https://ritekit.com/api-demo/company-logo">https://ritekit.com/api-demo/company-logo</a></li>
  <li>Lookup by domain</li>
  <li>Will return SVG if available</li>
  <li>Tries to extract on the fly</li>
  <li>Also returns brand colors</li>
  <li>Option to download database “200K+ logos”</li>
  <li>Pricing unclear: looks like focus is on other tools</li>
</ul>

<h2 id="the-companies-api">The Companies API</h2>

<ul>
  <li><a href="https://www.thecompaniesapi.com/api">https://www.thecompaniesapi.com/api</a></li>
  <li>Lookup by name, domain or free form (“prompt”)</li>
  <li>17M records</li>
  <li>Search on home page does not work</li>
  <li>Free: 500</li>
  <li>Paid: 50,000/month for $950/year</li>
</ul>

<h2 id="uplead">Uplead</h2>

<ul>
  <li><a href="https://www.uplead.com/free-company-logo-api/">https://www.uplead.com/free-company-logo-api/</a></li>
  <li>Lookup by domain name</li>
  <li>incorrect content-type on images</li>
  <li>no auto-add</li>
  <li>Free: attribution required</li>
</ul>

<h2 id="not-analyzed">Not Analyzed</h2>

<ul>
  <li><a href="https://icon.horse/">Icon Horse</a> - only favicons</li>
  <li><a href="https://www.logo.wine/">Logo.Wine</a> - full logo (i.e. not icon), no API</li>
  <li><a href="https://developer.linkedin.com/product-catalog">LinkedIn</a> - looks like they removed their company profile lookup API</li>
  <li><a href="https://www.xignite.com/product/logos-api/">Xignite</a> - (aka Quodd)only stocks and 7K logos, but logo+icon and SVG</li>
  <li><a href="https://lucky.logosear.ch/">lucky.logosear.ch</a> - not ready for prime time</li>
  <li><a href="https://logo.allindigital.se/goteborg.com">AllInDigital</a> - seems dead</li>
  <li><a href="https://airhex.com/api/logos/">AirHex</a> - only airlines</li>
</ul>

<h2 id="to-do">To do</h2>

<ul>
  <li><a href="https://www.microsoft.com/en-us/bing/apis/bing-image-search-api">Bing Image Search</a></li>
  <li><a href="https://api.search.brave.com/app/documentation/image-search/get-started">Brave Image Search API</a></li>
  <li><a href="https://yandex.cloud/en/docs/search-api/concepts/pic-search">Yandex Image Search</a></li>
  <li><a href="https://rapidapi.com/Hellorana/api/logofinderapi">LogoFinderAPI</a></li>
  <li><a href="https://rapidapi.com/flowlet/api/logo-api1">Logo API</a></li>
  <li><a href="https://github.com/ScientaNL/brandr-api">ScientaNL/brandr-api</a></li>
  <li><a href="https://haveibeentrained.com/">Have I Been Trained</a></li>
</ul>
]]></description>
        </item>
        <item>
            <guid>https://andrew.marcuse.info/blog/2024/2024-11-18-rss-style.html</guid>
            <link>https://andrew.marcuse.info/blog/2024/2024-11-18-rss-style.html</link>
            <pubDate>Mon, 18 Nov 2024 00:00:00 -0600</pubDate>
            <title>RSS.Style: better user experience for RSS and Atom links</title>
            <description><![CDATA[<p>One of the things that (IMHO) is hindering RSS/Atom is poor discoverability.</p>

<p>The major browsers no longer support it, so clicking on a RSS/Atom link brings up either a “wall of text” or even worse, a “Save As” dialog, both of which are useless and especially hostile to newcomers. This has lead to authors avoiding putting visible links to their feeds in the HTML body.  So now newcomers never even know that feeds are a thing.</p>

<p>There’s not much I can do to help with built-in browser support, but I can do something to make feeds look better when you click on them: add some style!  Introducing <a href="https://www.rss.style/">RSS.Style</a> to help you add a stylesheet to your RSS/Atom feed, including a (rather generic-looking) sample style template and a way to <a href="https://www.rss.style/example.xml">preview</a> it.</p>

<p>The other thing that I discovered while working on RSS.Style is that people are not paying enough attention to their feeds.  RSS.Style requires that the basic fields are present (and correct) so it can use them in the template: It is shocking how many high-profile bloggers have errors in their feeds.  I made a <a href="https://www.rss.style/feed-analyzer.html">Feed Analyzer</a> that points out some common mistakes that are not covered by the W3C’s feed validator.</p>

<p>You can see it in action on <a href="https://andrew.marcuse.info/blog/rss.xml">my blog’s RSS feed</a>!</p>

<p>Source is available at <a href="https://github.com/fileformat/rss.style">github.com/fileformat/rss.style</a> and is MIT licensed.  The preview and analyzer are written in TypeScript and hosted on Cloudflare Pages.</p>
]]></description>
        </item>
        <item>
            <guid>https://andrew.marcuse.info/blog/2024/2024-11-09-github-actions-dashboard.html</guid>
            <link>https://andrew.marcuse.info/blog/2024/2024-11-09-github-actions-dashboard.html</link>
            <pubDate>Sat, 09 Nov 2024 00:00:00 -0600</pubDate>
            <title>Ghashboard: A dashboard builder for Github Actions</title>
            <description><![CDATA[<p>Are you losing track of all the repos you have?  I am.</p>

<p>Have you used Github Actions to automate everything in existance?  I have.</p>

<p>So I built a tool to generate a page full of Github Action badges.</p>

<p>And, of course, it runs as a Github Action!  (It also works from the CLI)</p>

<p>It works really well for Github organization profiles: public or private.</p>

<p>Note: badges for private Github repos are only visible if the page is hosted on github.com for security reasons, so it makes sense to have it on a Github profile or in a custom README file.</p>

<p>Written in Go, MIT license.  Source is at <a href="https://github.com/fileformat/ghashboard">fileformat/ghashboard</a></p>

<p>Example: <a href="https://github.com/VectorLogoZone">VectorLogoZone’s Github Profile</a></p>

<p>Check it out on the Github Marketplace: <a href="https://github.com/marketplace/actions/ghashboard">ghashboard</a></p>

]]></description>
        </item>
        <item>
            <guid>https://andrew.marcuse.info/blog/2024/2024-11-02-node-without-npm.html</guid>
            <link>https://andrew.marcuse.info/blog/2024/2024-11-02-node-without-npm.html</link>
            <pubDate>Sat, 02 Nov 2024 00:00:00 -0600</pubDate>
            <title>Node.js without NPM</title>
            <description><![CDATA[<p>I saw a snippet in the Bun docs that <a href="https://bun.sh/docs/api/http#benchmarks">benchmarked a minimal Node.js webserver</a>, and thought it would be interesting to see how it would work with something a little bigger than “Hello World”.  It was surprising easy to do, with a lot of advantages:</p>

<ul>
  <li>No dependencies</li>
  <li>No build step</li>
  <li>Not even a <code class="language-plaintext highlighter-rouge">package.json</code></li>
  <li>Docker image is a single step straight from <a href="https://github.com/GoogleContainerTools/distroless">distroless</a></li>
  <li>Node’s new <code class="language-plaintext highlighter-rouge">--watch</code> flag works</li>
</ul>

<p>I am not really sure that it is practical for a real project: I wouldn’t want to have to reimplement common parsing tasks and such like.  And I would probably use Bun or Deno to get built-in TypeScript support.</p>

<p>The source code on Github: <a href="https://github.com/fileformat/node-without-npm">fileformat/node-without-npm</a>.</p>
]]></description>
        </item>
        <item>
            <guid>https://andrew.marcuse.info/blog/2024/2024-10-20-starting.html</guid>
            <link>https://andrew.marcuse.info/blog/2024/2024-10-20-starting.html</link>
            <pubDate>Sun, 20 Oct 2024 00:00:00 -0600</pubDate>
            <title>Starting a blog!</title>
            <description><![CDATA[<p>I know it is a little late to be joining the party, but I am starting a blog.</p>

<p>I want a place to post random things that are not necessarily part of a specific <a href="/side-projects.html">project</a> or a <a href="https://til.marcuse.info/">things-i-learned</a> note.</p>
]]></description>
        </item>
    </channel>
</rss>
