# RSS

## Hva det er

RSS er et XML-format for å publisere en feed: ett `channel`-element som
beskriver et nettsted og holder en liste med `item`-elementer, hvert av dem et
innlegg med en lenke, en dato og litt tekst, på en adresse som feedlesere henter
med jevne mellomrom. Spesifikasjonen skriver navnet ut som Really Simple
Syndication, mange kaller enhver feed en RSS-feed uansett format, og RSS 1.0,
RDF Site Summary, er et eget format bygd på RDF og ikke en tidligere versjon av
det som brukes i dag.

Formatet begynte hos Netscape, som publiserte RSS 0.90 i mars 1999 og 0.91 i
juli samme år. UserLand Software publiserte sin egen 0.91 i juni 2000, deretter
0.92 og, i august 2002, RSS 2.0. Berkman Klein Center ved Harvard Law School
publiserte 2.0.1, skrevet av Dave Winer, i juli 2003, og RSS Advisory Board har
forvaltet teksten siden, under en Creative Commons-lisens. Veikartet (roadmap)
til styret sier at formatet for alle praktiske formål er frosset ved 2.0.1.
Styret har publisert revisjoner av selve dokumentet siden, den gjeldende i mars
2009, men nye behov dekkes av utvidelser i egne XML-navnerom og ikke av nye
versjoner av RSS.

Et dokument er lite. Roten er et `rss`-element med et `version`-attributt som må
være `2.0`, og det holder én enkelt `channel`. Kanalen må ha `title`, `link` og
`description`. Hvert element i en oppføring er valgfritt, så lenge oppføringen
har minst en tittel eller en beskrivelse. Alt annet, fra `pubDate` og `guid` til
kanalens `image` og `ttl`, er der når en utgiver vil ha det:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Example Notes</title>
    <link>https://example.com/</link>
    <description>Short notes on running servers.</description>
    <item>
      <title>Moving the database</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>Why the move took one evening.</description>
    </item>
  </channel>
</rss>
```

## Hvorfor det er viktig

RSS er løst, og det er løsheten en utgiver må forstå. Elementet `description` i
en oppføring kan holde ren tekst eller HTML som er escapet inn i elementet, og
filen sier ikke hvilket av dem, så feedleseren avgjør. `guid` er valgfritt, så
uten den må en feedleser selv finne ut om en oppføring er ny. Datoer følger RFC
822, en standard for e-post fra 1982, som strenger som
`Sat, 17 Oct 2026 09:00:00 GMT` med engelske navn på dager og måneder, og
spesifikasjonen tillater fortsatt et årstall med to sifre. Formatet har heller
ikke noen måte å oppgi en base-URL på, så en relativ lenke inne i en oppføring
har ikke noe pålitelig å bli løst opp mot.

Svaret fra styret er RSS Best Practices Profile, publisert i oktober 2007:
anbefalinger for dokumenter som virker på tvers av det brede utvalget av
programvare som leser dem. Profilen ber om en `guid` på hver oppføring og om
absolutte URL-er i lenker og beskrivelser. Den melder at de eneste datoformene
hver aggregator den testet, håndterte, var i Universal Time, med `GMT`, `+0000`
eller `-0000` på slutten. Den dokumenterer også en `atom:link` med `rel="self"`
som navngir feedens egen adresse. En feed skrevet etter profilen overlater langt
mindre til gjetning hos leserne sine.

To utvidelser bærer det meste av det en moderne feed legger til. `atom:link`
låner det elementet fra Atom. `content:encoded`, fra en modul som først ble
skrevet for RSS 1.0, holder hele HTML-en til en oppføring. Profilen beskriver å
bruke begge sammen, hele teksten i `content:encoded` og et kortere sammendrag i
`description`, og fant at når en oppføring hadde begge, viste seks av de åtte
aggregatorene den testet `content:encoded` og overså sammendraget. Elementet
`enclosure` knytter en mediefil til en oppføring med tre påkrevde attributter:
adressen i `url`, lengden i bytes i `length` og MIME-typen i `type`.

At formatet er frosset, er også en styrke. Et format som ikke har endret seg
siden 2003, er et fast mål, og en feed skrevet etter det i dag blir lest av
programvare skrevet mot den samme teksten for mange år siden. Atom tetter de
fleste hullene over i selve spesifikasjonen, så argumentet for å publisere RSS i
tillegg handler om leserne og ikke om stringens: noen feedlesere tar bare imot
RSS, og en RSS-adresse som ble delt ut for mange år siden, blir fortsatt hentet.

## Slik ser det ut i praksis

Dette nettstedet publiserer RSS 2.0 på
`/index.xml`, og den norske utgaven på `/nb/index.xml`, ved siden av en
Atom-feed og en JSON Feed.
[Kolofonen forklarer hvorfor det finnes to XML-feeder](/nb/credits/): alle tre
har hele teksten, og det er to XML-feeder i stedet for én fordi noen feedlesere
bare tar imot ett av de to formatene, og det er ikke til å stole på hvilket. Den
samme siden lenker RSS-feeden til
[W3C Feed Validator](https://validator.w3.org/feed/), ved siden av Atom-feeden,
slik at hvem som helst kan kjøre sjekken selv i stedet for å ta nettstedet på
ordet.

Den andre siden,
[om å lese nettstedet fra en terminal](/nb/cli/),
behandler feedene som data. Den sier at porteføljen publiseres i tre formater,
hvert med hele teksten i hvert punkt og ikke bare en smakebit, og henter
RSS-feeden med ikke mer enn `curl`:

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

Den norske utgaven av den siden henter `/nb/index.xml` på samme måte, ved siden
av Atom-feeden og JSON Feed.

## Hvor det går galt

**Bildet til kanalen mangler, og validatoren protesterer.** En feedleser viser
ikke noe bilde ved siden av navnet på feeden, og W3C-tjenesten advarer om
bildeformatet. Elementet `image` i RSS er det strengeste bildeelementet i de tre
feedformatene: bare GIF, JPEG eller PNG, høyst 144 piksler bredt og 400 høyt. Et
delingskort for sosiale medier i WebP er feil fil for det. RSS-malen på dette
nettstedet lar i stedet `image` peke på PNG-ikonet på 144 piksler, og
kommentaren ved siden av noterer at WebP-kortet hadde gitt en
`ImageUrlFormat`-advarsel, som ble fanget opp da feeden ble sjekket på nytt med
validatoren etter endringen.

**Oppføringer sorteres i feil rekkefølge, og ingenting melder fra.** En
feedleser lister nye oppføringer under gamle, eller viser dem med feil dato.
Datoer i RSS er strenger, så en ISO 8601-dato, et feilstavet datomønster eller
et dagsnavn på et annet språk gir fortsatt velformet XML, og bare datoparseren i
feedleseren merker det. I Hugo skriver malmetoden `Format` på en dato engelske
navn, mens funksjonen `time.Format` lokaliserer dem; en `pubDate` på dansk er
ikke en RFC 822-dato. Dette nettstedet formaterer hver `pubDate` med metoden,
etter et datomønster som ligger i én delmal (partial) sammen med mønsteret til
Atom, og kommentaren der sier at en skrivefeil i ett av dem ikke gir et feilet
bygg, men en feed som parses og sorteres feil i feedleseren til en helt annen.

**Ikonene i et innlegg blir borte, og validatoren lister feil.** Hele teksten i
`content:encoded` forlater siden sin, så alt som er avhengig av siden, mangler.
Et SVG-ikon som peker inn i en sprite definert et annet sted på siden, tegner
ikke noe i en feedleser, og W3C-tjenesten flagger selve `svg`. Av den grunn får
feedene på dette nettstedet overskriftene sine uten skillelinjen med tannhjulet
fra merkevaren; kommentaren i den malen noterer at validatoren hadde rapportert
tolv `Non-html tag: svg`-meldinger og seks klager på et `role`-attributt.

**Lenker inne i et innlegg fører ingen steder.** En abonnent følger en lenke i
en oppføring og havner på en side som ikke finnes, eller ikke noe sted i det
hele tatt. En rotrelativ lenke som `/notes/` virker på nettsiden fordi
nettleseren kjenner adressen til siden, men et RSS-dokument kan ikke oppgi en
base-URL. Profilen sier at en beskrivelse ikke bør inneholde relative URL-er, og
at en aggregator kan prøve å løse en slik opp mot kanalens `link`; en feedleser
som ikke prøver, lar lenken være brutt. Skriv hver lenke i HTML-en til en feed
som en absolutt URL.

**To kategorier med samme ord ser ut som én.** En oppføring merket i to
vokabularer viser et begrep to ganger, eller en feedleser slår sammen to
begreper som betyr forskjellige ting. Elementet `category` i RSS tar et
valgfritt `domain`-attributt som navngir vokabularet et begrep kommer fra.
RSS-malen på dette nettstedet skriver det på hver kategori, fordi, som
kommentaren sier, de overlappende begrepene i de to vokabularene ellers ville
sett ut som duplikater.

## Les mer

- [RSS 2.0 Specification](https://www.rssboard.org/rss-specification)
  — teksten til RSS Advisory Board, element for element, med veikartet som
  erklærer formatet frosset.
- [RSS Best Practices Profile](https://www.rssboard.org/rss-profile)
  — anbefalingene fra styret, og hva det fant da det testet ekte aggregatorer.
- [RSS History](https://www.rssboard.org/rss-history)
  — hver versjon fra 0.90 hos Netscape til den gjeldende teksten, med datoer og
  utgivere.
- [RDF Site Summary (RSS) 1.0](https://web.resource.org/rss/1.0/spec)
  — det separate, RDF-baserte formatet som deler navnet.
- [RFC 822](https://www.rfc-editor.org/rfc/rfc822)
  — standarden for e-post fra 1982, med syntaksen for dato og tid som RSS
  fortsatt bruker.

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