POSSE & Bridgy Integration
Overview
The Phenom App blog implements the POSSE (Publish Own Site, Syndicate Everywhere) methodology to maintain content ownership while distributing posts across social media platforms. This approach ensures the website remains the canonical source of truth while reaching audiences on their preferred platforms.
What is POSSE?
POSSE is a content publishing strategy where:
- Content is published first on your own domain (www.thephenom.app)
- Content is automatically syndicated to social platforms (Twitter, Mastodon, etc.)
- Social interactions flow back to the original post via webmentions
- Ownership remains with the author - not platforms
Architecture
Logan writes markdown
↓
AI converts to HTML (with microformats)
↓
Deploy to Cloudflare Pages
↓
Bridgy polls RSS feed
↓
Auto-posts to Twitter/Mastodon
↓
Social comments → Webmention.io → Blog
Technology Stack
Core Services (All Free)
| Service | Purpose | Cost |
|---|---|---|
| Cloudflare Pages | Static site hosting | Free |
| Bridgy | Social media syndication | Free |
| Webmention.io | Comment aggregation | Free |
| Microformats2 | Semantic HTML markup | Free (standard) |
1. Cloudflare Pages
- Hosts blog HTML files
- Global CDN for fast delivery
- Automatic HTTPS
- Deployment URL: https://www.thephenom.app
2. Bridgy (https://brid.gy)
- Monitors RSS feed for new posts
- Syndicates to connected social platforms
- Adds syndication links back to posts
- Polls feed every 30 minutes
3. Webmention.io (https://webmention.io)
- Collects webmentions from social media
- Provides API to fetch interactions
- Aggregates comments, likes, retweets
4. Microformats2 (http://microformats.org)
- Semantic HTML markup standard
- Makes posts machine-readable
- Enables Bridgy to parse content
Implementation Phases
Phase 1: Microformats Markup ✅ [Issue #50]
Add semantic HTML classes to blog posts:
<article class="h-entry">
<h1 class="p-name">Post Title</h1>
<time class="dt-published" datetime="2026-01-16">January 16, 2026</time>
<div class="p-author h-card">
<img class="u-photo" src="/assets/images/logan-avatar.jpg" alt="Lenval Logan">
<span class="p-name">Lenval Logan</span>
<a class="u-url" href="https://www.thephenom.app/about.html">Profile</a>
</div>
<div class="e-content">
<!-- Blog post content -->
</div>
<div class="syndication">
<a class="u-syndication" href="https://twitter.com/...">View on Twitter</a>
</div>
</article>
Key Microformat Classes:
h-entry- Post containerp-name- Titledt-published- Publication dateh-card- Author infoe-content- Contentu-syndication- Social links
Validation:
- Tool: https://indiewebify.me/validate-h-entry/
- Status: Pending implementation
Phase 2: Webmention Support ✅ [Issue #51]
Add webmention endpoint discovery:
<head>
<link rel="webmention" href="https://webmention.io/thephenom.app/webmention" />
<link rel="pingback" href="https://webmention.io/thephenom.app/xmlrpc" />
</head>
Setup Steps:
- Sign up at https://webmention.io with GitHub account
- Verify domain ownership (add
rel="me"link) - Get API key for fetching mentions
- Add endpoint links to all blog posts
Phase 3: Social Comment Display ✅ [Issue #52]
JavaScript component to fetch and display webmentions:
// Fetch webmentions for current post
async function fetchWebmentions(postUrl) {
const response = await fetch(
`https://webmention.io/api/mentions.jf2?target=${encodeURIComponent(postUrl)}`
);
const data = await response.json();
return data.children || [];
}
// Render different mention types
function renderWebmentions(mentions) {
const container = document.getElementById('webmentions');
mentions.forEach(mention => {
const mentionType = mention['wm-property'];
if (mentionType === 'in-reply-to') {
// Render reply with author, content, link
} else if (mentionType === 'like-of') {
// Render like with author avatar
} else if (mentionType === 'repost-of') {
// Render retweet/share
}
});
}
Features:
- Display comments from Twitter, Mastodon, etc.
- Show author avatars and names
- Link back to original posts
- Group by interaction type (replies, likes, shares)
Phase 4: RSS Feed Generation ✅ [Issue #53]
Create RSS feed for Bridgy monitoring:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>The Phenom App Blog</title>
<link>https://www.thephenom.app/blog.html</link>
<description>UAP Research and The Phenom App Updates</description>
<item>
<title>We Will Collaborate to Graduate</title>
<link>https://www.thephenom.app/blog/welcome-to-phenom-blog.html</link>
<pubDate>Wed, 15 Jan 2026 00:00:00 GMT</pubDate>
<guid>https://www.thephenom.app/blog/welcome-to-phenom-blog.html</guid>
<content:encoded><![CDATA[
<!-- Full HTML content with microformats -->
]]></content:encoded>
</item>
</channel>
</rss>
RSS Discovery:
<head>
<link rel="alternate" type="application/rss+xml"
title="The Phenom App Blog"
href="/feed.xml">
</head>
Phase 5: Bridgy Configuration ✅ [Issue #54]
Configure Bridgy for automatic syndication:
- Go to https://brid.gy
- Sign in with social media accounts
- Enable “Publish” for each platform
- Configure feed URL:
https://www.thephenom.app/feed.xml - Bridgy polls every 30 minutes for new posts
- Test with “Retry” button on dashboard
Publishing Workflow
Step-by-Step Process
Write Content
# Logan writes in markdown vim blog-posts/my-new-post.mdConvert to HTML
# Claude Code converts with microformats # Creates web/blog/my-new-post.htmlUpdate RSS Feed
# Add new post to feed.xml vim web/feed.xmlDeploy via Workflow
# Follow standard GitHub workflow git checkout -b feature/XX-new-blog-post git add web/blog/my-new-post.html web/feed.xml git commit -m "feat: Add new blog post" # Deploy to testing server ./scripts/deploy-to-dockerhub.sh # Get user approval # Create PR and merge to mainAutomatic Syndication
- Cloudflare Pages deploys to production
- Bridgy polls RSS feed (within 30 minutes)
- Detects new post with microformats
- Posts to Twitter, Mastodon, etc.
- Adds syndication links back to blog post
Social Interactions
- Users reply/like/retweet on social media
- Social platforms send webmentions to webmention.io
- JavaScript fetches and displays interactions on blog
- Comments appear on original blog post
Required Microformats Reference
Minimal Required Structure
Every blog post must include:
<article class="h-entry">
<h1 class="p-name">Post Title</h1>
<time class="dt-published" datetime="YYYY-MM-DD">Date</time>
<div class="p-author h-card">
<span class="p-name">Lenval Logan</span>
</div>
<div class="e-content">
Post content...
</div>
</article>
Optional Enhancements
<!-- Categories/Tags -->
<a class="p-category" href="/blog/tag/uap">UAP</a>
<!-- Location -->
<span class="p-location">Washington, D.C.</span>
<!-- Summary -->
<p class="p-summary">Brief post description</p>
<!-- In-reply-to (for responses) -->
<a class="u-in-reply-to" href="https://example.com/post">In reply to</a>
Validation and Testing
Microformats Validation
- Tool: https://indiewebify.me/validate-h-entry/
- Process: Paste blog post URL to validate h-entry markup
- Check: All required classes present (h-entry, p-name, e-content)
RSS Feed Validation
- Tool: https://validator.w3.org/feed/
- Process: Validate feed.xml syntax
- Check: Valid RSS 2.0 structure, content:encoded present
Webmention Testing
- Tool: https://webmention.rocks/
- Process: Test suite for webmention implementations
- Check: Endpoint discovery, mention receiving
Bridgy Testing
- Go to Bridgy dashboard
- Click “Retry” on test post
- Verify syndication to social media
- Check u-syndication links added to post
- Confirm comments flow back via webmentions
Troubleshooting
Bridgy Not Syndicating
Problem: New posts not appearing on social media
Solutions:
- Verify RSS feed is valid (W3C validator)
- Check microformats present (IndieWebify.me)
- Review Bridgy dashboard for errors
- Manually click “Retry” on dashboard
- Ensure feed.xml updated with new post
- Check social account connections in Bridgy
Webmentions Not Displaying
Problem: Social comments not showing on blog
Solutions:
- Verify webmention endpoint in HTML
<head> - Check webmention.io dashboard for received mentions
- Test API URL manually:
https://webmention.io/api/mentions.jf2?target=POST_URL - Review JavaScript console for errors
- Verify CORS headers allow API requests
- Check network tab for failed requests
Syndication Links Missing
Problem: u-syndication links not on blog post
Solutions:
- Bridgy adds these automatically after posting
- Wait 5-10 minutes after syndication
- Check Bridgy dashboard for syndication status
- Verify post has h-entry markup
- Manually add links if needed (not ideal)
Benefits of POSSE
Content Ownership
- Your domain is the canonical source
- Content persists even if platforms shut down
- Full control over presentation and formatting
- Independent of social media algorithms
Platform Independence
- Not locked into any single platform
- Can switch or add platforms without losing content
- Own URL structure and permalinks
- Data portability
Broader Reach
- Automatically reach audiences on multiple platforms
- Users see content where they prefer
- Cross-platform visibility
- Increased engagement opportunities
Unified Interactions
- All comments collected in one place
- Display interactions on your site
- Historical record of engagement
- Better community building
Related Documentation
- Website Overview - Main website architecture
- Design Tokens - Styling system
- Testing Guide - Testing procedures
- Workflow Guide - Development workflow
GitHub Issues
Track POSSE implementation progress:
- Issue #50: Add microformats to blog posts
- Issue #51: Add webmention support
- Issue #52: JavaScript component for comments
- Issue #53: Generate RSS feed
- Issue #54: Configure Bridgy accounts
External Resources
Documentation
- POSSE Concept: https://indieweb.org/POSSE
- Microformats2 Spec: http://microformats.org/wiki/microformats2
- h-entry Reference: https://indieweb.org/h-entry
- Webmention W3C Spec: https://www.w3.org/TR/webmention/
- IndieWeb Wiki: https://indieweb.org
Services
- Bridgy: https://brid.gy/about
- Webmention.io: https://webmention.io
- IndieWebify.me: https://indiewebify.me (validation tools)
Examples in Production
- Ryan Barrett’s Blog: https://snarfed.org (creator of Bridgy)
- Aaron Parecki: https://aaronparecki.com (IndieWeb examples)
- Tantek Çelik: http://tantek.com (IndieWeb co-founder)
Future Enhancements
Potential Additions
- Micropub API: Enable third-party posting tools
- IndieAuth: Decentralized authentication for comments
- Reply Syndication: Reply on blog, syndicate to social media
- Private Posts: Authentication for sensitive content
- Rich Post Types: Notes, photos, videos beyond articles
- Multi-language: Syndicate in multiple languages
- Analytics: Track engagement across platforms
Advanced Features
- Backfeed Likes/Retweets: Display as separate sections
- Author Avatars: Fetch from social profiles
- Thread Handling: Display reply chains
- Moderation: Filter spam webmentions
- Notifications: Email when new comments arrive
Security Considerations
API Keys
- Store Bridgy credentials in password manager
- Never commit API keys to repository
- Use environment variables for local development
Webmention Spam
- Webmention.io includes spam filtering
- Additional moderation may be needed
- Consider manual approval for first comment
CORS and CSP
- Ensure Content Security Policy allows webmention.io API
- Configure CORS headers if needed
- Test API requests in production environment
Maintenance
Regular Tasks
- Monitor Bridgy: Check dashboard weekly for errors
- Review Webmentions: Moderate comments as needed
- Update Feed: Ensure RSS feed includes all posts
- Test Syndication: Verify new posts syndicate correctly
- Validate Markup: Periodically check microformats
When Adding New Posts
- Include all required microformats
- Update feed.xml with new post
- Validate microformats before deployment
- Test on staging server first
- Monitor Bridgy for successful syndication
Support
For questions or issues with POSSE integration:
- GitHub Issues: https://github.com/Phenom-earth/www/issues
- Email: support@thephenom.app
- IndieWeb Chat: https://chat.indieweb.org/
- Bridgy Support: File issues at https://github.com/snarfed/bridgy
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.