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+

Releases

No releases published

Packages

 
 
 

Contributors