12 Commits

Author SHA1 Message Date
3222620cee release: Bump version to 1.3.0
Some checks failed
Build Container / build (push) Failing after 12s
Promoting v1.3.0-rc.1 to stable release.

Changes:
- Updated version in starpunk/__init__.py to 1.3.0
- Updated CHANGELOG.md header to v1.3.0

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-10 12:19:11 -07:00
247eb34c36 Merge feature/v1.3.0-tags-microformats into main
Release candidate v1.3.0-rc.1 with tags/categories and enhanced Microformats2 support.

Major features:
- Complete tag/category system with Micropub support
- Strict Microformats2 compliance (p-category, h-feed properties)
- Tag archive pages at /tags/{tag}
- Enhanced h-entry markup with dt-updated
- Proper h-feed structure on collection pages

Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-10 12:01:09 -07:00
41b65703f9 docs: Add v1.3.1 and v1.4.0 release definitions
v1.3.1 "Syndicate Tags":
- RSS/Atom/JSON Feed category/tag support

v1.4.0 "Media":
- Micropub media endpoint (W3C compliant)
- Large image support (>10MB auto-resize)
- Enhanced feed media (image variants, full Media RSS)

Also adds tag-filtered feeds to backlog at medium priority.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-10 12:00:56 -07:00
f901aa2242 docs: Update project plan files 2025-12-10 11:58:45 -07:00
5ca8b7e9b4 release: Bump version to 1.3.0-rc.1
Release candidate for v1.3.0 with tags/categories and enhanced Microformats2 support.

Features:
- Tag/category system with Micropub support
- Strict Microformats2 compliance (p-category, h-feed)
- Tag archive pages
- Enhanced h-entry markup

Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-10 11:58:10 -07:00
3d80e1af51 test(microformats): Add v1.3.0 validation tests for tags and h-feed
Phase 4: Validation per microformats-tags-design.md

Added test fixtures:
- published_note_with_tags: Creates note with test tags for p-category validation
- published_note_with_media: Creates note with media for u-photo placement testing

Added v1.3.0 microformats2 validation tests:
- test_hfeed_has_required_properties: Validates name, author, url per spec
- test_hfeed_author_is_valid_hcard: Validates h-card structure
- test_hentry_has_pcategory_for_tags: Validates p-category markup
- test_uphoto_outside_econtent: Validates u-photo placement per draft spec

Test results:
- All 18 microformats tests pass
- All 116 related tests pass (microformats, notes, micropub)
- Confirms Phases 1-3 implementation correctness

Updated BACKLOG.md with tag-filtered feeds feature (medium priority)

Implementation report: docs/design/v1.3.0/2025-12-10-phase4-implementation.md

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-10 11:51:39 -07:00
372064b116 feat(tags): Add tag archive route and admin interface integration
Implement Phase 3 of v1.3.0 tags feature per microformats-tags-design.md:

Routes (starpunk/routes/public.py):
- Add /tag/<tag> archive route with normalization and 404 handling
- Pre-load tags in index route for all notes
- Pre-load tags in note route for individual notes

Admin (starpunk/routes/admin.py):
- Parse comma-separated tag input in create route
- Parse tag input in update route
- Pre-load tags when displaying edit form
- Empty tag field removes all tags

Templates:
- Add tag input field to templates/admin/edit.html
- Add tag input field to templates/admin/new.html
- Use Jinja2 map filter to display existing tags

Implementation details:
- Tag URL parameter normalized to lowercase before lookup
- Tags pre-loaded using object.__setattr__ pattern (like media)
- parse_tag_input() handles trim, dedupe, normalization
- All existing tests pass (micropub categories, admin routes)

Per architect design:
- No pagination on tag archives (acceptable for v1.3.0)
- No autocomplete in admin (out of scope)
- Follows existing media loading patterns

Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-10 11:42:16 -07:00
377027e79a feat(templates): Add microformats2 h-feed and p-category markup for tags
Implement Phase 2 of v1.3.0 per microformats-tags-design.md

Template Updates:
- templates/index.html: Add h-feed properties (u-url, enhanced p-author with u-photo/p-note, feed-level u-photo)
- templates/index.html: Add p-category markup with rel="tag" to note previews
- templates/note.html: Add p-category markup with rel="tag" for tags
- templates/note.html: Enhance author h-card with u-photo and p-note (hidden for parsers)
- templates/note.html: Document u-photo placement outside e-content per draft spec
- templates/tag.html: Create new tag archive template with h-feed structure

Key Decisions Applied:
- Tags ordered alphabetically by display_name (ready for backend)
- rel="tag" on all p-category links per microformats2 spec
- Author bio (p-note) hidden with display: none for semantic parsing
- Dual u-photo elements intentional for parser compatibility
- Graceful fallback when author photo/bio not available

Templates are backward compatible and ready for backend integration.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-10 11:35:11 -07:00
f10d0679da feat(tags): Add database schema and tags module (v1.3.0 Phase 1)
Implements tag/category system backend following microformats2 p-category specification.

Database changes:
- Migration 008: Add tags and note_tags tables
- Normalized tag storage (case-insensitive lookup, display name preserved)
- Indexes for performance

New module:
- starpunk/tags.py: Tag management functions
  - normalize_tag: Normalize tag strings
  - get_or_create_tag: Get or create tag records
  - add_tags_to_note: Associate tags with notes (replaces existing)
  - get_note_tags: Retrieve note tags (alphabetically ordered)
  - get_tag_by_name: Lookup tag by normalized name
  - get_notes_by_tag: Get all notes with specific tag
  - parse_tag_input: Parse comma-separated tag input

Model updates:
- Note.tags property (lazy-loaded, prefer pre-loading in routes)
- Note.to_dict() add include_tags parameter

CRUD updates:
- create_note() accepts tags parameter
- update_note() accepts tags parameter (None = no change, [] = remove all)

Micropub integration:
- Pass tags to create_note() (tags already extracted by extract_tags())
- Return tags in q=source response

Per design doc: docs/design/v1.3.0/microformats-tags-design.md

Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-10 11:24:23 -07:00
927db4aea0 release: Bump version to 1.2.0
Some checks failed
Build Container / build (push) Failing after 1m52s
Promote v1.2.0-rc.2 to stable v1.2.0 release

- Merged rc.1 and rc.2 changelog entries
- Updated version in starpunk/__init__.py
- All features tested in production

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-10 08:39:54 -07:00
27501f6381 feat: v1.2.0-rc.2 - Media display fixes and feed enhancements
## Added
- Feed Media Enhancement with Media RSS namespace support
  - RSS enclosure, media:content, media:thumbnail elements
  - JSON Feed image field for first image
- ADR-059: Full feed media standardization roadmap

## Fixed
- Media display on homepage (was only showing on note pages)
- Responsive image sizing with CSS constraints
- Caption display (now alt text only, not visible)
- Logging correlation ID crash in non-request contexts

## Documentation
- Feed media design documents and implementation reports
- Media display fixes design and validation reports
- Updated ROADMAP with v1.3.0/v1.4.0 media plans

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-09 14:58:37 -07:00
10d85bb78b fix: Apply correlation filter to handlers for proper multi-logger support
Fixes logging errors during app initialization and in background threads.
The correlation_id filter must be applied to handlers (not just loggers)
to ensure all log records have the correlation_id attribute before
formatting occurs.

Issue: Gunicorn workers were crashing due to missing correlation_id
in logs from memory monitor and other non-request contexts.
2025-11-28 16:22:12 -07:00
242 changed files with 7340 additions and 11294 deletions

View File

@@ -7,9 +7,71 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [1.2.0-rc.1] - 2025-11-28
## [1.3.0] - 2025-12-10
### Added
- **Tag/Category System** - Complete tag support with hierarchical organization
- Tag creation and management via web UI and Micropub
- Support for Micropub `category` property in JSON and form-encoded requests
- Tag archive pages at `/tags/{tag}` with all tagged notes
- Tag cloud display on homepage showing all used tags
- Tag filtering in database queries (list_notes_by_tag)
- Reserved tag validation (prevents tags like 'api', 'admin', etc.)
- Comprehensive tag management in admin dashboard
- Database schema: tags table with slug and name fields
- Many-to-many relationship between notes and tags
- Automatic tag cleanup (removes orphaned tags)
- **Strict Microformats2 Compliance** - Enhanced h-entry markup for parsers
- p-category property for each tag in note markup
- dt-updated property displays when note is modified
- dt-published always shown for temporal context
- u-uid property matches u-url for permalink stability
- Proper h-feed structure on homepage and tag archives
- p-name property only when note has explicit title (# heading)
- e-content wraps full note content
- Nested h-card for author within each h-entry
- Homepage displays as complete h-feed with feed properties
- **h-feed Properties** - Proper feed markup on collection pages
- Homepage marked as h-feed with p-name "Recent Notes"
- Tag archive pages marked as h-feed with descriptive p-name
- Each feed contains multiple h-entry items
- Feed structure validates with Microformats2 parsers
- Supports feed readers and IndieWeb aggregators
### Changed
- **Template Structure** - Reorganized for better Microformats2 compliance
- Homepage template now wraps entries in proper h-feed
- Note display templates use semantic h-entry markup
- Tag display integrated throughout note views
- Consistent Microformats2 patterns across all pages
### Technical Details
- Migration 006: Add tags table and note_tags junction table
- New module: `starpunk/tags.py` with tag CRUD operations
- Enhanced: `starpunk/notes.py` with tag relationship handling
- Enhanced: `starpunk/micropub.py` with category property support
- Enhanced: Templates with p-category and h-feed markup
- All tests passing (580+ tests)
- 100% backward compatible with existing notes
## [1.2.0] - 2025-12-09
### Added
- **Feed Media Enhancement** - Media RSS and JSON Feed image support for improved feed reader compatibility
- RSS feeds now include Media RSS namespace (xmlns:media) for structured media metadata
- RSS enclosure element added for first image (per RSS 2.0 spec)
- Media RSS media:content elements for all images with type, medium, and fileSize attributes
- Media RSS media:thumbnail element for first image preview
- JSON Feed items include "image" field with first image URL (per JSON Feed 1.1 spec)
- Image field absent (not null) when no media attached
- Both feed formats maintain existing HTML embedding for universal reader support
- Provides enhanced display in modern feed readers (Feedly, Inoreader, NetNewsWire)
- **Custom Slug Input Field** - Web UI now supports custom slugs (v1.2.0 Phase 1)
- Added optional custom slug field to note creation form
- Slugs are read-only after creation to preserve permalinks
@@ -53,6 +115,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Multiple u-photo properties in Microformats2 markup
- Media files cached immutably (1 year) for performance
### Fixed
- **Media Display on Homepage** - Images now display correctly on homepage, not just individual note pages
- **Responsive Image Sizing** - Images constrained to container width with proper CSS
- **Caption Display** - Captions now used as alt text only, not displayed as visible text
- **Logging Correlation ID** - Fixed crash in non-request contexts (app init, memory monitor)
## [1.1.2] - 2025-11-28
### Fixed

View File

@@ -8,97 +8,50 @@ This file contains operational instructions for Claude agents working on this pr
- All Python commands must be run with `uv run` prefix
- Example: `uv run pytest`, `uv run flask run`
## Agent Protocol (All Agents)
**IMPORTANT**: All agents must review `docs/DOCUMENTATION.md` before starting work. This file is the authoritative source for documentation organization and supersedes any other instructions.
## Agent-Architect Protocol
When invoking the agent-architect, always remind it to:
1. Review documentation in docs/ before working on the task it is given
- docs/architecture, docs/decisions, docs/standards are of particular interest
1. Review `docs/DOCUMENTATION.md` for documentation organization standards
2. Give it the map of the documentation folder as described in the "Understanding the docs/ Structure" section below
2. Review documentation in docs/ before working on the task it is given
- docs/architecture, docs/decisions, docs/standards are of particular interest
3. Search for authoritative documentation for any web standard it is implementing on https://www.w3.org/
4. If it is reviewing a developers implementation report and it is accepts the completed work it should go back and update the project plan to reflect the completed work
4. If it is reviewing a developers implementation report and it accepts the completed work it should go back and update the project plan to reflect the completed work
## Agent-Developer Protocol
When invoking the agent-developer, always remind it to:
1. **Document work in reports**
- Create implementation reports in `docs/reports/`
- Include date in filename: `YYYY-MM-DD-description.md`
1. Review `docs/DOCUMENTATION.md` for documentation organization standards
2. **Update the changelog**
2. **Document work in design folder**
- Create implementation reports in `docs/design/{version}/`
- Include date in filename: `YYYY-MM-DD-description.md`
- All developer interaction (questions, responses, reports, reviews) goes in design/{version}/
3. **Update the changelog**
- Add entries to `CHANGELOG.md` for user-facing changes
- Follow existing format
3. **Version number management**
4. **Version number management**
- Increment version numbers according to `docs/standards/versioning-strategy.md`
- Update version in `starpunk/__init__.py`
4. **Follow git protocol**
5. **Follow git protocol**
- Adhere to git branching strategy in `docs/standards/git-branching-strategy.md`
- Create feature branches for non-trivial changes
- Write clear commit messages
## Documentation Navigation
## Documentation
### Understanding the docs/ Structure
The `docs/` folder is organized by document type and purpose:
- **`docs/architecture/`** - System design overviews, component diagrams, architectural patterns
- **`docs/decisions/`** - Architecture Decision Records (ADRs), numbered sequentially (ADR-001, ADR-002, etc.)
- **`docs/deployment/`** - Deployment guides, infrastructure setup, operations documentation
- **`docs/design/`** - Detailed design documents, feature specifications, phase plans
- **`docs/examples/`** - Example implementations, code samples, usage patterns
- **`docs/migration/`** - Migration guides for upgrading between versions and configuration changes
- **`docs/projectplan/`** - Project roadmaps, implementation plans, feature scope definitions
- **`docs/releases/`** - Release-specific documentation, release notes, version information
- **`docs/reports/`** - Implementation reports from developers (dated: YYYY-MM-DD-description.md)
- **`docs/reviews/`** - Architectural reviews, design critiques, retrospectives
- **`docs/security/`** - Security-related documentation, vulnerability analyses, best practices
- **`docs/standards/`** - Coding standards, conventions, processes, workflows
### Where to Find Documentation
- **Before implementing a feature**: Check `docs/decisions/` for relevant ADRs and `docs/design/` for specifications
- **Understanding system architecture**: Start with `docs/architecture/overview.md`
- **Coding guidelines**: See `docs/standards/` for language-specific standards and best practices
- **Past implementation context**: Review `docs/reports/` for similar work (sorted by date)
- **Project roadmap and scope**: Refer to `docs/projectplan/`
### Where to Create New Documentation
**Create an ADR (`docs/decisions/`)** when:
- Making architectural decisions that affect system design
- Choosing between competing technical approaches
- Establishing patterns that others should follow
- Format: `ADR-NNN-brief-title.md` (find next number sequentially)
**Create a design doc (`docs/design/`)** when:
- Planning a complex feature implementation
- Detailing technical specifications
- Documenting multi-phase development plans
**Create an implementation report (`docs/reports/`)** when:
- Completing significant development work
- Documenting implementation details for architect review
- Format: `YYYY-MM-DD-brief-description.md`
**Update standards (`docs/standards/`)** when:
- Establishing new coding conventions
- Documenting processes or workflows
- Creating checklists or guidelines
### Key Documentation References
- **Architecture**: See `docs/architecture/overview.md`
- **Implementation Plan**: See `docs/projectplan/v1/implementation-plan.md`
- **Feature Scope**: See `docs/projectplan/v1/feature-scope.md`
- **Coding Standards**: See `docs/standards/python-coding-standards.md`
- **Testing**: See `docs/standards/testing-checklist.md`
See `docs/DOCUMENTATION.md` for the authoritative documentation structure, navigation guidance, and key references.
## Project Philosophy

View File

@@ -2,13 +2,13 @@
A minimal, self-hosted IndieWeb CMS for publishing notes with RSS syndication.
**Current Version**: 1.1.0
**Current Version**: 1.2.0
## Versioning
StarPunk follows [Semantic Versioning 2.0.0](https://semver.org/):
- Version format: `MAJOR.MINOR.PATCH`
- Current: `1.1.0` (stable release)
- Current: `1.2.0` (stable release)
- Check version: `python -c "from starpunk import __version__; print(__version__)"`
- See changes: [CHANGELOG.md](CHANGELOG.md)
- Versioning strategy: [docs/standards/versioning-strategy.md](docs/standards/versioning-strategy.md)
@@ -29,10 +29,14 @@ StarPunk is designed for a single user who wants to:
- **File-based storage**: Notes are markdown files, owned by you
- **IndieAuth authentication**: Use your own website as identity
- **Micropub support**: Full W3C Micropub specification compliance
- **RSS feed**: Automatic syndication
- **Media attachments**: Upload and display images with your notes
- **Microformats2**: Full h-entry, h-card, and h-feed markup for IndieWeb compatibility
- **Author discovery**: Automatic profile discovery from your IndieWeb identity
- **RSS, ATOM, JSON Feed**: Multiple syndication formats with Media RSS support
- **Custom slugs**: Control your note permalinks
- **No database lock-in**: SQLite for metadata, files for content
- **Self-hostable**: Run on your own server
- **Minimal dependencies**: 6 core dependencies, no build tools
- **Minimal dependencies**: Core dependencies, no build tools
## Requirements
@@ -154,8 +158,10 @@ See [docs/architecture/](docs/architecture/) for complete documentation.
StarPunk implements:
- [Micropub](https://micropub.spec.indieweb.org/) - Publishing API
- [IndieAuth](https://www.w3.org/TR/indieauth/) - Authentication
- [Microformats2](http://microformats.org/) - Semantic HTML markup
- [RSS 2.0](https://www.rssboard.org/rss-specification) - Feed syndication
- [Microformats2](http://microformats.org/) - h-entry, h-card, h-feed markup
- [RSS 2.0](https://www.rssboard.org/rss-specification) with Media RSS extensions
- [ATOM 1.0](https://validator.w3.org/feed/docs/atom.html) - Syndication format
- [JSON Feed 1.1](https://jsonfeed.org/version/1.1) - Modern feed format
## Deployment

57
docs/DOCUMENTATION.md Normal file
View File

@@ -0,0 +1,57 @@
# PURPOSE
This document describes how documentation in this folder should be organized and supersedes any other instructions.
# FOLDERS
## ARCHITECTURE
The architecture folder should contain documentation reflecting the current design of the system and should be updated at the end of each release to ensure it is current.
## DECISIONS
This folder contains any architectural decisions, documented as ADRs.
- Format: `ADR-NNN-brief-title.md` (numbered sequentially)
- Create an ADR when making architectural decisions, choosing between technical approaches, or establishing patterns
## DESIGN
This folder is used by the architect to document implementation designs to be handed off to the developer. These designs should be sorted into subfolders reflecting the semantic version number of the release in question (e.g., `v1.0.0/`, `v1.1.1/`).
All developer interaction belongs in the appropriate version subfolder:
- Implementation designs and specifications
- Developer questions to the architect
- Architect responses
- Implementation reports (format: `YYYY-MM-DD-description.md`)
- Implementation reviews
## PROJECTPLAN
This folder contains documents relating to the future state of the project. There should be a single BACKLOG.md file that lists future features by priority as well as bugs (which are assumed to be high priority). Items in this file can have one of the following priorities:
- Critical - Items that break existing functionality
- High
- Medium
- Low
In addition to the backlog file each version should have a folder named for its semantic version with a RELEASE.md file which lists the features and bugs to be addressed in that release.
## STANDARDS
Includes any standards written by the architect that the developer needs to reference during development. Any deprecated standards should be moved to the DEPRECATED subfolder when appropriate.
# WHERE TO FIND DOCUMENTATION
- **Before implementing a feature**: Check `decisions/` for relevant ADRs and `design/{version}/` for specifications
- **Understanding system architecture**: Start with `architecture/`
- **Coding guidelines**: See `standards/`
- **Past implementation context**: Review `design/{version}/` for similar work
- **Project roadmap and scope**: Refer to `projectplan/`
# KEY REFERENCES
- **Architecture**: `architecture/`
- **Coding Standards**: `standards/python-coding-standards.md`
- **Testing**: `standards/testing-checklist.md`
- **Project Backlog**: `projectplan/BACKLOG.md`

View File

@@ -0,0 +1,281 @@
# ADR-059: Full Feed Media Standardization (Option 3)
## Status
Proposed (For v1.3.0 Backlog)
## Context
StarPunk v1.2.0 introduced media attachments for notes (images). The initial implementation embeds media as HTML in feed description fields. Option 2 (implemented in v1.2.x) adds Media RSS extension elements and JSON Feed image fields for better feed reader compatibility.
This ADR documents Option 3: Full Standardization, which provides comprehensive media support across all syndication formats, including video, audio, and advanced features. This is planned for v1.3.0 or later.
## Decision
Document the scope of "Full Standardization" for feed media support to be implemented in a future release. This option goes beyond Option 2's basic Media RSS support to include:
1. **Complete Media RSS Specification Support**
2. **Podcast RSS Support (RSS 2.0 enclosures for audio)**
3. **Video Support**
4. **Multiple Image Sizes/Thumbnails**
5. **Full JSON Feed 1.1 Media Compliance**
## Scope of Full Standardization
### 1. Complete Media RSS Implementation
**Research Required**: Full Media RSS specification at https://www.rssboard.org/media-rss
**Elements to Implement**:
- `<media:content>` with full attribute support:
- `url` (required) - Direct URL to media file
- `fileSize` - Size in bytes
- `type` - MIME type
- `medium` - Type: "image", "audio", "video", "document", "executable"
- `isDefault` - Boolean for default rendition
- `expression` - "full", "sample", "nonstop"
- `bitrate` - Kilobits per second
- `framerate` - Frames per second (video)
- `samplingrate` - Samples per second (audio)
- `channels` - Audio channels
- `duration` - Seconds
- `height` / `width` - Dimensions in pixels
- `lang` - RFC-3066 language code
- `<media:group>` - Container for multiple renditions of same content
- `<media:thumbnail>` - Multiple sizes with url, width, height, time
- `<media:title>` - Media title (type="plain" or "html")
- `<media:description>` - Media description (type="plain" or "html")
- `<media:keywords>` - Comma-separated keywords
- `<media:category>` - Categorization with scheme attribute
- `<media:credit>` - Credit attribution with role and scheme
- `<media:copyright>` - Copyright information
- `<media:rating>` - Content rating (scheme-based)
- `<media:hash>` - MD5/SHA-1 hash for integrity
- `<media:player>` - Embeddable player URL
**Effort Estimate**: 8-12 hours
### 2. Podcast RSS Support
**Research Required**:
- Apple Podcast RSS specification
- Google Podcast RSS requirements
- Podcast Index namespace (podcast:)
**Elements to Implement**:
- iTunes namespace (`xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"`):
- `<itunes:summary>` - Episode summary
- `<itunes:duration>` - Audio duration (HH:MM:SS)
- `<itunes:image>` - Episode artwork
- `<itunes:explicit>` - Content rating
- `<itunes:episode>` - Episode number
- `<itunes:season>` - Season number
- `<itunes:episodeType>` - "full", "trailer", "bonus"
- `<itunes:author>` - Author name
- `<itunes:owner>` - Owner contact
- Standard RSS `<enclosure>` for audio:
- `url` - Direct audio file URL
- `length` - File size in bytes
- `type` - MIME type (audio/mpeg, audio/mp4, etc.)
**Database Changes**:
- Add `duration` column to `note_media` table
- Add `media_type` enum (image, audio, video)
- Consider `podcast_metadata` table for series-level data
**Effort Estimate**: 10-16 hours
### 3. Video Support
**Research Required**:
- Video hosting considerations (storage, bandwidth)
- Supported formats (mp4, webm, ogg)
- Transcoding requirements
- Poster image generation
**Implementation Scope**:
- Accept video uploads via Micropub media endpoint
- Generate poster thumbnails automatically
- Include in Media RSS with proper video attributes:
- `medium="video"`
- `framerate`, `duration`, `bitrate`
- Associated `<media:thumbnail>` for poster
- HTML5 `<video>` element in feed description
- Consider video hosting limits (file size, duration)
**Database Changes**:
- Video-specific metadata in `media` table
- Poster image path
- Transcoding status (if needed)
**Effort Estimate**: 16-24 hours (significant)
### 4. Multiple Image Sizes (Thumbnails)
**Research Required**:
- Responsive image best practices
- WebP generation
- srcset/sizes patterns
**Implementation Scope**:
- Generate multiple sizes on upload:
- Thumbnail: 150x150 (square crop)
- Small: 320px width
- Medium: 640px width
- Large: 1280px width
- Original: preserved
- Store all sizes in `media_variants` table
- Include in Media RSS:
```xml
<media:group>
<media:content url="large.jpg" isDefault="true" width="1280" />
<media:content url="medium.jpg" width="640" />
<media:content url="small.jpg" width="320" />
</media:group>
<media:thumbnail url="thumb.jpg" width="150" height="150" />
```
- JSON Feed: Use `image` for default, include variants in `_starpunk` extension
**Database Changes**:
- `media_variants` table: media_id, variant_type, path, width, height, size_bytes
- Add `has_variants` boolean to `media` table
**Effort Estimate**: 8-12 hours
### 5. Full JSON Feed 1.1 Media Compliance
**Research Required**: JSON Feed 1.1 specification for extensions
**Implementation Scope**:
- Top-level `image` field (URL of first image, per spec)
- Top-level `banner_image` if applicable
- Item-level `image` field (main/featured image)
- Item-level `banner_image` for posts with banners
- Complete `attachments` array:
```json
{
"url": "https://example.com/media/image.jpg",
"mime_type": "image/jpeg",
"title": "Image caption",
"size_in_bytes": 245760,
"duration_in_seconds": null
}
```
- Audio attachments with `duration_in_seconds`
- Video attachments (if supported)
**Effort Estimate**: 4-6 hours
### 6. ATOM Feed Media Extensions
**Research Required**:
- ATOM Media extension namespace
- `<link rel="enclosure">` best practices
**Implementation Scope**:
- `<link rel="enclosure">` for each media item
- `type` attribute with MIME type
- `length` attribute with file size
- `title` attribute with caption
- Consider `<link rel="related">` for thumbnails
**Effort Estimate**: 3-5 hours
## Total Effort Estimate
| Feature | Minimum | Maximum |
|---------|---------|---------|
| Complete Media RSS | 8 hours | 12 hours |
| Podcast RSS Support | 10 hours | 16 hours |
| Video Support | 16 hours | 24 hours |
| Multiple Image Sizes | 8 hours | 12 hours |
| JSON Feed Compliance | 4 hours | 6 hours |
| ATOM Extensions | 3 hours | 5 hours |
| **Total** | **49 hours** | **75 hours** |
**Note**: Video support is the most complex feature and could be deferred to v1.4.0 "Media" release.
## Prerequisites
Before implementing Full Standardization:
1. **Option 2 Complete**: Basic Media RSS and JSON Feed `image` field
2. **Image Optimization**: ADR-058 image optimization strategy implemented
3. **Media Storage Architecture**: Clear path for large file storage
4. **Test Infrastructure**: Feed validation tests in place
## Implementation Phases
### Phase A: Enhanced Image Support (v1.3.0)
- Multiple image sizes/thumbnails
- Full Media RSS for images
- Enhanced JSON Feed attachments
- **Effort**: 12-18 hours
### Phase B: Audio Support (v1.3.x or v1.4.0)
- Podcast RSS implementation
- Audio duration extraction
- iTunes namespace
- **Effort**: 10-16 hours
### Phase C: Video Support (v1.4.0 "Media")
- Video upload handling
- Poster generation
- Video in feeds
- **Effort**: 16-24 hours
## Consequences
### Positive
- Best-in-class feed reader compatibility
- Podcast distribution capability
- Video content support
- Professional media syndication
- Future-proof architecture
### Negative
- Significant implementation effort (50-75 hours total)
- Increased storage requirements
- More complex feed generation
- Processing overhead for image variants
- Larger codebase to maintain
### Neutral
- Aligns with media-focused v1.4.0 roadmap
- Phased implementation possible
- Optional features can be configuration-gated
## Alternatives Considered
### Alternative 1: Minimal Enhancement (Option 2 Only)
Just implement basic Media RSS and JSON Feed image field.
- **Pros**: Low effort, immediate benefit
- **Cons**: Misses podcast/video opportunity
### Alternative 2: Third-Party Media Service
Use external service (Cloudinary, etc.) for media processing.
- **Pros**: Offloads complexity
- **Cons**: External dependency, cost, data ownership concerns
### Alternative 3: Plugin Architecture
Make media support pluggable for advanced features.
- **Pros**: Keeps core simple
- **Cons**: Added architectural complexity
## References
- [Media RSS Specification](https://www.rssboard.org/media-rss)
- [JSON Feed 1.1 Specification](https://jsonfeed.org/version/1.1)
- [Apple Podcast RSS Requirements](https://podcasters.apple.com/support/823-podcast-requirements)
- [Podcast Index Namespace](https://github.com/Podcastindex-org/podcast-namespace)
- [RSS 2.0 Enclosure Specification](https://www.rssboard.org/rss-specification#ltenclosuregtSubelementOfLtitemgt)
- [ADR-057: Media Attachment Model](/home/phil/Projects/starpunk/docs/decisions/ADR-057-media-attachment-model.md)
- [ADR-058: Image Optimization Strategy](/home/phil/Projects/starpunk/docs/decisions/ADR-058-image-optimization-strategy.md)
## Decision
This ADR documents the scope of Full Standardization (Option 3) for the project backlog. Implementation should be scheduled for v1.3.0 and v1.4.0 releases according to the phased approach outlined above.
**Immediate Action**: Implement Option 2 (ADR-060) for v1.2.x release.
**Future Action**: Review and refine this scope when scheduling v1.3.0 work.

View File

@@ -1,41 +0,0 @@
# Deployment Documentation Index
This directory contains deployment guides, infrastructure setup instructions, and operations documentation for StarPunk CMS.
## Deployment Guides
- **[container-deployment.md](container-deployment.md)** - Container-based deployment guide (Docker, Podman)
## Deployment Options
### Container Deployment (Recommended)
Container deployment provides:
- Consistent environment across platforms
- Easy updates and rollbacks
- Resource isolation
- Simplified dependency management
See: [container-deployment.md](container-deployment.md)
### Manual Deployment
For manual deployment without containers:
- Follow [../standards/development-setup.md](../standards/development-setup.md)
- Configure systemd service
- Set up reverse proxy (nginx/Caddy)
- Configure SSL/TLS certificates
### Cloud Deployment
StarPunk can be deployed to:
- Any container platform (Kubernetes, Docker Swarm)
- VPS providers (DigitalOcean, Linode, Vultr)
- PaaS platforms supporting containers
## Related Documentation
- **[../standards/development-setup.md](../standards/development-setup.md)** - Development environment setup
- **[../architecture/](../architecture/)** - System architecture
- **[README.md](../../README.md)** - Quick start guide
---
**Last Updated**: 2025-11-25
**Maintained By**: Documentation Manager Agent

Some files were not shown because too many files have changed in this diff Show More