FeaturesTemplatesShowcaseTownie
AI
BlogDocsPricing
Log inSign up
paulkinlan

paulkinlan

postherous

https://posthero.us - an email powered blogging system
Public
Like
6
postherous
Home
Code
10
backend
3
frontend
1
shared
2
ACTIVITYPUB.md
README.md
SETUP.md
E
email.ts
H
test-activitypub-inbox.ts
H
test-activitypub.ts
H
test-publish.ts
Branches
1
Pull requests
Remixes
4
History
Environment variables
9
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data โ€“ all from the browser, and deployed in milliseconds.
Sign up now
Code
/
README.md
Code
/
README.md
Search
7/10/2025
Viewing readonly version of main branch: v111
View latest version
README.md

Email Blog Platform

A modern blog platform inspired by Posterous that allows publishing posts via email.

๐Ÿš€ Status: READY TO USE

Your email blog platform is fully functional! Send an email to start publishing.

โœจ Features

  • ๐Ÿ“ง Email-to-Publish: Send an email to publish posts instantly
  • ๐ŸŽจ Multi-format Support: HTML and plain text posts
  • ๐Ÿ“ก RSS Feed: Full RSS 2.0 support for syndication
  • ๐ŸŒ WebSub: Real-time feed updates via WebSub protocol (configured)
  • ๐Ÿ˜ ActivityPub: Full federated social networking with followers, likes, and shares โœ…
  • ๐Ÿฆ‹ AT Protocol: Bluesky integration for cross-platform syndication (configured)
  • ๐Ÿ”— SEO Friendly: Clean URLs with slugified titles
  • ๐Ÿ“ฑ Responsive Design: Mobile-first responsive interface with TailwindCSS
  • โšก Fast: Built on Val Town with SQLite storage and static HTML generation
  • ๐Ÿš€ No JavaScript: Pure HTML/CSS frontend for maximum performance

๐Ÿ—๏ธ Architecture

Backend (/backend/)

  • index.ts - Main Hono server with HTML generation and API routes โœ…
  • database/ - SQLite schema and query functions โœ…
  • services/ - External service integrations โœ…

Email Handler (/email.ts)

  • Email trigger handler for processing incoming posts โœ…

Static HTML Generation

  • Server-side HTML rendering with TailwindCSS โœ…
  • No client-side JavaScript dependencies โœ…
  • Fast loading and SEO optimized โœ…

๐ŸŽฏ Quick Start

  1. Publish via Email: Send email to your Val Town email address
  2. View Blog: Visit your backend HTTP val URL
  3. RSS Feed: Access /rss for syndication
  4. Individual Posts: Visit /post/[slug]

๐Ÿ”ง Configuration

See SETUP.md for detailed setup instructions and ACTIVITYPUB.md for ActivityPub federation details.

Environment Variables (Optional)

  • WEBSUB_HUB_URL - WebSub hub URL
  • ACTIVITYPUB_DOMAIN - Domain for ActivityPub federation
  • ATPROTO_HANDLE - AT Protocol handle
  • ATPROTO_PASSWORD - AT Protocol app password

๐Ÿ“Š API Endpoints

  • GET / - Main blog interface
  • GET /post/:slug - Individual post page
  • GET /rss - RSS 2.0 feed
  • GET /api/posts - JSON API for posts
  • GET /api/posts/:slug - JSON API for single post
  • GET /websub - WebSub subscription endpoint
  • GET /.well-known/webfinger - WebFinger discovery for ActivityPub โœ…
  • GET /actor - ActivityPub actor document โœ…
  • GET /outbox - ActivityPub outbox (published activities) โœ…
  • GET /followers - ActivityPub followers collection โœ…
  • GET /following - ActivityPub following collection โœ…
  • POST /inbox - ActivityPub inbox (processes Follow, Like, Announce, Undo) โœ…
  • GET /api/posts/:slug/activities - Get activity counts (likes, shares, replies) โœ…
  • GET /health - Health check

๐Ÿงช Testing

Use /test-publish.ts to create sample posts for testing.

๐Ÿ“ Usage Example

Send an email like this:

To: your-email-val@val.town
Subject: My Amazing Blog Post
Body: <h2>Hello World!</h2><p>This post was published via email!</p>

The post will appear instantly on your blog with:

  • Title: "My Amazing Blog Post"
  • Slug: "my-amazing-blog-post"
  • Content: Rendered HTML
  • Author: Extracted from email address

๐ŸŽจ Customization

  • Edit HTML generation functions in /backend/index.ts
  • Modify CSS styles in the getCustomCSS() function
  • Update branding in HTML templates
  • Configure federation services via environment variables

๐Ÿ”„ Syndication

Posts are automatically syndicated to:

  • RSS feed (always enabled)
  • WebSub subscribers (if configured)
  • ActivityPub followers (with full interaction support) โœ…
  • AT Protocol/Bluesky (if configured)

ActivityPub Federation

Your blog is now fully federated with ActivityPub! Users can:

  • Follow your blog from Mastodon, Pleroma, and other ActivityPub platforms
  • Like your blog posts (shows โค๏ธ count on posts)
  • Share/Boost your posts (shows ๐Ÿ”„ count on posts)
  • Reply to your posts (shows ๐Ÿ’ฌ count on posts)

Discovery formats:

  • WebFinger: @blog@your-domain.com
  • Direct actor URL: https://your-domain.com/actor

Real-time interaction tracking:

  • All likes, shares, and replies are stored and displayed on individual post pages
  • Follower count is maintained and accurate
  • Full ActivityPub inbox processing for Follow/Unfollow activities

Example: If your blog is at myblog.web.val.run, users can follow @blog@myblog.web.val.run from their Mastodon client and interact with your posts!


Ready to blog via email? Send your first post now! ๐Ÿ“งโœจ

FeaturesVersion controlCode intelligenceCLI
Use cases
TeamsAI agentsSlackGTM
ExploreDocsShowcaseTemplatesNewestTrendingAPI examplesNPM packages
PricingNewsletterBlogAboutCareersBrandhi@val.townStatus
X (Twitter)
Discord community
GitHub discussions
YouTube channel
Bluesky
Terms of usePrivacy policyAbuse contact
ยฉ 2025 Val Town, Inc.