Hvad det gør
Miniflux samler dine kuraterede sikkerhedsfeeds, men rå feeds er støjende. Dette workflow lægger et intelligent filter ovenpå: en billig model screener for relevans, og kun det der består går videre til dyrere berigelse. Resultatet er et lavt-støj-flow af relevante, opsummerede security-nyheder.
Flow-overblik
To-trins screening: billig model frasorterer, dyr model beriger kun det relevante.
(1t)
Node-for-node
| # | Node | Type | Funktion |
|---|---|---|---|
| 1 | Schedule Trigger | scheduleTrigger | Kører hver time (juster interval efter feed-volumen) |
| 2 | Get Unread | httpRequest | GET /v1/entries?status=unread med X-Auth-Token-header |
| 3 | Split Entries | splitOut | Splitter entries-array til ét item pr. artikel |
| 4 | Screen | mistralAi (Small) | Billig relevans-vurdering, svarer struktureret JSON |
| 5 | Relevant? | if | Parser screening-JSON og forgrener på relevant |
| 6 | Enrich | mistralAi (Large) | Opsummerer relevante artikler til dansk intel-resume + IOCs |
| 7 | Mark Read | httpRequest | PUT /v1/entries sætter status read |
Importérbar JSON
n8n importKopiér nedenstående og indsæt i n8n via Workflows → ⋯ → Import from clipboard. Erstat credential-referencer og prompts med dine egne.
{
"name": "Miniflux News Screening",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 1
}
]
}
},
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.1,
"position": [
240,
300
]
},
{
"parameters": {
"url": "=https://rss.defencia.dk/v1/entries?status=unread&limit=100&direction=asc",
"options": {
"response": {
"response": {
"fullResponse": false
}
}
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-Auth-Token",
"value": "={{ $credentials.minifluxToken }}"
}
]
}
},
"name": "Get Unread (Miniflux)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
460,
300
]
},
{
"parameters": {
"fieldToSplitOut": "entries",
"options": {}
},
"name": "Split Entries",
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [
680,
300
]
},
{
"parameters": {
"modelId": "mistral-small-latest",
"messages": {
"values": [
{
"role": "system",
"content": "Du er en sikkerhedsanalytiker. Vurder om artiklen er relevant for trusselsovervaagning. Svar KUN med JSON: {\"relevant\": true/false, \"kategori\": \"...\", \"begrundelse\": \"...\"}"
},
{
"role": "user",
"content": "=Titel: {{ $json.title }}\nIndhold: {{ $json.content }}"
}
]
}
},
"name": "Screen (Mistral Small)",
"type": "n8n-nodes-base.mistralAi",
"typeVersion": 1,
"position": [
900,
300
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true
},
"conditions": [
{
"leftValue": "={{ JSON.parse($json.choices[0].message.content).relevant }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "true"
}
}
]
}
},
"name": "Relevant?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
1120,
300
]
},
{
"parameters": {
"modelId": "mistral-large-latest",
"messages": {
"values": [
{
"role": "system",
"content": "Sammenfat artiklen til et kort dansk threat-intel resume med IOCs hvis til stede."
},
{
"role": "user",
"content": "={{ $json.title }}\n{{ $json.content }}"
}
]
}
},
"name": "Enrich (Mistral Large)",
"type": "n8n-nodes-base.mistralAi",
"typeVersion": 1,
"position": [
1340,
220
]
},
{
"parameters": {
"method": "PUT",
"url": "=https://rss.defencia.dk/v1/entries",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-Auth-Token",
"value": "={{ $credentials.minifluxToken }}"
}
]
},
"sendBody": true,
"jsonBody": "={ \"entry_ids\": [ {{ $json.id }} ], \"status\": \"read\" }"
},
"name": "Mark Read (Miniflux)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1560,
300
]
}
],
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Get Unread (Miniflux)",
"type": "main",
"index": 0
}
]
]
},
"Get Unread (Miniflux)": {
"main": [
[
{
"node": "Split Entries",
"type": "main",
"index": 0
}
]
]
},
"Split Entries": {
"main": [
[
{
"node": "Screen (Mistral Small)",
"type": "main",
"index": 0
}
]
]
},
"Screen (Mistral Small)": {
"main": [
[
{
"node": "Relevant?",
"type": "main",
"index": 0
}
]
]
},
"Relevant?": {
"main": [
[
{
"node": "Enrich (Mistral Large)",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Read (Miniflux)",
"type": "main",
"index": 0
}
]
]
},
"Enrich (Mistral Large)": {
"main": [
[
{
"node": "Mark Read (Miniflux)",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
}
}
rss.defencia.dk. Den indlejrede token-reference er en placeholder — bind den til en rigtig n8n-credential, læg den aldrig i klartekst.Credentials
| Credential | Opsætning |
|---|---|
| Miniflux-token | Generér i Miniflux (Settings → API Keys). Gem som n8n header-auth-credential eller env-variabel — ikke inline i noden |
| Mistral API | n8n's Mistral-credential med din API-nøgle; bruges af både Screen- og Enrich-noden |
Tuning & udvidelser
| Justering | Effekt |
|---|---|
| Interval | Lavere = friskere nyheder, men flere API-kald. 1t er en god balance for ~71 feeds |
| limit | Hæv hvis feeds hober sig op mellem kørsler; pas på rate-limits på Mistral |
| Batching | Screen flere artikler i ét Mistral-kald for at spare tokens (kræver array-prompt) |
| Output | Tilføj en node efter Enrich: send til dashboard, Slack, e-mail eller en database-tabel |
| IOC-ekstraktion | Tilføj regex/Code-node der trækker IP'er, domæner, hashes ud af resumeet |
| Dedup | Miniflux's læst-status er din dedup — derfor markeres alt læst i begge grene |