A WebExtension that adds granular time filtering options to LinkedIn job search. The toolbar UI is branded Recent Jobs+. Works on Chrome, Firefox, and Edge.
The marketing site and privacy policy live only under docs/ (docs/index.html, docs/privacy.html). There is no separate privacy/ folder at the repository root.
Live URLs (organization repo INVIII β use these, not username.github.io unless the repo is under your user):
- Home:
https://inviii.github.io/linkedin-time-filter/ - Privacy:
https://inviii.github.io/linkedin-time-filter/privacy.html
Important: Opening https://github.com/INVIII/linkedin-time-filter shows the GitHub repository (README, files). That is not the deployed site. The actual website is only at *.github.io/... after Pages is enabled.
Deploy either branch main + folder /docs, or the included GitHub Actions workflow (.github/workflows/pages.yml) with Pages β Source: GitHub Actions. A docs/.nojekyll file disables Jekyll for static HTML.
- Granular Time Filters: Add precise time options (10m, 30m, 1h, 2h, 6h, 12h) to LinkedIn's Date Posted dropdown
- Seamless Integration: Custom options appear identical to LinkedIn's native filters
- URL-based Filtering: Uses LinkedIn's f_TPR parameter (e.g., f_TPR=r600 for 10 minutes)
- Toggle control: Recent Jobs+ popup (Filters tab) to enable or disable the extension
- Persistent Settings: State maintained across browser sessions and navigation
- Dynamic Injection: MutationObserver handles LinkedIn's dynamic content updates
- π Local analytics: Perβtime-filter apply counts (stored only on your device)
- π Background notifications: Optional alerts for saved searches (when enabled)
- β¨ Visual highlights: Jobs within the selected timeframe can be highlighted on the page
- πΎ Saved searches: Save combinations from the popup and manage them on the options page
- βοΈ Options page: Settings, saved searches, and usage analytics (Recent Jobs+ β Settings)
-
Download the Extension
git clone <repository-url> cd linkedin-time-filter
-
Load in Chrome/Edge
- Open
chrome://extensions/(oredge://extensions/) - Enable "Developer mode"
- Click "Load unpacked" and select the
linkedin-time-filterfolder - Note: Extension will use default browser icon (custom icons temporarily removed for easy testing)
- Open
-
Load in Firefox
- Open
about:debugging#/runtime/this-firefox - Click "Load Temporary Add-on"
- Select the
manifest.jsonfile
- Open
Chrome Web Store: (Coming soon)
Firefox Add-ons: (Coming soon)
Edge Add-ons: (Coming soon)
-
Enable the Extension
- Click the extension icon in your browser toolbar
- Toggle the extension ON
-
Visit LinkedIn Jobs
- Go to linkedin.com/jobs/search/
- Click on the "Date Posted" filter dropdown
-
Use Enhanced Filters
- You'll see new options: Past 10 minutes, 30 minutes, 1 hour, 2 hours, 6 hours, 12 hours
- Click any option to apply the filter instantly
- Results update just like native LinkedIn filters
-
Popup and settings
- Filters: toggle, time presets, last-applied filter, success feedback under Time posted
- Saved: search and open saved job searches
- More: usage/export shortcut and All settings (full options page)
- On the options page: general toggle, saved searches CRUD, usage totals and per-filter counts, export/clear analytics
linkedin-time-filter/
βββ manifest.json # Extension configuration
βββ src/
β βββ content/
β β βββ contentScript.js # DOM injection & filter logic
β βββ background/
β β βββ background.js # Service worker & notifications
β βββ popup/
β β βββ popup.html # Extension popup interface
β β βββ popup.js # Popup functionality
β βββ options/
β β βββ options.html # Settings & analytics page
β β βββ options.js # Options page logic
β βββ css/
β βββ injected.css # Styling for injected elements
βββ icons/ # Extension icons (16, 32, 48, 128px)
βββ README.md # This file
Time Filter Calculations:
- 10 minutes = 10 Γ 60 = 600 seconds β
f_TPR=r600 - 30 minutes = 30 Γ 60 = 1800 seconds β
f_TPR=r1800 - 1 hour = 60 Γ 60 = 3600 seconds β
f_TPR=r3600 - 2 hours = 2 Γ 3600 = 7200 seconds β
f_TPR=r7200 - 6 hours = 6 Γ 3600 = 21600 seconds β
f_TPR=r21600 - 12 hours = 12 Γ 3600 = 43200 seconds β
f_TPR=r43200
DOM Injection Strategy:
- Multiple selector strategies for LinkedIn's evolving DOM
- Resilient text-based fallback detection
- MutationObserver for dynamic content handling
- Clean removal when extension is disabled
Cross-browser Compatibility:
- Manifest V3 for Chrome/Edge
- WebExtension API compatibility for Firefox
- Graceful feature degradation
Sync Storage (User Settings):
{
"enabled": true,
"lastTPR": 3600,
"notificationsEnabled": false,
"highlightEnabled": true,
"autoApply": false,
"contextMenu": true
}Local Storage (Analytics & Data):
{
"analytics": {
"usage": {
"r600": { "uses": 5, "lastUsed": 1640995200000 },
"r3600": { "uses": 12, "lastUsed": 1640995200000 }
}
},
"savedSearches": [
{
"id": "1640995200000",
"keywords": "software engineer",
"location": "San Francisco",
"tpr": 3600,
"name": "SF Software Jobs"
}
]
}Core Functionality:
- Extension loads without errors
- Toggle enables/disables injection
- Custom filters appear in Date Posted dropdown
- Clicking filters updates URL with correct f_TPR values
- Results refresh properly after filter application
- Settings persist across browser restarts
Cross-browser Testing:
- Chrome (latest)
- Firefox (latest)
- Edge (latest)
LinkedIn Navigation:
- Filters work on job search page
- MutationObserver re-injects after navigation
- No memory leaks from observers
- Clean removal when disabled
# Load the extension in developer mode
# Open LinkedIn job search page
# Open browser console and look for:
console.log('[LinkedIn Time Filters] Initialized')
# Test filter injection
# Click Date Posted dropdown
# Verify custom options appear
# Test URL updates
# Click custom filter option
# Check URL contains f_TPR=r[seconds]- Modern web browser (Chrome/Firefox/Edge)
- Basic understanding of WebExtensions API
- LinkedIn account for testing
-
Clone and Setup
git clone <repository-url> cd linkedin-time-filter
-
Make Changes
- Edit files in
src/directory - Update version in
manifest.jsonfor releases
- Edit files in
-
Test Changes
- Reload extension in browser
- Test on LinkedIn job search pages
- Check browser console for errors
-
Debug Common Issues
- Content script not loading: Check manifest permissions
- Filters not appearing: Verify LinkedIn DOM selectors
- Storage not working: Check chrome.storage permissions
-
Prepare Release
- Update version in
manifest.json - Test on all target browsers
- Create proper icon files (16, 32, 48, 128px)
- Update version in
-
Package Extension
# Chrome/Edge: Zip the entire folder zip -r linkedin-time-filter-v1.0.0.zip linkedin-time-filter/ # Firefox: Create XPI if needed
-
LinkedIn DOM Changes
- Risk: LinkedIn may change class names or structure
- Mitigation: Resilient selectors with fallbacks
-
Background Notifications
- Risk: CORS prevents direct LinkedIn page fetching
- Limitation: Requires user to visit LinkedIn for job count updates
-
Browser Store Policies
- Risk: Store policies may restrict certain behaviors
- Mitigation: Clear privacy policy, minimal permissions
- No Data Collection: All analytics stored locally
- No External Requests: Extension works entirely offline
- Minimal Permissions: Only LinkedIn access and storage
- Open Source: Code available for audit
This extension:
- β Stores all data locally on your device
- β Never transmits personal information
- β Only accesses linkedin.com pages
- β Uses minimal browser permissions
- β Does not track user behavior externally
- β Does not collect personal data
- β Does not share data with third parties
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
- Follow existing code style
- Test on multiple browsers
- Update README if needed
- Keep changes focused and atomic
MIT License - see LICENSE file for details
- Issues: Report bugs via GitHub Issues
- Documentation: Check this README
- Development: See Development section above
Version: See manifest.json
Last updated: April 2026
Compatibility: Chrome 88+, Firefox 78+, Edge 88+