Listsome
A platform for sharing DIY projects and recipes with the maker community.
Table of Contents
- Introduction
- Project Goals & Values
- Architectural Overview
- Content Sharing Pipeline
- Federation Model
- Technical Implementation
- Development Roadmap
Introduction
Listsome is a content sharing and documentation platform designed for indie web makers and creators. Instead of being “listless” (without energy or purpose), you’re “listsome” - actively documenting and sharing the things you create. Whether it’s a woodworking project, a new recipe, or an electronics build, Listsome helps you share what you’ve done so others can learn from your experience.
Think of it as:
- A recipe box for all your DIY projects, not just food
- A portfolio for makers who build things
- A how-to wiki written by people who actually did the thing
- Your project’s documentation that others can follow
Project Goals & Values
Core Values
Indie Web First
- Content creators maintain ownership and control of their work
- No platform lock-in - content lives on creator’s own sites
- Support for indie web standards (microformats, WebMention, etc.)
- Respect for creator autonomy and data sovereignty
Anti-Big Tech
- Avoid dependency on FAANG services (AWS, GCP, etc.)
- Use open source alternatives wherever possible
- Support self-hosting and homelab deployment
- Build with privacy-first principles
Accessibility & Inclusion
- Deployable on modest hardware (Raspberry Pi, old laptops)
- Low resource requirements for participation
- Support for creators with limited technical resources
- Progressive enhancement for all users
Community-Driven
- Open source development model
- Community curation and moderation
- Transparent algorithms and processes
- Collaborative improvement of discovery mechanisms
Primary Goals
- Enhance Discoverability: Help indie web creators reach new audiences without leaving their platforms
- Preserve Creator Control: Aggregate and enhance without appropriating or displacing original content
- Build Community: Foster connections between makers, learners, and creators across the indie web
- Democratize Access: Make sophisticated content discovery accessible to anyone with basic hardware
- Support Federation: Enable multiple hub instances to work together while maintaining independence
Architectural Overview
High-Level Architecture
The Listsome platform operates as a content sharing and documentation service with three primary layers:
- Discovery Layer: Finds and ingests content from distributed sources
- Processing Layer: Parses, enriches, and curates discovered content
- Distribution Layer: Provides enhanced discovery interfaces and federation capabilities
Technology Stack
Core Runtime
- Language: Rust (performance, safety, single-binary deployment)
- Web Framework: Axum (async, composable, well-maintained)
- Database: SQLite (currently), PostgreSQL (planned)
- Search: Full-text search (planned, Tantivy)
Frontend
- Framework: Leptos (Rust-based, SSR)
- Styling: Plain CSS
- Markdown: Integrated editor with live preview (planned)
Content Processing (Planned)
- Microformats: h-recipe, h-entry parsing
- JSON-LD: Schema.org HowTo/Recipe structured data
Federation & Standards
- ActivityPub: ActivityPub endpoints (partial)
- WebFinger: Instance discovery (partial)
- RSS/Atom: Feed generation and consumption
Deployment
- Containerization: Docker with multi-arch builds (x86_64, ARM64) (planned)
- Single Binary: Embedded assets, SQLite database, zero dependencies
- CI/CD: Codeberg Actions (planned)
System Components
Content Discovery
- WebMention endpoint for indie web integration
- RSS/Atom feed crawler with intelligent scheduling
- ActivityPub listener for fediverse content
- Manual submission interface for community curation
- Microformats parser for structured content detection
Content Processing Pipeline
- Multi-stage parsing (structured → semi-structured → unstructured)
- Confidence scoring for parsing quality assessment
- Content enrichment (difficulty, time estimates, tags)
- Duplicate detection and content deduplication
- Image extraction and optimization
Data Storage
- Metadata database (PostgreSQL/SQLite)
- Full-text search index (Tantivy)
- Content cache (summaries, images, metadata)
- Analytics database (privacy-friendly, aggregated only)
User Interfaces
- Web discovery interface (browse, search, filter)
- RSS/JSON feeds (filtered streams, custom collections)
- Embed widgets (for integration with other sites)
- Mobile PWA (offline reading, responsive design)
Federation Network
- ActivityPub server (share discoveries, follow creators)
- WebHook system (real-time notifications)
- Bridge integrations (Discord, Slack, etc.)
- Hub-to-hub federation (distributed network)
Content Discovery Pipeline
Discovery Methods
WebMention Integration
- Creators send webmentions when publishing new content
- Automatic validation and processing of mentioned content
- Support for indie web reply/like/repost interactions
- Backfeed social interactions to original content
RSS/Atom Crawling
- Intelligent scheduling based on publication frequency
- Support for full-content and summary feeds
- Automatic discovery of new feeds through OPML and link following
- Respect for robots.txt and rate limiting
ActivityPub Listening
- Monitor fediverse hashtags (#diy, #maker, #tutorial)
- Process shared links and content from Mastodon, Lemmy, etc.
- Federate discoveries back to the network
- Support for ActivityPub collections and featured content
Manual Submission
- Community-driven content submission
- Verification and quality control processes
- Batch processing for content creators
- API for programmatic submission
Content Parsing Strategy
Tier 1: Structured Data (90-95% confidence)
#![allow(unused)]
fn main() {
// Microformats (h-recipe, h-entry)
<article class="h-entry">
<h1 class="p-name">Project Title</h1>
<div class="e-content">...</div>
</article>
// JSON-LD Schema.org
{
"@type": "HowTo",
"name": "Project Title",
"instruction": [...]
}
}
Tier 2: Semi-Structured HTML (60-80% confidence)
- Common blog patterns and CSS selectors
- Numbered lists and heading hierarchies
- Content area detection algorithms
- Heuristic-based extraction
Tier 3: Unstructured Content (30-50% confidence)
- Regex pattern matching for steps, materials, tools
- Natural language processing for content classification
- Machine learning for difficulty and time estimation
- Requires human review for quality assurance
Content Enhancement
Automatic Enrichment
- Difficulty level assessment based on tools and complexity
- Time estimation from step analysis and historical data
- Tag generation using content analysis and ML
- Image extraction, optimization, and caching
- Tool and material standardization
Community Enhancement
- Quality voting and community feedback
- Collaborative tagging and categorization
- Content correction and improvement suggestions
- Moderation and spam detection
Federation Model
Hub-to-Hub Federation
Distributed Network
- Multiple independent hub instances
- Shared content discovery and curation
- Distributed moderation decisions
- Resilient to single points of failure
ActivityPub Integration
- Standard federation protocol
- Interoperability with Mastodon, Lemmy, etc.
- Custom activity types for instructional content
- Rich metadata sharing between instances
Content Syndication
- RSS/JSON feed sharing between hubs
- Webhook notifications for new discoveries
- Collaborative filtering and recommendation
- Respect for creator preferences and licensing
Creator Benefits
Increased Discoverability
- Content appears in federated timeline
- Cross-instance search and discovery
- Community-driven promotion and sharing
- Analytics on content performance
Maintained Control
- Content remains on creator’s platform
- Full attribution and backlinks
- Creator can request removal at any time
- No platform lock-in or content migration
Community Engagement
- Cross-platform comments and discussions
- Collaborative improvement suggestions
- Skill-based networking and connections
- Project remixes and derivatives tracking
Technical Implementation
Core Architecture Decisions
Single Binary Deployment
#![allow(unused)]
fn main() {
// Embedded assets and database
// Zero external dependencies
// Configurable via environment variables
// Graceful degradation for limited resources
}
Resource Efficiency
- Target <512MB RAM for basic functionality
- Efficient content parsing and caching
- Intelligent background processing
- Rate limiting and resource management
Privacy-First Design
- No user tracking or cross-site analytics
- Aggregate statistics only
- GDPR compliance built-in
- User control over data retention
Extensible Plugin System
- Custom content parsers
- Additional federation protocols
- Community-contributed enhancements
- Modular deployment options
Development Practices
Open Source Methodology
- Codeberg for primary development
- Transparent development process
- Community contributions welcome
- Comprehensive documentation and examples
Quality Assurance
- Comprehensive test suite (unit, integration, end-to-end)
- Automated security scanning
- Performance benchmarking
- Community code review
Deployment Options
- Single binary for simple deployment
- Docker containers for containerized environments
- Kubernetes manifests for production scale
- Ansible playbooks for automated setup
Development Roadmap
Phase 1: Foundation (Months 1-3)
- Basic content parsing pipeline
- SQLite-based single-user deployment
- Web interface for content discovery
- RSS feed generation
- Basic WebMention support
Phase 2: Enhancement (Months 4-6)
- PostgreSQL support for multi-user instances
- Advanced content enrichment (AI/ML)
- Community features (voting, collections)
- Mobile PWA development
- Comprehensive test suite
Phase 3: Federation (Months 7-9)
- ActivityPub server implementation
- Hub-to-hub federation
- Advanced search and filtering
- Performance optimization
- Security hardening
Phase 4: Ecosystem (Months 10-12)
- Plugin system for extensibility
- Advanced analytics and insights
- Community moderation tools
- Integration bridges (Discord, Slack)
- Comprehensive documentation
Long-Term Vision
Sustainable Ecosystem
- Self-sustaining community development
- Multiple independent hub instances
- Rich ecosystem of tools and integrations
- Standard protocols adopted by other projects
Creator Empowerment
- Indie web creators have powerful discovery tools
- Reduced dependency on centralized platforms
- Strong community connections and collaboration
- Sustainable creator economy support
Technical Innovation
- Advanced content understanding and classification
- Intelligent recommendation systems
- Seamless cross-platform integration
- Privacy-preserving analytics and insights
This documentation is living and will evolve with the project. Contributions and suggestions are welcome through our Codeberg repository.
Getting Started
Welcome to Listsome! This guide will help you set up your instance and discover DIY content from the indie web.
What is Listsome?
Listsome is a federated platform for discovering and sharing DIY content. Each instance is self-hosted and operated independently, connected to other instances through a simple subscription model.
Quick Start
Step 1: Set Up Your Instance
- Visit your listsome instance
- Complete the setup wizard to create your admin account
- Configure your instance details (name, domain, description)
Step 2: Add Content
- Go to Admin → New Project
- Add your tutorials, recipes, or DIY projects
- Use markdown for content formatting
- Tag content for organization
Your content is now available via RSS feed and visible to anyone who follows your instance.
Step 3: Discover Content
- Go to Admin → Federation
- Add instances to your blogroll
- Your instance will fetch their RSS feeds
- New content appears in your aggregated feed
Step 4: Browse and Search
- Visit the Timeline to see content from followed instances
- Use Search to find specific content across all feeds
- Filter by tags or content type
Your Instance Features
Content Publishing
- Create and manage projects with markdown
- Organize with tags
- Generate RSS feeds for your content
- Share your instance URL with others
Discovery
- Add instances to your blogroll
- Aggregate content from followed instances
- Search across all aggregated content
- Follow your interests
Federation
- Your instance is discoverable via WebFinger
- Others can find and subscribe to your content
- No complex ActivityPub required - just RSS
Best Practices
Content
- Quality over quantity - Better to have great tutorials than many mediocre ones
- Use tags - Help others discover your content
- Regular updates - Keep your content current
Discovery
- Follow curated instances - Find instances that share content you care about
- Stay organized - Review your blogroll periodically
- Trust your sources - Only follow instances you find trustworthy
Key Concepts
Blogroll
A list of instances you follow. When you add an instance, your instance subscribes to their RSS feed.
Aggregation
Content from followed instances is fetched and stored locally, making it searchable and browsable.
Federation
Listsome instances are decentralized. Each operates independently but can discover and share content with others.
Next Steps
- Add Your First Project - Share your DIY content
- Manage Your Blogroll - Discover content from others
- Browse the Timeline - See aggregated content
- Search Content - Find specific tutorials or projects
Need Help?
- Discovery Guide - Learn how to find and follow instances
- Architecture - Understand how listsome works
- Limitations - Know current constraints
Ready to start? Set up your account, add some content, and start discovering DIY projects from the indie web!
Discovery
Listsome instances discover content from other instances through a simple blogroll model. No scraping, no complex federation - just subscribe to feeds you trust.
How Discovery Works
The Blogroll Model
A blogroll is a curated list of instances you follow. When you add an instance to your blogroll:
- Your instance subscribes to their RSS feed
- New content appears in your aggregated feed
- You can search across all aggregated content
Think of it like RSS reader subscriptions, but managed by your instance instead of a third party.
Key Principles
- Explicit consent - You choose who you follow
- No inbox complexity - Just RSS feed fetching
- Decentralized - Each instance operates independently
- Your data stays yours - Aggregated content is cached locally
Managing Your Blogroll
Adding an Instance
- Go to the Federation page
- Enter the domain of the instance you want to follow
- Click “Follow” to add to your blogroll
- Your instance will start fetching their RSS feed
Removing an Instance
- Go to the Federation page
- Find the instance in your blogroll
- Click “Unfollow” to remove
- Their content will be removed from your aggregated feed
Discovery vs. Federation
Discovery (Current Implementation)
- Model: Blogroll + RSS aggregation
- Protocol: RSS feeds only
- Complexity: Low
- Privacy: Your instance fetches their public feed
- Example: Adding
diy.example.comto follow their tutorials
Federation (Future)
- Model: ActivityPub social features
- Protocol: ActivityPub inbox/outbox
- Complexity: High (HTTP signatures, verification)
- Privacy: Direct instance-to-instance communication
- Example: Mastodon-style following with social interactions
For now, discovery through RSS feeds is the focus. Federation features may be added later.
Finding Instances
Ways to Discover Listsome Instances
- Direct sharing - Someone shares their instance URL with you
- Community lists - Future: a registry of public instances
- Word of mouth - Indie web communities, maker forums
- RSS discovery - Find blogs/tutorials you like and check if they use listsome
What to Look For
- Content topics that interest you
- Active instances with regular updates
- Community engagement and moderation
- Quality of existing aggregated content
Content Aggregation
How It Works
- You add an instance to your blogroll
- Your instance fetches their RSS feed
- New items are stored in your database
- Content appears in your timeline and search results
- Original source is preserved for attribution
Updating Content
- Your instance checks for new content periodically
- Existing content is updated if changed
- Deleted content is handled gracefully
Privacy Considerations
What Others Can See
- Your instance domain (when you follow them)
- Public RSS feed content (what you already get from RSS)
What Others Cannot See
- Your admin credentials
- Other instances in your blogroll
- Your local-only content
- Server logs (if you configure logging carefully)
Discovery Best Practices
Building Your Blogroll
- Quality over quantity - Follow instances with content you actually want
- Trust the source - Only follow instances you find trustworthy
- Stay organized - Regularly review and clean up your blogroll
- Check activity - Follow active instances with regular updates
Discovering New Content
- Start with interests - Find topics you care about
- Follow curators - Find instances that curate good content
- Branch out - When you find good content, explore their sources
Next Steps
- Your Blogroll - Add or remove followed instances
- Timeline - View aggregated content from followed instances
- Search - Find content across your aggregated feed
💡 Pro Tip: Think of your blogroll as a curated reading list for DIY content. Add instances that consistently publish content you find valuable.
Architecture
Listsome is a federated, self-hostable platform for discovering and sharing DIY content (tutorials, recipes, projects).
Principles
- Own your data - Content lives on your instance, you control it
- Federation - Instances discover and follow each other via ActivityPub
- No scraping - Explicit subscription model, not stealth extraction
- RSS-first - Structured feeds as the interoperability layer
How It Works
┌─────────────────┐ Follow ┌─────────────────┐
│ your.listsome │ ──────────────────► │ my.listsome │
│ │ ◄────────────────── │ │
│ Your tutorials │ Content feed │ Your feed + │
│ Your recipes │ │ My feed │
│ Your projects │ │ │
└─────────────────┘ └─────────────────┘
▲ ▲
│ │
WebFinger WebFinger
│ │
└─────────── Fediverse ──────────────────┘
Instance Discovery
- WebFinger - Query
https://instance/.well-known/webfinger?resource=acct:user@instance - Actor endpoint - Returns ActivityPub actor with inbox/outbox URLs
- Follow - Send Follow activity to their inbox
- Accept - They approve, relationship established
- Aggregate - Your instance pulls their RSS feed
Content Flow
Publishing (Local)
- Create content via admin UI or API
- Content stored in local SQLite database
- Available via RSS feed at
/feed.xml - Optionally broadcast via ActivityPub outbox
Discovery (Remote)
- Discover instance via WebFinger
- Send Follow request
- On Accept, subscribe to their RSS feed
- Content aggregated into your local feed
- Search across your aggregated content
Data Model
Local Content
- Projects with title, description, markdown content
- Tags for organization
- Author attribution
- Published status
Remote Content (Aggregated)
- Fetched from followed instances’ RSS feeds
- Stored locally for search
- Original source preserved for attribution
Relationships
- Followed instances (who you follow)
- Followers (who follows you)
- Pending follows (approval queue)
Comparison to Faircamp/Fairplayer
| Component | Faircamp | Fairplayer | Listsome |
|---|---|---|---|
| Publisher | Artists publish music | Aggregates faircamps | Users publish DIY content |
| Format | Audio catalog | Audio player | Tutorials, recipes, projects |
| Discovery | Manual URLs | WebFinger | WebFinger + RSS |
| Subscription | - | Follow faircamp | Follow listsome instance |
| Federation | - | Fairplayer network | Listsome federation |
Listsome takes the Faircamp/Fairplayer model and applies it to DIY/maker content with full federation support.
Password Reset System
This document describes the password reset and recovery system for Listsome. Since this is a single-user instance, the approach prioritizes simplicity while maintaining security.
Overview
The system provides two methods for password recovery:
- Direct CLI Reset - Immediate password change (requires SSH access)
- Token-Based Reset - Generate a one-time token for web-based reset
Architecture
Database Schema
CREATE TABLE password_reset_tokens (
id INTEGER PRIMARY KEY AUTOINCREMENT,
token_hash TEXT UNIQUE NOT NULL, -- Argon2 hash (never store plaintext)
account_id INTEGER NOT NULL,
created_at TIMESTAMP,
expires_at TIMESTAMP, -- 1 hour expiry
used_at TIMESTAMP, -- When consumed
ip_address TEXT, -- Optional audit
used BOOLEAN DEFAULT FALSE -- Single-use flag
);
Security Features:
- Tokens are hashed with Argon2id before storage
- 1-hour expiration window
- Single-use only (marked as
usedafter consumption) - Automatic cleanup of expired tokens (after 24 hours)
- Optional IP address logging for audit trail
Token Lifecycle
- Generation → Store hash, display plaintext once
- Validation → Compare hash, check expiry/usage
- Consumption → Mark as used, update timestamp
- Cleanup → Remove old tokens via trigger
CLI Tool Usage
Direct Password Reset
Use when you have SSH access to the server:
# Reset password immediately
$ listsome-cli reset-password
WARNING: This will reset the admin password immediately.
Type 'I am sure' to continue:
I am sure
Enter new password: ********
Confirm new password: ********
Password has been reset successfully.
Security: Requires exact confirmation phrase “I am sure”
Generate Reset Token
Use when you’ve forgotten the password but can access server logs:
# Generate a one-time token
$ listsome-cli generate-reset-token
This will generate a one-time password reset token.
Type 'generate' to create a token:
generate
========================================
RESET TOKEN (save this securely):
a1b2c3d4e5f6... (64 hex characters)
========================================
Use this token via:
1. Web interface: POST /reset-password with token
2. Or check server logs for the token
Token expires: 1 hour
Token is single-use
Token Format: 32 random bytes encoded as 64 hex characters
Cleanup Tokens
Remove expired and used tokens:
$ listsome-cli cleanup-tokens
Cleanup complete: removed 5 tokens
Setup (Initial Account Creation)
Create the first admin account if none exists:
$ listsome-cli setup
No admin account found. Let's create one.
Email: admin@example.com
Password: ********
Display Name: Admin User
Instance Domain (e.g., diy.example.com): diy.example.com
Setup complete! You can now log in.
Recovery Scenarios
Scenario 1: Forgot Password, Have SSH
Solution: Direct CLI reset
ssh user@server
listsome-cli reset-password
# Enter new password
Risk Level: Low - requires server access
Scenario 2: Forgot Password, No SSH
Solution: Generate token via logs
# On server (or in systemd logs)
journalctl -u listsome | grep "RESET TOKEN"
# Or check application logs
tail -f /var/log/listsome/app.log
Then use the token via web interface or cURL:
curl -X POST http://localhost:3000/reset-password \
-H "Content-Type: application/json" \
-d '{"token": "a1b2c3d4...", "new_password": "newpass123"}'
Risk Level: Medium - token exposure in logs
Scenario 3: Complete Lockout
Solution: Physical server access required
If you have:
- No SSH access
- No web access
- Forgot password
You must have physical access to the server to:
- Access console directly
- Mount the SQLite database
- Delete the account row to trigger re-setup
- Or use SQL to manually update password_hash
# Emergency: Delete account to re-trigger setup
sqlite3 data.db "DELETE FROM account WHERE id = 1;"
# Then run setup again
listsome-cli setup
Risk Level: High - requires physical security breach
Security Considerations
Threat Model
Assumed attackers:
- Someone with web access (can try tokens)
- Someone with file system read access (can see tokens in logs)
- Someone with database access (can see token hashes)
Mitigations:
- Tokens expire in 1 hour (reduces window of attack)
- Tokens are single-use (prevents replay)
- Tokens are hashed (attacker with DB access can’t use tokens)
- Direct reset requires confirmation phrase (prevents accidental execution)
Audit Trail
All CLI operations log to stderr:
[CLI] Starting password reset process
[CLI] Connecting to database: sqlite://data.db
[CLI] Password updated successfully for account_id=1
Recommendation: Redirect stderr to syslog:
listsome-cli reset-password 2> >(logger -t listsome-cli)
File Permissions
The CLI should be protected by file permissions:
# Make CLI only executable by owner
chmod 750 listsome-cli
chown root:admin listsome-cli
# Database should be readable only by application user
chmod 640 data.db
chown listsome:listsome data.db
Implementation Details
Token Generation
Uses cryptographically secure random bytes:
#![allow(unused)]
fn main() {
let token_bytes: Vec<u8> = (0..32).map(|_| rand::random::<u8>()).collect();
let token = hex::encode(&token_bytes); // 64 hex chars
}
Entropy: 256 bits (comparable to JWT signing keys)
Hash Algorithm
Uses Argon2id (same as password hashing):
- Memory-hard (resists GPU cracking)
- Salted (each token produces different hash)
- Tunable parameters
Database Cleanup
Automatic trigger runs on INSERT:
DELETE FROM password_reset_tokens
WHERE expires_at < datetime('now', '-24 hours')
OR (used = TRUE AND used_at < datetime('now', '-7 days'));
Future Enhancements
Possible improvements (not currently needed for single-user):
- Email Integration - Send tokens via email using
lettre - Rate Limiting - Limit token generation per IP
- Hardware Token - Require Yubikey for CLI operations
- Recovery Keys - Generate offline backup codes during setup
- Web UI - Add /forgot-password page for self-service
Testing
Run tests for the password reset system:
# Run all auth tests
cargo test auth
# Run specific token tests
cargo test test_create_reset_token
cargo test test_validate_and_consume_token
Troubleshooting
Token Not Working
Checklist:
- Token hasn’t expired (1 hour limit)
- Token hasn’t been used already
- Token is complete (64 characters)
- Database is accessible
CLI Can’t Connect to Database
# Check DATABASE_URL environment variable
echo $DATABASE_URL
# Default is sqlite://data.db
# Override: export DATABASE_URL="sqlite:///path/to/data.db"
Database Locked
If SQLite is locked by the running web server:
# Stop the web server temporarily
systemctl stop listsome
listsome-cli reset-password
systemctl start listsome
References
RSS Feeds
Stay updated with new content by subscribing to RSS feeds. Learn how to use feeds for content discovery and sharing.
Available RSS Feeds
Content Type Feeds
Feed Parameters
- content_type: Filter by content type (Recipe, Tutorial, Project, Article)
- limit: Control number of items (default: 50, max: 100)
- format: Choose RSS or Atom format (default: rss)
Examples:
/feed?content_type=Recipe&limit=20- 20 latest recipes/feed?format=atom- All content in Atom format/feed?content_type=Tutorial&limit=10- 10 latest tutorials
Using RSS Feeds
RSS Readers
Add any of the feed URLs above to your favorite RSS reader:
- Feedly - Web and mobile RSS reader
- Inoreader - Advanced RSS reader with filters
- NetNewsWire - macOS RSS reader
- Reeder - iOS RSS reader
- Any RSS reader - Most support custom feed URLs
Browser Integration
- Firefox: Built-in RSS reader
- Chrome: Extensions like “RSS Feed Reader”
- Safari: Built-in feed reading
Following Instances
Blogroll-Based Following
Content from other instances is added through your blogroll:
- Go to the Federation page
- Enter the domain of an instance to follow
- Your instance will automatically fetch their RSS feed
- Content appears in your aggregated timeline
How It Works
- Adding an instance subscribes to their RSS feed
- New content is fetched and stored locally
- You can unfollow at any time to stop aggregation
- See the Discovery guide for more details
Feed Sources
- Listsome instances - Full compatibility with RSS feeds
- Other platforms - Any site with a valid RSS/Atom feed
- Faircamp sites - Audio-focused content (future integration)
Feed Management
Organizing Feeds
- Create folders in your RSS reader for different topics
- Use descriptive names for each feed
- Set update frequencies based on content volume
- Enable notifications for important feeds
Content Quality
- Review feed content before adding
- Check update frequency to avoid spam
- Monitor content quality over time
- Remove inactive feeds periodically
Advanced Feed Usage
Feed Filtering
- Use content type parameters to focus on specific content
- Combine multiple feeds for comprehensive coverage
- Create filtered feeds for specific interests
Integration
- Email subscriptions for important feeds
- IFTTT/Zapier automation with feed updates
- Social media sharing of interesting content
- Content aggregation for newsletters
Automation
- Scheduled consumption of external feeds
- Automated filtering based on keywords
- Content alerts for specific topics
- Feed exports for backup and sharing
Troubleshooting Feeds
Feed Not Loading
- Check the URL is correct and accessible
- Ensure the feed format is valid (RSS/Atom)
- Try different feed parameters
- Check if the site blocks feed access
Missing Content
- Some feeds may have access restrictions
- Content may be behind paywalls
- Feed format may not be standard
- Site may have changed feed structure
Performance Issues
- Large feeds may take time to process
- Frequent updates can be resource-intensive
- Some feeds may have rate limits
Feed Best Practices
Content Sources
- Choose reputable sources with consistent quality
- Look for active feeds with regular updates
- Check content relevance to your interests
- Verify feed stability before relying on it
Organization
- Use descriptive feed names in your reader
- Create topic-based folders for organization
- Set appropriate update intervals (hourly, daily, weekly)
- Regular cleanup of inactive feeds
Integration
- Combine with search for comprehensive discovery
- Use feeds for staying current on topics
- Share interesting feeds with communities
- Export feed lists for backup
Next Steps
- Learn About Content Discovery - Add more content to feeds
- Master Searching - Find content in your collection
- See Current Limitations - Understand feed constraints
💡 Pro Tip: RSS feeds are perfect for staying updated with your favorite creators and topics. Combine them with search for the best content discovery experience.
Searching Content
Master the search features to find tutorials, recipes, and projects in your collection.
How to Search
Basic Search
- Navigate to the search page
- Enter keywords in the search field
- Click “Search” to see results
Advanced Search Options
- Content Type Filter: Limit results to Recipes, Tutorials, Projects, or Articles
- Results Limit: Choose how many results to show (10, 20, 50, or 100)
Search Tips
Effective Keywords
- Be specific: “sourdough bread recipe” works better than just “bread”
- Use multiple words: “arduino temperature sensor” finds more relevant results
- Try variations: Different terms for the same concept
- Include context: “raspberry pi camera project” is more specific than “camera”
Content Type Filtering
- Recipes: Cooking instructions, ingredient lists, preparation methods
- Tutorials: Step-by-step guides, how-to instructions, educational content
- Projects: DIY builds, construction guides, maker projects
- Articles: Blog posts, general information, opinion pieces
Understanding Search Results
Result Information
Each search result shows:
- Title: Click to visit the original content
- Content Type Badge: Color-coded by type (Recipe, Tutorial, Project, Article)
- Confidence Score: How well the content was parsed (higher is better)
- Description: Preview of the content
- Metadata: Materials count, tools count, steps count
Interpreting Results
- High confidence scores (80%+) indicate well-parsed content
- Complete metadata (materials, tools, steps) means better structured content
- Original source links take you to the creator’s website
- Content types help you find the right type of information
Search Strategies
Finding Recipes
- Search for ingredients: “chicken rice tomato”
- Search for meal types: “pasta dinner” or “breakfast smoothie”
- Search for techniques: “fermentation” or “sous vide”
Finding Tutorials
- Search for skills: “woodworking” or “electronics”
- Search for tools: “3d printer” or “laser cutter”
- Search for projects: “smart home” or “robotics”
Finding Projects
- Search for outcomes: “greenhouse” or “furniture”
- Search for materials: “wood” or “arduino”
- Search for complexity: “beginner” or “advanced”
Building Search Collections
Curated Searches
- Save effective search terms
- Build collections around topics
- Create personal knowledge bases
Regular Discovery
- Search weekly for new content
- Follow up on related topics
- Build comprehensive resource libraries
Troubleshooting Search
No Results Found
- Try different keywords
- Use broader search terms
- Remove content type filters
- Check spelling
Too Many Results
- Add more specific keywords
- Use content type filters
- Include context or qualifiers
Irrelevant Results
- Use more specific search terms
- Add context to your keywords
- Try synonyms or related terms
Advanced Search Techniques
Boolean-Like Searching
While the current search doesn’t support complex boolean operators, you can:
- Use multiple specific terms: “raspberry pi camera night vision”
- Combine concepts: “arduino temperature humidity sensor”
- Add qualifiers: “beginner woodworking project”
Iterative Refinement
- Start with broad search terms
- Note relevant results
- Refine with more specific terms
- Use content type filters to narrow results
Search Status
Currently Implemented
- Basic text search across local content
- Filter by content type
In Development
- Full-text search backend
- Relevance ranking
- Filter by tags and source instance
Future Improvements
- Fuzzy matching for typos
- Advanced filters (difficulty, time, materials)
- Cross-instance search (search followed instances)
- Saved searches and alerts
Next Steps
- Set Up RSS Feeds - Get notified of new content
- Discovery - Follow instances to expand searchable content
- See Future Features - What’s planned for search
💡 Pro Tip: The more content you add through parsing, the better your search results will be. Start building your collection to improve search relevance.
Current Limitations
While Listsome is functional, it has some limitations to be aware of. This page explains what’s not implemented yet and how it affects your experience.
Search Capabilities
Current State
- Simple text matching only - No advanced search features
- No fuzzy matching - Exact spelling required
- Limited filtering - Only by content type
- No relevance ranking - Results ordered by confidence score only
Impact
- Search results may include irrelevant matches
- Typos in search queries won’t find results
- Can’t filter by difficulty, time, or materials
- Results may not be in the most useful order
Workaround
- Use specific, correctly spelled keywords
- Add more context to search terms
- Use content type filters to narrow results
- Parse more content to improve result relevance
Content Discovery
Current State
- Manual URL entry only - No automatic crawling
- No content suggestions - No “related content” features
- Limited parsing strategies - May not work with all websites
- No batch processing - One URL at a time
Impact
- Can’t discover content automatically
- No recommendations for similar content
- Some websites may not parse well
- Time-consuming to add many URLs
Workaround
- Manually find and add content you’re interested in
- Use RSS feeds to stay updated with known sources
- Focus on well-structured websites
- Build your collection gradually
Data Storage
Current State
- SQLite only - No multi-user support
- No PostgreSQL backend - Limited scalability
- Single-user focused - Not designed for teams
- No data export/import - Difficult to migrate
Impact
- Can’t share collections with others
- Limited to personal use
- No collaboration features
- Data stays on your local machine
Workaround
- Use the platform for personal content management
- Share RSS feed URLs for others to subscribe
- Export content through RSS feeds
- Run your own instance for personal use
User Interface
Current State
- Basic HTML interface - No advanced features
- No user accounts - No personalization
- No saved searches - Can’t save favorite queries
- No content management - Limited organization tools
Impact
- Can’t save preferences or settings
- No personalized recommendations
- Can’t organize content into collections
- Limited content management features
Workaround
- Use browser bookmarks for important searches
- Manually organize content through RSS feeds
- Use external tools for content organization
- Focus on core discovery and search features
Content Processing
Current State
- Rule-based parsing only - No AI/ML enhancement
- No duplicate detection - May have duplicate content
- Limited content types - Basic classification
- No quality scoring - All content treated equally
Impact
- Parsing may miss complex content structures
- Duplicate content may appear in results
- Content classification may be inaccurate
- No automatic quality assessment
Workaround
- Focus on well-structured, simple content
- Manually review and remove duplicates
- Use confidence scores to gauge parsing quality
- Parse content from reputable sources
RSS Feeds
Current State
- Basic feed generation - Limited customization
- No feed management - Can’t edit or delete feeds
- No social features - Can’t share or follow feeds
- Limited feed formats - Basic RSS/Atom only
Impact
- Can’t customize feed content or appearance
- No way to manage multiple feeds
- Can’t collaborate on feed curation
- Limited integration options
Workaround
- Use feeds as-is for basic subscription
- Share feed URLs manually
- Use external feed management tools
- Focus on content discovery rather than feed management
Federation & Social Features
Current State
- Basic ActivityPub endpoints - WebFinger, Actor, Inbox exist
- Blogroll discovery - Follow other instances via RSS aggregation
- No full ActivityPub flow - Follow/Accept not fully implemented
- No fediverse connectivity - Can’t connect to Mastodon/Lemmy
Impact
- Can discover content from followed instances
- Can’t accept/manage followers yet
- Limited social interaction features
- No connection to broader fediverse
Workaround
- Add instances to your blogroll manually
- Share your RSS feed URL for others to subscribe
- Use RSS readers to follow content
- Focus on blogroll-based discovery
Performance & Scalability
Current State
- Single-threaded processing - Limited performance
- No caching - Every request processes from scratch
- SQLite limitations - Not designed for high traffic
- No background processing - Everything happens synchronously
Impact
- Slow response times with large content databases
- No caching for frequently accessed content
- Limited concurrent users
- Resource-intensive operations
Workaround
- Keep content database manageable in size
- Use for personal or small team use
- Avoid very large search result sets
- Run on capable hardware
Why These Limitations Exist
Design Philosophy
These limitations are intentional and by design:
- Start simple - Focus on core functionality first
- Personal use focus - Designed for individual users initially
- Progressive enhancement - Build advanced features over time
- Resource efficiency - Keep requirements minimal
Development Approach
- Phase-based development - Core features first, advanced features later
- User feedback driven - Build what users actually need
- Open source model - Community can contribute improvements
- Sustainability - Focus on maintainable, reliable features
Future Improvements
These limitations will be addressed in future updates:
- Enhanced search with full-text indexing and relevance ranking
- Full ActivityPub flow with Follow/Accept management
- Federated blogrolls for cross-instance discovery
- Fediverse connectivity to connect with Mastodon/Lemmy
- Multi-user support with PostgreSQL backend
Getting Help
If You Encounter Issues
- Check this page to see if it’s a known limitation
- Try the workarounds suggested above
- Review the future features to see if it’s planned
- Check the getting started guide for basic usage
Contributing
- Report issues on the project repository
- Suggest improvements or new features
- Help with documentation or testing
- Contribute code for new features
Next Steps
- See Future Features - What’s planned to address these limitations
- Getting Started - Learn how to work within current limitations
- Content Discovery - Make the most of current features
💡 Remember: These limitations represent the current state, not the final vision. The platform is designed to grow and improve over time.
Future Features
These features are planned but not yet implemented. They represent the next phases of development for Listsome.
Phase 2: Enhanced Search & Discovery
Full-Text Search Engine
- Tantivy integration for advanced search capabilities
- Relevance ranking based on content quality and user engagement
- Fuzzy matching for typos and variations
- Stemming and lemmatization for better word matching
Automatic Content Discovery
- Web crawling of known tutorial sites
- RSS feed monitoring for automatic content ingestion
- Content recommendations based on user interests
- Duplicate detection to avoid redundant content
Advanced Filtering
- Difficulty level filtering (beginner, intermediate, advanced)
- Time estimation filtering (quick projects, long-term builds)
- Material requirements filtering (specific tools or materials)
- Content quality scoring and filtering
Phase 3: Federation & Social Features
ActivityPub Integration
- Fediverse connectivity - Connect with Mastodon, Lemmy, and other platforms
- Cross-instance sharing - Share projects with other Listsome instances
- Social interactions - Like, share, and comment on content
- Creator following - Follow your favorite makers and creators
Federated Blogrolls
- Instance blogrolls - Curate lists of listsome instances you follow
- Discovery by endorsement - See what trusted instances recommend
- Trust propagation - Follow chains of endorsed instances
- Cross-instance search - Search content across followed instances
WebMention Support
- Cross-site interactions - Mention and reference content on other sites
- Backfeed integration - Receive notifications when content is referenced
- Citation tracking - See how your content is being used
- Social web integration - Connect with the broader indie web
Hub-to-Hub Federation
- Distributed network - Multiple instances working together
- Content synchronization - Share discoveries across instances
- Collaborative curation - Community-driven content quality assessment
- Resilient architecture - No single points of failure
Phase 4: AI/ML Enhancement
Intelligent Content Processing
- Content classification using machine learning
- Automatic tagging based on content analysis
- Difficulty assessment from content complexity
- Time estimation from step analysis
Quality Scoring
- Content quality metrics based on structure and completeness
- User engagement tracking (views, saves, shares)
- Automated spam detection and content filtering
- Content freshness scoring and updates
Personalized Recommendations
- User preference learning from search and save patterns
- Content similarity matching for related content discovery
- Trending content identification and promotion
- Personalized feeds based on interests
Phase 5: Advanced User Experience
Progressive Web App
- Offline functionality for reading saved content
- Mobile optimization with responsive design
- Push notifications for new content and updates
- App-like experience on mobile devices
User Accounts & Personalization
- User registration and profile management
- Personal collections and content organization
- Saved searches and search history
- Content ratings and reviews
Content Management
- Bulk operations for content management
- Content editing and improvement suggestions
- Collection sharing and collaboration
- Content export in multiple formats
Phase 6: Infrastructure Improvements
Multi-User Support
- PostgreSQL backend for scalability
- User authentication and authorization
- Team collaboration features
- Content sharing and permissions
Performance Optimization
- Redis caching for frequently accessed content
- Background processing for content ingestion
- Database optimization for large content collections
- CDN integration for static assets
API Enhancements
- GraphQL API for flexible data access
- REST API improvements with better pagination
- Webhook support for integrations
- Rate limiting and abuse prevention
Local-Prod Sync Architecture
- Plain text source of truth - Markdown files stored locally as canonical data
- Local SQLite index - Index derived from MD files for fast queries
- Migration-based sync - Push local changes to prod via versioned migrations
- Conflict resolution - Timestamp-based conflict detection with manual resolution
- Bidirectional sync - Pull prod changes, reconcile with local files
- Offline-first workflow - Full functionality without connectivity, sync when online
Phase 7: Ecosystem Integration
Third-Party Integrations
- Discord bots for content sharing
- Slack integrations for team notifications
- IFTTT/Zapier support for automation
- Browser extensions for easy content saving
Content Platform Integration
- WordPress plugins for content publishing
- Static site generators integration
- GitHub integration for documentation sites
- YouTube/PeerTube integration for video content
Developer Tools
- API documentation and developer portal
- SDKs for different programming languages
- CLI tools for content management
- Docker integration for easy deployment
Long-Term Vision
Decentralized Content Network
- Global federation of content discovery hubs
- Interoperable content across different platforms
- Creator-owned content with distributed hosting
- Community governance and decision-making
AI-Powered Discovery
- Semantic search understanding content meaning
- Personalized learning paths and recommendations
- Automated content curation and quality assessment
- Intelligent content synthesis and summarization
Sustainable Ecosystem
- Self-funding model through optional premium features
- Community contributions and open development
- Educational partnerships with maker communities
- Research collaborations for content understanding
Development Roadmap
Current Phase
- ✅ Content publishing with markdown
- ✅ RSS feed generation
- ✅ Blogroll-based discovery (RSS aggregation)
- ✅ ActivityPub endpoints (WebFinger, Actor, Inbox)
- 🔄 Full-text search backend
- 🔄 Session management (auth)
- 🔄 Project editor UI
Next Phase
- 🔄 Enhanced search (filtering, relevance ranking)
- 🔄 Federated blogrolls (cross-instance discovery)
- 🔄 Follow/Accept flow for ActivityPub
- 🔄 Improved user interface
Future Phases
- 📋 Fediverse connectivity (Mastodon, Lemmy)
- 📋 Trust propagation and endorsement chains
- 📋 Cross-instance search
- 📋 Multi-user support and collaboration
Future Phases (2025-2026)
- 📋 Federation and social features
- 📋 AI/ML content enhancement
- 📋 Multi-user support and collaboration
- 📋 Progressive web app development
Contributing to Development
Ways to Help
- Bug reports and feature requests
- Code contributions for new features
- Documentation improvements
- Testing and feedback
- Community support and advocacy
Development Priorities
- User feedback drives feature development
- Core functionality stability before new features
- Backward compatibility maintained across updates
- Open standards and interoperability prioritized
Getting Involved
- Check the project repository for open issues
- Join community discussions about features
- Contribute documentation or code
- Help test new features and provide feedback
Feature Request Process
How to Suggest Features
- Check existing issues to see if it’s already planned
- Create a feature request with detailed description
- Include use cases and benefits
- Consider implementation complexity and impact
What Gets Prioritized
- User impact - How many users will benefit
- Feasibility - Can it be implemented with available resources
- Alignment - Does it fit the project vision
- Dependencies - Does it enable other features
Next Steps
- Getting Started - Use current features effectively
- Current Limitations - Understand what’s not available yet
- Contribute - Help build future features
🚀 The future of Listsome is shaped by the community. Your feedback and contributions help determine what gets built next!
Releases
Listsome uses release-plz for automated releases. This ensures version consistency between Cargo.toml, git tags, CHANGELOG.md, and GitHub/Gitea releases.
Release Workflow
- Push to main → Release PR workflow creates a PR with version bump and changelog update
- Review and merge PR →
release-plz releasecreates git tag and Codeberg release - Tag pushed → CI builds and uploads binaries to the release
Files Involved
.woodpecker/release.yml- Woodpecker CI pipeline for releases.woodpecker/release-plz.toml- release-plz configurationCHANGELOG.md- Maintains full release history
Configuration
The release workflow is configured for git-only mode (no crates.io publishing):
[workspace]
git_only = true # Don't publish to crates.io
publish = false # Disable cargo publish
git_release_enable = true # Create Codeberg releases
semver_check = false # Not a library
changelog_update = true # Keep CHANGELOG.md updated
Tokens Required
The release_api_token secret must be configured in Woodpecker CI with appropriate permissions.
Creating a Token on Codeberg
- Go to Settings → Applications on Codeberg
- Click Create Token
- Set a descriptive name (e.g.,
Woodpecker CI - listsome) - Select these scopes:
read:repository- Read repository datawrite:repository- Push tags and create releases
- Click Create Token
- Copy the token immediately - it won’t be shown again
Configuring the Secret in Woodpecker CI
- Go to your repository in Woodpecker CI
- Navigate to Settings → Secrets
- Create a new secret:
- Name:
release_api_token - Name:
ssh_key(for Pages deployment in docs.yml) - Value: Paste the token from Codeberg (no quotes, no trailing newline)
- Name:
- Ensure the secret is available for:
tagevent (forreleaseandupload-assetssteps)pushevent (forrelease-prstep)- Image:
rustlang/rust:*(or leave empty for all images)
Token Format Requirements
- Token must be a raw string with no extra whitespace
- When pasting into Woodpecker, ensure no trailing newline is added
- If you see “invalid header field value” errors, regenerate the token
CHANGELOG Management
The existing CHANGELOG.md is preserved and updated with each release:
- New commits are added to the
[Unreleased]section - When a release is created, unreleased changes are moved to the version section
- Full changelog history is maintained in the root CHANGELOG.md
Binaries
Each release includes pre-built binaries for multiple platforms:
x86_64-unknown-linux-gnu- Standard Linux (glibc)x86_64-unknown-linux-musl- Static binary (works anywhere)aarch64-unknown-linux-gnu- ARM64 (Raspberry Pi, ARM servers)
Version Bumping
Versions are bumped automatically based on conventional commits:
feat:commits → Minor version bumpfix:commits → Patch version bumpfeat!:orfix!:commits → Major version bump- Other commits → Patch version bump
See Conventional Commits for details.
Manual Release (Emergency)
If automated release fails, you can create a release manually:
# Install release-plz
cargo install release-plz
# Bump version and update changelog locally
release-plz update
# Create the release
release-plz release --forge gitea
See Also
Production Deployment
Listsome is designed to be deployed simply to any hardware you control. The goal is to bring ease of use to technology you control.
Prerequisites
- A server running Linux (Raspberry Pi, VPS, or dedicated hardware)
justtask runner installed locally (cargo install justor via package manager)- ARM64 cross-compilation support:
rustup target add aarch64-unknown-linux-gnu - SSH access to your server
Configuration
Create a .justlocal file in the project root:
export LISTSOME_HOST="your-server.local"
export LISTSOME_USER="your-username"
export LISTSOME_PORT="3003"
export LISTSOME_PORT_TEST="3005"
Then source it before running just commands:
source .justlocal
Note: .justlocal is gitignored - never commit it.
Quick Start
First Time Setup
just deploy-init
This creates:
/opt/listsome/with binary, static files, and database/opt/listsome/.envwith runtime configuration- Systemd service at
/etc/systemd/system/listsome.service - Database file at
/opt/listsome/db/listsome.db
Deploy Updates
just deploy
Builds ARM64 binary, copies to server, restarts service.
Cloudflare Tunnel Setup
Point your tunnel to localhost:3003 (or your configured port):
# ~/.cloudflared/config.yml
ingress:
- hostname: yourdomain.com
service: http://localhost:3003
Restart the tunnel: sudo systemctl restart cloudflared
First-Time Admin Setup
After deploying, visit https://yourdomain.com/setup to create your admin account.
Maintenance Commands
Production Management
just logs-prod # View real-time logs
just status-prod # Check service status
just restart-prod # Restart service
just shell # SSH to server
Binary Management
just binary-list # List all versions with timestamps
just rollback-prod # Interactive rollback to previous version
just binary-prune --keep 3 # Delete old versions, keep last 3
Database
just db-backup # Backup to ~/.listsome/backups/
Test Deployment (Optional)
Deploy to a test instance before promoting to production:
just deploy-test-init # First time test setup (port 3004)
just deploy-test # Deploy to test
File Structure on Server
/opt/listsome/ # Production
├── listsome # Current binary
├── listsome.v0.1.0 # Versioned backup
├── static/ # Static assets
├── content/assets/ # User uploads
├── db/
│ └── listsome.db # SQLite database
└── .env # Runtime config
/opt/listsome-test/ # Test (optional)
├── listsome
├── static/
├── content/assets/
├── db/
│ └── listsome.db
└── .env
Troubleshooting
Permission denied on database:
ssh your-user@your-server "sudo chown your-user:your-user /opt/listsome/db/listsome.db"
Service won’t start:
just logs-prod 100
just status-prod
Build fails:
rustup target add aarch64-unknown-linux-gnu
Security Notes
- App runs as your user (not root)
- Service is bound to specific port only
- Database is in app directory, isolated per instance
- Systemd hardening enabled (NoNewPrivileges, PrivateTmp, etc.)
See Also
just --listfor all available commandsjust helpfor quick reference