Skip to content

INVIII/linkedin-time-filter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

14 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

LinkedIn Enhanced Time Filters (Recent Jobs+)

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.

Version License Browser Support

Website (GitHub Pages)

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.

✨ Features

Core Features (Required)

  • 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

Advanced Features (Optional)

  • πŸ“Š 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)

πŸš€ Installation

For Development & Testing

  1. Download the Extension

    git clone <repository-url>
    cd linkedin-time-filter
  2. Load in Chrome/Edge

    • Open chrome://extensions/ (or edge://extensions/)
    • Enable "Developer mode"
    • Click "Load unpacked" and select the linkedin-time-filter folder
    • Note: Extension will use default browser icon (custom icons temporarily removed for easy testing)
  3. Load in Firefox

    • Open about:debugging#/runtime/this-firefox
    • Click "Load Temporary Add-on"
    • Select the manifest.json file

For Production Use

Chrome Web Store: (Coming soon)
Firefox Add-ons: (Coming soon)
Edge Add-ons: (Coming soon)

🎯 Usage

  1. Enable the Extension

    • Click the extension icon in your browser toolbar
    • Toggle the extension ON
  2. Visit LinkedIn Jobs

  3. 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
  4. 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

πŸ—οΈ Architecture

File Structure

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

Technical Implementation

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

βš™οΈ Configuration

Storage Schema

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"
    }
  ]
}

πŸ§ͺ Testing

Manual Testing Checklist

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

Development Testing

# 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]

πŸ”§ Development

Prerequisites

  • Modern web browser (Chrome/Firefox/Edge)
  • Basic understanding of WebExtensions API
  • LinkedIn account for testing

Setup Development Environment

  1. Clone and Setup

    git clone <repository-url>
    cd linkedin-time-filter
  2. Make Changes

    • Edit files in src/ directory
    • Update version in manifest.json for releases
  3. Test Changes

    • Reload extension in browser
    • Test on LinkedIn job search pages
    • Check browser console for errors
  4. Debug Common Issues

    • Content script not loading: Check manifest permissions
    • Filters not appearing: Verify LinkedIn DOM selectors
    • Storage not working: Check chrome.storage permissions

Building for Production

  1. Prepare Release

    • Update version in manifest.json
    • Test on all target browsers
    • Create proper icon files (16, 32, 48, 128px)
  2. 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

🚨 Known Limitations & Risks

Technical Limitations

  1. LinkedIn DOM Changes

    • Risk: LinkedIn may change class names or structure
    • Mitigation: Resilient selectors with fallbacks
  2. Background Notifications

    • Risk: CORS prevents direct LinkedIn page fetching
    • Limitation: Requires user to visit LinkedIn for job count updates
  3. Browser Store Policies

    • Risk: Store policies may restrict certain behaviors
    • Mitigation: Clear privacy policy, minimal permissions

Privacy & Security

  • 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

πŸ“ Privacy Policy

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

🀝 Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Test thoroughly
  5. Submit a pull request

Contribution Guidelines

  • Follow existing code style
  • Test on multiple browsers
  • Update README if needed
  • Keep changes focused and atomic

πŸ“„ License

MIT License - see LICENSE file for details

πŸ†˜ Support

  • Issues: Report bugs via GitHub Issues
  • Documentation: Check this README
  • Development: See Development section above

πŸ“š Resources


Version: See manifest.json
Last updated: April 2026
Compatibility: Chrome 88+, Firefox 78+, Edge 88+

About

LinkedIn Recent Jobs+ adds clear time filters to LinkedIn job search so you can focus on listings from today, this week, or the last month. No clutter. No guesswork.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors