An automated system that fetches notifications from Anna University COE website and delivers them to an Android app.
| App Interface | Home Screen Widget | Push notification |
|---|---|---|
![]() |
![]() |
![]() |
- ✅ Automatic notification scraping every 15 minutes
- ✅ Real-time push notifications when new notifications are posted on COE website
- ✅ Automatic update notifications - app checks for new versions and provides direct APK download link
- ✅ Manual test notification workflow to test push notifications
- ✅ Manual APK build trigger with version management
- ✅ Pull-to-refresh in the app
- ✅ Offline caching with AsyncStorage
- ✅ Clean notification list UI with teal theme (#37B3B3)
- ✅ Tap to open official links in browser
- ✅ "NEW" badge for new notifications
- ✅ Home screen widget to view latest notifications
- ✅ Direct link to COE website when tapping notifications
- ✅ Firebase Cloud Messaging (FCM) for reliable push notifications
/
├── .github/
│ └── workflows/
│ ├── fetch-notifications.yml # Auto-fetch + send FCM notifications every 15 min
│ ├── build-apk.yml # Manual APK build
│ └── test-notifications.yml # Test push notifications manually
├── scraper/
│ ├── package.json
│ └── index.js # Node.js scraper
├── app/
│ ├── android/ # Android project files
│ ├── App.tsx # Main React Native app
│ ├── NotificationService.ts # Firebase notification service
│ └── package.json
├── scripts/
│ ├── send-test-notification.js # Send test notification via FCM
│ └── send-new-notification.js # Send notification for real updates
├── docs/
│ ├── FCM_SETUP.md # Firebase setup guide
│ └── NTFY_SETUP.md # ntfy.sh setup guide (legacy)
└── data/
└── notifications.json # Scraped notifications data
- Fetches notifications from Anna University COE website marquee section
- Extracts title, link, and "new" status
- Generates unique IDs using MD5 hash
- Saves to
data/notifications.json
- fetch-notifications.yml: Runs every 15 minutes via cron job
- Scrapes new notifications
- Detects new notifications by comparing with previous data
- Sends push notifications via Firebase Cloud Messaging (FCM)
- Commits updated data to repository
- build-apk.yml: Manually triggered to build Android APK
- test-notifications.yml: Manually triggered to send test push notification
- Fetches notifications from GitHub raw JSON URL
- Displays in a clean list with pull-to-refresh
- Offline caching for better performance
- Teal theme matching COE website
- Automatic Update Checker:
- Checks for new app versions from GitHub releases (once per day)
- Shows update banner when new version is available
- Provides direct APK download link
- Displays release notes
- Push Notifications:
- Automatically sent when new notifications are detected on COE website
- Manual test notifications via GitHub Actions workflow
- Uses Firebase Cloud Messaging for reliable delivery
- Home Screen Widget: Add widget to home screen to see latest notifications at a glance
- Direct COE Link: Tap any push notification or widget to open coe.annauniv.edu
- Go to Releases
- Download the latest APK file
- Enable "Install from Unknown Sources" in Android settings
- Install the APK
- Grant notification permissions when prompted
- That's it! You'll receive push notifications automatically! 📱
- Long press on home screen
- Select "Widgets"
- Find "AU Notifications" widget
- Drag to home screen
cd scraper
npm install
npm startcd app
npm install
# Run on Android
npm run androidThe APK is built via GitHub Actions with proper version management:
-
Build APK with Version:
- Go to Actions tab
- Select Build APK workflow
- Click Run workflow
- Enter version number (e.g., "1.0", "1.1", "2.0")
- Enter release notes
- Click Run workflow
- APK will be created as a GitHub Release with the specified version
- Download from Releases page:
anna-univ-notifications-v{version}.apk
-
Version Management:
- Version format:
MAJOR.MINORorMAJOR.MINOR.PATCH(e.g., 1.0, 1.1, 2.0.1) - Version code is auto-calculated:
MAJOR*10000 + MINOR*100 + PATCH - Example: v1.2 = version code 10200, v2.0.1 = version code 20001
- The app automatically updates version info in code during build
- See Update System Guide for detailed version management
- Version format:
The app includes an automatic update system:
- Checks for updates once every 24 hours from GitHub releases
- Shows update banner when new version is available
- Direct download link to latest APK
- Release notes displayed in-app
- Zero configuration - works automatically for all users
When a new version is released:
- Users see a green update banner on app startup
- Tap "Update" to view release notes
- Tap "Download" to get the latest APK
- Install and enjoy new features! 🎉
For detailed information about the update system and releasing new versions, see the Update System Guide.
To test sending a push notification:
- Make sure the app is installed on your device
- Go to Actions tab in GitHub
- Select Test Notifications workflow
- Click Run workflow
- Enter a custom test message (optional)
- Click Run workflow
- Check your phone - you should receive a push notification! 📱
The system automatically sends push notifications for new Anna University announcements:
- The fetch-notifications workflow runs every 15 minutes
- When new notifications appear on coe.annauniv.edu:
- They are automatically scraped
- Push notifications are sent to all app users via Firebase FCM
- Your phone receives the notification in real-time
- No manual action required - just wait for new notifications!
The test workflow validates:
- ✅ Scraper successfully fetches notifications
- ✅ JSON data structure is valid
- ✅ All required fields are present (notifications, lastUpdated, count)
- ✅ Push notification is sent successfully via Firebase FCM
{
"notifications": [
{
"id": "a1b2c3d4",
"title": "Review Results of April/May 2025 Examinations is Published",
"link": "https://coe.annauniv.edu/aucoe/pdf/results.pdf",
"isNew": true
}
],
"lastUpdated": "2025-12-17T10:30:00.000Z",
"count": 15
}- Scraper: Node.js, Axios, Cheerio
- App: React Native 0.73, TypeScript
- Push Notifications: Firebase Cloud Messaging (FCM)
- Widget: Native Android widget (Kotlin)
- Storage: AsyncStorage
- CI/CD: GitHub Actions
Everything is done from GitHub.com — no local tools or CLI required.
Go to Settings → Secrets and variables → Actions → New repository secret and add:
| Secret name | Value |
|---|---|
CLOUDFLARE_API_TOKEN |
Cloudflare API token with Workers KV: Edit and Workers Scripts: Edit permissions |
CLOUDFLARE_ACCOUNT_ID |
Your Cloudflare account ID (found on the Cloudflare dashboard right sidebar) |
CF_WORKER_GITHUB_TOKEN |
A GitHub fine-grained PAT for this repo with Actions: write permission (the Worker uses this to trigger scrape workflows) |
FIREBASE_SERVICE_ACCOUNT |
Firebase service account JSON key (see FCM_SETUP.md) |
- Go to the Actions tab on GitHub.com
- Select "Setup KV Namespace (Run Once)"
- Click Run workflow → Run workflow
- The workflow creates the Cloudflare KV namespace via the API and commits the namespace ID directly into
worker/wrangler.toml— nothing to do locally
- Go to the Actions tab
- Select "Deploy Cloudflare Worker"
- Click Run workflow → Run workflow
- The workflow deploys the Worker and automatically pushes
CF_WORKER_GITHUB_TOKENas the Worker'sGITHUB_TOKENsecret — no localwrangler secret putneeded
After Step 3 succeeds the Worker is live and running on its cron schedule.
Re-deploys: any push to
mainthat touchesworker/triggers the deploy workflow automatically.
MIT License - See LICENSE file for details
Contributions are welcome! Please feel free to submit a Pull Request.


