Stop scrolling past engagement opportunities. ReplyQueue watches your LinkedIn feed and surfaces posts that align with your blog content, so you can join conversations that matter.
Install from Chrome Web Store β
Content creators spend hours scrolling social feeds hoping to find relevant discussions. ReplyQueue flips that model: connect your RSS feed, browse normally, and let AI surface the posts worth your time.
- Passive Discovery - Extracts posts as you scroll, no extra workflow
- Smart Matching - Keyword and AI-powered relevance scoring against your content
- Reply Suggestions - Generates responses that match your writing style
- View Post - One click to open matched posts in a new tab
- Dark Mode - System, light, or dark theme with one-click toggle
- Privacy-First - No analytics, no tracking, your data stays local
- Extensible - Platform adapter pattern makes adding new networks straightforward
After installation:
- Click the puzzle piece icon in Chrome toolbar
- Pin ReplyQueue for easy access
- Click the ReplyQueue icon to open the side panel and start setup
-
Clone the repository
git clone https://github.com/charlesjones-dev/replyqueue.git cd replyqueue -
Install dependencies
pnpm install
-
Build the extension
pnpm build
-
Load in Chrome
- Open Chrome and navigate to
chrome://extensions/ - Enable "Developer mode" (toggle in top right)
- Click "Load unpacked"
- Select the
distfolder from the project directory
- Open Chrome and navigate to
-
Pin the extension
- Click the puzzle piece icon in Chrome toolbar
- Pin ReplyQueue for easy access
- Node.js 18+
- pnpm 9+
- Chrome browser
# Start development server with hot reload
pnpm dev
# Run all tests
pnpm test
# Run tests in watch mode
pnpm test:watch
# Build for production
pnpm build- Run
pnpm devto start the development server - Open
chrome://extensions/ - Enable Developer mode
- Click "Load unpacked" and select the
distfolder - The extension will hot-reload as you make changes
ReplyQueue uses a modular architecture designed for cross-platform extensibility.
src/
βββ platforms/ # Platform adapters (LinkedIn, future: Twitter, etc.)
β βββ types.ts # PlatformAdapter interface
β βββ index.ts # Platform registry
β βββ linkedin/ # LinkedIn-specific implementation
β βββ _template/ # Template for adding new platforms
βββ content/ # Content script (runs on social media pages)
β βββ index.ts # Entry point
β βββ dom-observer.ts # MutationObserver for feed changes
β βββ post-extractor.ts# Extracts posts using platform adapters
βββ background/ # Service worker
β βββ index.ts # Message handling and orchestration
β βββ rss-fetcher.ts # RSS feed parsing and caching
β βββ matcher.ts # Keyword-based matching
β βββ openrouter.ts # AI API client for semantic matching
βββ sidepanel/ # Side panel UI (Vue 3)
β βββ App.vue # Root component
β βββ views/ # SetupView, MainView, SettingsView
β βββ components/ # Reusable UI components
β βββ composables/ # Vue composables for state management
βββ shared/ # Shared utilities
βββ types.ts # TypeScript interfaces
βββ constants.ts # Configuration constants
βββ storage.ts # Chrome storage wrappers
βββ validation.ts # Input validation
βββ messages.ts # Message passing types
- Content Script extracts posts from LinkedIn feed using the platform adapter
- Background Worker receives posts via message passing and stores them
- RSS Fetcher periodically fetches and parses your blog's RSS feed
- Matcher compares extracted posts against RSS content using keywords and AI
- Side Panel displays matched posts with relevance scores and reply suggestions
ReplyQueue is designed to support multiple social media platforms. To add a new platform:
-
Copy the template directory
cp -r src/platforms/_template src/platforms/twitter
-
Update
selectors.ts- Define CSS selectors for the platform's DOM structure
- Include selectors for posts, authors, content, engagement metrics
-
Implement the adapter in
adapter.ts- Update class name,
platformId, andplatformName - Implement
extractPost()to parse the platform's DOM - Implement
getPostUrl()for generating permalinks - Implement
scrollToPost()for navigation
- Update class name,
-
Register the platform in
src/platforms/index.tsimport { TwitterAdapter } from './twitter/adapter' const adapters: PlatformAdapter[] = [ new LinkedInAdapter(), new TwitterAdapter(), ]
-
Update
manifest.json- Add the platform's URL patterns to
host_permissions - Add content script matches
- Add the platform's URL patterns to
-
Add tests
- Create
tests/platforms/twitter-extraction.test.ts - Test post extraction with mock DOM elements
- Create
-
Update allowed origins for message validation
- In
src/background/index.ts, add the platform's domain toALLOWED_CONTENT_SCRIPT_ORIGINS
- In
See CONTRIBUTING.md for detailed guidelines.
| Option | Default | Options | Description |
|---|---|---|---|
| Relevance Threshold | 30% | 10-90% | Minimum score for a post to be considered a match |
| Max Posts to Show | 20 | 10, 20, 30, 50, 100 | Maximum number of matched posts to display |
| RSS Cache Duration | 60 min | 15, 30, 60, 120, 240 | How long to cache RSS feed before refreshing |
| Max RSS Items | 25 | 10, 25, 50, 100 | Maximum items to fetch from RSS feed |
| Max Blog Items in AI Prompts | 25 | 10, 25, 50, All | Blog items included when AI evaluates posts |
| Blog Content Sent to AI | 2,500 chars | 1K, 2.5K, 5K, 10K, No limit | Amount of blog content included when matching |
| Social Post Content Sent to AI | 1,000 chars | 500, 1K, 2K, 3K, No limit | Amount of post content included when evaluating |
| Option | Default | Description |
|---|---|---|
| Model | anthropic/claude-haiku-4.5 | OpenRouter model for semantic matching and reply generation |
| Writing Style Examples | - | Up to 10 examples of your previous comments to match your tone |
| Communication Preferences | - | Custom writing rules for AI-generated replies (e.g., formatting, tone) |
ReplyQueue is built with privacy as a core principle.
What stays on your device:
- All extracted post data
- Your configuration and preferences
- Writing style examples
- Cached RSS content
What is sent externally:
- OpenRouter API - Post content and RSS data for AI matching (only when you trigger a scan)
- Your RSS Feed URL - Fetched periodically to get your blog content
No tracking:
- No analytics
- No telemetry
- No usage data collection
- No third-party scripts
See privacy-policy.md for the full privacy policy.
ReplyQueue uses multiple layers of security tooling to catch vulnerabilities early.
| Tool | Purpose | Command |
|---|---|---|
eslint-plugin-security |
Detects common security anti-patterns in JS/TS | pnpm lint |
pnpm audit |
Scans dependencies for known CVEs | pnpm audit:check |
| Semgrep | SAST scanning for injection, XSS, and more | CI only (or Docker locally) |
The .github/workflows/security.yml workflow runs Semgrep on every push and PR to main, using:
auto- Semgrep's recommended security rulesp/javascript- JavaScript-specific security patternsp/typescript- TypeScript-specific security patterns
# ESLint security rules (included in lint)
pnpm lint
# Dependency vulnerability scan
pnpm audit:check
# Semgrep via Docker
docker run --rm -v "$(pwd):/src" semgrep/semgrep semgrep scan --config auto --config p/javascript --config p/typescript /src- Origin validation - Background script validates message origins against allowlist
- Input sanitization - All user inputs validated before processing
- No eval/Function - Dynamic code execution patterns are blocked by ESLint
- Secure storage - API keys stored in
chrome.storage.local, never exposed to content scripts - CSP compliance - Extension follows Chrome's Content Security Policy requirements
- Ensure you're loading the
distfolder, not the project root - Check for build errors:
pnpm build - Look for errors in
chrome://extensions/
- Make sure you're on linkedin.com
- Scroll through the feed to trigger extraction
- Check the console for errors (right-click extension icon > "Inspect")
- Verify your OpenRouter API key starts with
sk-or-v1- - Check that your API key has credits available
- Try the key at openrouter.ai
- Ensure the URL returns valid RSS/Atom XML
- Try the URL in a browser to verify it's accessible
- Check for CORS issues in the console
- Lower the relevance threshold in settings
- Ensure your RSS feed has recent content
- Try refreshing the feed manually
- Twitter/X
- Mastodon
- Bluesky
- Batch reply generation
- Reply history tracking
- Multiple RSS feed support
- Custom matching prompts
- Export matches to CSV
- Browser notifications for high-relevance matches
Contributions are welcome! Please read CONTRIBUTING.md for guidelines on:
- Setting up the development environment
- Code style and linting
- Submitting issues and pull requests
- Adding new platform adapters
This project is licensed under the MIT License - see the LICENSE file for details.
- OpenRouter for AI model access
- CRXJS for Vite Chrome extension integration
- Vue.js for the reactive UI framework