LLMFeeder - Webpage to Markdown for your LLM context!
August 17, 2026 Β· View on GitHub
A browser extension that converts web page content to clean Markdown format and copies it to clipboard with a single click, perfect for feeding content to Large Language Models (LLMs). Available for both Chrome and Firefox.
Website: llmfeeder.fyi
β¨ What's New in v2.2.1
- πΌοΈ More robust iframe extraction - Same-origin and srcdoc frames are read through the DOM; cross-origin frames keep a link/warning instead of page-to-page HTML messaging
- π Safer iframe placeholders - Embedded-content links are built with DOM APIs and only for explicit
http(s)URLs
Previous Release (v2.2.0)
- π Lazy-Loading Auto-Scroll - Opt-in setting to scroll chat/AI pages (Gemini, ChatGPT, Claude, etc.) before extraction so long conversations aren't truncated (#91)
- π Alternative Copy Mode - Split copy button with a one-click override for Full Page vs Main Content without changing your default setting
- π» Better Code Blocks - Generic
<pre>elements convert to fenced Markdown code blocks with language detection (#66) - π·οΈ Store SEO Refresh - Renamed to Web to Markdown for AI; short description targets ChatGPT/Claude/Gemini searches (within Chromeβs 132-char limit)
- π§ͺ Unit Tests & CI - Jest test suite and GitHub Actions workflow for PRs
- π§ Firefox Icon Fix - Correct 16Γ16 icon dimensions for Add-ons compatibility
Previous Release (v2.1.0)
- ποΈ Multi-Tab Support - Convert multiple tabs at once! Select multiple tabs with Ctrl/Cmd+Shift and use Copy All, Download Merged, or Download as ZIP
- π±οΈ Right-Click Context Menus - Quick access to conversion options directly from the right-click menu on any webpage
- π Token Counter - Real-time token count estimation (GPT-4/Claude tokenizer) with configurable context limits (4K to 32K)
- π Include Links Toggle - New option to include or strip links from Markdown output (reduce token usage when URLs aren't needed)
- π Debug Mode & Logging - Built-in diagnostic system to help troubleshoot conversion issues
- πΌοΈ Cross-Origin Iframe Support - Improved extraction of embedded content from iframes
- π Better Table Conversion - Fixed table-to-markdown conversion for various HTML table formats
- β Review Prompt - Gentle reminder to rate the extension after 20 successful conversions
- π§ Bug Fixes - Fixed race condition in context menu initialization, CSS syntax errors, and removed dead code
Demo
Privacy & Security
LLMFeeder operates as a fully client-side extension with zero backend dependencies. All content processing occurs locally within your browser's execution environment:
-
No Remote Data Transmission: The extension performs all operations (content extraction, Markdown conversion, clipboard operations) entirely within your browser's sandbox. No data is ever transmitted to external servers.
-
Zero Telemetry: Unlike many extensions, LLMFeeder contains no analytics, tracking, or data collection mechanisms of any kind.
-
Minimal Permissions: The extension requests only the permissions strictly necessary for its core functionality (activeTab, clipboardWrite, storage, scripting).
-
Verifiable Codebase: Being fully open source, the entire codebase is available for inspection to verify these privacy claims. Users are encouraged to review the source code to confirm the absence of any data exfiltration mechanisms.
This architecture ensures that your content remains exclusively on your device throughout the entire extraction and conversion process.
Features
- Multi-Tab Support: Convert multiple selected tabs at once - merge into single file or download as ZIP
- Lazy-Loading Auto-Scroll: Opt-in scroll pass for chat/AI UIs so long conversations aren't truncated
- Alternative Copy Mode: One-click Full Page / Main Content override from the copy button
- Right-Click Context Menus: Quick conversion access from anywhere on a page
- Token Counter: Real-time token estimation with configurable LLM context limits
- Include Links Toggle: Option to include or strip URLs from links in output (great for reducing token usage)
- Smart Content Extraction: Uses Readability algorithm to focus on main content
- Dark/Light Mode: Toggle between themes with automatic preference persistence
- Enhanced Image Processing: Smart alt text generation with intelligent fallbacks for better image descriptions
- One-Click Simplicity: Single action to process and copy content
- Download as File: Save converted Markdown directly as .md files to your device
- Page Title Integration: Option to include webpage titles in your Markdown output
- Customizable Metadata Format: Template-based system with 6 variables for flexible citation styles
- Debug Mode: Built-in logging system for troubleshooting
- Modern Notifications: Redesigned UI banner with improved accessibility and visual feedback
- LLM-Optimized Output: Clean, structured Markdown perfect for AI consumption
- Customizable: Configure content scope and formatting options
- Keyboard Shortcuts: Quick convert (Alt+Shift+M), download (Alt+Shift+D), and ZIP (Alt+Shift+Z)
- Multi-Browser Support: Works seamlessly on both Chrome and Firefox
Installation
Option 1: Browser Extension Stores (Recommended)
Chrome Web Store
β Now Available! Install directly from the Chrome Web Store
Firefox Add-ons
β Now Available! Install directly from the Firefox Add-ons Store
Option 2: Direct Download
- Download the latest release zip file based on your browser.
- Extract the zip file to a location of your choice
For Chrome:
- Open Chrome and navigate to
chrome://extensions/ - Enable "Developer mode" by toggling the switch in the top right
- Click "Load unpacked" and select the extracted
extensiondirectory - The LLMFeeder extension should now appear in your extensions list
- Click the puzzle piece icon in Chrome toolbar and pin LLMFeeder for easy access
For Firefox:
- Open Firefox and navigate to
about:debugging#/runtime/this-firefox - Click "Load Temporary Add-on..."
- Select the
manifest.jsonfile in the extractedextensiondirectory - The LLMFeeder extension should now appear in your add-ons list
- Note: For permanent installation in Firefox, use the Firefox Add-ons store option when available
Option 3: From Source (Development)
For Chrome
- Clone this repository:
git clone git@github.com:jatinkrmalik/LLMFeeder.git - Build the extension:
- Using the provided build script:
cd LLMFeeder ./scripts/build.sh chrome - Using Makefile (if you have
makeinstalled):
This will create a Chrome-compatible package in thecd LLMFeeder make chromedist/directory.
- Unzip the generated
LLMFeeder-Chrome-*.zipfile in thedistdirectory to a directory of your choice - Open Chrome and navigate to
chrome://extensions/ - Enable "Developer mode" by toggling the switch in the top right
- Click "Load unpacked" and select the
extensiondirectory from the unzipped package - The extension will appear in your Chrome extensions list
For Firefox
-
Clone this repository:
git clone git@github.com:jatinkrmalik/LLMFeeder.git(If you've already cloned, ensure you are on the desired branch/commit.)
-
Navigate to the cloned directory:
cd LLMFeeder -
Build the extension:
- Using the provided build script:
./scripts/build.sh firefox - Using Makefile (if you have
makeinstalled):
This will create a Firefox-compatible package in themake firefoxdist/directory.
- Unzip the generated
LLMFeeder-Firefox-*.zipfile in thedistdirectory to a directory of your choice - Open Firefox and navigate to
about:debugging#/runtime/this-firefox - Click "Load Temporary Add-on..."
- Select the
manifest.jsonfile inside theextensiondirectory from the unzipped package - The extension will appear in your Firefox extensions list
Usage
- Navigate to any web page you want to convert to Markdown
- Click the LLMFeeder icon in your browser toolbar
- Configure your preferences (content scope, include page title, etc.)
- Choose your action:
- "Convert & Copy" - Process content and copy to clipboard
- "Download as .md" - Save content directly as a Markdown file
- Paste the clipboard content into your LLM tool or use the downloaded file
Keyboard Shortcuts
- Open Extension Popup:
Alt+Shift+L(Windows/Linux) orβ₯β§L(Mac) - Convert & Copy without Opening Popup:
Alt+Shift+M(Windows/Linux) orβ₯β§M(Mac) - Download as Markdown File:
Alt+Shift+D(Windows/Linux) orβ₯β§D(Mac) - Download Multiple Tabs as ZIP:
Alt+Shift+Z(Windows/Linux) orβ₯β§Z(Mac)
Customizing Shortcuts
Users can customize keyboard shortcuts by following these steps:
- Chrome: Go to
chrome://extensions/shortcutsin your browser - Firefox: Go to
about:addonsβ Extensions β βοΈ (Gear icon) β Manage Extension Shortcuts
Settings
-
Content Scope:
- Main article content only (default)
- Full page content
- Selected text only
-
Content Options:
- Include page title in output
- Enhanced image alt text generation
-
Formatting Options:
- Preserve table formatting
- Include/exclude images
- Include/exclude links (strip URLs to reduce token usage)
-
Metadata Format:
- Toggle metadata inclusion on/off
- Customize metadata template with 6 variables:
{title},{url},{date},{author},{siteName},{excerpt} - Reset to default format with one click
- Predictable WYSIWYG formatting
-
Output Options:
- Copy to clipboard
- Download as .md file
Project Structure
Below is a visual representation of the project structure to help developers understand the codebase:
LLMFeeder/
β
βββ dist/ # Distribution packages directory
β βββ LLMFeeder-Chrome-*.zip # Chrome package
β βββ LLMFeeder-Firefox-*.zip # Firefox package
β βββ LLMFeeder-Source-*.zip # Source package
β
βββ extension/ # Browser extension directory
β βββ icons/ # Extension icons
β β βββ icon16.png # 16x16 icon
β β βββ icon48.png # 48x48 icon
β β βββ icon128.png # 128x128 icon
β β
β βββ libs/ # Third-party libraries
β β βββ readability.js # Mozilla's Readability for content extraction
β β βββ turndown.js # HTML to Markdown conversion
β β βββ browser-polyfill.js # Browser compatibility layer
β β
β βββ manifest.json # Extension configuration and metadata
β βββ popup.html # UI for the extension popup
β βββ popup.js # Controls popup behavior and user interactions
β βββ styles.css # Styling for the popup UI
β βββ content.js # Content script that runs on web pages
β βββ background.js # Background script for keyboard shortcuts
β
βββ scripts/ # Build and utility scripts
β βββ build.sh # Main build script
β
βββ testbench.html # Test bench page for extension testing
βββ iframe-content-test.html # Nested iframe content for testing
β
βββ .gitignore # Git ignore rules
βββ README.md # Project documentation
Component Descriptions
- manifest.json: Defines extension metadata, permissions, and configuration
- popup.html/js/css: Creates the user interface when you click the extension icon
- content.js: Contains the core functionality to extract and convert web content to Markdown
- background.js: Handles keyboard shortcuts and global extension functionality
- readability.js: Mozilla's library that identifies and extracts the main content from a webpage
- turndown.js: Converts HTML to Markdown with configurable options
- browser-polyfill.js: Provides compatibility layer for Chrome and Firefox extension APIs
Data Flow
- User triggers conversion (via popup UI or keyboard shortcut)
- Request is sent from popup.js or background.js to content.js
- content.js extracts content using readability.js
- Enhanced image alt text generation processes images with smart fallbacks
- Optional page title is prepended if enabled
- Content is converted to Markdown using turndown.js
- Output is either copied to clipboard or downloaded as .md file
- Cross-browser notification provides success feedback
Browser Compatibility
LLMFeeder is designed to work on all modern browsers with complete feature parity:
- Chrome/Chromium-based browsers: Fully supported (v80+)
- Firefox: Fully supported (v109+)
Tech Stack
- Content Extraction: Mozilla's Readability.js
- Markdown Conversion: Turndown.js
- Extension Framework: Web Extensions API (Chrome Manifest V3, Firefox Manifest V2 compatibility)
- Browser Compatibility: Custom polyfill for cross-browser support
Build Instructions
Prerequisites
zipinstalled (required for packaging)jqinstalled (optional but recommended for JSON processing)- For Make approach: GNU Make (usually pre-installed on Linux/macOS)
Using Scripts
To build the extension packages for distribution:
- Run the build script:
./scripts/build.sh
This will create three packages in the dist/ directory:
LLMFeeder-Chrome-v1.0.1.zip- Chrome-compatible packageLLMFeeder-Firefox-v1.0.1.zip- Firefox-compatible packageLLMFeeder-Source-v1.0.1.zip- Source code package
You can also build specific packages:
# Build only Chrome package
./scripts/build.sh chrome
# Build only Firefox package
./scripts/build.sh firefox
# Build only source package
./scripts/build.sh source
# Specify version number
./scripts/build.sh --version 1.1.0 all
Using Make
To build the extension packages for distribution:
- Common Targets
make all # Build all (chrome, firefox, source)
make chrome # Build Chrome only
make firefox # Build Firefox only
make source # Build source zip only
make full-build # Full build via ./scripts/build.sh
- Versioned Builds
make versioned-chrome version=1.0.0
make versioned-full version=1.0.0
make versioned-firefox version=1.0.0
make versioned-source version=1.0.0
Note: β These require a
version=x.y.zflag or will throw an error.
- Utilities
make clean # Remove dist/ artifacts
make help # Show help message
Testing
Unit Tests
The project uses Jest for unit testing. Tests live in the tests/ directory, with Chrome extension APIs mocked in tests/setup.js.
-
Install dependencies (requires Node.js 20+):
npm install -
Run the test suite:
npm test
Jest prints a pass/fail summary per test file; a non-zero exit code means at least one test failed. The suite also runs automatically in CI (GitHub Actions) on every push to main and on every pull request β see .github/workflows/test.yml.
To add tests for a new module, export it for Node at the bottom of the source file (see extension/token-counter.js for the pattern):
if (typeof module !== 'undefined' && module.exports) {
module.exports = MyModule;
}
Then create tests/my-module.test.js following the structure of tests/token-counter.test.js.
A test bench page (testbench.html) is included to verify extension functionality manually:
Running the Test Bench
-
Start a local HTTP server:
python3 -m http.server 8080 -
Open
http://localhost:8080/testbench.htmlin your browser -
Test the extension with different content types:
- Main Content Extraction: Article content with Readability
- Iframe Extraction: Same-origin, srcdoc, and cross-origin iframes
- Table Conversion: Standard HTML tables and GitHub-style tables
- Empty Cells: Tables with missing data
Test Coverage
| Test Case | Description | Expected Result |
|---|---|---|
| Test 1 | Main article content | Extracted with proper formatting |
| Test 2 | srcdoc iframe | Content extracted (same-origin) |
| Test 3 | Nested iframe | Content extracted (same-origin) |
| Test 4 | Cross-origin iframe | Warning message with link placeholder |
| Test 5 | Sandboxed iframe | May or may not extract (browser-dependent) |
| Test 6 | Standard HTML table | Markdown table with ` |
| Test 7 | GitHub-style table | Markdown table without <thead> |
| Test 8 | Empty cells | Empty cells handled correctly |
Testing Tips
- Enable Debug Mode in options for detailed logs
- Use Full Page scope to test iframe extraction
- Enable Preserve Tables to test table conversion
- Test with both "Main Content" and "Full Page" scopes
License
MIT
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Our Wonderful Contributors πͺ
Thanks a lot for spending your time helping LLMFeeder grow.π»