# RSS

## Vad det är

RSS är ett XML-format för att publicera ett webbflöde: ett element `channel` som beskriver en
webbplats och rymmer en lista med element `item`, där var och en är en post med en länk, ett datum
och lite text, på en adress som flödesläsare hämtar med jämna mellanrum. Specifikationen skriver ut
namnet som Really Simple Syndication, många säger ”RSS-flöde” om ett flöde i vilket format som
helst, och RSS 1.0, ”RDF Site Summary”, är ett separat format byggt på RDF snarare än en tidigare
version av det som används i dag.

Formatet började hos Netscape, som publicerade RSS 0.90 i mars 1999 och 0.91 i juli samma år.
UserLand Software publicerade en egen 0.91 i juni 2000, sedan 0.92 och, i augusti 2002, RSS 2.0.
Berkman Klein Center vid Harvard Law School publicerade 2.0.1, skriven av Dave Winer, i juli 2003,
och RSS Advisory Board har förvaltat texten sedan dess, under en Creative Commons-licens. Rådets
färdplan säger att formatet i alla praktiska avseenden är fryst vid 2.0.1. Rådet har sedan dess
publicerat revisioner av dokumentet, den aktuella i mars 2009, men nya behov möts av tillägg i egna
XML-namnrymder snarare än av nya versioner av RSS.

Ett dokument är litet. Roten är ett element `rss` vars attribut `version` måste vara `2.0`, och det
rymmer en enda `channel`. Kanalen behöver en `title`, en `link` och en `description`. Varje element
i en post är valfritt, så länge posten har åtminstone en titel eller en beskrivning. Allt annat,
från `pubDate` och `guid` till kanalens `image` och `ttl`, finns där när en utgivare vill 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>
```

## Varför det spelar roll

RSS är löst specificerat, och det är just lösheten som en utgivare behöver förstå. En posts
`description` kan innehålla ren text eller HTML som har escapats in i elementet, och ingenting i
filen säger vilket, så det är läsaren som avgör. Elementet `guid` är valfritt, så utan det får en
läsare själv räkna ut om en post är ny. Datum följer RFC 822, en standard för e-post från 1982, som
strängar som `Sat, 17 Oct 2026 09:00:00 GMT` med engelska namn på dagar och månader, och
specifikationen tillåter fortfarande ett tvåsiffrigt årtal. Dessutom saknar formatet ett sätt att
ange en bas-URL, så en relativ länk inne i en post har inget pålitligt att lösas upp mot.

Rådets svar är RSS Best Practices Profile, publicerad i oktober 2007: rekommendationer för dokument
som fungerar i det breda utbud av programvara som läser dem. Profilen ber om en `guid` på varje post
och om absoluta URL:er i länkar och beskrivningar. Den rapporterar att de enda datumformer som varje
testad aggregator klarade var angivna i universell tid, med `GMT`, `+0000` eller `-0000` på slutet.
Den dokumenterar också en `atom:link` med `rel="self"` som anger flödets egen adress. Ett flöde som
följer profilen lämnar mycket mindre åt läsarna att gissa.

Två tillägg står för det mesta som ett modernt flöde lägger till. `atom:link` lånar det elementet
från Atom. `content:encoded`, från en modul som först skrevs för RSS 1.0, rymmer en posts
fullständiga HTML. Profilen beskriver hur de två används tillsammans, med hela texten i
`content:encoded` och en kortare sammanfattning i `description`, och fann att sex av de åtta
aggregatorer som testades visade `content:encoded` och struntade i sammanfattningen när en post bar
båda. Elementet `enclosure` bifogar en mediefil till en post med tre obligatoriska attribut: filens
`url`, dess `length` i byte och dess MIME-`type`.

Att formatet är fryst är också en styrka. Ett format som inte har ändrats sedan 2003 är ett fast
mål, och ett flöde som skrivs mot det i dag läses av programvara som skrevs mot samma text för flera
år sedan. Atom täpper till de flesta av luckorna ovan genom sin specifikation, så skälet att också
publicera RSS handlar om läsarna snarare än om stringens: vissa tar bara emot RSS, och en RSS-adress
som delades ut för flera år sedan hämtas fortfarande.

## Så ser det ut i praktiken

Den här webbplatsen publicerar RSS 2.0 på `/index.xml`, bredvid ett Atom-flöde och ett flöde i
formatet JSON Feed. [Kolofonen förklarar varför det finns två XML-flöden](/sv/credits/): alla tre
bär hela texten, och det finns två XML-flöden i stället för ett eftersom vissa läsare bara tar emot
det ena av de två och man ”inte kan lita på att det är ett visst av dem”. Samma sida länkar
RSS-flödet till [W3C Feed Validator](https://validator.w3.org/feed/), bredvid Atom-flödet, så att
vem som helst kan köra kontrollen utan att behöva ta webbplatsens ord för något.

[Sidan om att läsa webbplatsen från en terminal](/sv/cli/) behandlar flödena som data. Den säger att
portföljen publiceras i tre format, vart och ett med hela texten för varje post i stället för en
försmak, och hämtar RSS-flödet med bara `curl`:

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

## Var det går fel

**Kanalens bild saknas, och validatorn invänder.** En läsare visar ingen bild bredvid flödets namn,
och W3C:s tjänst varnar för bildformatet. RSS-elementet `image` är det striktaste bildelementet av
de tre flödesformaten: bara GIF, JPEG eller PNG, högst 144 pixlar brett och 400 högt. Ett
delningskort för sociala medier i WebP är fel fil för det. Den här webbplatsens RSS-mall låter i
stället `image` peka på webbplatsens ikon i PNG på 144 pixlar, och kommentaren bredvid noterar att
WebP-kortet hade gett varningen `ImageUrlFormat`, något som upptäcktes genom att validera igen efter
ändringen.

**Poster sorteras i fel ordning, och ingenting rapporterar det.** En läsare listar nya poster under
gamla, eller visar dem med fel datum. Datum i RSS är strängar, så ett datum i ISO 8601, en felstavad
layout eller ett dagnamn på ett annat språk ger fortfarande välformad XML, och bara läsarens
datumtolk märker något. I en Hugo-mall skriver metoden `Format` på ett datum ut engelska namn, medan
funktionen `time.Format` lokaliserar dem, och ett `pubDate` på svenska eller danska är inte ett
datum enligt RFC 822. Den här webbplatsen formaterar varje `pubDate` med metoden, utifrån en layout
som hålls i en enda partiell mall tillsammans med Atoms, och kommentaren där säger att ett stavfel i
någon av dem inte är ett byggfel utan ett flöde som tolkas och sorteras fel i någon annans läsare.

**Ikoner i ett inlägg visas inte, och validatorn listar fel.** Hela texten i `content:encoded`
lämnar sin sida, så allt som är beroende av sidan försvinner. En SVG-ikon som pekar in i en sprite
som definieras någon annanstans på sidan visar ingenting i en läsare, och W3C:s tjänst flaggar
själva `svg`. Därför får den här webbplatsens flöden sina rubriker utan varumärkets avdelare med
kugghjulet. Kommentaren i den mallen noterar att validatorn hade rapporterat tolv meddelanden om
`Non-html tag: svg` och sex klagomål på ett attribut `role`.

**Länkar i ett inlägg leder ingenstans.** En prenumerant följer en länk i en post och hamnar på en
sida som saknas, eller ingenstans alls. En rotrelativ länk som `/notes/` fungerar på webbsidan
eftersom webbläsaren känner till sidans adress, men ett RSS-dokument kan inte ange en bas-URL.
Profilen säger att en beskrivning inte bör innehålla relativa URL:er och att en aggregator kan
försöka lösa upp en sådan mot kanalens `link`. En läsare som inte försöker lämnar länken trasig.
Skriv varje länk i ett flödes HTML som en absolut URL.

**Två kategorier med samma ord ser ut som en.** En post som har taggats i två vokabulärer visar en
term två gånger, eller så slår en läsare ihop två termer som betyder olika saker. RSS-elementet
`category` tar ett valfritt attribut `domain` som anger vilken vokabulär en term kommer från. Den
här webbplatsens RSS-mall skriver ut det på varje kategori, eftersom de två vokabulärernas
överlappande termer annars skulle läsas som dubbletter, som mallens kommentar säger.

## Läs mer

- [RSS 2.0 Specification](https://www.rssboard.org/rss-specification)
  — RSS Advisory Boards text för formatet, element för element, med färdplanen som förklarar det
  fryst.
- [RSS Best Practices Profile](https://www.rssboard.org/rss-profile)
  — rådets rekommendationer och vad det fann när det testade verkliga aggregatorer.
- [RSS History](https://www.rssboard.org/rss-history)
  — varje version från Netscapes 0.90 till den aktuella texten, med datum och utgivare.
- [RDF Site Summary (RSS) 1.0](https://web.resource.org/rss/1.0/spec)
  — det separata, RDF-baserade formatet som delar namnet.
- [RFC 822](https://www.rfc-editor.org/rfc/rfc822)
  — standarden för e-post från 1982 vars syntax för datum och tid RSS fortfarande använder.

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