AI Web FeedsAI Web FeedsOpen web AI reader
  • Guides
    Documentation

    GitHub Infrastructure

    Understanding the GitHub workflows, issue templates, and automation

    Source: apps/web/content/docs/guides/github-infrastructure.mdx

    GitHub Infrastructure

    The AI Web Feeds project includes comprehensive GitHub infrastructure for managing feed submissions, pull requests, and automated validation.

    Overview

    Our GitHub setup includes:

    • Issue Forms - Structured templates for feed submissions and bug reports
    • Pull Request Templates - Standardized PR descriptions with checklists
    • GitHub Actions - Automated validation, testing, and deployment
    • Scripts - Helper utilities for testing and validation

    Issue Templates

    Feed Submission Form

    The feed submission form (.github/ISSUE_TEMPLATE/feed-submission.yml) provides a structured way to submit new feeds to the registry.

    Features:

    • Validates feed URLs and site URLs
    • Ensures topic selection from canonical list
    • Collects metadata (language, format, source type)
    • Auto-labels issues as feed-submission
    • Automatically assigns to project board

    Fields:

    FieldTypeRequiredDescription
    Feed IDTextUnique identifier (slug format)
    Feed URLTextOptionalDirect RSS/Atom/JSON feed URL
    Site URLTextOptionalHomepage or section URL
    TitleTextDescriptive title for the feed
    TopicsDropdown1-6 canonical topics
    Source TypeDropdownblog, newsletter, podcast, etc.
    Content MediumsCheckboxesOptionaltext, audio, video, code, data
    LanguageTextOptionalISO 639-1 code (e.g., 'en')
    Feed FormatDropdownOptionalRSS, Atom, JSONFeed

    Usage Example:

    When a user submits a feed through the form:

    1. GitHub creates an issue with all structured data
    2. Issue is auto-labeled feed-submission
    3. Validation workflow can parse the issue body
    4. Approved submissions append to data/feeds.yaml

    Bug Report Template

    Standard bug report template (.github/ISSUE_TEMPLATE/bug-report.yml) for reporting issues.

    Fields:

    • Bug description
    • Steps to reproduce
    • Expected vs actual behavior
    • Environment details
    • Screenshots/logs

    Feature Request Template

    Feature request template (.github/ISSUE_TEMPLATE/feature-request.yml) for suggesting enhancements.

    Fields:

    • Feature description
    • Use case/motivation
    • Proposed solution
    • Alternatives considered

    Documentation Update

    Documentation template (.github/ISSUE_TEMPLATE/documentation.yml) for doc improvements.

    Fields:

    • Documentation area
    • Issue description
    • Proposed changes
    • Related pages/sections

    Pull Request Templates

    Standard PR Template

    Located at .github/pull_request_template.md, provides:

    Structure:

    • Description section with placeholder
    • Type of change checkboxes (bug fix, feature, docs, etc.)
    • Comprehensive checklist:
      • Code quality checks
      • Testing requirements
      • Documentation updates
      • Schema validation
      • Feed validation
      • Breaking changes review

    Checklist Items:

    ## Checklist
    
    ### Code Quality
    
    - [ ] Code follows project style guidelines
    - [ ] Self-review completed
    - [ ] Comments added for complex code
    - [ ] No new warnings generated
    
    ### Testing
    
    - [ ] Tests added/updated for changes
    - [ ] All tests pass locally
    - [ ] Edge cases covered
    
    ### Documentation
    
    - [ ] README updated (if needed)
    - [ ] API docs updated (if needed)
    - [ ] Changelog updated
    - [ ] Comments/docstrings added
    
    ### Feed Changes (if applicable)
    
    - [ ] Schema validation passes
    - [ ] Feed URLs validated
    - [ ] Topics match canonical list
    - [ ] No duplicate entries
    - [ ] Follows feeds.yaml format
    
    ### Breaking Changes
    
    - [ ] No breaking changes OR
    - [ ] Breaking changes documented
    - [ ] Migration guide provided

    GitHub Actions Workflows

    Feed Validation Workflow

    File: .github/workflows/validate-feeds.yml

    Triggers:

    • Manual dispatch (workflow_dispatch)
    • Pull requests modifying data/feeds.yaml
    • Issues with label feed-submission

    Jobs:

    1. Setup - Install Python, uv, dependencies
    2. Schema Validation - Validate against JSON schema
    3. Feed Validation - Check feed URLs are accessible
    4. Topic Validation - Verify topics exist in data/topics.yaml
    5. Comment Results - Post validation results to PR/issue

    Example Usage:

    name: Validate Feeds
    on:
      pull_request:
        paths:
          - "data/feeds.yaml"
      workflow_dispatch:
    
    jobs:
      validate:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v4
          - name: Validate Schema
            run: |
              uv run python -c "
              import json, yaml
              from jsonschema import validate
    
              with open('data/feeds.yaml') as f:
                  feeds = yaml.safe_load(f)
              with open('data/feeds.schema.json') as f:
                  schema = json.load(f)
    
              validate(instance=feeds, schema=schema)
              print('✅ Schema validation passed')
              "

    Feed Status Checker

    File: .github/workflows/check-feed-status.yml

    Purpose: Periodically check all feeds in the registry for availability and update status.

    Schedule: Runs weekly (configurable)

    Features:

    • Checks HTTP status codes
    • Validates feed format
    • Updates curation.status field
    • Creates issues for broken feeds
    • Updates feed metadata

    Status Values:

    • verified - Feed is accessible and valid
    • unverified - Feed not yet checked
    • archived - Feed intentionally archived
    • inactive - Feed returns 404 or other error

    Helper Scripts

    Local Feed Submission Testing

    File: scripts/test-feed-submission.py

    Test feed submissions locally before creating a GitHub issue.

    Usage:

    # Test a feed submission
    python scripts/test-feed-submission.py \
      --id "example-blog" \
      --feed "https://example.com/feed.xml" \
      --title "Example Blog" \
      --topics "ml" "nlp" \
      --source-type "blog"
    
    # Test with site URL (discovery)
    python scripts/test-feed-submission.py \
      --id "example-site" \
      --site "https://example.com" \
      --discover \
      --title "Example Site" \
      --topics "research"

    Features:

    • ✅ Validates feed ID format
    • ✅ Checks feed URL accessibility
    • ✅ Validates topics against canonical list
    • ✅ Verifies JSON schema compliance
    • ✅ Checks for duplicate entries
    • ✅ Previews YAML output
    • ✅ Optionally appends to feeds.yaml

    Output:

    🔍 Validating feed submission...
    
    ✅ Feed ID 'example-blog' is valid
    ✅ Feed URL is accessible (200 OK)
    ✅ Topics are valid
    ✅ Schema validation passed
    ✅ No duplicate entry found
    
    📝 Preview of article:
    ---
    - id: "example-blog"
      feed: "https://example.com/feed.xml"
      title: "Example Blog"
      topics: ["ml", "nlp"]
      source_type: "blog"
      meta:
        updated: "2025-10-15"
        contributor: "your-github-username"
    
    💾 Append to data/feeds.yaml? [y/N]:

    GitHub Infrastructure Setup

    File: scripts/setup-github-infra.sh

    One-command setup for all GitHub infrastructure.

    Usage:

    bash scripts/setup-github-infra.sh

    Actions:

    1. Creates .github/ directory structure
    2. Generates all issue templates
    3. Creates PR templates
    4. Sets up workflows
    5. Configures GitHub settings (via API)

    Requirements:

    • GitHub CLI (gh) for API access
    • Repository write permissions

    Configuration Files

    Issue Template Configuration

    File: .github/ISSUE_TEMPLATE/config.yml

    Controls the "New Issue" experience:

    blank_issues_enabled: false
    contact_links:
      - name: 💬 Discussions
        url: https://github.com/wyattowalsh/ai-web-feeds/discussions
        about: Ask questions and discuss with the community
      - name: 📖 Documentation
        url: https://aiwebfeeds.w4w.dev/docs
        about: Read the documentation

    Best Practices

    For Contributors

    1. Use Issue Templates - Don't create blank issues
    2. Test Locally First - Use test-feed-submission.py before submitting
    3. Follow Schema - Ensure submissions match feeds.schema.json
    4. Check Duplicates - Search existing feeds before submitting
    5. Provide Context - Add notes explaining the feed's value

    For Maintainers

    1. Review Automation - Check workflow runs regularly
    2. Update Status - Keep feed status current
    3. Merge Carefully - Ensure validation passes before merging
    4. Document Changes - Update changelog for significant changes
    5. Monitor Issues - Respond to submissions promptly

    Automation Workflow

    Feed Submission Lifecycle

    Weekly Status Check

    Troubleshooting

    Common Issues

    Issue: "Schema validation failed"

    Solution:

    # Validate schema locally
    uv run python -c "
    import json, yaml
    from jsonschema import validate
    
    with open('data/feeds.yaml') as f:
        feeds = yaml.safe_load(f)
    with open('data/feeds.schema.json') as f:
        schema = json.load(f)
    
    try:
        validate(instance=feeds, schema=schema)
        print('✅ Valid')
    except Exception as e:
        print(f'❌ Error: {e}')
    "

    Issue: "Feed URL not accessible"

    Solution:

    # Test feed URL
    curl -I https://example.com/feed.xml
    
    # Check with Python through uv
    uv run python -c "
    import requests
    resp = requests.get('https://example.com/feed.xml', timeout=10)
    print(f'Status: {resp.status_code}')
    print(f'Content-Type: {resp.headers.get(\"content-type\")}')
    "

    Issue: "Topics not found in canonical list"

    Solution:

    # List valid topics
    cat data/topics.yaml | grep "^  - id:"
    
    # Or use Python through uv
    uv run python -c "
    import yaml
    with open('data/topics.yaml') as f:
        topics = yaml.safe_load(f)
    print('Valid topics:', [t['id'] for t in topics.get('topics', [])])
    "

    API Integration

    GitHub CLI Examples

    # Create feed submission issue
    gh issue create \
      --title "Add: Example Feed" \
      --body-file issue-body.md \
      --label "feed-submission"
    
    # List feed submissions
    gh issue list --label "feed-submission"
    
    # Approve and close
    gh issue close 123 --comment "Merged in PR #456"

    GitHub Actions Context

    Access issue data in workflows:

    - name: Parse Feed Submission
      run: |
        echo "${{ github.event.issue.body }}" | \
        python scripts/parse-issue-body.py > feed-data.json

    Future Enhancements

    Planned improvements:

    • Automated feed testing in PR checks
    • RSS/Atom feed preview in PR comments
    • Feed health scoring automation
    • Duplicate detection in CI
    • Auto-categorization with ML
    • Feed analytics dashboard
    • Community voting system
    GitHub Infrastructure | AI Web Feeds