Skip to main content

A CLI tool to aggregate and view curated news articles from 100+ sources

Project description

Articlay ๐Ÿ“ฐ

PyPI version Python Downloads License: MIT

A comprehensive news aggregator that fetches articles from popular magazines and news sources worldwide, including India and Tamil Nadu, and presents them in a beautiful, minimalistic UI.

โœจ Zero Configuration CLI - Install and use immediately with pip install articlay!

Features

News Aggregation

  • ๐ŸŒ Global Coverage: Fetches from 35+ news sources including Reuters, Forbes, The Economist, Wired, Nature, BBC, CNN, Al Jazeera, and more
  • ๐Ÿ‡ฎ๐Ÿ‡ณ Indian News: Includes The Hindu, Times of India, Indian Express, NDTV, Hindustan Times, Zee News, India Today, DD News
  • ๐Ÿ›๏ธ Tamil Nadu News: Features Dinamalar, Dinamani, Daily Thanthi
  • ๐ŸŽฌ Movie & Film: Mubi, Letterboxd, RogerEbert.com, IndieWire, Criterion Collection, Film Companion, Filmfare, Variety
  • ๐Ÿ“š Literature: Literary Hub, Project Gutenberg, The Paris Review, Granta, New Yorker Books, Hindu Literary Review
  • โœ๏ธ Writing: Medium, Substack, Wattpad, Electric Literature, Poets.org, Reddit r/writing
  • ๐Ÿ“‚ Categorized Articles: Organized by World, India, Tamil Nadu, Movie, Literature, Writing, Reddit, Business, Technology, Science, Culture, and more
  • โšก Frequent Updates: Runs automatically every 15 minutes
  • ๐Ÿ”„ Deduplication: Intelligent article deduplication to prevent duplicates across sources
  • ๐ŸŽฏ One Article Per Source: Displays one unique article from each news source per update

Wikipedia & Special Content

  • ๐Ÿ“š Wikipedia Article of the Day: Featured article with full content
  • ๐Ÿ–ผ๏ธ Wikipedia Picture of the Day: Beautiful daily images from Wikimedia Commons
  • ๐Ÿ“œ Wikipedia Quote of the Day: Inspiring quotes from Wikiquote
  • ๐ŸŽฒ Random Wikipedia Article: Discover something new every day
  • ๐Ÿ“… On This Day in History: Historical events that happened on the current date
  • ๐Ÿ’ก Daily Quotes: Inspirational quotes from multiple sources

User Interface

  • ๐ŸŒ GitHub Pages UI: Beautiful, minimalistic interface to browse today's articles
  • ๐ŸŽจ 1970s Retro Design: Bold red Courier New header with vintage text shadow effects
  • ๐ŸŒˆ Retro Article Highlights: Colorful gradient left border appears on hover for a vintage magazine feel
  • ๐ŸŽญ Easter Egg: Jean-Michel Basquiat-style art revealed when scrolling to bottom (footer fades away)
  • ๐Ÿ‘† Touch Gestures: Swipe left/right to switch between tabs (no refresh), pull down to refresh
  • ๐ŸŒ“ Dark Mode: Toggle between light and dark themes with localStorage persistence
  • ๐Ÿ” Powerful Search: Real-time search by keywords or source names (e.g., "forbes", "technology", "climate")
    • Search across all fields or filter by source name, title, description, or category
    • Case-insensitive with instant results as you type
    • Clear search to return to all articles
  • ๐Ÿ“Š Statistics Dashboard: View article counts, sources, and categories at a glance
  • ๐Ÿ“ฑ Responsive Design: Works perfectly on desktop, tablet, and mobile
  • ๐Ÿ• IST Timezone: All times and dates use Indian Standard Time

Data Management

  • ๐Ÿ’พ Gist Storage: Stores current date's article data (title, description, link, publish date, category) to GitHub Gist
  • ๐ŸŽฏ Current Date Focus: Only keeps today's articles to maintain optimal performance (keeps JSON ~386KB instead of accumulating to 11+MB over time)

Installation

Prerequisites

  • Python 3.7 or higher
  • GitHub Personal Access Token (for Gist archiving)

Setup

  1. Clone the repository:
git clone https://github.com/pappater/articlay.git
cd articlay
  1. Install dependencies:
pip install -r requirements.txt
  1. Set up your GitHub token (for Gist archiving):
export GITHUB_TOKEN="your_github_personal_access_token"

Or create a .env file:

GITHUB_TOKEN=your_github_personal_access_token

Usage

Daily Automation (Recommended)

The repository is configured to automatically fetch articles every day at 6:00 AM IST via GitHub Actions. The scraped articles are:

  1. Stored in a GitHub Gist
  2. Displayed on the live UI

No manual intervention is required!

Command-Line Interface (CLI)

Articlay provides a powerful CLI for viewing articles right in your terminal.

โœจ Zero Configuration Required! The CLI works immediately after installation with no setup needed.

Installation

Install from PyPI (recommended):

pip install articlay

That's it! No configuration, no Gist ID, no setup. Just install and use.

Or install from source:

git clone https://github.com/pappater/articlay.git
cd articlay
pip install -e .

Quick Start (No Setup Needed!)

# Install and use immediately
pip install articlay

# Show all articles
articlay --all

# Show India news
articlay --india --limit 10

# Get one random article
articlay random

# Show Tamil Nadu news
articlay --tamilnadu --limit 5

# Show tech articles
articlay --codetech -l 15

โœ… Works out of the box - No Gist ID or environment variables needed!
โœ… Same content as web UI - Access all articles from the terminal
โœ… Perfect for developers - Fast, lightweight, and scriptable

Available Category Flags

  • --foryou - Curated selection from all sources
  • --india or --indi - India news
  • --tamilnadu or --tn - Tamil Nadu news
  • --movie - Movie reviews and film news
  • --literature or --lit - Literature and books
  • --writing - Writing tips and author resources
  • --reddit - Popular Reddit posts
  • --codetech or --tech - Technology and programming
  • --artculture or --art - Art exhibitions and culture
  • --others - All other categories
  • --all - Show all articles from today

Examples

# View help
articlay --help

# Show specific category with limit
articlay --india --limit 10
articlay --movie -l 5

# Random article discovery
articlay random

# Show all available articles
articlay --all --limit 0

Advanced Configuration (Optional)

Note: Configuration is NOT required for normal use! Only needed for advanced scenarios.

# Use your own Gist ID (optional)
export ARTICLAY_GIST_ID="your_gist_id"
articlay --all

# Use a private Gist (optional)
export GITHUB_TOKEN="your_token"
articlay --india

# Or pass Gist ID as argument (optional)
articlay --gist-id your_gist_id --all

For complete CLI documentation, see CLI_GUIDE.md.

Manual Scraper Execution

To manually run the article scraper:

# Set your GitHub token (required for Gist storage)
export GITHUB_TOKEN="your_github_token_here"

# Run the daily scraper
python daily_gist_job.py

This will:

  • Fetch articles from all configured news sources
  • Store them in the configured GitHub Gist
  • Organize them by date and category

Legacy Magzter Tool

The original articlay.py tool for Magzter is still available:

# Basic usage (uses placeholder data)
python articlay.py --magazines 20 --articles 10

Output

The tool generates two types of output:

  1. Console Output: Displays selected articles with titles, magazine names, and links
  2. JSON File: Saves articles locally as articlay-YYYY-MM-DD.json
  3. GitHub Gist: Archives articles as markdown to a public Gist (if enabled)

Example Output

๐Ÿ“ฐ Articlay - Magzter Article Aggregator
==================================================

Fetching top 10 popular magazines...
Found 10 magazines

Selecting 5 random articles from different magazines...

๐Ÿ“š Selected Articles:
--------------------------------------------------

1. Magazine 1 - Article 3
   Magazine: Magazine 1
   Link: https://www.magzter.com/magazine-1/article-3

2. Magazine 5 - Article 2
   Magazine: Magazine 5
   Link: https://www.magzter.com/magazine-5/article-2

...

โœ“ Archived to Gist: https://gist.github.com/...
โœ“ Articles saved to: articlay-2024-01-15.json

Setup for Your Own Instance

If you want to run Articlay on your own repository:

  1. Fork the repository

  2. Create a GitHub Gist

    • Go to https://gist.github.com/
    • Create a new gist with filename magazine-articles.json
    • Initialize it with {}
    • Copy the Gist ID from the URL
  3. Update Configuration

    • Edit gist_config.py with your Gist ID
    • Edit docs/index.html to update the GIST_ID constant
  4. Set up GitHub Token

    • Go to GitHub Settings โ†’ Developer settings โ†’ Personal access tokens
    • Generate a new token with gist scope
    • Add it as a repository secret named GIST_TOKEN
  5. Enable GitHub Pages

    • Go to repository Settings โ†’ Pages
    • Source: Deploy from a branch
    • Branch: main, folder: /docs
    • Save
  6. Enable GitHub Actions

    • The workflows will run automatically
    • Articles will be fetched daily at 6 AM IST

Requirements

See requirements.txt:

  • requests>=2.31.0
  • beautifulsoup4>=4.12.0
  • lxml>=4.9.0

Live Demo

Visit the live UI: https://pappater.github.io/articlay/

Browse daily articles in a clean, minimalistic interface organized by category.

News Sources

World News (7 sources)

  • Reuters, Time, The Atlantic, NPR, BBC, CNN, Al Jazeera

Business & Economics (3 sources)

  • Forbes, The Economist, Bloomberg

Technology (1 source)

  • Wired

Science & Nature (5 sources)

  • National Geographic, Scientific American, Popular Science, New Scientist, Nature

Culture (2 sources)

  • The New Yorker, Smithsonian Magazine

India (8 sources)

  • The Hindu, Times of India, Indian Express, NDTV, Hindustan Times, Zee News, India Today, DD News

Tamil Nadu (3 sources)

  • Dinamalar, Dinamani, Daily Thanthi

Wikipedia & Special Content (6 sources)

  • Wikipedia Article of the Day
  • Wikipedia Picture of the Day
  • Random Wikipedia Article
  • Wikiquote Quote of the Day
  • On This Day in History
  • Daily Inspirational Quotes

Total: 35+ sources across 9 categories

Automation

Articles are automatically scraped and stored every 15 minutes via GitHub Actions. Non-working scrapers are gracefully skipped.

Note: The 15-minute schedule is aggressive and may cause rate limiting with some sources. Monitor the GitHub Actions logs and adjust the schedule in .github/workflows/daily-gist.yml if needed (e.g., change to 0 */1 * * * for hourly updates).

Scraper Status

For tracking which scrapers are working and which need attention, see SCRAPER_STATUS.md. This document helps identify:

  • Newly added scrapers pending production testing
  • Known issues with specific scrapers
  • Alternative sources when scrapers fail
  • Testing instructions for individual scrapers

License

MIT License

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

articlay-1.1.5.tar.gz (40.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

articlay-1.1.5-py3-none-any.whl (12.6 kB view details)

Uploaded Python 3

File details

Details for the file articlay-1.1.5.tar.gz.

File metadata

  • Download URL: articlay-1.1.5.tar.gz
  • Upload date:
  • Size: 40.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.1

File hashes

Hashes for articlay-1.1.5.tar.gz
Algorithm Hash digest
SHA256 1979d4cc3a22ab19882ba50534965d1b1599b97b01af7c771827a087ca7d8701
MD5 914e7888013acaf5ba5a124c28c12a63
BLAKE2b-256 3634255bee5d180a4754bac8ba020cf6394d768985ea7a32b7a84bf428e209c1

See more details on using hashes here.

File details

Details for the file articlay-1.1.5-py3-none-any.whl.

File metadata

  • Download URL: articlay-1.1.5-py3-none-any.whl
  • Upload date:
  • Size: 12.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.1

File hashes

Hashes for articlay-1.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 85629aa55d6370f89d63dce7f15071c1b40aeb159170b99f6eb60222107e1442
MD5 a129f3623dac50cfbb7cce51b7b0819f
BLAKE2b-256 cd2b3c48a012025a017cffbec8acf06dfb7f6a7bc2439fb2b0e146d3ca559634

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page