Deploying TinyFeed
Introduction
TinyFeed is a minimalist, self-hosted RSS/Atom feed aggregator designed with simplicity in mind. Written in Go, it generates a static HTML page from your configured feeds, making it incredibly lightweight and fast. Unlike full-featured feed readers, TinyFeed focuses on doing one thing well: aggregating feeds into a clean, readable format.
The application periodically fetches your configured feeds and generates a single HTML page displaying the latest items. This static approach means minimal resource usage, fast page loads, and simple deployment without databases or complex dependencies.
Key highlights of TinyFeed:
- Minimal Resource Usage: Single binary with no runtime dependencies
- Static HTML Output: Generates a simple HTML page, no JavaScript required
- Fast Performance: Written in Go for efficient feed processing
- YAML Configuration: Simple, readable configuration format
- Customizable Templates: Modify the output HTML with custom templates
- Docker Support: Easy containerized deployment
- Scheduled Updates: Configurable refresh intervals
- Multi-Feed Support: Aggregate unlimited feeds into one view
- No Database Required: Configuration-driven with no persistence needs
- 100% Open Source: Available under MIT license
This guide walks through deploying TinyFeed on Klutch.sh using Docker, configuring your feeds, and customizing the output.
Why Deploy TinyFeed on Klutch.sh
Deploying TinyFeed on Klutch.sh provides several advantages:
Always-On Updates: Your feed aggregation runs continuously, keeping your feed page current without manual intervention.
HTTPS by Default: Klutch.sh provides automatic SSL certificates for secure access to your aggregated feeds.
Minimal Resource Cost: TinyFeed’s lightweight nature means low resource requirements and efficient operation.
GitHub Integration: Manage your feed configuration through version control with automatic redeployments when you update your feeds list.
Custom Domains: Serve your feed page from your own domain for a personalized experience.
No Database Management: TinyFeed’s static approach eliminates database administration overhead.
Prerequisites
Before deploying TinyFeed on Klutch.sh, ensure you have:
- A Klutch.sh account
- A GitHub account with a repository for your configuration
- Basic familiarity with Docker and containerization concepts
- A list of RSS/Atom feed URLs you want to aggregate
- (Optional) A custom domain for your feed page
Understanding TinyFeed Architecture
TinyFeed follows an extremely simple architecture:
Go Binary: A single compiled binary handles all functionality - fetching feeds, parsing content, and generating HTML.
YAML Configuration: Feeds and settings are defined in a simple YAML file.
HTML Generation: Output is a static HTML file that can be served by any web server.
Scheduled Updates: The application periodically refreshes feeds based on configured intervals.
Preparing Your Repository
Create a GitHub repository with your TinyFeed configuration.
Repository Structure
tinyfeed-deploy/├── Dockerfile├── feeds.yaml├── README.md└── .dockerignoreCreating the Dockerfile
Create a Dockerfile in the root of your repository:
FROM ghcr.io/tinyfeed/tinyfeed:latest
# Set working directoryWORKDIR /app
# Copy feed configurationCOPY feeds.yaml /app/feeds.yaml
# Create output directoryRUN mkdir -p /app/output
# Set environment variablesENV TINYFEED_CONFIG=/app/feeds.yamlENV TINYFEED_OUTPUT=/app/output/index.htmlENV TINYFEED_INTERVAL=30m
# Expose port for serving the static fileEXPOSE 8080
# Health checkHEALTHCHECK --interval=60s --timeout=10s --start-period=30s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1
# Start TinyFeed with built-in web serverCMD ["tinyfeed", "serve", "--config", "/app/feeds.yaml", "--port", "8080"]Creating the Feeds Configuration
Create a feeds.yaml file with your feed subscriptions:
# TinyFeed Configuration
# Page settingstitle: "My Feed Aggregator"description: "Aggregated content from my favorite sources"
# Refresh interval (how often to fetch feeds)interval: 30m
# Maximum items per feedmax_items: 10
# Total maximum items on the pagetotal_max_items: 100
# Feed sourcesfeeds: # Technology - name: "Hacker News" url: "https://news.ycombinator.com/rss" category: "Technology"
- name: "Ars Technica" url: "https://feeds.arstechnica.com/arstechnica/index" category: "Technology"
- name: "The Verge" url: "https://www.theverge.com/rss/index.xml" category: "Technology"
# Development - name: "Go Blog" url: "https://blog.golang.org/feed.atom" category: "Development"
- name: "CSS-Tricks" url: "https://css-tricks.com/feed/" category: "Development"
# Open Source - name: "OpenSource.com" url: "https://opensource.com/feed" category: "Open Source"
# Custom Blogs - name: "My Favorite Blog" url: "https://example.com/feed.xml" category: "Blogs"Creating the .dockerignore File
Create a .dockerignore file:
.git.github*.mdLICENSE.gitignore*.log.DS_Storeoutput/Deploying TinyFeed on Klutch.sh
Follow these steps to deploy your TinyFeed instance:
- Select HTTP as the traffic type
- Set the internal port to 8080
- Build your Docker image
- Start the TinyFeed service
- Provision an HTTPS certificate
Push Your Repository to GitHub
Initialize and push your repository:
git initgit add Dockerfile feeds.yaml .dockerignore README.mdgit commit -m "Initial TinyFeed configuration"git remote add origin https://github.com/yourusername/tinyfeed-deploy.gitgit push -u origin mainCreate a New Project on Klutch.sh
Navigate to the Klutch.sh dashboard and create a new project. Name it something like “feeds” or “tinyfeed”.
Create a New App
Within your project, create a new app. Connect your GitHub account and select your TinyFeed repository.
Configure HTTP Traffic
TinyFeed serves a static HTML page. In the deployment settings:
Set Environment Variables
Configure optional environment variables:
| Variable | Value |
|---|---|
TINYFEED_INTERVAL | 30m |
TZ | America/New_York (your timezone) |
Deploy Your Application
Click Deploy to start the build process. Klutch.sh will:
Access Your Feed Page
Navigate to https://your-app-name.klutch.sh to view your aggregated feeds.
Configuring Feeds
Adding Feeds
Add new feeds to your feeds.yaml:
feeds: - name: "New Source" url: "https://example.com/feed.xml" category: "General"Push the changes to trigger a redeployment.
Organizing by Category
Group feeds by category for organized display:
feeds: # Technology News - name: "TechCrunch" url: "https://techcrunch.com/feed/" category: "Tech News"
- name: "Wired" url: "https://www.wired.com/feed/rss" category: "Tech News"
# Security - name: "Krebs on Security" url: "https://krebsonsecurity.com/feed/" category: "Security"
- name: "Schneier on Security" url: "https://www.schneier.com/feed/" category: "Security"Limiting Items
Control how many items display from each feed:
# Per-feed limitmax_items: 5
# Total page limittotal_max_items: 50Popular Feed URLs
| Source | Feed URL |
|---|---|
| Hacker News | https://news.ycombinator.com/rss |
| Reddit (subreddit) | https://www.reddit.com/r/programming/.rss |
| GitHub Trending | https://rsshub.app/github/trending/daily |
| Lobsters | https://lobste.rs/rss |
| Dev.to | https://dev.to/feed |
Customizing the Output
Custom Templates
Create a custom HTML template for your feed page:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{{ .Title }}</title> <style> body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; background: #f5f5f5; } .item { background: white; padding: 15px; margin-bottom: 10px; border-radius: 5px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); } .item a { color: #0066cc; text-decoration: none; } .item a:hover { text-decoration: underline; } .meta { color: #666; font-size: 0.9em; } .category { display: inline-block; background: #e0e0e0; padding: 2px 8px; border-radius: 3px; font-size: 0.8em; } </style></head><body> <h1>{{ .Title }}</h1> <p>{{ .Description }}</p> <p class="meta">Last updated: {{ .UpdatedAt }}</p>
{{ range .Items }} <div class="item"> <a href="{{ .Link }}" target="_blank">{{ .Title }}</a> <div class="meta"> <span class="category">{{ .Category }}</span> {{ .Source }} - {{ .PublishedAt }} </div> </div> {{ end }}</body></html>Styling Options
Modify CSS in your template for different looks:
- Dark mode: Adjust background and text colors
- Mobile-friendly: Template includes viewport meta tag
- Print-friendly: Add print media queries
Update Intervals
Configuring Refresh Rate
Adjust how often feeds are fetched:
# In feeds.yamlinterval: 15m # Every 15 minutes
# Or via environment variableENV TINYFEED_INTERVAL=1h # Every hourRecommended Intervals
| Use Case | Interval |
|---|---|
| News aggregation | 15-30 minutes |
| Blog reading | 1-2 hours |
| Low-traffic feeds | 6-12 hours |
Performance Considerations
Resource Usage
TinyFeed is extremely lightweight:
| Metric | Typical Value |
|---|---|
| Memory | 20-50 MB |
| CPU | Minimal (spikes during fetch) |
| Storage | < 10 MB |
Optimizing Feed Count
For best performance:
- Limit to 20-30 feeds for quick refreshes
- Remove feeds that update infrequently
- Use category limits to control output size
Monitoring
Checking Status
Monitor your TinyFeed deployment through:
- Klutch.sh Dashboard: View runtime status and logs
- Page Updates: Check the “Last updated” timestamp on the page
- Health Endpoint: Access
/healthif configured
Viewing Logs
TinyFeed logs include:
- Feed fetch status
- Parse errors
- Generation timing
Troubleshooting Common Issues
Feeds Not Updating
Symptoms: Page shows old content.
Solutions:
- Check that feed URLs are accessible
- Verify interval setting is reasonable
- Look for fetch errors in logs
- Ensure container is running
Feed Parse Errors
Symptoms: Specific feeds not appearing.
Solutions:
- Validate feed URL returns valid RSS/Atom
- Check for authentication requirements
- Some feeds may block certain user agents
Page Not Loading
Symptoms: 502 or connection errors.
Solutions:
- Verify container is running in dashboard
- Check port configuration is 8080
- Review startup logs for errors
Slow Page Generation
Symptoms: Long wait times for page loads.
Solutions:
- Reduce number of feeds
- Lower max_items per feed
- Increase interval between refreshes
Updating TinyFeed
To update to a newer version:
- Update the image tag in your Dockerfile:
FROM ghcr.io/tinyfeed/tinyfeed:v1.2.0
- Push changes to trigger redeployment
Alternative Configurations
Read-Only Mode
Generate static files for external hosting:
CMD ["tinyfeed", "generate", "--config", "/app/feeds.yaml", "--output", "/app/output/"]JSON Output
Export feeds as JSON for custom frontends:
output_format: jsonAdditional Resources
- TinyFeed GitHub Repository
- W3C Feed Validator
- About Feeds - RSS/Atom Guide
- RSSHub - RSS Feed Generator
- Klutch.sh Deployments
Conclusion
TinyFeed on Klutch.sh offers a refreshingly simple approach to feed aggregation. Instead of complex feed readers with databases, accounts, and countless features, TinyFeed delivers exactly what many users want: a clean page showing the latest from their favorite sources.
The static HTML approach means fast page loads, minimal resource usage, and straightforward deployment. Combined with Klutch.sh’s automatic HTTPS and GitHub integration, you get an always-updated feed page with minimal effort.
Whether you’re curating news sources for personal reading, creating a topic-specific aggregator to share with others, or building a simple news portal, TinyFeed provides the foundation without the overhead of more complex solutions.