A powerful Chrome extension that automatically manages your Gmail emails using regex-based rules. Set up custom patterns to automatically label, archive, mark as read, and perform other actions on incoming emails.
✨ Regex Pattern Matching
- Match emails by sender (From)
- Match emails by recipient (To)
- Match emails by subject
- Match emails by body/snippet
- Live Regex Helper - Test patterns in real-time as you type
🎯 Automated Actions
- Add or remove labels
- Mark as read/unread
- Mark as important
- Star emails
- Archive emails
- Move to trash
⚡ Real-Time Monitoring
- Automatically detects new emails in Gmail
- Processes emails as they arrive
- Configurable scan interval (1-60 minutes)
- Works in the background with retry logic
🎨 User-Friendly Interface
- Easy rule creation and management
- Drag & drop rule reordering to set priority
- Test rules before applying
- Enable/disable rules individually
- Per-rule match statistics (count & last matched)
- Visual feedback and status
📊 Performance & Observability
- Stats tab with processing metrics
- Configurable retention (5-500 entries)
- Adjustable log levels (error/warn/info/debug)
- Import/export rules for backup/sharing
📋 Important: This extension requires your own Google OAuth credentials to access Gmail. Follow the setup guide below.
- Get OAuth Credentials - Follow our detailed OAuth setup guide
- Configure the extension - Use the helper script or edit manually
- Load in Chrome - Install as an unpacked extension
# Install dependencies
npm install
# Configure your OAuth Client ID
npm run config YOUR_CLIENT_ID.apps.googleusercontent.com- Download or clone this repository
- Open
manifest.jsonin a text editor - Find the
oauth2section at the bottom - Replace
YOUR_CLIENT_ID.apps.googleusercontent.comwith your actual Client ID
"oauth2": {
"client_id": "YOUR_ACTUAL_CLIENT_ID.apps.googleusercontent.com",
"scopes": [
"https://www.googleapis.com/auth/gmail.modify",
"https://www.googleapis.com/auth/gmail.labels"
]
}- Open Chrome and go to
chrome://extensions/ - Enable Developer mode (toggle in top right)
- Click Load unpacked
- Select the extension folder
- Click the extension icon and Sign In to authenticate
- 📖 Complete OAuth Setup Guide - Step-by-step instructions with troubleshooting
- 🚀 Quick Start Guide - Get started in 5 minutes
- ❓ Check the Troubleshooting Guide for common issues
Click to expand detailed manual setup
-
Go to Google Cloud Console
-
Create a new project or select an existing one
-
Enable the Gmail API:
- Navigate to "APIs & Services" > "Library"
- Search for "Gmail API"
- Click "Enable"
-
Create OAuth 2.0 credentials:
- Go to "APIs & Services" > "Credentials"
- Click "Create Credentials" > "OAuth client ID"
- Select "Chrome Extension" as application type
- Copy your Chrome Extension ID (you'll get this after loading the extension)
- Add authorized redirect URIs:
https://<extension-id>.chromiumapp.org/
- Click "Create"
- Copy the Client ID
- Download or clone this repository
- Open
manifest.json - Replace
YOUR_CLIENT_ID.apps.googleusercontent.comwith your actual Client ID from Step 1
"oauth2": {
"client_id": "YOUR_ACTUAL_CLIENT_ID.apps.googleusercontent.com",
"scopes": [
"https://www.googleapis.com/auth/gmail.modify",
"https://www.googleapis.com/auth/gmail.labels"
]
}- Open Chrome and navigate to
chrome://extensions/ - Enable "Developer mode" (toggle in top-right corner)
- Click "Load unpacked"
- Select the
gmail-regex-managerfolder - Note the Extension ID shown on the extension card
- Go back to Google Cloud Console and update your OAuth credentials with this Extension ID
- Click the extension icon in Chrome
- Click "Sign In" button
- Authorize the extension to access your Gmail
- You're ready to create rules!
- Click the extension icon
- Go to the "Create Rule" tab
- Give your rule a name (e.g., "Newsletter Filter")
- Set up patterns:
- From Pattern: Regex to match sender email
- Subject Pattern: Regex to match subject line
- Body Pattern: Regex to match email content
- Live Regex Helper: Type sample values below each pattern to see live matches
- Choose actions:
- Add labels (comma-separated)
- Mark as read
- Archive
- etc.
- Click "Save Rule"
The Create Rule tab includes a live testing panel:
- Enter sample From, To, Subject, and Body values
- As you type patterns, see instant feedback
- ✔ Green = pattern matches sample
- ✖ Red = pattern doesn't match
- Yellow = regex syntax error
- Empty pattern fields show as gray "—"
This helps you validate patterns before saving the rule.
Rules are evaluated in the order shown on the Rules tab. Drag and drop rules using the ☰ handle to reorder them. Higher priority rules run first. Reordering is saved automatically.
Each rule card displays:
- Matches: Total number of times the rule has matched
- Last: Timestamp of the most recent match
Statistics help you understand which rules are actively processing emails.
Name: Newsletter Filter
From Pattern: .*@newsletter\.com|.*@marketing\..*
Actions: Add Label "Newsletters", Mark as Read, Archive
Name: Urgent Marker
Subject Pattern: ^\[URGENT\].*|^URGENT:.*
Actions: Add Label "Urgent", Mark as Important, Star
Name: Invoice Detector
Subject Pattern: .*(invoice|receipt|payment).*
Body Pattern: .*(invoice|payment|bill).*
Actions: Add Label "Finance/Invoices"
Name: GitHub Filter
From Pattern: notifications@github\.com
Subject Pattern: ^\[.*\].*
Actions: Add Label "GitHub", Archive
.- matches any character.*- matches any characters (zero or more)^- start of string$- end of string|- OR operator\- escape special characters[abc]- matches a, b, or c[a-z]- matches any lowercase letter\d- matches any digit\w- matches word characters
Case Insensitive: All patterns are automatically case-insensitive.
- Go to the "Test" tab
- Enter sample email data (from, to, subject, body)
- Click "Test Against All Rules"
- See which rules would match your test email
The top of the popup includes configuration options:
- Auto-process emails: Toggle to enable/disable automatic processing
- Log Level: Choose verbosity (error, warn, info, debug)
- Processing Interval: Set scan frequency in minutes (minimum 1 minute due to Chrome alarm API limits)
- Lower values = more responsive but higher CPU/network usage
- Default: 1 minute
- Perf Retention: Maximum number of performance entries to store (5-500)
- Default: 50 entries
Interval changes take effect immediately and reschedule the background alarm.
- Content Script: Monitors Gmail webpage for new emails using DOM observation
- Background Service Worker: Processes emails and applies rules via Gmail API with exponential backoff retry logic
- Storage: Rules and settings are stored locally using Chrome's storage API
- Gmail API: Applies actions (labels, read status, etc.) to matched emails with automatic label creation
- Performance Tracking: Records metrics for each processing run (configurable retention)
- Logging: Structured logging with adjustable verbosity levels
The extension requires the following permissions:
storage- Store rules and settings locallyidentity- Authenticate with Googlealarms- Periodic email checking- Gmail API scopes:
gmail.modify- Modify emails (labels, read status, etc.)gmail.labels- Manage labels
- Make sure the extension is authenticated (click "Sign In")
- Check that auto-process is enabled in the extension popup
- Verify that Gmail is open in at least one tab
- Use the "Test" tab to verify your regex patterns
- Check that patterns are properly escaped
- Remember patterns are case-insensitive
- Verify Client ID is correctly configured in manifest.json
- Make sure Gmail API is enabled in Google Cloud Console
- Check that OAuth consent screen is properly configured
- Labels are created automatically if they don't exist
- Refresh Gmail to see newly created labels
- Check browser console for any errors
gmail-regex-manager/
├── manifest.json # Extension configuration
├── background.js # Service worker (email processing logic)
├── content.js # Gmail page monitor
├── popup.html # Extension popup UI
├── popup.css # Popup styles
├── popup.js # Popup logic (includes drag & drop, stats, regex helper)
├── gmailActions.js # Gmail API action helpers with retry logic
├── perf.js # Performance tracking utilities
├── logger.js # Structured logging utility
├── rules.js # Rule matching logic (testable)
├── icons/ # Extension icons
│ ├── icon16.png
│ ├── icon48.png
│ └── icon128.png
├── tests/unit/ # Jest unit tests
│ ├── perf.test.js
│ └── gmailActions.test.js
├── scripts/ # Build and automation scripts
│ ├── test-rules.js # Offline rule testing harness
│ └── release.js # Version bump & release helper
├── examples/ # Sample data for testing
│ ├── rules-sample.json
│ └── emails-sample.json
├── .github/workflows/ # CI/CD workflows
│ ├── validate.yml # Extension validation
│ ├── ci.yml # Test & lint
│ └── package.yml # Package & release
└── README.md # This file
- All rules are stored locally on your device
- No data is sent to external servers (except Google APIs)
- Extension only accesses Gmail when authenticated
- You can revoke access anytime in your Google Account settings
- Make changes to the code
- Go to
chrome://extensions/ - Click the refresh icon on the extension card
- Test your changes
Jest tests live under tests/unit/. Run (after installing dev dependencies locally):
npm install
npm testTests cover:
- Performance entry creation and storage
- Gmail API retry logic with exponential backoff
- Label creation and retrieval
- Rule matching logic
CI runs tests automatically on push/PR via .github/workflows/ci.yml.
Use the popup's Import/Export tab:
- Export: Downloads
rules-export.json(current rules) - Import: Select a JSON array of rules, they are validated and appended
Rule object shape:
{
"id": "rule_id",
"name": "Readable name",
"enabled": true,
"fromPattern": "regex",
"toPattern": "regex",
"subjectPattern": "regex",
"bodyPattern": "regex",
"actions": {
"addLabels": ["Label"],
"removeLabels": ["Label"],
"markAsRead": true,
"markAsImportant": false,
"star": false,
"archive": false,
"trash": false
}
}Processing performance entries are stored in chrome.storage.local under perfStats (configurable retention: 5-500 entries, default 50). Each entry:
{
"timestamp": 1730956800000,
"emails": 10,
"rules": 12,
"matchChecks": 120,
"ruleMatches": 4,
"processedCount": 4,
"durationMs": 37.5
}You can inspect via the DevTools console in the service worker:
chrome.storage.local.get(['perfStats'], x => console.log(x.perfStats));Open the Stats tab in the popup to view a table of recent runs with:
- Time of run
- Emails scanned
- Rules count
- Match checks performed
- Rule matches
- Emails processed (actions applied)
- Duration (ms)
Buttons:
- Refresh: Reload data
- Clear: Remove all stored performance entries
Summary line shows entry count, average duration, and total processed across runs.
Use the release helper to bump version, update manifest.json, update package.json, append a CHANGELOG entry, commit, and tag:
npm run release -- patch "Improve stats UI and dedupe imports"
git push && git push --tagsLevels: major | minor | patch.
### Packaging Workflow
GitHub Actions workflow `package.yml` zips the extension when you push a tag (e.g., `v1.1.0`) or run manually. Artifact name: `gmail-regex-rules-manager.zip`.
Manual trigger: GitHub UI → Actions → Package Extension → Run workflow.
Tag trigger example:
```powershell
git tag -a v1.1.0 -m "v1.1.0"
git push origin v1.1.0
You can evaluate rules against sample emails outside Chrome using the Node test harness.
Sample data lives in examples/:
examples/rules-sample.jsonexamples/emails-sample.json
Run harness (JSON output):
node scripts/test-rules.js --rules examples/rules-sample.json --emails examples/emails-sample.jsonCompact summary:
node scripts/test-rules.js --rules examples/rules-sample.json --emails examples/emails-sample.json --compactSingle inline email:
node scripts/test-rules.js --rules examples/rules-sample.json --email '{"from":"billing@vendor.com","subject":"Payment Receipt"}' --compactVersion bump helper:
npm run bump -- 1.1.0Add --tag to auto commit & tag:
npm run bump -- 1.1.0 --tag
git push && git push --tags- Background script:
chrome://extensions/> Click "service worker" - Content script: Open Gmail, press F12, check Console
- Popup: Right-click extension icon > "Inspect popup"
- Rules process emails visible in Gmail's current view
- Body matching only works on email snippets (not full content)
- Maximum 100 rules recommended for performance
- Requires Gmail to be open in at least one browser tab
- Import/export rules
- Rule execution statistics (Stats tab)
- Rule priority/ordering (drag & drop)
- Live regex helper
- Configurable processing interval
- Retry logic with exponential backoff
- Per-rule match statistics
- Structured logging
- Advanced regex builder UI
- Email templates for responses
- Scheduled rule execution (time-based)
- Full email body search via API
- Rule groups/folders
- Conditional actions (if/then logic)
MIT License - Feel free to modify and distribute
For issues, questions, or contributions, please visit the GitHub repository.
Note: This extension requires proper Google Cloud OAuth setup. Make sure to follow the installation instructions carefully.