Added detailed debug logging throughout the application to diagnose
production issues on Windows Server with MySQL 5.6.
Debug Features:
- Enable with environment variable: DEBUG=true
- Logs database connection attempts with host, port, user, database
- Shows MySQL version on successful connection
- Tracks query execution step-by-step
- Reports row counts fetched from database
- Shows data conversion progress
- Categorization results (current vs upcoming events)
- All errors include error codes, SQL state, and full stack traces
Debug output includes:
- Connection parameters (host:port/database)
- MySQL server version
- Query execution status
- Number of rows returned
- Data conversion steps
- Event categorization counts
Startup now shows:
- DEBUG MODE: ENABLED/DISABLED
- Database connection info
- Instructions to enable debug mode
Error responses now include:
- Full error message
- Error code (errno)
- SQL state (if available)
- Complete stack trace
Usage on Windows production:
set DEBUG=true
python app.py
Or with PM2:
pm2 delete shopfloor-dashboard
pm2 start app.py --name shopfloor-dashboard --interpreter python3 --env DEBUG=true
pm2 logs shopfloor-dashboard
This will help identify the exact cause of 500 errors without switching
to a different MySQL connector.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added better error handling and MySQL 5.6 support for Windows Server:
1. Enhanced error logging in app.py:
- Detailed database error messages with error codes
- Full stack traces logged to console/PM2
- Error details returned in JSON for debugging
2. Created app-pymysql.py:
- Alternative version using PyMySQL instead of mysql-connector-python
- Better compatibility with older MySQL 5.6 servers
- Handles bit field conversion from bytes to boolean
- Pure Python implementation (no C extensions)
3. Added requirements-mysql56.txt:
- PyMySQL 1.1.0 for MySQL 5.6 compatibility
- Use this on Windows servers with old MySQL
For production Windows servers with MySQL 5.6, use:
pip install -r requirements-mysql56.txt
python app-pymysql.py
For debugging 500 errors, check console/PM2 logs for detailed error messages.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removed all Node.js/npm related files as they are no longer needed:
- server.js (replaced by app.py)
- package.json (replaced by requirements.txt)
- package-lock.json (npm lock file)
- node_modules/ (6.6 MB of npm packages)
Project size reduced from ~9 MB to 776 KB
The application now runs entirely on Python/Flask with only 2 dependencies:
- Flask
- mysql-connector-python
All functionality maintained and tested working.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
BREAKING CHANGE: Replaced Node.js backend with Python Flask
Reason: npm not available on production server, Python/pip is available.
Changes:
- Created app.py (Flask) to replace server.js (Node.js)
- Created requirements.txt with only 2 dependencies (Flask, mysql-connector-python)
- Updated README.md with Flask installation and deployment instructions
- Maintained all existing functionality:
* Same API endpoints (/api/notifications, /health)
* Same database queries (isshopfloor filter, 72-hour window)
* Same priority sorting (incidents first)
* Serves static files from public/ directory
* Same environment variable configuration
Dependencies:
- Flask==3.0.0
- mysql-connector-python==8.2.0
The public/index.html frontend remains unchanged - only the backend was converted.
Tested and verified:
- API endpoint returns correct data
- Health check responds
- Dashboard displays properly
- Database connectivity working
- PM2 process manager compatible
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Removed devDependencies section (nodemon) from package.json
- Removed "dev" script that referenced nodemon
- Reinstalled with --omit=dev flag
- Reduced node_modules from 8.4MB (105 packages) to 6.6MB (78 packages)
Only production dependencies remain:
- express (web server)
- mysql2 (database driver)
This creates a cleaner, smaller package for production deployment.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removed unnecessary files from PHP-based version of dashboard:
- api_notifications.php (replaced by server.js /api/notifications endpoint)
- db_config.php (database config now in server.js)
- index.php (replaced by public/index.html)
- ge-aerospace-logo.svg (duplicate, public/ge-aerospace-logo.svg is served)
The project now uses Node.js/Express exclusively with static files
served from the public/ directory.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Removed overflow: hidden and height: 100vh from body to allow scrolling
- Removed MAX_UPCOMING limit - now displays all upcoming events
- Removed "more events" indicator since all events are shown
- Added grid layout to upcoming events section for consistent display
- Both current and upcoming events now use 2-column grid (single column for 1 event)
This allows users to scroll and interact with the page to view all events
without artificial limits, improving usability for TV displays.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Removed display limits on current events to show all active notifications
- Implemented responsive 2-column grid layout (single column for 1 event, 2 columns for 2+)
- Added min-height to event-header for consistent spacing with/without ticket badges
- Fixed padding inconsistency between events with and without ticket numbers
- Maintained 2-event limit for upcoming events to preserve screen space
- Scaled proportionally for 4K displays (90px min-height, 24px margin)
This allows the dashboard to display all current events efficiently without
vertical overflow, addressing user feedback about event count limitations.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Backend (server.js):
- Implemented severity-based sorting for current events
- Priority hierarchy: Incident > Change > Awareness > TBD
- Events with same severity sorted by starttime (earliest first)
- Upcoming events remain sorted by starttime only
- Added severityPriority mapping for consistent ordering
Frontend (index.html):
- Reduced display limits for 1080p TVs: 2 current + 2 upcoming = 4 total
- Prevents content overflow on 1080p displays
- 4K displays still auto-scale content appropriately
- Ensures critical incidents always appear first in current events
Testing:
- Verified Incident appears before Change before Awareness
- Verified all 4 events fit on 1080p screen without scrolling
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implemented dynamic Current Events badge color based on severity hierarchy:
* RED (danger) if any Incident exists
* YELLOW (warning) if any Change exists (and no incidents)
* GREEN (success) if only Awareness/TBD exists
- Added getHighestSeverity() function to determine badge color
- Removed all emojis from UI for cleaner professional appearance
- Increased event card height (padding: 20px→30px vertical, 30px→40px horizontal)
- Increased color bar thickness from 40px to 60px for better visibility
- Improved visual hierarchy and clarity for TV display
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Extended time window from 48 hours to 72 hours
- Added isshopfloor filter - only show notifications marked for shopfloor
- Added JOIN with notificationtypes table to get type colors
- Implemented type-based color coding with 40px thick left border:
* Green (#0ad64f) for Awareness and TBD types
* Yellow (#ffc107) for Change type
* Red (#dc3545) for Incident type
- Optimized layout for single-screen TV display (no scrolling):
* Reduced all font sizes and spacing significantly
* Set overflow: hidden and height: 100vh on body
* Reduced header, section titles, event cards, and footer sizes
- Limited display to 3 current + 3 upcoming events max
- Shows "+ X more event(s)" indicator when needed
- Positioned LIVE badge in absolute top-right corner
- Updated all text references from 48 hours to 72 hours
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Node.js Express server with MySQL integration
- Real-time event dashboard with live updates
- GE Aerospace branding and design
- Auto-refresh every 10 seconds (AJAX)
- Shows current and upcoming events (48 hour window)
- Connection status monitoring
- Optimized for TV display
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>