This commit resolves all documentation issues identified in the comprehensive review: CRITICAL FIXES: - Renumbered duplicate ADRs to eliminate conflicts: * ADR-022-migration-race-condition-fix → ADR-037 * ADR-022-syndication-formats → ADR-038 * ADR-023-microformats2-compliance → ADR-040 * ADR-027-versioning-strategy-for-authorization-removal → ADR-042 * ADR-030-CORRECTED-indieauth-endpoint-discovery → ADR-043 * ADR-031-endpoint-discovery-implementation → ADR-044 - Updated all cross-references to renumbered ADRs in: * docs/projectplan/ROADMAP.md * docs/reports/v1.0.0-rc.5-migration-race-condition-implementation.md * docs/reports/2025-11-24-endpoint-discovery-analysis.md * docs/decisions/ADR-043-CORRECTED-indieauth-endpoint-discovery.md * docs/decisions/ADR-044-endpoint-discovery-implementation.md - Updated README.md version from 1.0.0 to 1.1.0 - Tracked ADR-021-indieauth-provider-strategy.md in git DOCUMENTATION IMPROVEMENTS: - Created comprehensive INDEX.md files for all docs/ subdirectories: * docs/architecture/INDEX.md (28 documents indexed) * docs/decisions/INDEX.md (55 ADRs indexed with topical grouping) * docs/design/INDEX.md (phase plans and feature designs) * docs/standards/INDEX.md (9 standards with compliance checklist) * docs/reports/INDEX.md (57 implementation reports) * docs/deployment/INDEX.md (deployment guides) * docs/examples/INDEX.md (code samples and usage patterns) * docs/migration/INDEX.md (version migration guides) * docs/releases/INDEX.md (release documentation) * docs/reviews/INDEX.md (architectural reviews) * docs/security/INDEX.md (security documentation) - Updated CLAUDE.md with complete folder descriptions including: * docs/migration/ * docs/releases/ * docs/security/ VERIFICATION: - All ADR numbers now sequential and unique (50 total ADRs) - No duplicate ADR numbers remain - All cross-references updated and verified - Documentation structure consistent and well-organized These changes improve documentation discoverability, maintainability, and ensure proper version tracking. All index files follow consistent format with clear navigation guidance. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
6.7 KiB
6.7 KiB
Syndication Architecture
Overview
StarPunk's syndication architecture provides multiple feed formats for content distribution, ensuring broad compatibility with feed readers and IndieWeb tools while maintaining simplicity.
Current State (v1.1.0)
┌─────────────┐
│ Database │
│ (Notes) │
└──────┬──────┘
│
┌──────▼──────┐
│ feed.py │
│ (RSS 2.0) │
└──────┬──────┘
│
┌──────▼──────┐
│ /feed.xml │
│ endpoint │
└─────────────┘
Target Architecture (v1.1.2+)
┌─────────────┐
│ Database │
│ (Notes) │
└──────┬──────┘
│
┌──────▼──────────────────┐
│ Feed Generation Layer │
├──────────┬───────────────┤
│ feed.py │ json_feed.py │
│ RSS/ATOM│ JSON │
└──────────┴───────────────┘
│
┌──────▼──────────────────┐
│ Feed Endpoints │
├─────────┬───────────────┤
│/feed.xml│ /feed.atom │
│ (RSS) │ (ATOM) │
├─────────┼───────────────┤
│ /feed.json │
│ (JSON Feed) │
└─────────────────────────┘
Design Principles
1. Format Independence
Each syndication format operates independently:
- No shared state between formats
- Failures in one don't affect others
- Can be enabled/disabled individually
2. Shared Data Access
All formats read from the same data source:
- Single query pattern for notes
- Consistent ordering (newest first)
- Same publication status filtering
3. Library Leverage
Maximize use of existing libraries:
feedgenfor RSS and ATOM- Native Python
jsonfor JSON Feed - No custom XML generation
Component Design
Feed Generation Module (feed.py)
Current Responsibility: RSS 2.0 generation Future Enhancement: Add ATOM generation function
# Pseudocode structure
def generate_rss_feed(notes, config) -> str
def generate_atom_feed(notes, config) -> str # New
JSON Feed Module (json_feed.py)
New Component: Dedicated JSON Feed generation
# Pseudocode structure
def generate_json_feed(notes, config) -> str
def format_json_item(note) -> dict
Route Handlers
Simple pass-through to generation functions:
@app.route('/feed.xml') # Existing
@app.route('/feed.atom') # New
@app.route('/feed.json') # New
Data Flow
- Request: Client requests feed at endpoint
- Query: Fetch published notes from database
- Transform: Convert notes to format-specific structure
- Serialize: Generate final output (XML/JSON)
- Response: Return with appropriate Content-Type
Microformats2 Architecture
Template Layer Enhancement
Microformats2 operates at the HTML template layer:
┌──────────────┐
│ Data Model │
│ (Notes) │
└──────┬───────┘
│
┌──────▼───────┐
│ Templates │
│ + mf2 markup│
└──────┬───────┘
│
┌──────▼───────┐
│ HTML Output │
│ (Semantic) │
└──────────────┘
Markup Strategy
- Progressive Enhancement: Add classes without changing structure
- CSS Independence: Use mf2-specific classes, not styling classes
- Validation First: Test with parsers during development
Configuration Requirements
New Configuration Variables
# Author information for h-card
AUTHOR_NAME = "Site Author"
AUTHOR_URL = "https://example.com"
AUTHOR_PHOTO = "/static/avatar.jpg" # Optional
# Feed settings
FEED_LIMIT = 50
FEED_FORMATS = "rss,atom,json" # Comma-separated
Performance Considerations
Caching Strategy
- Feed generation is read-heavy, write-light
- Consider caching generated feeds (5-minute TTL)
- Invalidate cache on note creation/update
Resource Usage
- RSS/ATOM: ~O(n) memory for n notes
- JSON Feed: Similar memory profile
- Microformats2: No additional server resources
Security Considerations
Content Sanitization
- HTML in feeds must be properly escaped
- CDATA wrapping for RSS/ATOM
- JSON string encoding for JSON Feed
- No script injection vectors
Rate Limiting
- Apply same limits as HTML endpoints
- Consider aggressive caching for feeds
- Monitor for feed polling abuse
Testing Architecture
Unit Tests
tests/
├── test_feed.py # Enhanced for ATOM
├── test_json_feed.py # New test module
└── test_microformats.py # Template parsing tests
Integration Tests
- Validate against external validators
- Test feed reader compatibility
- Verify IndieWeb tool parsing
Backwards Compatibility
URL Structure
/feed.xmlremains RSS 2.0 (no breaking change)- New endpoints are additive only
- Auto-discovery links updated in templates
Database
- No schema changes required
- All features use existing Note model
- No migration needed
Future Extensibility
Potential Enhancements
- Content negotiation on
/feed - WebSub (PubSubHubbub) support
- Custom feed filtering (by tag, date)
- Feed pagination for large sites
Format Support Matrix
| Format | v1.1.0 | v1.1.2 | v1.2.0 |
|---|---|---|---|
| RSS 2.0 | ✅ | ✅ | ✅ |
| ATOM | ❌ | ✅ | ✅ |
| JSON Feed | ❌ | ✅ | ✅ |
| Microformats2 | Partial | Partial | ✅ |
Decision Rationale
Why Multiple Formats?
- No Universal Standard: Different ecosystems prefer different formats
- Low Maintenance: Feed formats are stable, rarely change
- User Choice: Let users pick their preferred format
- IndieWeb Philosophy: Embrace plurality and interoperability
Why This Architecture?
- Simplicity: Each component has single responsibility
- Testability: Isolated components are easier to test
- Maintainability: Changes to one format don't affect others
- Performance: Can optimize each format independently