server/docs/proposals/artikkel_publisering.md
vegard 74110e842c Dokumentasjon: oppdatert arkitektur, nye proposals og konsepter
Oppdatert basert på ekstern tilbakemelding. Nye proposals for
kildevern, podcasting 2.0, web clipper, waveforms, editor,
tekst-primitiv og avisvisning. Oppdatert meldingsboks med
slette-semantikk, entity resolution i kunnskapsgrafen, og
AI gateway med kildevern-modus.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 21:45:24 +01:00

194 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Forslag: Artikkel-publisering og publikasjonsmodell
## Idé
Utvide Sidelinja til en publiseringsplattform der individuelle skribenter og redaksjonelle team kan skrive, samarbeide på, og publisere tekster. Inspirert av Substack (individuell publisering), men med en kollaborativ og kuratorisk dimensjon: en tekst eies av noen, samarbeides med noen, og publiseres av én eller flere.
## Designfilosofi
### Vakre tekster
Sidelinja-artikler skal føles som noe mellom en Substack-essay og en akademisk publikasjon. Ingen sidebar-rot, ingen widget-helvete. Bare tekst, typografi og innhold.
**Prinsipper:**
- **Typografi først.** Seriffont for brødtekst (Georgia, Literata), god linjehøyde (1.61.8), komfortabel lesbredde (6075 tegn). Overskrifter i sans-serif for kontrast.
- **Luft.** Generøse marginer. Innholdet puster.
- **Mørk/lys.** Respekterer `prefers-color-scheme`. Begge moduser like gjennomtenkte.
- **Matematikk er førsteklasses.** KaTeX for LaTeX-notasjon, server-side-rendret.
- **Ingen visuell støy.** Metadata diskret plassert. Fokus er teksten.
**Inspirasjon:** Gwern.net (typografi + fotnoter), Distill.pub (interaktive figurer), Stratechery (ren leseopplevelse), Edward Tufte (informasjonstetthet uten rot).
### Teksten som primitiv
En artikkel er ikke en egen ting — den er en melding med `article_view` (se `tekst_primitiv.md`). Samme meldingsboks-filosofi: én primitiv, flere formål. Det som gjør dette til noe mer enn "bare en editor" er *publikasjonsmodellen*.
## Hvorfor er dette interessant?
### Publiseringslandskapet har et hull
De fleste plattformer tvinger deg til å velge:
- **Individuell blogg** (WordPress, Substack) — du skriver alene, du publiserer alene
- **Redaksjonelt fellesprosjekt** (nettavis, magasin) — alt er felles, individet forsvinner
Virkeligheten er mer nyansert:
- Individuelle skribenter skriver sitt eget
- Samarbeidende team gjør sin kollaborative greie
- Alle publiserer sitt eget (personlig feed/blogg)
- En redaktør/publikasjon kan *kuratere* — plukke opp individuelle tekster til en felles utgivelse
- Lesere abonnerer fast på noen skribenter, velger selektivt fra andre
Sidelinja kan modellere alt dette fordi primitiven er riktig: **en tekst eies av en forfatter, kan ha medforfattere, og kan publiseres i flere kontekster**.
### Naturlig forlengelse av eksisterende features
- Redaksjonen har chat, AI-behandling og kunnskapsgraf. Artikler er neste steg — fra intern diskusjon til publisert innhold.
- Grafkobling: en artikkel arver automatisk koblinger til temaer, aktører og episoder via `#`-mentions.
- SEO: podcast-innhold er vanskelig å søkemotor-indeksere. Artikler gir tekstlig innhold som rangerer.
- Show notes 2.0: kan bli fullverdige artikler med egne URL-er.
## Hva bygger den på?
- **Tekst-primitiv** (proposal) — `article_view`, WYSIWYG-editor, lagringsformat
- **Kunnskapsgraf** — artikkel er en melding (node) med edges til temaer/aktører
- **Personlig workspace** (proposal) — personlig publisering
- **Jobbkø** — AI-assistert skriving, faktasjekk, oppsummering
- **Caddy** — servering av publiserte artikler
## Skisse
### Publikasjonsmodellen
#### Publikasjon som node
En publikasjon er en ny `node_type` — en kuratert samling tekster med egen identitet:
```sql
ALTER TYPE node_type ADD VALUE 'publikasjon';
CREATE TABLE publications (
id UUID PRIMARY KEY REFERENCES nodes(id) ON DELETE CASCADE,
name TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE, -- URL-prefiks
description TEXT,
avatar_url TEXT,
owner_id TEXT REFERENCES users(authentik_id) ON DELETE SET NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
```
Typer publikasjoner:
- **Personlig feed** — implisitt, én per bruker, knyttet til personlig workspace
- **Redaksjonell publikasjon** — opprettet manuelt, flere kuratorer
- **Tematisk feed** — automatisk generert fra graf-spørringer ("alt tagget med #Skolepolitikk")
#### `PUBLISHED_IN`-edge
En tekst publiseres i en publikasjon via en graf-edge:
```sql
-- Ny relation_type: 'PUBLISHED_IN'
-- source_id = melding (artikkel)
-- target_id = publikasjon
-- origin = 'user' (forfatter publiserer selv) eller 'curator' (redaktør plukker opp)
-- context_id = NULL (eller referanse til kurateringsforespørsel)
```
En tekst kan ha flere `PUBLISHED_IN`-edges — publisert i forfatterens personlige feed *og* i redaksjonens magasin. Ingen kopiering — bare flere edges til samme node.
#### Samarbeid: medforfattere
En tekst har én `author_id` (eier) i `messages`. Medforfattere modelleres som:
```sql
-- Ny relation_type: 'CONTRIBUTED_BY'
-- source_id = melding (artikkel)
-- target_id = entitet (person) eller bruker-node
-- confidence = NULL
-- origin = 'user'
```
Medforfattere kan redigere teksten (tilgangskontroll i appkode). Kreditering vises i publisert artikkel.
### URL-struktur
```
sidelinja.org/@vegard/ → Vegards personlige feed
sidelinja.org/@vegard/skolepolitikk-2026 → Enkeltartikkel (personlig)
sidelinja.org/pub/sidelinja-magasinet/ → Redaksjonell publikasjon
sidelinja.org/pub/sidelinja-magasinet/artikkel-slug → Artikkel i publikasjon
sidelinja.org/feed/@vegard.xml → Personlig Atom-feed
sidelinja.org/feed/pub/sidelinja-magasinet.xml → Publikasjons-feed
```
### Kurateringsflyt
```
Forfatter skriver tekst i sitt workspace
→ Publiserer i personlig feed (@vegard/slug)
→ Redaktør ser teksten (følger forfatteren, eller finner via graf)
→ Redaktør "kuraterer" teksten til sin publikasjon
→ Ny PUBLISHED_IN-edge med origin: 'curator'
→ Teksten dukker opp i publikasjonens feed
→ Forfatter varsles, kan godkjenne/avslå
```
### Abonnementer
Lesere kan følge:
- En forfatter (personlig feed)
- En publikasjon (redaksjonell feed)
- Et tema (automatisk feed fra graf)
**Ekstern distribusjon:** Atom/RSS-feeds for alt. Ingen e-postavhengighet (anti-Substack). Lesere bruker sin egen feed-reader.
**Intern distribusjon (fremtidig):** Notifikasjoner i appen. Men RSS er minimum viable — funker fra dag 1 uten notifikasjonssystem.
### Innholdsformat og rendering
Se `tekst_primitiv.md` for editor og lagringsformat. Tillegg for publiserte artikler:
- **KaTeX server-side rendering** — `body_html` i `article_view` inneholder ferdig-rendret HTML med KaTeX. Ingen JavaScript for lesere.
- **Sidemerknad-fotnoter** (Tufte-stil) — vises i margen på brede skjermer (>1200px), popup på mobil.
- **Podcast-embeds** — `{{segment:uuid}}` rendrer innebygd lydspiller med transkripsjon.
- **OG-tags** — automatisk generert Open Graph-metadata per artikkel.
### Typografi-stack (CSS)
```
Brødtekst: Literata / Georgia / serif (1.6 linjehøyde, 6075ch bredde)
Overskrifter: Inter / system-ui / sans-serif (stramt, tydelig hierarki)
Kode: JetBrains Mono / monospace (med ligaturer)
Matematikk: KaTeX default (skalerer med brødtekst)
```
## Åpne spørsmål
### Publikasjonsmodell
- Bør en forfatter godkjenne at teksten kurateres av en publikasjon, eller er det implisitt tillatt?
- Kan en publikasjon ha eksklusivitet (teksten publiseres *bare* der)?
- Hvem eier kommentarfeltet på en kuratert tekst — forfatteren eller publikasjonen?
### Samarbeid
- Er `CONTRIBUTED_BY`-edge nok for medforfatterskap, eller trengs en egen `article_collaborators`-tabell med rolleinfo (forfatter, redaktør, korrekturleser)?
- Sanntids samredigering (Yjs) fra dag 1, eller auto-save + manuell koordinering?
### Kommentarer: to kanaler, én node
En publisert artikkel har to separate diskusjonsrom:
1. **Intern kontekst** — den opprinnelige `reply_to`-kjeden og workspace-channelen artikkelen tilhører. Usynlig utenfra. En artikkel som startet som et svar i #Mediepolitikk beholder hele den interne tråden — men den lekker aldri ut.
2. **Offentlig kommentarkanal** — en separat channel med `visibility: 'public'`, knyttet til artikkelen via `article_view.comment_channel_id`. Workspace-medlemmer ser begge kanaler. Publikum ser bare den offentlige.
Åpne spørsmål rundt offentlige kommentarer:
- Hvem kan kommentere? Anonymt, autentisert (Authentik), kun inviterte?
- Moderasjon: forfatter, workspace-admin, eller begge?
- Enkleste start: ingen offentlige kommentarer (read-only for publikum). Arkitekturen tillater det via nullable `comment_channel_id`, men det bygges først når behovet er reelt.
### Tematiske feeds
- Automatisk feed basert på graf-spørringer ("alle artikler med MENTIONS-edge til #Skolepolitikk") — er dette en publikasjon, eller et separat konsept?
- Trolig: en publikasjon med `type: 'auto'` og en lagret graf-spørring. Men det er et steg videre.
### Versjonering
- Bør publiserte artikler ha synlig versjonering (à la Wikipedia)? `message_revisions` gir historikk allerede, men det er et spørsmål om det eksponeres til lesere.
### Bilder og media
- Content-addressable via `media_files` (eksisterende), eller CDN?
- Bildeoptimalisering (responsive `srcset`) for publiserte artikler?
## Innsats: Middels-Stor
Datamodellen (publikasjoner, `PUBLISHED_IN`-edges) er overkommelig. Typografi og leseopplevelse krever CSS-arbeid. Kurateringsflyten er det mest komplekse — men kan bygges inkrementelt.
## Wow-faktor: Høy
Kombinasjonen av vakker typografi, individuelle forfattere, kollaborativt forfatterskap og kuratoriske publikasjoner — integrert med kunnskapsgraf og podcast-embeds — er noe som ikke finnes andre steder. En publiseringsplattform der en politisk analyse kan ha formler, lydklipp fra intervjuer, og koblinger til kunnskapsgrafen.
## Relasjon til andre proposals
- **Tekst-primitiv** — fundament: editor, `article_view`, lagringsformat
- **Personlig workspace** — kontekst: der individet skriver og publiserer fra
- Denne proposalen handler om *hva som skjer etter at teksten er skrevet* — publisering, kurasjon, distribusjon, leseopplevelse