This is a submission for the Postmark Challenge: Inbox Innovators.
What I Built
I created Tarzan - a revolutionary email-powered blogging platform that transforms your inbox into a publishing powerhouse! 🌟
Instead of logging into yet another content management system, Tarzan lets you publish blog posts by simply sending an email. Write your content in your favorite email client, hit send, and watch as it magically appears as a beautifully formatted blog post on your website.
The platform leverages Postmark's inbound email parsing to receive emails, processes Markdown content seamlessly, handles file attachments, and renders everything into a stunning blog interface built with Vue.js and TailwindCSS.
Key Features:
- 📧 Email-to-Blog Publishing: Send an email, get a blog post
- 🎨 Markdown Support: Full Markdown rendering with syntax highlighting
- 📎 File Attachments: Images and documents are automatically handled
- ⚡ Lightning Fast: Go backend with SQLite for exceptional performance
- 🔒 Self-Hosted: Complete data ownership and privacy
- 🏠 Single Binary: No dependencies, perfect for air-gapped environments
- 📱 PWA Ready: Install like a native app on any device
Demo
🚀 Live Demo: https://tarzan.meysam.io
Testing Instructions:
Since this is a live blogging platform, you can see real blog posts that were created by sending emails! The demo site showcases:
- Browse Posts: Navigate through blog posts created via email
- Responsive Design: Test on different screen sizes
- PWA Features: Try installing it as an app on your device
-
RSS Feed: Check out the auto-generated RSS feed at
/rss.xml
For Developers - Local Testing:
# Quick start with Docker Compose
curl -o .env https://raw.githubusercontent.com/meysam81/tarzan/main/.env.example
curl -o docker-compose.yml https://raw.githubusercontent.com/meysam81/tarzan/main/compose.yml
docker compose up -d
Then visit http://localhost:8000
to see your local instance!
To test the email functionality, you'll need to:
- Set up a Postmark account (free tier works perfectly!)
- Configure your domain's MX record
- Set the webhook URL to your Tarzan instance
- Send a test email and watch the magic happen ✨
Code Repository
meysam81
/
tarzan
🌟 Revolutionary email-powered blogging platform. Transform your inbox into a publishing powerhouse! Send emails to create beautiful blog posts instantly. Self-hosted, zero dependencies, lightning-fast Go backend with Vue.js frontend. PWA ready, Docker support, Kubernetes deployment included. 📧✨
🌟 Tarzan - Revolutionary Email-Powered Blogging Platform
Transform your inbox into a publishing powerhouse with revolutionary email-powered blogging.
Tarzan revolutionizes content creation by turning every email you send into a beautifully rendered blog post. Built with cutting-edge technology and an unwavering commitment to simplicity, Tarzan empowers creators to publish content effortlessly while maintaining complete control over their data and infrastructure.
- ✨ Why Choose Tarzan?
- 🚀 Key Features
- 🚀 Quick Start
- ⚙️ Configuration
- 📧 Email Integration
- 🎨 Customization
- 🤝 Community & Support
- 📈 Performance & Reliability
- 🔄 Migration & Vendor Freedom
- 📱 Modern Web Standards
- 🏗️ Architecture
- 📄 License
- 🎯 What's Next?
✨ Why Choose Tarzan?
🎯 Effortless
…The repository includes:
- 🏗️ Clean Architecture: Modular Go backend with dependency injection
- 🎨 Modern Frontend: Vue.js 3 with TailwindCSS and Vite
- 🐳 Production Ready: Docker support with Kubernetes manifests
- 🔐 Security First: Vulnerability scanning with every commit
- 📖 Comprehensive Docs: Detailed setup and configuration guides
- 🧪 Quality Assured: Pre-commit hooks and automated testing
How I Built It
Building Tarzan was an exciting journey that pushed me to think differently about content creation! Here's how I leveraged Postmark's amazing inbound email capabilities:
🔧 Technical Architecture
Backend (Go):
- Built a robust HTTP server that receives Postmark's inbound webhooks
- Implemented secure webhook authentication using basic auth
- Created a flexible content processor that parses email bodies as Markdown
- Designed a clean SQLite database schema for storing posts and metadata
- Added file storage system for email attachments
Frontend (Vue.js + TailwindCSS):
- Crafted a beautiful, responsive blog interface
- Implemented progressive web app features for native-like experience
- Added RSS feed generation and SEO optimization
- Created smooth animations and modern UI patterns
📧 Postmark Integration Journey
Working with Postmark's inbound email parsing was absolutely delightful! The API is incredibly well-designed and made the integration seamless:
-
Webhook Setup: Configured Postmark to send parsed emails to my
/webhook
endpoint - Email Processing: Extracted email content, sender info, and attachments from the webhook payload
- Content Transformation: Converted email body to Markdown and rendered it beautifully
- Attachment Handling: Saved email attachments as static files and embedded them in posts
What impressed me most about Postmark:
- The webhook payload is perfectly structured and contains everything needed
- The attachment handling is robust and reliable
- The inbound parsing configuration is intuitive
- The free tier is generous enough for thorough testing and small blogs
🚀 Development Highlights
- Zero-dependency deployment: The entire application compiles to a single binary
- 12-Factor App principles: Fully configurable via environment variables
- Security-hardened: Container runs as non-root user with minimal privileges on scratch image
- Production-ready: Comprehensive CI/CD with automated releases and security scanning
💡 Challenges & Solutions
The biggest challenge was designing an intuitive email-to-blog workflow. I wanted users to feel like they're just sending a regular email, not learning a new publishing system. After many iterations, I settled on:
- Email subject becomes the blog post title
- Email body (Markdown supported) becomes the post content
- First attachment becomes the featured image
- Sender email maps to author information
🎯 Why This Matters
As a developer who's often on the go, I found myself wanting to blog more but being frustrated by complex interfaces. Tarzan scratches my own itch - I can draft posts in my email client during commutes, send them when I have connectivity, and they're automatically published with beautiful formatting.
The email-first approach also makes Tarzan incredibly accessible - everyone knows how to send an email, but not everyone wants to learn another CMS!
🙏 Thank You Postmark!
Huge thanks to the Postmark team for not only providing an excellent service but also for sponsoring this challenge! The inbound email parsing feature opened up so many creative possibilities, and building with Postmark was genuinely enjoyable.
Working on this project reminded me why I love building tools that solve real problems in simple, elegant ways. Sometimes the best innovation comes from asking "what if we did this completely differently?"
I hope Tarzan inspires others to think creatively about how we can make content creation more accessible and enjoyable for everyone! 🌟
Built with love, lots of coffee, and the amazing Postmark API. Check out the live demo and let me know what you think! ☕✨
Top comments (3)
Interesting approach! Does Tarzan support any email formatting limitations, or can users use rich text and inline images freely when emailing posts?
Well, it does support markdown right out of the box.
But, there is a catch!
The short version
The markdown support is limited to no-image rendering.
The long version
The inbound server sends a JSON that contains
TextBody
and theHtmlBody
.The
TextBody
does not have the inline images within it, which means, if the user sends markdown formatted email, you will get the#
and other elements in thisTextBody
but you will not have access to the image.On the other hand, in the
HtmlBody
, there areimg
elements for any attachments from the inline images. Parsing that and making sure that thesrc
of the image is set correctly is no biggie, i.e., just switchcid:<attachment-id>
to the URL of the image.But, sadly, you'd have to do crazy HTML parsing of the
HtmlBody
to be able to render the markdown format AND have the inline images.Here's the official doc:
postmarkapp.com/developer/user-gui...
For the time being, and to avoid perfection killing the progress, the image rendering does not happen simply because I grab the
TextBody
and produce markdown rendered content, but that obviously can change if the postmark would include the image in theTextBody
!You blew me away