# Webbflöde

## Vad det är

Ett webbflöde är en fil på en fast adress som listar en webbplats senaste poster i en form som
program kan läsa. Varje post har en rubrik, ett datum, en identifierare som aldrig ändras och oftast
själva texten, så att ett program kan hämta filen enligt ett schema och visa en människa bara det
som är nytt. Det kallas också syndikeringsflöde eller bara flöde, och många säger ”RSS-flöde” om
vilket som helst av dem, oavsett vilket format som ligger under.

Det som skiljer ett flöde från andra kanaler är åt vilket håll innehållet färdas. Ett nyhetsbrev
skjuts ut: utgivaren håller en lista med adresser och skickar till var och en. Ett flöde hämtas:
utgivaren lägger en enda fil på servern, och varje prenumerants flödesläsare hämtar den, jämför den
med kopian från förra gången och behåller de poster den inte har sett förut. Utgivaren får aldrig
veta vem som prenumererar, prenumeranten lämnar aldrig ut en e-postadress, och att sluta följa är
en fråga om att ta bort en rad i läsaren.

Tre format bär nästan alla flöden på webben. RSS 2.0 är XML, daterar sina poster i stilen från
RFC 822 (`Sat, 07 Sep 2002 00:00:01 GMT`) och förklaras fryst av sin egen specifikation. Atom,
publicerat av IETF som RFC 4287 i december 2005, är också XML och striktare: varje flöde och varje
post bär ett permanent `id` och en tidsstämpel i `updated` på formen från RFC 3339, och en
författare måste anges någonstans. JSON Feed, i version 1.1 sedan augusti 2020, säger samma saker i
JSON, för utvecklare som helst slipper tolka XML.

En sida talar om för program var dess flöden finns med element av typen `<link rel="alternate">` i
sidhuvudet, där vart och ett anger en mediatyp: `application/rss+xml`, `application/atom+xml` eller
`application/feed+json`. Det är så en läsare hittar flödet utifrån ingenting annat än webbplatsens
vanliga adress.

## Varför det spelar roll

Det första beslutet är om ett flöde ska publiceras överhuvudtaget. Ett flöde är ytterligare en
utdata att skriva mallar för, validera och hålla stabil i åratal, för en publik som är mindre än ett
socialt nätverks. Mot det står att det är den enda prenumerationskanal som inte kräver någon
plattform, något konto eller någon sändlista, och det finns ingen rankningsalgoritm mellan ett
inlägg och de personer som bad om att få se det.

Det andra beslutet gäller format. Vissa läsare tar bara RSS och andra bara Atom, och det går inte
att veta i förväg vilket en viss prenumerants läsare vill ha. Att publicera båda täcker luckan till
priset av en mall till, och JSON Feed lägger till ett tredje för program som skrivs av folk som
hellre hanterar JSON. Varje extra format är ännu en fil att hålla i takt: samma poster, samma
identifierare, samma datum.

Det tredje är hur mycket text varje post ska innehålla. Ett flöde med hela texten låter folk läsa
hela inlägget i sin läsare, vilket är en stor del av poängen med en läsare, och kostar utgivaren
sidvisningar. Ett flöde med bara sammanfattningar skickar varje läsare till webbplatsen för varje
post. Båda är försvarbara; valet står mellan hur långt texten når och hur ofta själva sidan besöks.

Oavsett svaren är adressen ett åtagande. Läsare frågar efter den URL de fick, enligt ett schema som
varje läsare väljer själv (RSS låter ett flöde föreslå ett intervall i minuter med `ttl`, och en
läsare får strunta i det), och många fortsätter att fråga i åratal. När en flödesadress väl är ute
stannar den.

## Så ser det ut i praktiken

Den här webbplatsen publicerar alla tre formaten från startsidan, på svenska under
`/sv/index.xml` (RSS), `/sv/atom.xml` (Atom) och `/sv/feed.json` (JSON Feed).
[Kolofonen listar flödena och de tjänster som kontrollerar dem](/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 det ena av dem
och ingen kan veta i förväg vilket. [W3C Feed Validator](https://validator.w3.org/feed/)
kontrollerar flödena i Atom och RSS, och [JSON Feed Validator](https://validator.jsonfeed.org/)
kontrollerar det tredje, som tjänsten från W3C inte täcker eftersom den är äldre än formatet.
Tjänsten från W3C varnar för att de flesta poster har samma ändringsdatum. Sidan behåller varningen
i stället för att dölja den: datumen kommer från historiken i git, och de flesta sidorna skrevs i
samma fåtal commits.

[Kontaktsidan erbjuder flödena som ett sätt att följa företaget utan konto](/sv/contact/),
bredvid dess sociala profiler, och upprepar att alla tre bär hela texten i allt som publiceras.

De tre flödena skrivs varken för hand eller på begäran. I
[projektet som byggde webbplatsen](/sv/portfolio/built-a-multilingual-static-site-in-hugo-126/)
genereras webbplatsen helt vid byggtid utan någon backend som körs. Samma innehållsträd ger varje
sida fyra versioner, och utöver dem lägger startsidan till tre syndikeringsflöden och ett manifest
för en installerbar applikation.

## Var det går fel

**Varje gammal post dyker upp igen som ny.** Efter en omdesign, ett domänbyte eller en ändrad mall
ser prenumeranterna dussintals poster som de läste för flera månader sedan. Läsare känner igen en
post på dess identifierare, `id` i Atom, `guid` i RSS eller `id` i JSON Feed, och när den strängen
ändras är posten ny för dem. RFC 4287 säger uttryckligen att en posts `id` ska överleva flytt,
migrering och återpublicering. En permalänk är en bra identifierare bara så länge webbplatsen lovar
att behålla den gamla strängen efter en flytt. Ange i RSS också vad `guid` är: specifikationen har
`isPermaLink` satt till true som standard, och den här webbplatsens mall för RSS skriver ändå ut
`isPermaLink="true"`, eftersom en läsare som gissar åt andra hållet importerar varje post på nytt
som en dubblett.

**Flödet påstår att det har ändrats vid varje bygge.** Datumet på flödesnivå flyttas varje gång
webbplatsen byggs om, oavsett om något har publicerats, så program som bevakar det datumet för att
hitta nyheter reagerar i onödan. Orsaken är en mall som stämplar klockan vid byggtid. RSS definierar
`lastBuildDate` som den senaste gången kanalens innehåll ändrades, och `updated` på flödesnivå i
Atom betyder samma sak, så datumet bör i stället hämtas från den nyaste posten. Den här webbplatsens
mall för Atom tar det från den nyaste posten av just det skälet.

**Flödet går inte längre att tolka efter en typografisk ändring.** Läsare rapporterar att flödet är
trasigt, och en validerare pekar på en odefinierad entitet i den första artikeln med ett
typografiskt citattecken. XML fördefinierar fem namngivna entiteter, `lt`, `gt`, `amp`, `apos` och
`quot`, medan HTML definierar hundratals fler. En Markdown-renderare som skriver citattecken och
tankstreck som de namngivna entiteterna från HTML producerar kod som fungerar i en sida men är
dödlig inuti ett XML-element. Escapa HTML-koden innan den läggs in, vilket är vad `type="html"` i
Atom förväntar sig, eller lägg den i en CDATA-sektion, vilket RSS Best Practices Profile tillåter
för `content:encoded`. Den här webbplatsens mall för Atom escapar sitt innehåll, och kommentaren
bredvid noterar att flödet inte gick att tolka alls när innehållet skrevs ut oescapat.

**Prenumeranter försvinner efter en flytt, och ingen hör om det.** Ett flöde har ingen knapp för att
avsluta prenumerationen och ingen lista som krymper, så det enda tecknet är tystnad. Flödets adress
har ändrats, eller filen har tagits bort, och varje läsare som frågar efter den gamla URL:en får nu
ett fel. Låt den gamla adressen fortsätta svara, antingen med själva flödet eller med en permanent
omdirigering. Den här webbplatsen behåller sitt RSS-flöde på `index.xml`, standardsökvägen i den
generator den byggs med, eftersom det är den adressen som befintliga läsare frågar efter; och på ett
språk som webbplatsen inte annonserar skriver den ändå välformade flöden med noll poster, så att en
läsare får ett giltigt dokument i stället för en 404.

**Två flöden smälter ihop till ett i en prenumerationsdialog.** Ett webbläsartillägg eller en läsare
erbjuder ett enda flöde där sidan anger två. Två alternativa länkar med samma typ och samma titel
ser för ett sådant verktyg ut som ett enda flöde, och det listar det som det såg sist. Ge varje länk
en egen titel; den här webbplatsens sidor namnger sina med webbplatsens namn följt av ”(RSS)”,
”(Atom)” eller ”(JSON Feed)”.

## Läs mer

- [RFC 4287: The Atom Syndication Format](https://www.rfc-editor.org/rfc/rfc4287) — standarden från
  IETF, med de obligatoriska elementen, permanenta identifierare och datum enligt RFC 3339.
- [RSS 2.0 Specification](https://www.rssboard.org/rss-specification) — texten till det frysta
  formatet från RSS Advisory Board, element för element.
- [JSON Feed Version 1.1](https://www.jsonfeed.org/version/1.1/) — samma idé uttryckt i JSON, och
  vad som ändrades sedan version 1.0.
- [HTML Standard: link type ”alternate”](https://html.spec.whatwg.org/multipage/links.html#link-type-alternate)
  — hur en sida pekar program till sina flöden.
- [W3C Feed Validation Service](https://validator.w3.org/feed/) — kontrollerar ett flöde i RSS
  eller Atom utifrån dess adress och förklarar varje varning.

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