chelsea 3ab3b04643 Clean up redundant authentication checks in dashboard template
Removed redundant current_user.is_authenticated checks in the else block
of the navigation menu. The else block only executes for authenticated
users per app.py logic (line 278 vs 293), so the nested checks were
dead code that created confusion.

Changes:
- Removed defensive checks for unauthenticated users in authenticated block
- Added clarifying comment about when else block executes
- Simplified template logic for better maintainability
- Removed dead code paths (Anonymous User label, ? avatar)

Addresses concerns raised in Issue #2 about confusing template logic.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 22:08:42 -05:00
2025-10-11 17:38:19 -05:00

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

  1. Clone the repository

    git clone https://git.scorpi.us/chelsea/balanceboard.git
    cd balanceboard
    
  2. Set up environment

    python3 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
    
  3. Configure environment variables

    cp .env.example .env
    # Edit .env with your database credentials and settings
    
  4. Initialize the database

    python3 -c "from app import app, db; app.app_context().push(); db.create_all()"
    
  5. Run migrations (if needed)

    python3 migrate_password_reset.py
    
  6. Start the application

    python3 app.py
    
  7. Access the application

    • Open browser to http://localhost:5000
    • Create an account or browse anonymously

Docker Deployment

  1. Build the image

    docker build -t git.scorpi.us/chelsea/balanceboard:latest .
    
  2. Push to registry

    docker push git.scorpi.us/chelsea/balanceboard:latest
    
  3. 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 string
  • SECRET_KEY: Flask secret key for sessions
  • AUTH0_DOMAIN: Auth0 domain (if using OAuth)
  • AUTH0_CLIENT_ID: Auth0 client ID
  • AUTH0_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

  1. Polling service checks enabled sources at configured intervals
  2. Data collection fetchers retrieve posts from platforms
  3. Posts are normalized to a common schema and stored in data/posts/
  4. Web interface displays posts from the feed
  5. Users can filter, customize, and interact with content

API Endpoints

Public Routes

  • GET /: Main feed (anonymous or authenticated)
  • GET /login: Login page
  • POST /login: Authenticate user
  • GET /register: Registration page
  • POST /register: Create new account
  • GET /password-reset-request: Request password reset
  • POST /password-reset-request: Send reset link
  • GET /password-reset/<token>: Reset password form
  • POST /password-reset/<token>: Update password

Authenticated Routes

  • GET /settings: User settings
  • GET /logout: Log out

Admin Routes

  • GET /admin: Admin panel
  • GET /admin/polling: Manage polling sources
  • POST /admin/polling/add: Add new source
  • POST /admin/polling/update: Update source settings
  • POST /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

  1. Add platform config to platform_config.json
  2. Implement fetcher in data_collection_lib.py:
    • fetchers.getPlatformData()
    • converters.platform_to_schema()
    • builders.build_platform_url()
  3. Update routing in getData() function
  4. Test data collection
  5. Add to available sources in admin panel

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Test thoroughly
  5. 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

Description
BalanceBoard - ADHD-friendly content aggregator
Readme 1.5 MiB
Languages
Python 52.3%
HTML 42.3%
CSS 3.9%
JavaScript 1.2%
Dockerfile 0.3%