# Roadmap — Mörkgröna fonder hos Swedbank

Mål: en liten, snabb, statisk webapp som visar de mest framgångsrika SFDR
artikel 9-fonderna ("mörkgröna") som går att köpa via Swedbank, rangordnade
efter historisk avkastning, med tydlig källredovisning per datapunkt.

Status: 2026-05-05, MVP under uppbyggnad.

---

## Fas 1 — Research och datainsamling

**Mål:** En verifierad lista med ≥10 kandidater till "mörkgröna" fonder som är
köpbara via Swedbank.

Källor i prioritetsordning:
1. **Swedbank Robur** (`swedbankrobur.se`) — fondbolagets egna fondsidor anger
   både SFDR-klassning och faktablad. Robur har störst utbud av artikel 9 hos
   Swedbank.
2. **spara.swedbank.se / swedbank.se/.../fonder.html** — verifierar
   *köpbarhet* via Swedbank för varje fond. Många fonder är JS-renderade, så
   vi använder fondbolagets sida primärt och Swedbanks sida för
   tillgänglighetsverifiering.
3. **Morningstar (`morningstar.se`)** — neutrala avkastningssiffror,
   risknivåer och avgift (KIID/PRIIPS). Där tillgängligt.
4. **Fondmarknaden / Avanza / Pensionsmyndigheten** — kompletterande
   datapunkter när en av ovan saknas.
5. **Faktablad (KID/KIID PDF)** — sista verifiering på avgift, risknivå och
   SFDR-statement.

Kandidater att kontrollera (start-set, ej accepterade utan ny verifiering):
- Swedbank Robur Global Impact A
- Swedbank Robur Humanfond
- Swedbank Robur Climate Impact A
- Swedbank Robur Climate Bond A
- Swedbank Robur Climate Bond High Yield A

Sök även:
- Andra Robur-fonder med "Impact", "Climate", "Sustainable", "Transition"
- Externa fondbolag som är artikel 9 *och* finns i Swedbanks utbud (t.ex.
  Handelsbanken Hållbar Energi, Storebrand Global Solutions, BGF Sustainable
  Energy etc. — verifieras case-by-case).

Output: arbetslista i `research/notes.md` med URL per påstående.

## Fas 2 — Datamodell och verifiering

Datafil: `data/funds.json`. Varje fond:

```jsonc
{
  "name": "string",                      // Fondens officiella namn
  "isin": "string|null",
  "company": "string",                   // Fondbolag
  "type": "Aktiefond|Räntefond|Blandfond|Övrigt",
  "sfdrArticle": 9 | 8 | null,
  "sfdrConfidence": "confirmed|candidate", // confirmed = direkt källa till art.9
  "darkGreenReason": "string",           // varför mörkgrön
  "ethicalReason": "string",             // varför etisk
  "return5y": number|null,               // % årlig snittavkastning, eller total — fält "returnBasis" anger
  "return3y": number|null,
  "return1y": number|null,
  "returnBasis": "annualized|cumulative",
  "returnAsOf": "YYYY-MM-DD",
  "fee": number|null,                    // årlig avgift i %
  "risk": number|null,                   // 1-7 SRRI/SRI
  "links": {
    "swedbank": "url|null",
    "company": "url|null",
    "kid": "url|null"
  },
  "sources": {                           // URL per kritisk datapunkt
    "sfdr": "url",
    "returns": "url",
    "fee": "url",
    "risk": "url",
    "swedbankAvailability": "url"
  },
  "fetchedAt": "YYYY-MM-DD",
  "notes": "string|null"                 // osäkerhet, saknad data, varningar
}
```

Verifieringsregler:
- `sfdrArticle: 9` + `sfdrConfidence: "confirmed"` kräver direkt citat eller
  länk till fondbolagets sida/KID som säger artikel 9. Annars `"candidate"`.
- Ranking-fält (5y/3y/1y) kräver källa i `sources.returns`.
- En fond utan verifierad Swedbank-länk *kan* visas men flaggas i `notes`.

## Fas 3 — MVP-design

Stack: vanilla HTML + CSS + JS (ingen build-step). Hostas på GitHub Pages.

Skäl: snabbast till live, inga dependencies att underhålla, JSON kan
uppdateras direkt.

UI-principer:
- Mörk bakgrund (#0d1117-ish), ljus text, dämpad grön accent (#3fb950)
- Header med titel + kort förklaring
- Disclaimer-banner: "Historisk avkastning är ingen garanti..."
- Filter-rad: fondtyp, fondbolag, max avgift, max risk, min 5y-avkastning
- Sortering: 5y / 3y / 1y / avgift / risk / namn
- Sektioner i ordning: Aktiefonder, Räntefonder, Kort historik
- Per fond ett kort med:
  - Namn + fondbolag + ISIN
  - SFDR-badge (grön = confirmed art.9, gul = candidate)
  - Avkastningstabell (5y/3y/1y)
  - Avgift, risk
  - "Mörkgrön för att…" och "Etisk för att…"
  - Källor som klickbara chips (varje datapunkt)
  - Knappar: "Hos Swedbank", "Fondbolagets sida", "Faktablad"
- "Datum hämtat" syns på varje fond.

## Fas 4 — Implementation

Filer som skapas:

```
roadmap.md
README.md
.gitignore
index.html
styles.css
app.js
data/funds.json
research/notes.md
```

Implementationssteg:
1. `index.html` — semantiskt skelett, header/main/footer, filter-bar,
   sektioner.
2. `styles.css` — dark theme, grid/cards, badges, ansvarsfullt med grönt.
3. `app.js` — fetch JSON, render, filter, sort. Vanilla, inga libs.
4. `data/funds.json` — initial verifierad dataset (start: 5–10 fonder, väx
   efterhand).
5. `README.md` — vad sidan är, hur urvalet gjorts, hur datan hämtas, hur
   man lägger till/ändrar fonder, live-länk.

## Fas 5 — Publicering / live

1. `git init` i `Swedbank fonder/`
2. Commit
3. `gh repo create gitjoda71/swedbank-morkgrona-fonder --public --source=. --push`
4. Aktivera GitHub Pages från `main` branch, root.
5. Verifiera live-URL.
6. Uppdatera README med live-länk.

## Fas 7 — "Vad fonderna finansierar" (projekt/mottagare)

**Mål:** Visa 3–5 konkreta exempel på vart pengarna i de mörkgröna fonderna
faktiskt går — bolag fonderna äger aktier i, projekt gröna obligationer
finansierar, eller välgörenhetsmottagare via Humanfonden.

**Valt fokus (v1, 2026-05-06):** Spår 1 (publika holdings) + Spår 3 (Humanfond-
donationer). Spår 2 (use of proceeds för enskilda gröna obligationer) skippas i
v1 — fondrapporterna anger emittent men inte projekt-nivå.

**Shortlist (verifierad mot fondsidan 2026-04-30):**

| # | Mottagare | Spår | Fond | Källa-koll |
|---|---|---|---|---|
| 1 | Iberdrola SA (vind/sol, ES) | Investering | Global Impact A 3.32 %, Climate Impact A 3.43 % | swedbankrobur.fondlista.se topp-innehav |
| 2 | Delta Electronics Inc (effektelektronik, TW) | Investering | Global Impact A 3.02 %, Climate Impact A 3.79 % | swedbankrobur.fondlista.se topp-innehav |
| 3 | Scatec ASA (sol-utvecklare, NO) | Investering (high yield green bond-emittent) | Climate Bond High Yield A 1.82 % | swedbankrobur.fondlista.se topp-innehav |
| 4 | Naturskyddsföreningen | Humanfond-donation | Humanfond | swedbank.se anslutna-organisationer |
| 5 | Barncancerfonden | Humanfond-donation | Humanfond | swedbank.se anslutna-organisationer |

**Risker:**
- Bolagsvikter ändras månadsvis — datum-stämpel måste finnas i datan.
- Per-organisation-belopp i Humanfonden är inte publikt nedbrutet (totalt 54 mkr
  delades ut Hjärtedagen 2026); skriver "okänt" per mottagare.
- Use of proceeds för Scatec-obligationen verifierad endast på emittent-nivå —
  exakt projekt anges som "ej offentligt i fondrapport".

**Definition of Done v1:**
- [x] Roadmap-fas skriven
- [ ] `data/projects.json` finns och validerar som JSON
- [ ] Ny sektion "Vad fonderna finansierar" renderas på sidan
- [ ] Varje rad har klickbar länk till organisationens egen hemsida
- [ ] Varje rad har klickbar källa till fondbolagets/Swedbanks bekräftelse
- [ ] Live-URL verifierad efter push

## Fas 8 — Mini-projektlista per fondkort + projektspecifika org-URL:er

**Status:** påbörjad 2026-05-07.

### Mål
1. Varje fondkort visar de projekt/mottagare ur `data/projects.json` vars
   `funds[]`-array innehåller fondens namn — som en kompakt klickbar lista
   (max 3 rader). Klick scrollar till motsvarande rad i tabellen och
   highlightar den i ~2 s.
2. Uppgradera `orgLink` i `data/projects.json` från landingpages till
   projektspecifika undersidor på respektive organisations egen domän.
   Lägg till nya fält `orgLinkLabel` + `projectPeriod`.

### Vad som ingår i v1 vs v2

**v1 (ska in i första pushen):**
- Mini-listan i fondkortet renderas, är keyboard-accessible och scrollar
  till tr-id med `scrollIntoView({behavior:"smooth", block:"center"})`.
- Tabellraden får CSS-klass `.row-highlight` i ~2 s med pulserande
  `--accent-soft → --accent-strong`-bakgrund via `@keyframes`.
- Varje `<tr>` får `id="project-${p.id}"`.
- Sticky-offset: scroll med ~80 px luft i toppen så att eventuell sticky
  header inte täcker raden.
- Stack ner snyggt på mobil (font-size 12, ingen sidoscroll).
- Minst **2 av 5** `orgLink` uppgraderade till projektspecifika URL:er.

**v2 (efter v1-push):**
- Resten (3 av 5) `orgLink` uppgraderade.
- `orgLinkLabel` + `projectPeriod` tillagda för alla 5.
- README + research/notes.md uppdaterade med curl-verifieringen.

### Kandidater per projekt — research-plan

| # | Projekt | Aktuell orgLink | Kandidat-URL till projekt | Verifieringsmetod |
|---|---|---|---|---|
| 1 | Iberdrola SA | iberdrola.com (landing) | iberdrola.com/about-us/our-activities/offshore-wind/wikinger-offshore-wind-farm eller liknande namngiven anläggning | curl -sI HTTP 200 + grep "Wikinger\|Offshore" |
| 2 | Delta Electronics | deltaww.com (landing) | deltaww.com/.../ev-charging eller .../solar-pv-inverters | curl -sI HTTP 200 + grep "EV\|inverter" |
| 3 | Scatec ASA | scatec.com (landing) | scatec.com/projects/<namngiven park> | curl -sI HTTP 200 + grep park-namn |
| 4 | Naturskyddsföreningen | naturskyddsforeningen.se (landing) | undersida om Hjärtedagen/Humanfond-stöd om finns, annars behåll landing | curl-grep "humanfond\|hjärtedagen" |
| 5 | Barncancerfonden | barncancerfonden.se (landing) | undersida om Humanfond/företagsstöd om finns, annars behåll landing | curl-grep "humanfond\|swedbank" |

### Tekniska beslut
- Mini-listan renderas inuti `renderCard(f)` i `app.js`, hämtar projekt
  från `state.projects.filter(p => p.funds.includes(f.name))` sorterade
  efter `organization` A–Ö.
- Klickhanterare: en delegerad listener på `<main>` som matchar
  `[data-project-id]`, scrollar och stoppar default-href hash-navigeringen
  så att vi kan justera offset + lägga till highlight-klassen.
- Kort utan projekt: `<section class="mini-projects">` döljs (ingen
  rubrik renderas).
- Tillgänglighet: `<a href="#project-{id}">` med riktig hash så att även
  middle-click / "öppna i ny flik" fungerar.

### Definition of Done

**v1:**
- [ ] Mini-listan synlig i fondkortet för minst 3 fonder (Global Impact,
      Climate Impact, Climate Bond High Yield, Humanfond).
- [ ] Klick scrollar till rätt rad och pulsar i ~2 s.
- [ ] Tab + Enter fungerar (keyboard-accessibility).
- [ ] `data/projects.json` validerar som JSON.
- [ ] Live-curl visar `id="project-..."` i HTML och mini-list-länkar i
      någon fond-card.

**v2:**
- [ ] ≥3 av 5 `orgLink` är projektspecifika sidor på org:s egen domän.
- [ ] `orgLinkLabel` + `projectPeriod` (eller null + förklaring) finns
      för alla 5.
- [ ] research/notes.md har curl-output per uppgraderad URL.
- [ ] README nämner mini-list-funktionen.

## Fas 6 — Förbättringar och möjlig automatisering

Ej blockande för MVP. Kandidater:
- Automatisk hämtning av Robur-faktablad via deras katalog (om stabil).
- Morningstar-skrapning av avkastning (kontroversiellt, ToS — utvärdera).
- Cron/GitHub Action som öppnar PR vid förändringar.
- Filter "endast confirmed art.9".
- "Senast verifierad"-badge per fond, varna om >90 dagar gammal.
- Stöd för export (CSV).

## Risker och osäkerheter

| Risk | Hantering |
|---|---|
| Swedbanks fondsida är JS-renderad → svårt att skrapa | Använd fondbolagets sida + KID som primär källa, Swedbank för köpbarhet |
| Avkastningssiffror skiljer sig mellan källor (cum vs annualized, SEK vs EUR, datum) | Lagra `returnBasis` + `returnAsOf` + källa per fond, jämför inte fonder med olika basis okommenterat |
| SFDR-omklassificering: en fond kan ha *varit* art.9 men nedgraderats till art.8 | Kräv färsk källa (≤6 mån); flagga annars som "candidate" |
| "Etisk" är subjektivt | Definiera operativt: explicit hållbarhetsmål + exkluderingar (vapen, fossila, kontroversiella) ELLER tydlig social/klimat-inriktning |
| Andra fondbolags fonder kanske inte är köpbara hos Swedbank | Verifiera *varje* mot spara.swedbank.se eller markera tydligt om okänt |
| Hallucination | Aldrig skriva en siffra utan källa. Saknad data = `null` + `notes` |

## Definition of Done (MVP)

- [ ] `roadmap.md` finns
- [ ] `data/funds.json` har minst 5 fullt verifierade fonder med källor per kritisk datapunkt
- [ ] Webappen renderar listan, filtrerar, sorterar
- [ ] Aktie- och räntefonder visas separat
- [ ] Disclaimer syns
- [ ] Källor är klickbara chips
- [ ] Confirmed art.9 vs candidate är visuellt åtskilda
- [ ] Sidan körs lokalt utan fel
- [ ] Repot finns på GitHub som publikt
- [ ] GitHub Pages live, URL i README
- [ ] README förklarar urval, datakällor och hur man uppdaterar
