<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: netnewswire</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/netnewswire.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-10-08T16:12:14+00:00</updated><author><name>Simon Willison</name></author><entry><title>Why NetNewsWire Is Not a Web App</title><link href="https://simonwillison.net/2025/Oct/8/why-netnewswire-is-not-a-web-app/#atom-tag" rel="alternate"/><published>2025-10-08T16:12:14+00:00</published><updated>2025-10-08T16:12:14+00:00</updated><id>https://simonwillison.net/2025/Oct/8/why-netnewswire-is-not-a-web-app/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://inessential.com/2025/10/04/why-netnewswire-is-not-web-app.html"&gt;Why NetNewsWire Is Not a Web App&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
In the wake of Apple &lt;a href="https://daringfireball.net/2025/10/iceblock_removed_from_app_store"&gt;removing ICEBlock from the App Store&lt;/a&gt;, Brent Simmons talks about why he still thinks his veteran (and actively maintained) &lt;a href="https://netnewswire.com/"&gt;NetNewsWire&lt;/a&gt; feed reader app should remain a native application.&lt;/p&gt;
&lt;p&gt;Part of the reason is cost - NetNewsWire is free these days (&lt;a href="https://github.com/Ranchero-Software/NetNewsWire/blob/main/LICENSE"&gt;MIT licensed in fact&lt;/a&gt;) and the cost to Brent is an annual Apple developer subscription:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If it were a web app instead, I could drop the developer membership, but I’d have to pay way more money for web and database hosting. [...] I could charge for NetNewsWire, but that would go against my political goal of making sure there’s a good and &lt;em&gt;free&lt;/em&gt; RSS reader available to everyone.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A bigger reason is around privacy and protecting users:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Second issue. Right now, if law enforcement comes to me and demands I turn over a given user’s subscriptions list, I can’t. Literally can’t. I don’t have an encrypted version, even — I have nothing at all. The list lives on their machine (iOS or macOS).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And finally it's about the principle of what a personal computing device should mean:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My computer is &lt;em&gt;not&lt;/em&gt; a terminal. It’s a world I get to control, and I can use — and, especially, &lt;em&gt;make&lt;/em&gt; — whatever I want. I’m not stuck using just what’s provided to me on some other machines elsewhere: I’m not dialing into a mainframe or doing the modern equivalent of using only websites that other people control.&lt;/p&gt;
&lt;/blockquote&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apple"&gt;apple&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/brent-simmons"&gt;brent-simmons&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/macos"&gt;macos&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/netnewswire"&gt;netnewswire&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ios"&gt;ios&lt;/a&gt;&lt;/p&gt;



</summary><category term="apple"/><category term="brent-simmons"/><category term="macos"/><category term="netnewswire"/><category term="ios"/></entry><entry><title>Building and deploying a custom site using GitHub Actions and GitHub Pages</title><link href="https://simonwillison.net/2025/Mar/18/actions-pages/#atom-tag" rel="alternate"/><published>2025-03-18T20:17:34+00:00</published><updated>2025-03-18T20:17:34+00:00</updated><id>https://simonwillison.net/2025/Mar/18/actions-pages/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://til.simonwillison.net/github-actions/github-pages"&gt;Building and deploying a custom site using GitHub Actions and GitHub Pages&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I figured out a minimal example of how to use GitHub Actions to run custom scripts to build a website and then publish that static site to GitHub Pages. I turned &lt;a href="https://github.com/simonw/minimal-github-pages-from-actions/"&gt;the example&lt;/a&gt; into a template repository, which should make getting started for a new project extremely quick.&lt;/p&gt;
&lt;p&gt;I've needed this for various projects over the years, but today I finally put these notes together while setting up &lt;a href="https://github.com/simonw/recent-california-brown-pelicans"&gt;a system&lt;/a&gt; for scraping the &lt;a href="https://www.inaturalist.org/"&gt;iNaturalist&lt;/a&gt; API for recent sightings of the California Brown Pelican and converting those into an Atom feed that I can subscribe to in &lt;a href="https://netnewswire.com/"&gt;NetNewsWire&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of a Brown Pelican sighting Atom feed in NetNewsWire showing a list of entries on the left sidebar and detailed view of &amp;quot;Brown Pelican at Art Museum, Isla Vista, CA 93117, USA&amp;quot; on the right with date &amp;quot;MAR 13, 2025 AT 10:40 AM&amp;quot;, coordinates &amp;quot;34.4115542997, -119.8500448&amp;quot;, and a photo of three brown pelicans in water near a dock with copyright text &amp;quot;(c) Ery, all rights reserved&amp;quot;" src="https://static.simonwillison.net/static/2025/pelicans-netnewswire.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;I got Claude &lt;a href="https://claude.ai/share/533a1d59-60db-4686-bd50-679dd01a585e"&gt;to write&lt;/a&gt; me &lt;a href="https://github.com/simonw/recent-california-brown-pelicans/blob/81f87b378b6626e97eeca0719e89c87ace141816/to_atom.py"&gt;the script&lt;/a&gt; that converts the scraped JSON to atom.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: I just &lt;a href="https://sfba.social/@kueda/114185945871929778"&gt;found out&lt;/a&gt; iNaturalist have their own atom feeds! Here's their own &lt;a href="https://www.inaturalist.org/observations.atom?verifiable=true&amp;amp;taxon_id=123829"&gt;feed of recent Pelican observations&lt;/a&gt;.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/atom"&gt;atom&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github"&gt;github&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/netnewswire"&gt;netnewswire&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/inaturalist"&gt;inaturalist&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github-actions"&gt;github-actions&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/git-scraping"&gt;git-scraping&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;&lt;/p&gt;



</summary><category term="atom"/><category term="github"/><category term="netnewswire"/><category term="inaturalist"/><category term="github-actions"/><category term="git-scraping"/><category term="ai-assisted-programming"/></entry><entry><title>Footnotes that work in RSS readers</title><link href="https://simonwillison.net/2024/Aug/1/footnotes-that-work-in-rss-readers/#atom-tag" rel="alternate"/><published>2024-08-01T21:57:07+00:00</published><updated>2024-08-01T21:57:07+00:00</updated><id>https://simonwillison.net/2024/Aug/1/footnotes-that-work-in-rss-readers/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://css-tricks.com/footnotes-that-work-in-rss-readers/"&gt;Footnotes that work in RSS readers&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Chris Coyier explained the mechanism used by Feedbin to render custom footnotes back in 2019.&lt;/p&gt;
&lt;p&gt;I stumbled upon this after I spotted an inline footnote rendered in NetNewsWire the other day (from &lt;a href="https://www.dbreunig.com/2024/07/31/towards-standardizing-place.html"&gt;this post&lt;/a&gt; by Drew Breunig):&lt;/p&gt;
&lt;p&gt;&lt;img alt="NetNewsWire screenshot. A post by Drew Breunig is shown, and a small number one in a pill reveals an overlay displaying a footnote." src="https://static.simonwillison.net/static/2024/netnewswire-footnote.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Since feed readers generally strip JavaScript and CSS and only allow a subset of HTML tags I was intrigued to figure out how that worked.&lt;/p&gt;
&lt;p&gt;I found &lt;a href="https://github.com/Ranchero-Software/NetNewsWire/blob/094a85bce0ca2e5a7593eed027b71714a37c147c/Shared/Article%20Rendering/main.js#L144-L150"&gt;this code&lt;/a&gt; in the NetNewsWire source (it's MIT licensed) which runs against elements matching this CSS selector:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sup &amp;gt; a[href*='#fn'], sup &amp;gt; div &amp;gt; a[href*='#fn']&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;So any link with an &lt;code&gt;href&lt;/code&gt; attribute containing &lt;code&gt;#fn&lt;/code&gt; that is a child of a &lt;code&gt;&amp;lt;sup&amp;gt;&lt;/code&gt; (superscript) element.&lt;/p&gt;
&lt;p&gt;In Drew's post the HTML looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- Footnote link: --&amp;gt;
&amp;lt;sup id="fnref:precision" role="doc-noteref"&amp;gt;
  &amp;lt;a href="#fn:precision" class="footnote" rel="footnote"&amp;gt;1&amp;lt;/a&amp;gt;
&amp;lt;/sup&amp;gt;
&amp;lt;!-- Then at the bottom: --&amp;gt;
&amp;lt;div class="footnotes" role="doc-endnotes"&amp;gt;
  &amp;lt;ol&amp;gt;
    &amp;lt;li id="fn:precision" role="doc-endnote"&amp;gt;
      &amp;lt;p&amp;gt;This is the footnote.
        &amp;lt;a href="#fnref:precision" class="reversefootnote" role="doc-backlink"&amp;gt;&amp;amp;#8617;&amp;lt;/a&amp;gt;
      &amp;lt;/p&amp;gt;
    &amp;lt;/li&amp;gt;
  &amp;lt;/ol&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Where did this convention come from? It doesn't seem to be part of any specific standard. Chris linked to &lt;code&gt;www.bigfootjs.com&lt;/code&gt; (no longer resolving) which was the site for the &lt;a href="https://github.com/lemonmade/bigfoot"&gt;bigfoot.js&lt;/a&gt; jQuery plugin, so my best guess is the convention came from that.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/atom"&gt;atom&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jquery"&gt;jquery&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/netnewswire"&gt;netnewswire&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;&lt;/p&gt;



</summary><category term="atom"/><category term="jquery"/><category term="netnewswire"/><category term="rss"/></entry><entry><title>On the design of the first-run assistant</title><link href="https://simonwillison.net/2008/Jan/29/inessentialcom/#atom-tag" rel="alternate"/><published>2008-01-29T12:16:05+00:00</published><updated>2008-01-29T12:16:05+00:00</updated><id>https://simonwillison.net/2008/Jan/29/inessentialcom/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://inessential.com/?comments=1&amp;amp;postid=3468"&gt;On the design of the first-run assistant&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
NetNewsWire’s Brent Simmons explains the in-depth thinking behind the new first-run assistant.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/brent-simmons"&gt;brent-simmons&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/netnewswire"&gt;netnewswire&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/usability"&gt;usability&lt;/a&gt;&lt;/p&gt;



</summary><category term="brent-simmons"/><category term="netnewswire"/><category term="usability"/></entry><entry><title>NetNewsWire 2.0b3 and MarsEdit public betas</title><link href="https://simonwillison.net/2004/Sep/22/netnewswire/#atom-tag" rel="alternate"/><published>2004-09-22T04:13:48+00:00</published><updated>2004-09-22T04:13:48+00:00</updated><id>https://simonwillison.net/2004/Sep/22/netnewswire/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://inessential.com/2004/09/21.php"&gt;NetNewsWire 2.0b3 and MarsEdit public betas&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Plenty of new features, free upgrades for registered users.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/netnewswire"&gt;netnewswire&lt;/a&gt;&lt;/p&gt;



</summary><category term="netnewswire"/></entry></feed>