FeaturesTemplatesShowcaseTownie
AI
BlogDocsPricing
Log inSign up
paulkinlan
paulkinlanpostherous
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: v108
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! ๐Ÿ“งโœจ

Go to top
X (Twitter)
Discord community
GitHub discussions
YouTube channel
Bluesky
Product
FeaturesPricing
Developers
DocsStatusAPI ExamplesNPM Package Examples
Explore
ShowcaseTemplatesNewest ValsTrending ValsNewsletter
Company
AboutBlogCareersBrandhi@val.town
Terms of usePrivacy policyAbuse contact
ยฉ 2025 Val Town, Inc.