Enhanced the community matching logic in /api/posts to work for all platforms by using platform-agnostic matching rules: 1. Exact source match (source == community) 2. Platform match (platform == community) 3. Partial source match (substring) 4. Partial post ID match (substring) This resolves the issue where users with empty communities couldn't see posts and works equally well for Reddit, HackerNews, Lobsters, GitHub, etc. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
BalanceBoard
A Reddit-style content aggregator that collects posts from multiple platforms (Reddit, Hacker News, RSS feeds) and presents them in a unified, customizable feed.
Features
- Multi-Platform Support: Collect content from Reddit, Hacker News, and RSS feeds
- Automated Polling: Background service polls sources at configurable intervals
- User Authentication: Local accounts with bcrypt password hashing and Auth0 OAuth support
- Anonymous Browsing: Browse public feed without creating an account
- Password Reset: Secure token-based password reset mechanism
- Customizable Feeds: Filter and customize content based on your preferences
- Admin Panel: Manage polling sources, view logs, and configure the system
- Modern UI: Card-based interface with clean, responsive design
Quick Start
Prerequisites
- Python 3.12+
- PostgreSQL database
- Docker (for containerized deployment)
Local Development
-
Clone the repository
git clone https://git.scorpi.us/chelsea/balanceboard.git cd balanceboard -
Set up environment
python3 -m venv venv source venv/bin/activate pip install -r requirements.txt -
Configure environment variables
cp .env.example .env # Edit .env with your database credentials and settings -
Initialize the database
python3 -c "from app import app, db; app.app_context().push(); db.create_all()" -
Run migrations (if needed)
python3 migrate_password_reset.py -
Start the application
python3 app.py -
Access the application
- Open browser to
http://localhost:5000 - Create an account or browse anonymously
- Open browser to
Docker Deployment
-
Build the image
docker build -t git.scorpi.us/chelsea/balanceboard:latest . -
Push to registry
docker push git.scorpi.us/chelsea/balanceboard:latest -
Deploy with docker-compose
docker-compose up -d
See DEPLOYMENT.md for detailed deployment instructions.
Configuration
Platform Sources
Configure available platforms and communities in platform_config.json:
{
"reddit": {
"name": "Reddit",
"communities": [
{
"id": "programming",
"name": "r/programming",
"description": "Computer programming"
}
]
}
}
Polling Configuration
Admins can configure polling sources via the Admin Panel:
- Platform: reddit, hackernews, or rss
- Source ID: Subreddit name, or RSS feed URL
- Poll Interval: How often to check for new content (in minutes)
- Max Posts: Maximum posts to collect per poll
- Fetch Comments: Whether to collect comments
- Priority: low, medium, or high
Environment Variables
Key environment variables (see .env.example):
DATABASE_URL: PostgreSQL connection stringSECRET_KEY: Flask secret key for sessionsAUTH0_DOMAIN: Auth0 domain (if using OAuth)AUTH0_CLIENT_ID: Auth0 client IDAUTH0_CLIENT_SECRET: Auth0 client secret
Architecture
Components
- Flask Web Server (
app.py): Main application server - Polling Service (
polling_service.py): Background scheduler for data collection - Data Collection (
data_collection.py,data_collection_lib.py): Platform-specific data fetchers - Database Models (
models.py): SQLAlchemy ORM models - User Service (
user_service.py): User authentication and management
Database Schema
- users: User accounts with authentication
- poll_sources: Configured polling sources
- poll_logs: History of polling activities
- user_sessions: Active user sessions
Data Flow
- Polling service checks enabled sources at configured intervals
- Data collection fetchers retrieve posts from platforms
- Posts are normalized to a common schema and stored in
data/posts/ - Web interface displays posts from the feed
- Users can filter, customize, and interact with content
API Endpoints
Public Routes
GET /: Main feed (anonymous or authenticated)GET /login: Login pagePOST /login: Authenticate userGET /register: Registration pagePOST /register: Create new accountGET /password-reset-request: Request password resetPOST /password-reset-request: Send reset linkGET /password-reset/<token>: Reset password formPOST /password-reset/<token>: Update password
Authenticated Routes
GET /settings: User settingsGET /logout: Log out
Admin Routes
GET /admin: Admin panelGET /admin/polling: Manage polling sourcesPOST /admin/polling/add: Add new sourcePOST /admin/polling/update: Update source settingsPOST /admin/polling/poll: Manually trigger poll
Development
Project Structure
balanceboard/
├── app.py # Main Flask application
├── polling_service.py # Background polling service
├── data_collection.py # Data collection orchestration
├── data_collection_lib.py # Platform-specific fetchers
├── models.py # Database models
├── user_service.py # User management
├── database.py # Database setup
├── platform_config.json # Platform configurations
├── filtersets.json # Content filter definitions
├── templates/ # Jinja2 templates
├── static/ # Static assets (CSS, JS)
├── themes/ # UI themes
├── data/ # Data storage
│ ├── posts/ # Collected posts
│ ├── comments/ # Collected comments
│ └── moderation/ # Moderation data
├── requirements.txt # Python dependencies
├── Dockerfile # Docker image definition
├── docker-compose.yml # Docker composition
├── README.md # This file
└── DEPLOYMENT.md # Deployment instructions
Adding a New Platform
- Add platform config to
platform_config.json - Implement fetcher in
data_collection_lib.py:fetchers.getPlatformData()converters.platform_to_schema()builders.build_platform_url()
- Update routing in
getData()function - Test data collection
- Add to available sources in admin panel
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
See DEPLOYMENT.md for commit and issue management guidelines.
License
This is a personal project by Chelsea. All rights reserved.
Support
For issues and feature requests, please use the issue tracker at: https://git.scorpi.us/chelsea/balanceboard/issues