# RSS

## Hvad det er

RSS er et XML-format til at udgive et feed: ét `channel`-element, der beskriver
et site og rummer en liste af `item`-elementer, hvert et indlæg med et link, en
dato og noget tekst, på en adresse, som feedlæsere henter med faste mellemrum.
Specifikationen skriver navnet ud som Really Simple Syndication, mange siger
»RSS-feed« om et feed i et hvilket som helst format, og RSS 1.0, »RDF Site
Summary«, er et selvstændigt format bygget på RDF og ikke en tidligere version
af det, der bruges i dag.

Formatet begyndte hos Netscape, som udgav RSS 0.90 i marts 1999 og 0.91 i juli
samme år. UserLand udgav sin egen 0.91 i juni 2000, derefter 0.92 og i august
2002 RSS 2.0. Berkman Klein Center ved Harvard Law School udgav 2.0.1, skrevet
af Dave Winer, i juli 2003, og siden har RSS Advisory Board passet teksten under
en Creative Commons-licens. Udvalgets køreplan siger, at formatet i al praktisk
forstand er frosset ved 2.0.1. Udvalget har udgivet reviderede udgaver af
dokumentet siden, den gældende i marts 2009, men nye behov dækkes af udvidelser
i deres egne XML-navnerum og ikke af nye versioner af RSS.

Et dokument er lille. Roden er et `rss`-element, hvis `version`-attribut skal
være `2.0`, og som rummer en enkelt `channel`. Kanalen skal have en `title`, et
`link` og en `description`. Alle elementer i et indlæg er valgfrie, så længe
indlægget har mindst en titel eller en beskrivelse. Alt andet, fra `pubDate` og
`guid` til kanalens `image` og `ttl`, er der, når udgiveren vil have det:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Eksempelnoter</title>
    <link>https://example.com/</link>
    <description>Korte noter om at drive servere.</description>
    <item>
      <title>Databasen flytter</title>
      <link>https://example.com/notes/db-move/</link>
      <guid isPermaLink="true">https://example.com/notes/db-move/</guid>
      <pubDate>Sat, 17 Oct 2026 09:00:00 GMT</pubDate>
      <description>Hvorfor flytningen tog én aften.</description>
    </item>
  </channel>
</rss>
```

## Hvorfor det betyder noget

RSS er løst, og løsheden er det, en udgiver skal forstå. Et indlægs
`description` kan rumme ren tekst eller HTML, der er escapet ind i elementet, og
intet i filen siger hvilket, så læseren afgør det. `guid` er valgfri, så uden
den må en læser selv regne ud, om et indlæg er nyt. Datoer følger RFC 822, en
e-mailstandard fra 1982, som strenge som `Sat, 17 Oct 2026 09:00:00 GMT` med
engelske navne på dage og måneder, og specifikationen tillader stadig et
tocifret årstal. Og formatet har ingen måde at erklære en basis-URL på, så et
relativt link inde i et indlæg har intet pålideligt at blive opløst imod.

Udvalgets svar er RSS Best Practices Profile, udgivet i oktober 2007:
anbefalinger til dokumenter, der virker på tværs af den brede vifte af software,
der læser dem. Profilen beder om en `guid` på hvert indlæg og om absolutte
URL'er i links og beskrivelser. Den fortæller, at de eneste datoformer, som alle
de testede aggregatorer håndterede, var i Universal Time og endte på `GMT`,
`+0000` eller `-0000`. Den beskriver også et `atom:link` med `rel="self"`, der
angiver feedets egen adresse. Et feed, der er skrevet efter profilen, lader sine
læsere gætte langt mindre.

To udvidelser bærer det meste af det, et moderne feed lægger til. `atom:link`
låner elementet fra Atom. `content:encoded`, fra et modul, der oprindelig blev
skrevet til RSS 1.0, rummer et indlægs fulde HTML. Profilen beskriver at bruge
begge sammen, den fulde tekst i `content:encoded` og et kortere resumé i
`description`, og fandt, at når et indlæg havde begge, viste seks af de otte
testede aggregatorer `content:encoded` og så bort fra resuméet.
`enclosure`-elementet hæfter en mediefil til et indlæg med tre krævede
attributter: filens `url`, dens `length` i bytes og dens MIME-`type`.

Frosset er også en styrke. Et format, der har stået stille siden 2003, er et
fast mål, og et feed, der skrives efter det i dag, læses af software, der blev
skrevet efter samme tekst for mange år siden. Atom lukker de fleste af hullerne
ovenfor i selve specifikationen, så argumentet for også at udgive RSS handler om
læserne og ikke om stringens: nogle tager kun RSS, og en RSS-adresse, der blev
delt ud for år tilbage, bliver stadig hentet.

## Sådan ser det ud i praksis

Dette site udgiver RSS 2.0 på `/da/index.xml` ved siden af et Atom-feed og et
JSON Feed. [Kolofonen forklarer, hvorfor der er to XML-feeds](/da/credits/):
alle tre har den fulde tekst, og der er to XML-feeds og ikke ét, fordi nogle
læsere kun tager det ene af de to, og det er ikke til at forudsige hvilket.
Samme side linker RSS-feedet til W3C's feed-validator ved siden af Atom-feedet,
så enhver kan køre tjekket selv uden at tage sitets ord for noget.

[Siden om at læse sitet fra en terminal](/da/cli/) behandler feedsene som data.
Den siger, at porteføljen udgives i tre formater, som hver har den fulde tekst
af hvert punkt og ikke bare en smagsprøve, og henter RSS-feedet med intet andet
end `curl`:

```sh
curl -s https://engineer.company/da/index.xml
```

## Hvor det går galt

**Kanalens billede mangler, og validatoren protesterer.** En læser viser intet
billede ved feedets navn, og W3C's tjeneste advarer om billedformatet. RSS'
`image`-element er det strengeste billedelement i de tre feedformater: kun GIF,
JPEG eller PNG, højst 144 pixel bredt og 400 højt. Et delingskort til sociale
medier i WebP er den forkerte fil til det. Dette sites RSS-skabelon peger i
stedet `image` på sitets PNG-ikon på 144 pixel, og kommentaren ved siden af
noterer, at WebP-kortet havde udløst en `ImageUrlFormat`-advarsel, som blev
fanget ved at validere igen efter ændringen.

**Indlæg står i forkert rækkefølge, og intet melder det.** En læser placerer nye
indlæg under gamle eller viser dem med forkert dato. RSS-datoer er strenge, så
en dato i ISO 8601, et layout med en stavefejl eller et dagnavn på et andet
sprog giver stadig velformet XML, og kun læserens datoparser opdager det. I Hugo
skriver en skabelons `Format`-metode på en dato engelske navne, mens funktionen
`time.Format` lokaliserer dem, og en `pubDate` med danske dag- og månedsnavne er
ikke en RFC 822-dato. Dette site formaterer hver `pubDate` med metoden ud fra et
layout, der ligger i én partial-skabelon sammen med Atoms, og kommentaren dér
siger, at en tastefejl i et af dem ikke er en buildfejl, men et feed, der parses
og sorteres forkert i en andens læser.

**Ikoner i et indlæg tegner ingenting, og validatoren lister fejl.** Den fulde
tekst i `content:encoded` forlader sin side, så alt, der afhænger af siden,
forsvinder. Et SVG-ikon, der peger ind i en sprite, som er defineret et andet
sted på siden, tegner ingenting i en læser, og W3C's tjeneste markerer selve
`svg`-elementet. Dette sites feeds får deres overskrifter uden brandets tandhjul
som skillelinje af den grund; kommentaren i den skabelon noterer, at validatoren
havde rapporteret tolv `Non-html tag: svg`-meddelelser og seks klager over en
`role`-attribut.

**Links inde i et indlæg fører ingen steder hen.** En abonnent følger et link i
et indlæg og lander på en side, der mangler, eller på ingenting. Et rodrelativt
link som `/da/notes/` virker på websiden, fordi browseren kender sidens adresse,
men et RSS-dokument kan ikke erklære en basis-URL. Profilen siger, at en
beskrivelse ikke bør indeholde relative URL'er, og at en aggregator kan forsøge
at opløse en imod kanalens `link`; en læser, der lader være, efterlader linket i
stykker. Skriv hvert link i et feeds HTML som en absolut URL.

**To kategorier med samme ord ligner én.** Et indlæg, der er mærket i to
vokabularer, viser et begreb to gange, eller en læser slår to begreber sammen,
der betyder noget forskelligt. RSS' `category`-element har en valgfri
`domain`-attribut, der navngiver det vokabular, et begreb kommer fra. Dette
sites RSS-skabelon skriver den på hver kategori, fordi de to vokabularers
overlappende begreber ellers ville ligne dubletter, som kommentaren siger.

## Læs mere

- [RSS 2.0 Specification](https://www.rssboard.org/rss-specification) — RSS
  Advisory Boards tekst til formatet, element for element, med køreplanen, der
  erklærer det frosset.
- [RSS Best Practices Profile](https://www.rssboard.org/rss-profile) — udvalgets
  anbefalinger og det, det fandt, da det testede rigtige aggregatorer.
- [RSS History](https://www.rssboard.org/rss-history) — hver version fra
  Netscapes 0.90 til den gældende tekst, med datoer og udgivere.
- [RDF Site Summary (RSS) 1.0](https://web.resource.org/rss/1.0/spec) — det
  selvstændige RDF-baserede format, der deler navnet.
- [RFC 822](https://www.rfc-editor.org/rfc/rfc822) — e-mailstandarden fra 1982,
  hvis syntaks for dato og klokkeslæt RSS stadig bruger.

<https://engineer.company/da/glossary/rss/>
