{
  "name": "FlowKit — Veille automatisée par email (gratuit)",
  "nodes": [
    {
      "parameters": {
        "content": "## Veille automatisée par email — FlowKit (gratuit)\nChaque matin à 8h : lecture de vos flux RSS, filtrage des dernières 24 h, synthèse par IA, digest envoyé dans votre boîte.\n\n3 réglages avant d'activer :\n1. Vos flux RSS dans « Liste des flux à surveiller »\n2. Votre credential OpenAI sur « Modèle OpenAI »\n3. Vos adresses + credential SMTP sur « Envoyer le digest par email »\n\nS'il n'y a aucun article nouveau, aucun email n'est envoyé.\n\nPlus de workflows prêts à importer : https://getflowkit.fr",
        "height": 340,
        "width": 440
      },
      "id": "7a1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
      "name": "Note — Fonctionnement",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-700, -380]
    },
    {
      "parameters": {
        "content": "## Le prompt fait le travail\nLe node « Rédiger la synthèse » contient un prompt complet : priorisation, regroupement par thème, liens cliquables. Adaptez-le à votre métier (mots-clés à surveiller, ton, langue).\n\nPour une veille hebdomadaire : passez le cron sur « 0 8 * * 1 » et FENETRE_HEURES à 168 dans « Garder les dernières 24 h ».",
        "height": 240,
        "width": 400
      },
      "id": "8b2d3e4f-5a6b-4c7d-9e8f-0a1b2c3d4e5f",
      "name": "Note — Personnalisation",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [260, -320]
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 8 * * *"
            }
          ]
        }
      },
      "id": "9c3e4f5a-6b7c-4d8e-0f9a-1b2c3d4e5f6a",
      "name": "Tous les matins à 8h",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [-680, 0]
    },
    {
      "parameters": {
        "jsCode": "// Ajoutez ou remplacez ici les flux RSS à surveiller (un par ligne).\nconst flux = [\n  \"https://blog.n8n.io/rss/\",\n  \"https://news.ycombinator.com/rss\",\n];\nreturn flux.map((url) => ({ json: { url } }));"
      },
      "id": "0d4f5a6b-7c8d-4e9f-1a0b-2c3d4e5f6a7b",
      "name": "Liste des flux à surveiller",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [-460, 0]
    },
    {
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {}
      },
      "id": "1e5a6b7c-8d9e-4f0a-2b1c-3d4e5f6a7b8c",
      "name": "Lire les flux RSS",
      "type": "n8n-nodes-base.rssFeedRead",
      "typeVersion": 1.1,
      "position": [-240, 0]
    },
    {
      "parameters": {
        "jsCode": "// Ne garde que les articles publiés ces dernières 24 h, sans doublons.\nconst FENETRE_HEURES = 24;\nconst limite = Date.now() - FENETRE_HEURES * 60 * 60 * 1000;\nconst vus = new Set();\nconst articles = [];\nfor (const item of $input.all()) {\n  const j = item.json;\n  const brut = j.isoDate || j.pubDate || j.pubdate || j.date;\n  const date = brut ? new Date(brut).getTime() : NaN;\n  if (Number.isFinite(date) && date < limite) continue;\n  const lien = j.link || \"\";\n  if (!lien || vus.has(lien)) continue;\n  vus.add(lien);\n  articles.push({\n    json: {\n      titre: j.title || \"(sans titre)\",\n      lien,\n      extrait: String(j.contentSnippet || j.content || \"\").replace(/<[^>]+>/g, \"\").slice(0, 300),\n      date: brut || \"\",\n    },\n  });\n}\n// Plafond pour maîtriser le coût en tokens.\nreturn articles.slice(0, 30);"
      },
      "id": "2f6b7c8d-9e0f-4a1b-3c2d-4e5f6a7b8c9d",
      "name": "Garder les dernières 24 h",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [-20, 0]
    },
    {
      "parameters": {
        "aggregate": "aggregateAllItemData",
        "options": {}
      },
      "id": "3a7c8d9e-0f1a-4b2c-4d3e-5f6a7b8c9d0e",
      "name": "Agréger les articles",
      "type": "n8n-nodes-base.aggregate",
      "typeVersion": 1,
      "position": [200, 0]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ 'Voici les articles collectés ces dernières 24 heures, au format JSON :\\n\\n' + JSON.stringify($json.data) }}",
        "messages": {
          "messageValues": [
            {
              "message": "Tu rédiges la veille quotidienne d'un professionnel francophone. On te fournit la liste JSON des articles publiés ces dernières 24 heures sur les flux qu'il surveille (titre, lien, extrait, date).\n\nRédige un digest en français, en HTML simple (uniquement <h3>, <p>, <ul>, <li>, <a>, <strong> — pas de <html>, <head> ni <body>) :\n\n1. Une phrase d'ouverture avec le nombre d'articles collectés.\n2. <h3>À lire en priorité</h3> : les 3 à 5 articles les plus importants. Pour chacun, un <li> avec le titre en lien cliquable (<a href=\"...\">) suivi d'une phrase expliquant pourquoi c'est intéressant.\n3. <h3>Le reste, en bref</h3> : regroupe les autres articles par thème, une ligne par thème avec les liens.\n\nRègles :\n- Réutilise exactement les liens fournis, n'invente aucun article ni aucune URL.\n- Maximum 25 lignes au total : synthétise, ne recopie pas tout.\n- Aucune introduction ni conclusion en dehors du format demandé."
            }
          ]
        }
      },
      "id": "4b8d9e0f-1a2b-4c3d-5e4f-6a7b8c9d0e1f",
      "name": "Rédiger la synthèse",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.5,
      "position": [420, 0]
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "id": "5c9e0f1a-2b3c-4d4e-6f5a-7b8c9d0e1f2a",
      "name": "Modèle OpenAI",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [420, 200]
    },
    {
      "parameters": {
        "fromEmail": "veille@votre-domaine.fr",
        "toEmail": "vous@votre-domaine.fr",
        "subject": "=Veille du {{ $now.toFormat('dd/LL/yyyy') }}",
        "emailFormat": "html",
        "html": "={{ $json.text }}",
        "options": {}
      },
      "id": "6d0f1a2b-3c4d-4e5f-7a6b-8c9d0e1f2a3b",
      "name": "Envoyer le digest par email",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [660, 0]
    }
  ],
  "connections": {
    "Tous les matins à 8h": {
      "main": [
        [
          {
            "node": "Liste des flux à surveiller",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Liste des flux à surveiller": {
      "main": [
        [
          {
            "node": "Lire les flux RSS",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Lire les flux RSS": {
      "main": [
        [
          {
            "node": "Garder les dernières 24 h",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Garder les dernières 24 h": {
      "main": [
        [
          {
            "node": "Agréger les articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Agréger les articles": {
      "main": [
        [
          {
            "node": "Rédiger la synthèse",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Modèle OpenAI": {
      "ai_languageModel": [
        [
          {
            "node": "Rédiger la synthèse",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Rédiger la synthèse": {
      "main": [
        [
          {
            "node": "Envoyer le digest par email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {},
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}
