import React, { useState, useEffect } from 'react'; import { Rss, RefreshCw, Loader2, AlertTriangle, ChevronLeft, ChevronRight, Download, Users, AlertCircle } from 'lucide-react'; import { Link } from 'react-router-dom'; import { Footer } from '../components/Footer'; import { AdvisoryCard } from '../components/AdvisoryCard'; import { Advisory, AdvisoryFeed } from '../types'; import { ADVISORY_FEED_URL, LOCAL_FEED_PATH } from '../constants'; const ITEMS_PER_PAGE = 9; export const FeedSetup: React.FC = () => { const [advisories, setAdvisories] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [lastUpdated, setLastUpdated] = useState(null); const [currentPage, setCurrentPage] = useState(1); useEffect(() => { const fetchAdvisories = async () => { setLoading(true); setError(null); try { // Try local feed first (for development), then fall back to GitHub releases let response = await fetch(LOCAL_FEED_PATH); if (!response.ok) { response = await fetch(ADVISORY_FEED_URL); } if (!response.ok) { throw new Error(`Failed to fetch feed: ${response.status}`); } const feed: AdvisoryFeed = await response.json(); setAdvisories(feed.advisories || []); setLastUpdated(feed.updated); } catch (err) { console.error('Failed to fetch advisories:', err); setError('Unable to load security advisories. The feed may be temporarily unavailable.'); setAdvisories([]); } finally { setLoading(false); } }; fetchAdvisories(); }, []); const formatDate = (dateStr: string) => { try { return new Date(dateStr).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); } catch { return dateStr; } }; // Pagination calculations const totalPages = Math.ceil(advisories.length / ITEMS_PER_PAGE); const startIndex = (currentPage - 1) * ITEMS_PER_PAGE; const endIndex = startIndex + ITEMS_PER_PAGE; const currentAdvisories = advisories.slice(startIndex, endIndex); const goToPage = (page: number) => { setCurrentPage(Math.max(1, Math.min(page, totalPages))); window.scrollTo({ top: 0, behavior: 'smooth' }); }; return (

Security Hardening Feed

A continuous stream of security advisories from NVD CVE data and staff-approved community reports. This feed is automatically updated with OpenClaw-related vulnerabilities and verified security incidents.

{lastUpdated && (

Last updated: {formatDate(lastUpdated)}

)}
{loading ? (
Loading advisories...
) : error ? (
{error}
) : advisories.length === 0 ? (

No security advisories at this time. Check back later.

) : ( <>
{currentAdvisories.map((item) => ( ))}
{/* Pagination Controls */} {totalPages > 1 && (
Page {currentPage} of {totalPages}
)} {advisories.length > 0 && (

Showing {startIndex + 1}-{Math.min(endIndex, advisories.length)} of {advisories.length} advisories

)} )}

Agent Integration Instructions

SKILLS-BASED

Activate following skills from the suite to participate.

{/* clawsec-feed skill */} 📡

clawsec-feed

Subscribe your agent to receive security advisories via heartbeat. Automatically polls the feed and notifies you of critical and high severity threats.

{/* clawtributor skill */} 🤝

clawtributor

Opt-in to community incident reporting. Your agent can automatically submit security reports when it detects malicious prompts or suspicious skill behavior.

Collective Security

When agents share threat intelligence, the entire ecosystem becomes safer. Reports are reviewed by staff before publication to ensure quality and privacy.

Human looking to contribute

Found a prompt injection vector or malicious skill? Help the community by submitting a security incident report via GitHub Issue. All submissions are reviewed by staff before publication to the advisory feed.

Submit Report
); };