<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: syndication</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/syndication.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-03-28T00:08:01+00:00</updated><author><name>Simon Willison</name></author><entry><title>Quoting Nelson Minar</title><link href="https://simonwillison.net/2025/Mar/28/nelson-minar/#atom-tag" rel="alternate"/><published>2025-03-28T00:08:01+00:00</published><updated>2025-03-28T00:08:01+00:00</updated><id>https://simonwillison.net/2025/Mar/28/nelson-minar/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://lobste.rs/s/aygeaq/atom_vs_rss_2013#c_mxxurc"&gt;&lt;p&gt;I was there at the first Atom meeting at the Google offices. We meant so well! And I think the basic publishing spec is good, certainly better technically than the pastiche of different things called RSS.&lt;/p&gt;
&lt;p&gt;Alas, a bunch of things then went wrong. Feeds started losing market share. Facebook started doing something useful and interesting that ultimately replaced blog feeds in open formats. The Atom vs RSS spec was at best irrelevant to most people (even programmers) and at worst a confusing market-damaging thing. The XML namespaces in Atom made everyone annoyed. Also there was some confusing “Atom API” for publishing that diluted Atom’s mindshare for feeds.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://lobste.rs/s/aygeaq/atom_vs_rss_2013#c_mxxurc"&gt;Nelson Minar&lt;/a&gt;, Comment on lobste.rs&lt;/p&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/nelson-minar"&gt;nelson-minar&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/syndication"&gt;syndication&lt;/a&gt;&lt;/p&gt;



</summary><category term="atom"/><category term="nelson-minar"/><category term="rss"/><category term="syndication"/></entry><entry><title>ooh.directory: A page for every blog</title><link href="https://simonwillison.net/2024/Jan/9/oohdirectory/#atom-tag" rel="alternate"/><published>2024-01-09T22:15:59+00:00</published><updated>2024-01-09T22:15:59+00:00</updated><id>https://simonwillison.net/2024/Jan/9/oohdirectory/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://ooh.directory/blog/2024/blog-pages/"&gt;ooh.directory: A page for every blog&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I hadn’t checked in on Phil Gyford’s ooh.directory blog directory since it first launched in November 2022. I’m delighted to see that it’s thriving—2,117 blogs have now been carefully curated, and the latest feature is a page for each blog showing its categories, description, an activity graph and the most recent posts syndicated via RSS/Atom.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/atom"&gt;atom&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/blogs"&gt;blogs&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/phil-gyford"&gt;phil-gyford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/syndication"&gt;syndication&lt;/a&gt;&lt;/p&gt;



</summary><category term="atom"/><category term="blogs"/><category term="phil-gyford"/><category term="rss"/><category term="syndication"/></entry><entry><title>datasette-atom: Define an Atom feed using a custom SQL query</title><link href="https://simonwillison.net/2019/Dec/3/datasette-atom/#atom-tag" rel="alternate"/><published>2019-12-03T00:20:44+00:00</published><updated>2019-12-03T00:20:44+00:00</updated><id>https://simonwillison.net/2019/Dec/3/datasette-atom/#atom-tag</id><summary type="html">
    &lt;p&gt;I've been having a ton of fun iterating on &lt;a href="https://www.niche-museums.com/"&gt;www.niche-museums.com&lt;/a&gt;. I put together &lt;a href="https://simonwillison.net/2019/Nov/25/niche-museums/"&gt;some notes on how the site works&lt;/a&gt; last week, and I've been taking advantage of the Thanksgiving break to continue exploring ways in which &lt;a href="https://github.com/simonw/datasette"&gt;Datasette&lt;/a&gt; can be used to quickly build database-backed static websites.&lt;/p&gt;

&lt;p&gt;I post a new museum to the site every day, so it was inevitable that someone would &lt;a href="https://projects.metafilter.com/5697/Niche-Museums"&gt;ask for a feed&lt;/a&gt;. And here it is: an &lt;a href="https://www.niche-museums.com/browse/feed.atom?_feed_title=Niche+Museums"&gt;Atom feed for Niche Museums&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This means Niche Museums is effectively a blog now, which is fitting: it's a universal truth that any sufficiently advanced backend technology will evolve to the point where it can power a blog with an Atom feed.&lt;/p&gt;

&lt;h3 id="datasette-atom"&gt;datasette-atom&lt;/h3&gt;

&lt;p&gt;I built the feed by wrapping up work on the first version of a new Datasette plugin: &lt;a href="https://github.com/simonw/datasette-atom"&gt;datasette-atom&lt;/a&gt;. It takes advantage of the &lt;a href="https://datasette.readthedocs.io/en/stable/plugins.html#register-output-renderer-datasette"&gt;register_output_renderer&lt;/a&gt; plugin hook, which was contributed by Russ Garrett &lt;a href="https://github.com/simonw/datasette/pull/441"&gt;back in May&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The idea with the plugin is to make it possible to construct an Atom feed from an arbitrary SQL query.&lt;/p&gt;

&lt;p&gt;This is a really powerful ability. It means that a user with sufficent knowledge of SQL can subscribe to an arbitrary feed of data from any Datasette instance that is running the plugin. &lt;/p&gt;

&lt;h3 id="defining-atom-with-sql"&gt;Defining an Atom feed with a SQL query&lt;/h3&gt;

&lt;p&gt;The plugin works by requiring you to provide a SQL query that produces the following columns in its output:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;atom_id&lt;/code&gt;, &lt;code&gt;atom_title&lt;/code&gt; and &lt;code&gt;atom_updated&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These correspond to &lt;a href="https://validator.w3.org/feed/docs/atom.html#requiredEntryElements"&gt;the required entry elements&lt;/a&gt; defined by the Atom specification.&lt;/p&gt;

&lt;p&gt;The plugin can then render the results of the query as an Atom feed.&lt;/p&gt;

&lt;p&gt;You can also produce an &lt;code&gt;atom_link&lt;/code&gt; column, which will become a link.&lt;/p&gt;

&lt;p&gt;And finally, you can produce either an &lt;code&gt;atom_content&lt;/code&gt; column which will be treated as text and used as the feed entry body, or an &lt;code&gt;atom_content_html&lt;/code&gt; column which will be treated as HTML.&lt;/p&gt;

&lt;p&gt;(The HTML from &lt;code&gt;atom_content_html&lt;/code&gt; is sanitized through &lt;a href="https://github.com/mozilla/bleach"&gt;Mozilla's Bleach&lt;/a&gt; library to ensure the plugin doesn't act as an XSS vector.)&lt;/p&gt;

&lt;p&gt;This means we can define a custom Atom feed by crafting a SQL query! Here's the query I'm using on the Niche Museums website:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;select
  'tag:niche-museums.com,' || substr(created, 0, 11) || ':' || id as atom_id,
  name as atom_title,
  created as atom_updated,
  'https://www.niche-museums.com/browse/museums/' || id as atom_link,
  coalesce(
    '&amp;lt;img src="' || photo_url || '?w=800&amp;amp;amp;h=400&amp;amp;amp;fit=crop&amp;amp;amp;auto=compress"&amp;gt;',
    ''
  ) || '&amp;lt;p&amp;gt;' || description || '&amp;lt;/p&amp;gt;' as atom_content_html
from
  museums
order by
  created desc
limit
  15
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I'm using a couple of extra tricks here.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;atom_id&lt;/code&gt; is defined as a tag:uri following &lt;a href="https://web.archive.org/web/20080211143232/http://diveintomark.org/archives/2004/05/28/howto-atom-id#tag"&gt;this advice from Mark Pilgrim&lt;/a&gt; - since &lt;code&gt;created&lt;/code&gt; is an ISO 8601 timestamp &lt;code&gt;substr(created, 0, 11)&lt;/code&gt; returns the &lt;code&gt;YYYY-MM-DD&lt;/code&gt; component.&lt;/p&gt;

&lt;p&gt;Not every museum has a photo, which means &lt;code&gt;photo_url&lt;/code&gt; is sometimes &lt;code&gt;null&lt;/code&gt;. In SQL, concatenating a null value to something else (using the &lt;code&gt;||&lt;/code&gt; concatenation operator) produces another null. So this entire expression evaluates to null if &lt;code&gt;photo_url&lt;/code&gt; is null:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;'&amp;lt;img src="' || photo_url ||
'?w=800&amp;amp;amp;h=400&amp;amp;amp;fit=crop&amp;amp;amp;auto=compress"&amp;gt;',&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;coalesce(x...)&lt;/code&gt; function returns the first argument passed to it. So &lt;code&gt;coalesce('&amp;lt;img ...&amp;gt;' || photo_url || '...', '')&lt;/code&gt; returns the empty string if the photo is not available.&lt;/p&gt;

&lt;h3 id="deriving-created-updated"&gt;Deriving created/updated fields from Git history&lt;/h3&gt;

&lt;p&gt;For the atom feed to work, I need an &lt;code&gt;atom_updated&lt;/code&gt; value. This should be a timestamp representing "the last time the entry was modified in a significant way" - so it's actually more like a &lt;code&gt;created&lt;/code&gt; timestamp for my museums website.&lt;/p&gt;

&lt;p&gt;My museum data is defined in a YAML file - &lt;a href="https://github.com/simonw/museums/blob/master/museums.yaml"&gt;museums.yaml&lt;/a&gt; - which doesn't include created and updated timestamps. So where can I get them from?&lt;/p&gt;

&lt;p&gt;Since the YAML file is stored in the site's GitHub repository, I'm deriving those timestamps from the git history. I repurposed code I wrote for &lt;a href="https://simonwillison.net/2019/Oct/10/pge-outages/"&gt;my PG&amp;amp;E outages project&lt;/a&gt; for this - the full script is &lt;a href="https://github.com/simonw/museums/blob/master/annotate_timestamps.py"&gt;annotate
_timestamps.py&lt;/a&gt; in the museums repo.&lt;/p&gt;

&lt;p&gt;It works by looping through the entire history of the &lt;code&gt;museums.yaml&lt;/code&gt; file comparing the list of museums in each version to the previous iteration. If a museum is new (it has an ID not seen before) we use the commit date as its &lt;code&gt;created&lt;/code&gt; date. If the JSON serialization of the museum differs from the previous version we reset its &lt;code&gt;updated&lt;/code&gt; date.&lt;/p&gt;

&lt;p&gt;Then at the end the script uses &lt;a href="https://github.com/simonw/sqlite-utils"&gt;sqlite-utils&lt;/a&gt; to update each record with the derived timestamps:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# updated/created are dicts of {"id": "timestamp"}
db = sqlite_utils.Database("browse.db")
for id, ts in created.items():
    db["museums"].update(id, {
        "created": ts,
        "updated": updated[id]
    }, alter=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;alter=True&lt;/code&gt; parameter to the &lt;code&gt;.update()&lt;/code&gt; method causes &lt;code&gt;sqlite-utils&lt;/code&gt; to automatically add any missing columns that are referenced in the update.&lt;/p&gt;

&lt;h3 id="defining-canned-query"&gt;Defining a feed as a canned query&lt;/h3&gt;

&lt;p&gt;Now that we've defined the feed as a SQL query, we can assign it a more pleasing URL using Datasette's &lt;a href="https://datasette.readthedocs.io/en/stable/sql_queries.html#canned-queries"&gt;canned queries&lt;/a&gt; feature.&lt;/p&gt;

&lt;p&gt;I encoded the query as a JSON string using &lt;a href="https://json-escape-text.now.sh/"&gt;JSON Escape Text&lt;/a&gt;, then added it to the &lt;a href="https://github.com/simonw/museums/blob/master/metadata.json"&gt;metadata.json configuration file&lt;/a&gt; for Niche Museums. I named the query &lt;code&gt;feed&lt;/code&gt;, resulting in a URL of &lt;code&gt;www.niche-museums.com/browse/feed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There's just one catch: Atom feeds should have a name. As a quick and nasty hack I allow the name to be set using &lt;code&gt;?_feed_name=Niche+Museums&lt;/code&gt;. I have &lt;a href="https://github.com/simonw/datasette-atom/issues/6"&gt;an open issue&lt;/a&gt; to come up with a less nasty way of defining this.&lt;/p&gt;

&lt;h3 id="also-this-week-dec-2"&gt;Also this week&lt;/h3&gt;

&lt;p&gt;I added a simple search engine to Niche Museums! Here's an example search for "model": &lt;a href="https://www.niche-museums.com/browse/search?q=model"&gt;www.niche-museums.com/browse/search?q=model&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I used sqlite-utils to &lt;a href="https://sqlite-utils.readthedocs.io/en/stable/cli.html#configuring-full-text-search"&gt;configure SQLite FTS&lt;/a&gt; (here's &lt;a href="https://github.com/simonw/museums/blob/df8edbc30bbc48c6b5ffbd2d64c8e5404a4101d5/.circleci/config.yml#L17"&gt;the line that calls it&lt;/a&gt; in the CI build script), defined another canned query in &lt;code&gt;metadata.json&lt;/code&gt; that executes the query and built &lt;a href="https://github.com/simonw/museums/blob/master/templates/query-browse-search.html"&gt;a custom template&lt;/a&gt; to render the results page.&lt;/p&gt;

&lt;p&gt;I added press coverage to Niche Museums. Many of the listings now link to articles in the local media about them.&lt;/p&gt;

&lt;p&gt;Museum pages now link to other nearby museums. Here's &lt;a href="https://github.com/simonw/museums/commit/8059c1f3eec37e5e5420db29a045d3a3add28a84"&gt;the commit&lt;/a&gt; that implemented that feature - it works by embedding a new SQL query in the template page, using &lt;a href="https://github.com/simonw/datasette-template-sql"&gt;datasette-template-sql&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I identified &lt;a href="https://github.com/simonw/yaml-to-sqlite/issues/1"&gt;a bug&lt;/a&gt; in &lt;code&gt;yaml-to-sqlite&lt;/code&gt; and shipped a fix in &lt;a href="https://github.com/simonw/yaml-to-sqlite/releases/tag/0.3"&gt;version 0.3&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I added the following seven museums to the site:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.niche-museums.com/browse/museums/47"&gt;The Comic Rock Star’s Toilet Seat Museum&lt;/a&gt; in San Francisco&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.niche-museums.com/browse/museums/48"&gt;Fabergé Museum, Baden-Baden&lt;/a&gt; in Baden-Baden, Germany&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.niche-museums.com/browse/museums/49"&gt;jAdis&lt;/a&gt; in Santa Monica&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.niche-museums.com/browse/museums/50"&gt;Lundy&lt;/a&gt; in the Bristol Channel&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.niche-museums.com/browse/museums/51"&gt;Neon Works&lt;/a&gt; in Oakland&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.niche-museums.com/browse/museums/52"&gt;Maison des Johnnies et de l’Oignon de Roscoff&lt;/a&gt; in Roscoff&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.niche-museums.com/browse/museums/53"&gt;Bourton-on-the-Water Model Village&lt;/a&gt; in the Cotswolds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Goal for the next week: make some progress on projects that aren't related to niche museums!&lt;/p&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/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/syndication"&gt;syndication&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/weeknotes"&gt;weeknotes&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="atom"/><category term="projects"/><category term="syndication"/><category term="datasette"/><category term="weeknotes"/></entry><entry><title>Simple Update Protocol: Update</title><link href="https://simonwillison.net/2008/Dec/18/friendfeed/#atom-tag" rel="alternate"/><published>2008-12-18T23:33:46+00:00</published><updated>2008-12-18T23:33:46+00:00</updated><id>https://simonwillison.net/2008/Dec/18/friendfeed/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.friendfeed.com/2008/12/simple-update-protocol-update.html"&gt;Simple Update Protocol: Update&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Already implemented by more than five services, each of which now have near-real-time updates in to the FriendFeed syndication engine.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/friendfeed"&gt;friendfeed&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/realtime"&gt;realtime&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sup"&gt;sup&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/syndication"&gt;syndication&lt;/a&gt;&lt;/p&gt;



</summary><category term="friendfeed"/><category term="realtime"/><category term="sup"/><category term="syndication"/></entry><entry><title>Inside guardian.co.uk: Upgrading our RSS feeds</title><link href="https://simonwillison.net/2008/Oct/24/rss/#atom-tag" rel="alternate"/><published>2008-10-24T11:08:55+00:00</published><updated>2008-10-24T11:08:55+00:00</updated><id>https://simonwillison.net/2008/Oct/24/rss/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.guardian.co.uk/help/insideguardian/2008/oct/22/full-fat-rss-feed-upgrade"&gt;Inside guardian.co.uk: Upgrading our RSS feeds&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The Guardian now offers full-content RSS feeds of pretty much everything for which we have the necessary rights (no ads yet, but they’ll be added soon). Adding “/rss” to the URL in various places on the site will get you feeds for sections, subjects, contributors and more.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/fullcontent"&gt;fullcontent&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/guardian"&gt;guardian&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/syndication"&gt;syndication&lt;/a&gt;&lt;/p&gt;



</summary><category term="fullcontent"/><category term="guardian"/><category term="rss"/><category term="syndication"/></entry><entry><title>RSS Duplicate Detection</title><link href="https://simonwillison.net/2008/Jan/22/rss/#atom-tag" rel="alternate"/><published>2008-01-22T20:11:39+00:00</published><updated>2008-01-22T20:11:39+00:00</updated><id>https://simonwillison.net/2008/Jan/22/rss/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.xn--8ws00zhy3a.com/blog/2006/08/rss-dup-detection"&gt;RSS Duplicate Detection&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
“Detecting duplicate items in an RSS feed is something of a black art”. I hadn’t realised quite how involved such a basic function of an aggregator could be.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/aggregator"&gt;aggregator&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/atom"&gt;atom&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/blackart"&gt;blackart&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/duplicates"&gt;duplicates&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-holderness"&gt;james-holderness&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/syndication"&gt;syndication&lt;/a&gt;&lt;/p&gt;



</summary><category term="aggregator"/><category term="atom"/><category term="blackart"/><category term="duplicates"/><category term="james-holderness"/><category term="rss"/><category term="syndication"/></entry><entry><title>Google AJAX Feed API</title><link href="https://simonwillison.net/2007/Apr/18/google/#atom-tag" rel="alternate"/><published>2007-04-18T17:29:52+00:00</published><updated>2007-04-18T17:29:52+00:00</updated><id>https://simonwillison.net/2007/Apr/18/google/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/apis/ajaxfeeds/"&gt;Google AJAX Feed API&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Simple cross-domain proxy to allow JavaScript to access any publically addressable syndication feed, with the same logic as Google Reader providing normalisation.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://ajaxian.com/archives/google-announces-new-ajax-feed-api"&gt;Ajaxian&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/atom"&gt;atom&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/crossdomain"&gt;crossdomain&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/feed"&gt;feed&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google-reader"&gt;google-reader&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/syndication"&gt;syndication&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="atom"/><category term="crossdomain"/><category term="feed"/><category term="google"/><category term="google-reader"/><category term="javascript"/><category term="rss"/><category term="syndication"/></entry><entry><title>Pipes</title><link href="https://simonwillison.net/2007/Feb/8/pipes/#atom-tag" rel="alternate"/><published>2007-02-08T07:52:59+00:00</published><updated>2007-02-08T07:52:59+00:00</updated><id>https://simonwillison.net/2007/Feb/8/pipes/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://pipes.yahoo.com/"&gt;Pipes&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
New Yahoo! service for combining and remixing Atom/RSS feeds using a really sophisticated drag-and-drop UI.


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



</summary><category term="atom"/><category term="draganddrop"/><category term="pipes"/><category term="rss"/><category term="syndication"/></entry><entry><title>Subtlety</title><link href="https://simonwillison.net/2007/Jan/22/subtlety/#atom-tag" rel="alternate"/><published>2007-01-22T08:20:25+00:00</published><updated>2007-01-22T08:20:25+00:00</updated><id>https://simonwillison.net/2007/Jan/22/subtlety/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://subtlety.errtheblog.com/"&gt;Subtlety&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Instantly create an RSS feed from a public subversion repository.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://errtheblog.com/post/701"&gt;err.the_blog&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/subversion"&gt;subversion&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/syndication"&gt;syndication&lt;/a&gt;&lt;/p&gt;



</summary><category term="rss"/><category term="subversion"/><category term="syndication"/></entry></feed>