diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 5d763bd..be3fa3c 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -52,7 +52,8 @@ jobs:
icons \
shared \
LICENSE \
- README.md
+ README.md \
+ CHANGELOG.md
- name: Create Release
uses: softprops/action-gh-release@v2
@@ -61,3 +62,13 @@ jobs:
generate_release_notes: true
draft: false
prerelease: false
+
+ - name: Publish to Chrome Web Store
+ uses: mnao305/chrome-extension-upload@v5.0.0
+ with:
+ file-path: devwatch-github-v${{ steps.get_version.outputs.VERSION }}.zip
+ extension-id: ${{ secrets.CHROME_EXTENSION_ID }}
+ client-id: ${{ secrets.CHROME_CLIENT_ID }}
+ client-secret: ${{ secrets.CHROME_CLIENT_SECRET }}
+ refresh-token: ${{ secrets.CHROME_REFRESH_TOKEN }}
+ publish: true
diff --git a/.gitignore b/.gitignore
index 521a8b9..54a564e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,8 @@ dist/
*.zip
temp-package/
.env
+client_secret*.json
+scripts/get-refresh-token.js
.vscode/
*.crx
*.pem
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index a3d3214..bbacc2e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -77,6 +77,7 @@ Only maintainers can create releases. If you're a maintainer, follow this proces
- Run all tests
- Build the extension
- Create a GitHub release with the zip file
+ - Automatically publish to Chrome Web Store
### Version Guidelines
diff --git a/PRIVACY.md b/PRIVACY.md
index d99c6d4..b515d44 100644
--- a/PRIVACY.md
+++ b/PRIVACY.md
@@ -29,7 +29,7 @@ GitHub Devwatch collects and stores the following data **locally on your device
- Synced across your Chrome browsers if you're signed into Chrome
4. **Activity Data**
- - Recent activity from your watched repositories (last 100 items)
+ - Recent activity from your watched repositories (up to 2000 items)
- Cached locally for offline viewing
- Automatically cleaned up when storage limits are approached
@@ -68,13 +68,22 @@ This extension communicates with GitHub's API (api.github.com) to fetch reposito
- GitHub's privacy policy and terms of service apply to these interactions
- See GitHub's privacy policy at: https://docs.github.com/en/site-policy/privacy-policies/github-privacy-statement
+### NPM Registry (Optional)
+
+When you add a repository by NPM package name, the extension communicates with the NPM registry (registry.npmjs.org):
+
+- This is entirely optional and only happens when you use the "Add by NPM package" feature
+- Used to look up the GitHub repository associated with an NPM package
+- No authentication or personal data is sent to NPM
+- NPM's privacy policy applies to these interactions
+
### No Other Third Parties
GitHub Devwatch does **NOT**:
- Use advertising networks
- Use analytics services
- Connect to any servers we operate
-- Share data with any third-party services
+- Share data with any other third-party services
## Permissions Explained
diff --git a/README.md b/README.md
index 13c94b4..f11645b 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
Track GitHub activity across multiple repos. Get notifications for new PRs, issues, and releases without constantly refreshing.
-[](https://chrome.google.com/webstore)
+[](https://chromewebstore.google.com/detail/github-devwatch/dbgjgcaphfcfgppicmbiafcgcabikjch)
[](LICENSE)
[](https://github.com/jonmartin721/devwatch-github/actions)
[](https://codecov.io/gh/jonmartin721/devwatch-github)
@@ -25,11 +25,13 @@ Track GitHub activity across multiple repos. Get notifications for new PRs, issu
### From Chrome Web Store (Recommended)
-1. Visit the Chrome Web Store (coming soon)
+1. Visit the [Chrome Web Store](https://chromewebstore.google.com/detail/github-devwatch/dbgjgcaphfcfgppicmbiafcgcabikjch)
2. Click "Add to Chrome"
3. Grant permissions when prompted
4. Follow the guided setup wizard on first launch
+**GitHub Token Permissions**: You'll need a [Personal Access Token](https://github.com/settings/tokens/new) with `repo` (for private repos) or `public_repo` (for public only).
+
### Manual Installation (For Development)
1. Clone this repository
@@ -49,19 +51,16 @@ cd devwatch-github
## Quick Setup
### First-Time Setup
-When you first install the extension, an **interactive setup wizard** guides you through:
-1. **Welcome** - Overview of features and capabilities
-2. **GitHub Token** - Create and validate your personal access token with step-by-step instructions
-3. **Add Repositories** - Select which repositories to monitor
-4. **Activity Preferences** - Choose which types of activity to track (PRs, Issues, Releases)
-5. **Done!** - Start monitoring immediately
+An interactive wizard guides you through:
+1. Create a GitHub token
+2. Add repositories to watch
+3. Choose activity types (PRs, Issues, Releases)
-The entire setup takes about 2 minutes and requires no prior configuration knowledge.
+Takes about 2 minutes. No configuration knowledge needed.

-
Interactive setup wizard guides you through configuration
### Ongoing Use
@@ -74,25 +73,13 @@ The entire setup takes about 2 minutes and requires no prior configuration knowl
## How to Use
### Popup Interface
-- **Tabs**: Filter between All/PRs/Issues/Releases
-- **Search**: Filter activities by keyword
-- **Refresh**: Manually check for new activity
-- **Archive**: View previously read activities
-- **Activity Items**: Click to open in GitHub
+Filter by type (All/PRs/Issues/Releases), search activities, refresh manually, or browse the archive. Click any item to open in GitHub.
### Settings Page
-- **GitHub Token**: Secure storage of your personal access token
-- **Watched Repositories**: Add/remove repositories, import from GitHub
-- **Activity Filters**: Choose what types of activity to monitor
-- **Feed Management**: Control how long items are stored (up to 2000 items, optional time-based expiry)
-- **Check Interval**: Configure how often to check for updates
-- **Notifications**: Toggle browser notifications on/off
-- **Theme**: Choose dark, light, or system theme
-- **Backup/Restore**: Export and import your settings
+Manage your GitHub token, watched repositories, activity filters, check interval, notifications, and theme. Export/import settings for backup.

-
Settings page with repository management
## Typical Workflow
@@ -110,39 +97,19 @@ The extension keeps up to 2000 items in your local history, so you can always ch
## Accessibility
-GitHub Devwatch is built with accessibility in mind to ensure everyone can use it effectively:
-
-### WCAG 2.1 Level A Compliance
-- **Form Labels**: All form inputs have proper visible labels for screen readers
-- **Keyboard Navigation**: Full keyboard support with intuitive shortcuts
-- **Focus Management**: Proper focus indicators and logical tab order
-- **ARIA Landmarks**: Semantic HTML with proper ARIA roles and labels
-- **Screen Reader Support**: Descriptive labels and live region announcements
-
-### Keyboard Shortcuts
-- **R** - Refresh activity
-- **S** - Toggle search
-- **A** - Toggle archive view
-- **Escape** - Close modals and search
-- **Arrow Keys** - Navigate between filter tabs
-- **Enter/Space** - Activate buttons and links
+Full WCAG 2.1 Level A compliance with keyboard navigation, screen reader support, and ARIA landmarks.
-### Testing & Validation
-- Automated accessibility testing with axe-core
-- Manual testing with NVDA and JAWS screen readers
-- Keyboard-only navigation verified
-- Focus trap implementation in modals
+**Keyboard Shortcuts**: R (refresh), S (search), A (archive), Escape (close), Arrow keys (navigate tabs)
-For accessibility issues or suggestions, please [open an issue](https://github.com/jonmartin721/devwatch-github/issues).
+Tested with NVDA/JAWS screen readers and axe-core. [Report accessibility issues](https://github.com/jonmartin721/devwatch-github/issues).
## Privacy & Security
-Your GitHub token is encrypted and stays securely on your machine. The extension only communicates with GitHub's API - no analytics, no tracking, no third-party services.
+Your GitHub token is encrypted and stays on your machine. The extension only communicates with GitHub's API - no analytics, no tracking, no third-party services.
-- **Encrypted Storage** - Tokens are encrypted using industry-standard AES-GCM encryption and stored locally in Chrome's secure storage with session caching for optimal performance
-- **Local Storage Only** - All data stays on your machine, never sent to third-party servers
-- **API-Only Communication** - Only talks to GitHub's official API
-- **No Third Parties** - Zero external servers or analytics services
+- **Encrypted Storage** - Tokens use AES-GCM encryption in Chrome's secure storage
+- **Local Only** - All data stays on your machine, never sent to third parties
+- **GitHub API Only** - No external servers or analytics services
- **Minimal Permissions** - Token used exclusively for fetching repository activity
- **Open Source** - Review the entire codebase, raise issues, or submit fixes
@@ -225,14 +192,13 @@ Contributions welcome! Submit issues or pull requests. See [CONTRIBUTING.md](CON
## Roadmap
-Features I'm considering (no promises on timeline - this is a side project):
+This is a side project for me, so I work on it when time allows - but I'd love to see contributions! Here are some features I'm considering:
- **Comment notifications** - Track new comments on issues and PRs
- **Mention tracking** - Get notified when you're mentioned
- **Multiple GitHub accounts** - Switch between different accounts
-- **Custom notification filters** - Advanced filtering rules
+- **GitHub OAuth** - Simplified authentication with one-click login
- **Internationalization** - Support for multiple languages
- **Dashboard view** - Full-page dashboard for all activity
-- **Integration with other platforms** - GitLab, Bitbucket support
If any of these sound useful, open an issue or submit a PR!
diff --git a/manifest.json b/manifest.json
index f0f5cc0..9b38d45 100644
--- a/manifest.json
+++ b/manifest.json
@@ -34,5 +34,11 @@
},
"content_security_policy": {
"extension_pages": "script-src 'self'; object-src 'self'; connect-src 'self' https://api.github.com https://registry.npmjs.org; img-src 'self' https: data:; default-src 'self'; style-src 'self'"
- }
+ },
+ "web_accessible_resources": [
+ {
+ "resources": ["CHANGELOG.md"],
+ "matches": [""]
+ }
+ ]
}
diff --git a/options/options.css b/options/options.css
index 863ca63..b20ae31 100644
--- a/options/options.css
+++ b/options/options.css
@@ -1309,6 +1309,35 @@ body.dark-mode .notification-toggle input:checked + .toggle-slider {
font-weight: 600;
}
+.changelog-footer {
+ margin-top: 20px;
+ padding-top: 16px;
+ border-top: 1px solid var(--border-color);
+ text-align: center;
+}
+
+.changelog-link {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ color: var(--link-color);
+ text-decoration: none;
+ font-size: 14px;
+ font-weight: 500;
+ padding: 8px 16px;
+ border-radius: 8px;
+ transition: all 0.2s ease;
+}
+
+.changelog-link:hover {
+ background: var(--bg-secondary);
+ text-decoration: none;
+}
+
+.changelog-link svg {
+ flex-shrink: 0;
+}
+
.help-footer {
margin-top: 48px;
padding-top: 24px;
diff --git a/options/options.js b/options/options.js
index 1fec237..89e7112 100644
--- a/options/options.js
+++ b/options/options.js
@@ -1059,7 +1059,19 @@ async function loadVersionAndChangelog() {
const changelogContent = document.getElementById('changelogContent');
if (changelogContent) {
- changelogContent.innerHTML = changelogHtml;
+ changelogContent.innerHTML = changelogHtml + `
+
+ `;
}
} catch (error) {
console.error('Error loading version/changelog:', error);
diff --git a/package-lock.json b/package-lock.json
index b5fa504..696aefe 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "github-devwatch-chrome",
- "version": "1.0.0",
+ "version": "1.0.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "github-devwatch-chrome",
- "version": "1.0.0",
+ "version": "1.0.2",
"license": "MIT",
"devDependencies": {
"@eslint/js": "^9.39.1",
diff --git a/shared/config.js b/shared/config.js
index 08aceaa..c338a0c 100644
--- a/shared/config.js
+++ b/shared/config.js
@@ -28,7 +28,7 @@ export const RATE_LIMIT_CONFIG = {
// Storage Configuration
export const STORAGE_CONFIG = {
MAX_WATCHED_REPOS: 50,
- MAX_ACTIVITIES_STORED: 100,
+ MAX_ACTIVITIES_STORED: 2000,
MAX_STORAGE_SIZE: 1024 * 1024, // 1MB
CLEANUP_DAYS: 30, // days to keep old data
STORAGE_QUOTA_CHECK_INTERVAL: 10000 // 10 seconds
diff --git a/shared/state-manager.js b/shared/state-manager.js
index c9124cf..a88da37 100644
--- a/shared/state-manager.js
+++ b/shared/state-manager.js
@@ -5,6 +5,7 @@
import { getSyncItems, getLocalItems } from './storage-helpers.js';
import { STORAGE_KEYS, STORAGE_DEFAULTS } from './storage-helpers.js';
+import { STORAGE_CONFIG } from './config.js';
/**
* Centralized state manager with reactive updates
@@ -277,9 +278,8 @@ class StateManager {
const currentActivities = this.getState('allActivities');
const newActivities = [...activities, ...currentActivities];
- // Keep only the most recent activities (2000 limit to stay under Chrome storage quota)
- const maxActivities = 2000;
- const trimmedActivities = newActivities.slice(0, maxActivities);
+ // Keep only the most recent activities to stay under Chrome storage quota
+ const trimmedActivities = newActivities.slice(0, STORAGE_CONFIG.MAX_ACTIVITIES_STORED);
await this.setState({ allActivities: trimmedActivities });
}