A browser extension that integrates with changedetection.io to monitor your watches directly from your browser toolbar.
- 🔍 Watch Monitoring: View all your changedetection.io watches in a clean popup interface
 - 🔴 Visual Indicators: Red badge icon when unread watches are detected
 - 📖 Read Status: Bold text for unread watches, regular text for read watches
 - 🔗 Quick Access: Click any watch to open the monitored URL and mark it as read
 - ⚙️ Easy Setup: Simple configuration for server URL and API key
 - 🔄 Auto Refresh: Automatic background updates every 5 minutes
 - 🌐 Chrome Extension: Manifest V3 compatible with Chrome and Chromium browsers
 
- 
Clone the repository:
git clone <repository-url> cd changedetection-ext
 - 
Install dependencies:
npm install
 - 
Build the extension:
npm run build:chrome
 - 
Load in Chrome:
- Open 
chrome://extensions/ - Enable "Developer mode"
 - Click "Load unpacked"
 - Select the 
distdirectory (not the main project directory) 
 - Open 
 
The extension requires icon files in the icons/ directory. Create these PNG files:
icon16.png(16x16 pixels)icon32.png(32x32 pixels)icon48.png(48x48 pixels)icon128.png(128x128 pixels)
You can use any image editor or generate simple icons online.
- Click the extension icon in your browser toolbar
 - Click "Configure" or the settings gear icon
 - Enter your server details:
- Server URL: Your changedetection.io server (e.g., 
http://localhost:5000) - API Key: Your API key from changedetection.io settings
 
 - Server URL: Your changedetection.io server (e.g., 
 - Click "Test Connection" to verify the setup
 - Click "Save Settings" to store your configuration
 
- Open your changedetection.io web interface
 - Go to Settings
 - Find the API section
 - Enable the API if not already enabled
 - Copy your API key
 
- Click the extension icon to open the popup
 - See all your watches with their current status
 - Bold text = unread (last_viewed < last_changed)
 - Regular text = read (last_viewed >= last_changed)
 - Red badge on icon = at least one unread watch
 
- Click any watch in the list
 - Opens the monitored URL in a new tab
 - Automatically marks the watch as read
 - Updates the badge status
 
- Click the "🔄 Refresh" button in the popup
 - Background updates happen automatically every 5 minutes
 
The extension uses the changedetection.io REST API:
- GET 
/api/v1/watch/- Fetch all watches - PATCH 
/api/v1/watch/{uuid}- Update watch (mark as read) 
All requests include the x-api-key header with your API key.
A watch is considered unread when:
last_changedhas a value ANDlast_viewedis null ORlast_viewed <= last_changed
changedetection-ext/
├── manifest.json          # Extension manifest (Manifest V3)
├── background.js          # Service worker for API calls and badge
├── popup.html            # Popup interface HTML
├── popup.js              # Popup interface logic
├── popup.css             # Popup interface styles
├── options.html          # Settings page HTML
├── options.js            # Settings page logic
├── options.css           # Settings page styles
├── content.js            # Content script (minimal)
├── icons/                # Extension icons (16, 32, 48, 128px)
├── __tests__/            # Jest unit tests
├── package.json          # NPM dependencies and scripts
└── README.md            # This file
# Run tests
npm test
npm run test:watch
# Lint code
npm run lint
npm run lint:fix
# Build and validate
npm run build
# Package for distribution
npm run packageThe project includes comprehensive unit tests using Jest:
# Run all tests
npm test
# Run tests in watch mode
npm run test:watch
# Run specific test file
npm test background.test.jsTest coverage includes:
- ✅ API functionality and error handling
 - ✅ Badge management logic
 - ✅ Popup interface interactions
 - ✅ Settings validation and storage
 - ✅ Watch status calculations
 
❌ "Please configure your server URL and API key first"
- Ensure you've entered both the server URL and API key in settings
 - Click "Test Connection" to verify the configuration
 
❌ "Connection failed: API request failed: 401 Unauthorized"
- Check your API key is correct
 - Ensure the API is enabled in changedetection.io settings
 
❌ "Connection failed: Failed to fetch"
- Verify your server URL is correct and accessible
 - Check if your server is running
 - Ensure there are no firewall/CORS issues
 
❌ Extension icon shows no badge despite unread watches
- Check browser console for errors
 - Try refreshing manually with the "🔄 Refresh" button
 - Verify API permissions in extension settings
 
Enable developer tools to see detailed logs:
- Chrome: Right-click extension icon → "Inspect popup"
 
Check console logs for API responses and error details.
- Fork the repository
 - Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
 - Add tests for new functionality
 - Run the test suite (
npm test) - Commit your changes (
git commit -am 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
 
- Follow ESLint rules (run 
npm run lint) - Write tests for new features
 - Update documentation as needed
 - Test extension functionality in Chrome
 - Keep the popup responsive and lightweight
 
This project is licensed under the MIT License - see the LICENSE file for details.
- changedetection.io - The amazing change detection service
 - web-ext - Firefox extension development tool
 - Jest - Testing framework
 
If you encounter any issues or have feature requests:
- Check the troubleshooting section
 - Search existing issues on GitHub
 - Create a new issue with detailed information
 
Made with ❤️ for the changedetection.io community