AI-powered cybersecurity podcast summaries for CISOs, SOC teams, and security leaders.
ThreatIntelPod automatically:
- Monitors YouTube cybersecurity channels and playlists for new episodes (weekly)
- Sends you a Slack message for each new episode to approve or skip
- Fetches the transcript of approved episodes
- Uses AI to generate a structured summary with actionable takeaways
- Publishes the summary to your website automatically
YouTube RSS Feeds --> n8n (weekly scan) --> Slack Approval
|
[You click Approve]
|
Supadata API (transcript) --> OpenRouter (AI summary)
|
Push to GitHub --> GitHub Pages
You will need accounts (free or paid) on these services:
- GitHub (free) - hosts your website
- n8n (cloud or self-hosted) - runs the automation
- Supadata (paid, usage-based) - fetches YouTube transcripts
- OpenRouter (paid, usage-based) - AI summarization
- Slack (free) - approval notifications
- Go to github.com and sign in
- Click the + button in the top right corner, then New repository
- Name it
threatintelpod - Set it to Public (required for free GitHub Pages)
- Do NOT check "Add a README file" (we already have one)
- Click Create repository
Option A: Using GitHub's web interface (easiest)
- On your new empty repo page, click "uploading an existing file"
- Drag and drop the entire contents of the
threatintelpod/folder - Click Commit changes
Option B: Using the command line
cd threatintelpod
git init
git add .
git commit -m "Initial ThreatIntelPod setup"
git branch -M main
git remote add origin https://github.com/YOUR_USERNAME/threatintelpod.git
git push -u origin main- Go to your repo's Settings tab
- Click Pages in the left sidebar
- Under Source, select GitHub Actions
- The site will deploy automatically on the next push
Your site will be live at: https://YOUR_USERNAME.github.io/threatintelpod/
The n8n workflow needs a token to push summary files to your repo.
- Go to github.com/settings/tokens?type=beta
- Click Generate new token
- Name it
threatintelpod-n8n - Set expiration to 90 days (you'll need to renew it)
- Under Repository access, select Only select repositories and pick
threatintelpod - Under Permissions > Repository permissions, set Contents to Read and write
- Click Generate token
- Copy the token immediately - you won't see it again
Save this token somewhere safe. You'll enter it in n8n in Step 5.
- Go to supadata.ai and sign up
- Navigate to your dashboard / API keys section
- Create a new API key
- Copy and save it
- Go to openrouter.ai and sign up
- Go to Keys in your dashboard
- Create a new API key
- Copy and save it
- Add credits to your account ($5-10 is enough to start)
You need a Slack channel for approval notifications.
- In your Slack workspace, create a channel called
#threatintelpod-approvals - In n8n (next step), you'll connect your Slack workspace when configuring the workflow
- Log into your n8n instance
- Click + Add workflow (or New Workflow)
- Click the ... menu in the top right, then Import from file
- Select the file
n8n/workflow.jsonfrom this project - The workflow will appear with all 14+ nodes
You need to set up 3 credentials in n8n:
Slack:
- Click on the "Slack: Approve Episode?" node
- Click on Credential and select Create new
- Follow the OAuth flow to connect your Slack workspace
- Set the channel to
#threatintelpod-approvals
Supadata API Key:
- Click on the "Fetch Transcript (Supadata)" node
- In the Headers section, replace
YOUR_SUPADATA_API_KEYwith your actual API key
OpenRouter API Key:
- Click on the "Summarize with LLM" node
- In the Headers section, replace
YOUR_OPENROUTER_API_KEYwith your actual API key
GitHub Token:
- Click on the "Push to GitHub" node
- In the Headers section, replace
YOUR_GITHUB_PATwith your GitHub personal access token - In the URL field, replace
YOUR_GITHUB_USERNAMEwith your actual GitHub username
- In your GitHub repo, edit
hugo.toml - Replace
YOUR_GITHUB_USERNAMEin thebaseURLwith your actual GitHub username:baseURL = "https://YOUR_USERNAME.github.io/threatintelpod/"
- In n8n, click the Test workflow button (play icon)
- The workflow will:
- Fetch RSS feeds from all configured channels
- Find new videos
- Send Slack messages for approval
- Go to Slack and click Summarize on one of the messages
- Watch n8n process the transcript and push to GitHub
- Check your GitHub repo - a new file should appear in
content/episodes/ - Your website should rebuild and show the new episode within 2-3 minutes
Once testing works:
- In n8n, toggle the workflow to Active (the switch in the top right)
- The workflow will now run automatically every Monday at 9:00 AM
-
Find the channel's ID:
- Go to the YouTube channel page
- Open browser Developer Tools (F12)
- In the Console, run:
document.querySelector('link[rel="canonical"]')?.href - The channel ID is the
UC...part after/channel/
-
In n8n, open the "Load Feeds Config" Code node
-
Add a new entry to the
feedsarray:{ name: 'Channel Name', slug: 'channel-name', type: 'channel', id: 'UCxxxxxxxxxxxxxxxxxxxxxxxxx', category: 'news', description: 'What this channel covers' }
-
Save the node and the workflow
Same as above, but use type: 'playlist' and the playlist ID (starts with PL):
{
name: 'My Playlist',
slug: 'my-playlist',
type: 'playlist',
id: 'PLxxxxxxxxxxxxxxxxxxxxxxxxx',
category: 'mixed',
description: 'Curated playlist description'
}Delete the feed entry from the feeds array in the "Load Feeds Config" node.
- Click on the "Weekly Monday 9AM" Schedule Trigger node
- Change
triggerAtDay(0=Sunday, 1=Monday, ..., 6=Saturday) - Change
triggerAtHour(0-23)
- Click on the "Summarize with LLM" node
- In the JSON body, change the
modelfield - Available models: see openrouter.ai/models
- Recommended:
anthropic/claude-sonnet-4-20250514(good balance of quality and cost)
- Click on the "Summarize with LLM" node
- Edit the
systemmessage content in the JSON body - Modify the sections, instructions, or format as needed
Edit assets/css/main.css to change colors, fonts, or layout:
--accent-green: Primary accent color--accent-cyan: Secondary accent color--bg-primary: Main background color--bg-card: Card background color
- Check the specific node that failed (it will be highlighted in red)
- Click on the node to see the error message
- Common issues: expired API keys, rate limits, network timeouts
- Verify the Slack credential is connected and authorized
- Check that the channel name matches exactly (including the
#) - Ensure the Slack app/bot has been invited to the channel
- Go to your repo's Actions tab to check if the Hugo build succeeded
- If the build failed, click on the run to see the error log
- Common issue: YAML frontmatter syntax errors in the generated markdown
- Some videos don't have captions/transcripts available
- The workflow will send a Slack notification when this happens
- Consider using Supadata's
mode=autoparameter for AI-generated transcripts (costs more)
- The workflow includes a 3-second pause between transcript fetches
- If you still hit limits, increase the wait time in the "Rate Limit Pause" node
- The workflow tracks seen videos using n8n's static data
- If static data is lost (rare on n8n cloud), previously seen videos may reappear for approval
- Simply click Skip on any duplicates
| Service | Cost | Notes |
|---|---|---|
| GitHub Pages | Free | Public repos only |
| n8n Cloud | Free tier or ~$20/mo | Free tier has limited executions |
| Supadata | ~$0.001/transcript | Pay per use |
| OpenRouter (Claude) | ~$0.01-0.05/summary | Depends on transcript length |
Estimated monthly cost for 10-20 episodes: $1-5 for API calls + n8n hosting.
threatintelpod/
├── .github/workflows/deploy-hugo.yml - Auto-deploys site on push
├── assets/css/main.css - Dark cybersecurity theme
├── content/
│ ├── about.md - About page
│ └── episodes/ - Episode summaries (auto-generated)
│ ├── _index.md - Episodes list page config
│ └── *.md - Individual episode files
├── data/feeds.json - Reference copy of feed config
├── layouts/ - Hugo templates
├── static/images/ - Logo and favicon
├── n8n/workflow.json - Importable n8n workflow
├── hugo.toml - Hugo site configuration
└── README.md - This file
MIT License. Summaries are AI-generated and may contain inaccuracies. Always refer to the original episodes for authoritative information.