A powerful "Read It Later" tool that saves web articles to your own GitHub Pages site using GitHub Actions. Your personal reading archive powered by GitHub with advanced features like search, RSS feeds, and image handling.
- 📚 Article Extraction: Clean article text with metadata (author, date)
- 🔍 Full-Text Search: JavaScript-powered search through titles and authors
- 📱 Responsive Design: Beautiful, mobile-friendly interface
- 🖼️ Image Handling: Downloads and optimizes images for offline viewing
- 📡 RSS Feed: Auto-generated RSS feed for your saved articles
- 🔄 Duplicate Detection: Prevents saving the same article twice
- 📊 Rich Metadata: Extracts and displays author and date
- 🎨 Modern UI: Clean, professional design with hover effects and animations
- 📖 Reading Experience: Optimized typography and layout for comfortable reading
GitHub is free and many developers already use it. This project turns your GitHub account into a personal read-it-later service with advanced features. No subscriptions, no third-party storage, just your own archive built with tools you already have.
The system uses GitHub's repository dispatch feature to trigger article extraction:
- You send a URL via HTTP POST request to GitHub's API
- GitHub Actions triggers and checks out your repository
- Article extraction happens using Python's newspaper library
- Metadata is extracted (author, date)
- Images are downloaded and optimized for local storage
- Content is saved as a formatted HTML file with rich styling
- Search index is updated with article metadata
- RSS feed is generated with latest articles
- GitHub Pages deploys the updated site automatically
URL Request → GitHub API → Actions Workflow → Extract Article → Process Images → Update Search Index → Generate RSS → Deploy
- Go to your repository's Settings tab
- Scroll down to Pages section
- Set Source to "Deploy from a branch"
- Select gh-pages branch and / (root) folder
- Click Save
- Go to GitHub Settings → Developer settings → Personal access tokens → Tokens (classic)
- Click Generate new token (classic)
- Give it a descriptive name like "ReadItLater Dispatch"
- Select these scopes:
repo
(Full control of private repositories)workflow
(Update GitHub Action workflows)
- Copy the generated token (you won't see it again!)
Send a test request to add your first article:
curl -X POST \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token YOUR_PERSONAL_ACCESS_TOKEN" \
https://api.github.com/repos/YOUR_USERNAME/YOUR_REPO_NAME/dispatches \
-d '{"event_type":"new-url","client_payload":{"url":"https://example.com/some-article"}}'
Replace:
YOUR_PERSONAL_ACCESS_TOKEN
with your tokenYOUR_USERNAME
with your GitHub usernameYOUR_REPO_NAME
with your repository name- The URL with an actual article you want to save
curl -X POST \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token YOUR_TOKEN" \
https://api.github.com/repos/YOUR_USERNAME/YOUR_REPO/dispatches \
-d '{"event_type":"new-url","client_payload":{"url":"ARTICLE_URL"}}'
Create a bookmarklet for one-click saving. Add this as a bookmark:
javascript:(function(){var url=encodeURIComponent(window.location.href);fetch('https://api.github.com/repos/YOUR_USERNAME/YOUR_REPO/dispatches',{method:'POST',headers:{'Accept':'application/vnd.github.v3+json','Authorization':'token YOUR_TOKEN','Content-Type':'application/json'},body:JSON.stringify({event_type:'new-url',client_payload:{url:window.location.href}})}).then(r=>r.ok?alert('Article saved!'):alert('Error saving article'));})();
Feel free to submit issues and enhancement requests! Some ideas for improvements:
This project is open source and available under the MIT License.