Skip to content

SOFA Automated Pipeline Process

Overview

SOFA (Simple Organized Feed for Apple Software Updates) runs an automated data pipeline that processes Apple's software update information every 6 hours, generates structured feeds, and updates the dashboard with the latest information about macOS, iOS, tvOS, watchOS, visionOS, and Safari updates.

Schedule & Frequency

The pipeline runs automatically via GitHub Actions with a dual schedule:

Primary Schedule

  • Frequency: Every 6 hours daily
  • Schedule: 00:30, 06:30, 12:30, 18:30 UTC
  • Cron: 30 */6 * * *

Intensive Schedule

  • Frequency: Hourly during peak hours
  • Schedule: Monday-Friday, 17:00-20:00 CET (15:00-18:00 UTC)
  • Cron: 0 17-20 * * 1,2,3,4,5

Additional Details

  • Duration: ~10-15 minutes per run
  • Manual Trigger: Available via GitHub Actions UI
  • On-Demand: Can be triggered by workflow completion or manually

Pipeline Architecture

┌─────────────────┐
│  GitHub Action  │ ◄── Triggered by:
└────────┬────────┘     • Schedule (cron: '0 */6 * * *')
         │               • Manual dispatch (workflow_dispatch)
         │               • Workflow completion (workflow_run)
         │               • Code changes (push to scripts/config)

┌─────────────────┐
│  Prepare Stage  │ ◄── Check for changes, get SOFA CLI version
└────────┬────────┘     Determine if pipeline should run


┌─────────────────┐
│ Download Bins   │ ◄── Download fresh SOFA CLI binaries
└────────┬────────┘     Extract to bin/, cache for reuse


┌─────────────────────────────────────────────────────┐
│                   GATHER STAGE                       │
├─────────────────────────────────────────────────────┤
│  Uses sofa-gather to collect raw data:              │
│  • KEV Catalog - Known Exploited Vulnerabilities    │
│  • GDMF - Apple Global Device Management Feed       │
│  • IPSW API - iOS/iPadOS firmware information       │
│  • XProtect - Apple security definitions            │
│  • Beta feeds - Developer/public beta releases      │
│  • UMA Catalog - Unified Mac Analytics              │
└────────┬──────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────┐
│                   FETCH STAGE                        │
├─────────────────────────────────────────────────────┤
│  Uses sofa-fetch to enrich data:                    │
│  • Scrapes Apple security release pages             │
│  • Extracts CVE details and security content        │
│  • Downloads HTML cache for faster future runs      │
│  • Processes release notes and package information   │
└────────┬──────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────┐
│                   BUILD STAGE                        │
├─────────────────────────────────────────────────────┤
│  Uses sofa-build to generate feeds:                 │
│  • v1 format feeds (legacy compatibility)           │
│  • v2 format feeds (enhanced structure)             │
│  • Platform-specific JSON files for each OS         │
│  • SHA-256 hashes for data verification             │
│  • Timestamp metadata and status tracking           │
└────────┬──────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────┐
│                 RSS GENERATION                       │
├─────────────────────────────────────────────────────┤
│  Uses generate_rss.py to create feeds:              │
│  • RSS XML feed for subscribers                     │
│  • Includes latest security updates                 │
│  • XProtect definition updates                      │
│  • Beta release notifications                       │
└────────┬──────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────┐
│                  COMMIT RESULTS                      │
├─────────────────────────────────────────────────────┤
│  Commits changes if any:                            │
│  • Downloads all pipeline artifacts                 │
│  • Commits data/feeds/ and data/resources/          │
│  • Professional commit messages with timestamps     │
│  • Push to main branch triggers site rebuild        │
└────────┬──────────────────────────────────────────────┘


┌─────────────────┐
│   Dashboard     │ ◄── Updates reflect in ~5 minutes
│   Updates       │     Shows live feed status via API
└─────────────────┘

Key Components

SOFA CLI Binaries (Auto-Downloaded)

BinaryPurposeStage
sofa-gatherCollect data from Apple APIsGather
sofa-fetchScrape security pages and enrich dataFetch
sofa-buildGenerate JSON feeds and bulletin dataBuild
sofa-cveProcess CVE data (optional)CVE

Generated Files

LocationKey FilesDescriptionUpdate Frequency
v1/macos_data_feed.json
ios_data_feed.json
safari_data_feed.json
tvos_data_feed.json
watchos_data_feed.json
visionos_data_feed.json
rss_feed.xml
timestamp.json
Legacy format feeds, RSS, and metadataEvery run with changes
v2/macos_data_feed.json
ios_data_feed.json
safari_data_feed.json
tvos_data_feed.json
watchos_data_feed.json
visionos_data_feed.json
Enhanced format feeds with CVE detailsEvery run with changes
data/resources/bulletin_data.json
sofa-status.json
apple_security_releases.json
apple_cves_with_context.ndjson
kev_catalog.json
apple_beta_feed.json
gdmf_cached.json
ipsw.json
uma_catalog.json
xprotect.json
Dashboard data, security releases, CVE database, and external data sourcesEvery successful run

Dashboard Status Integration

The pipeline creates sofa-status.json to show data freshness on the dashboard:

StatusIndicatorConditionSource
Live🟢 GreenUpdated within 1 hourStatus file timestamps
Recent🟡 YellowUpdated within 24 hoursPipeline update times
Stale🔴 RedOver 24 hours oldAge calculation
Offline⚫ GrayNo data availableFailed data fetch

Last updated: 2025-08-31
Pipeline Version: 2.0-beta
SOFA CLI Version: v0.1.3-rc

Released under the Apache 2.0 License.

🔍 Data Source Debug

Current Page Data Sources:
Global Configuration:
  • Base URL: /
  • Environment: production
  • Feed Version: v2
Active Components:
Data Directories:
  • /v2/data/feeds/v2/
  • /v1/data/feeds/v1/
  • /resources/data/resources/