A modern, browser-based news aggregator that pulls the latest news from major news providers without requiring any API keys. Built with Node.js, Express, and Docker for easy deployment. The application uses RSS feeds from trusted news sources to deliver real-time news updates.
- π° Multiple News Sources: Aggregates news from BBC, CNN, The Guardian, Reuters, NPR, Al Jazeera, TechCrunch, and Hacker News
- π Filter by Source: View news from specific providers
- π Category Filtering: Filter by categories like Top Stories, World, Technology, and Business
- π Auto-Refresh: Automatically updates every 5 minutes
- π± Responsive Design: Works seamlessly on desktop, tablet, and mobile devices
- π No API Keys Required: Uses public RSS feeds for data
- π― Direct Links: Click any article to read the full story on the original source
The application aggregates news from:
- BBC News - UK & World news
- CNN - International news coverage
- The Guardian - In-depth journalism
- Reuters - Global news agency
- NPR - US public radio news
- Al Jazeera - Middle East & international news
- TechCrunch - Technology news
- Hacker News - Tech community news
-
Using Docker Compose (easiest):
docker-compose up -d
-
Using Docker directly:
# Build the image docker build -t 3eekeeper-news-aggregator . # Run the container docker run -d -p 3000:3000 --name news-aggregator 3eekeeper-news-aggregator
-
Access the application: Open your browser and navigate to
http://localhost:3000 -
Stop the container:
# With Docker Compose docker-compose down # With Docker docker stop news-aggregator
-
Clone or navigate to the project directory:
cd news_app -
Install dependencies:
npm install
-
Start the server:
npm start
-
Open your browser and navigate to:
http://localhost:3000
- Use the application:
- Select a news source from the dropdown or view all sources
- Filter by category (Top Stories, World, Technology, etc.)
- Click on any article card to read the full story on the original website
- Click the refresh button to manually update the news
- The app auto-refreshes every 5 minutes
Using Docker Compose (Recommended):
# Start the application
docker-compose up -d
# View logs
docker-compose logs -f
# Stop the application
docker-compose down
# Rebuild after code changes
docker-compose up -d --buildUsing Docker CLI:
# Build the image
docker build -t 3eekeeper-news-aggregator .
# Run the container
docker run -d \
-p 3000:3000 \
--name news-aggregator \
--restart unless-stopped \
3eekeeper-news-aggregator
# View logs
docker logs -f news-aggregator
# Stop and remove container
docker stop news-aggregator
docker rm news-aggregator- β Small image size - Uses Alpine Linux base (~150MB)
- β Health checks - Automatic container health monitoring
- β Auto-restart - Container restarts automatically on failure
- β Production-ready - Optimized for production deployments
- β Easy deployment - Single command deployment
To run in development mode with auto-restart on file changes:
npm run devnews_app/
βββ server.js # Express server with RSS parsing
βββ package.json # Project dependencies
βββ README.md # This file
βββ public/ # Frontend files
βββ index.html # Main HTML page
βββ styles.css # Styling
βββ script.js # Frontend JavaScript
- Express.js: Web server framework
- rss-parser: Parses RSS feeds from news sources
- CORS: Handles cross-origin requests
- Node.js: Runtime environment
- Vanilla JavaScript: No framework dependencies
- Responsive CSS: Mobile-first design
- Async/Await: Modern JavaScript for API calls
- The Express server fetches RSS feeds from various news sources
- The RSS parser converts XML feeds to JSON
- Articles are sorted by publication date
- The frontend displays articles in a responsive grid
- Clicking an article opens the original source in a new tab
Edit server.js and add to the newsSources object:
'source-id': {
name: 'Source Name',
feeds: [
{ category: 'Category Name', url: 'https://example.com/feed.rss' }
]
}Set the PORT environment variable or edit server.js:
const PORT = process.env.PORT || 3000;Edit script.js (last line):
// Current: 5 minutes (5 * 60 * 1000 ms)
setInterval(() => {
loadNews();
}, 5 * 60 * 1000);- Chrome (recommended)
- Firefox
- Safari
- Edge
- Opera
MIT License - Feel free to use and modify for your projects.
- RSS feeds are public and don't require authentication
- Some feeds may be temporarily unavailable
- Image availability depends on the RSS feed
- Respects rate limits by caching on the server side
- All articles link directly to their original sources