A Chromium browser extension that simplifies video downloads from social media.
English |
Russian
- Overview
- Features
- Tech Stack
- Project Structure
- Getting Started
- Usage
- How It Works
- Configuration
- Permissions
- Development
- Contributing
- License
Fetcho is a lightweight Chromium browser extension (Manifest V3). It acts as a smart intermediary: you paste a video link, Fetcho opens the correct downloader site with that link pre-filled, and a content script clicks the download button for you. No manual tab-hopping, no copy-paste between sites.
Six platforms are supported out of the box:
| Platform | URL Patterns | Routes To |
|---|---|---|
instagram.com, instagr.am |
igram.world |
|
| Twitter / X | twitter.com, x.com |
ssstwitter.com |
| YouTube Shorts | youtube.com/shorts, youtu.be |
ytshortsdl.io |
| TikTok | tiktok.com |
ssstik.io |
reddit.com |
rapidsave.com |
|
facebook.com, fb.com, fb.watch |
fdown.net |
Note
Fetcho does not host, store, download, or distribute any video content. It only routes URLs through publicly available third-party downloader services.
- Content script automation -- downloader sites are pre-filled and submitted without user interaction
- Platform auto-detection -- paste a URL; Fetcho identifies the platform and routes it to the correct downloader
- One-click paste -- the Paste button reads your clipboard and fills the input in a single tap
- Dark / Light theme -- toggle persisted to
chrome.storage.local; respects OS-level preference - Minimal popup UI -- tiny popup with straightforward functionality, nothing extraneous or distracting
- Download latest release of Fetcho and unpack it
- Open extensions tab in your browser:
chrome://extensionsfor Google Chromebrave://extensionsfor Braveedge://extensionsfor Microsoft Edge
- Enable Developer mode (toggle in the top-right corner)
- Click Load unpacked
- Select unpacked folder in explorer
- Done! (the Fetcho icon appears in your browser toolbar)
- Navigate to any supported social media site and copy a video URL
- Click the Fetcho icon in your browser toolbar
- Click the Paste button to pull the URL from your clipboard, or type / paste it manually
- The popup detects the platform and shows a color-coded badge
- Click Download -- Fetcho opens the appropriate downloader site in a new tab
- The content script auto-fills the URL and clicks the download button; the file download begins
Tip
If the Paste button does not work, the URL input also accepts manual paste (Ctrl+V / Cmd+V).
User copies a video URL
|
Clicks the extension icon
|
Pastes the link
|
detectPlatform() identifies the platform
|
User clicks the [Download] button
|
Extension opens the downloader site and runs the script
| Technology | Purpose |
|---|---|
| TypeScript 5.4 | Type-safe extension code |
| Vite 5.4 | Fast bundling with HMR during development |
| CRXJS Vite Plugin | Manifest V3 extension build tooling |
| Chrome Extension APIs | storage, tabs, clipboardRead |
| CSS Custom Properties | Light / dark theme system |
fetcho/
├── src/
│ ├── assets/ # Logos (light/dark SVGs) and icons (16, 48, 128 px)
│ ├── background/
│ │ └── index.ts # Service worker -- install lifecycle logging
│ ├── content/
│ │ ├── content-factory.ts # Shared automation logic (wait, fill, click)
│ │ ├── igram.ts # Instagram -> igram.world
│ │ ├── ssstwitter.ts # Twitter/X -> ssstwitter.com
│ │ ├── ytshorts.ts # YouTube -> ytshortsdl.io
│ │ ├── snaptik.ts # TikTok -> ssstik.io
│ │ ├── rapidsave.ts # Reddit -> rapidsave.com
│ │ └── fdown.ts # Facebook -> fdown.net
│ ├── popup/
│ │ ├── icons.ts # SVG icon components (info, cross, warn, check)
│ │ ├── index.html # Popup markup
│ │ ├── index.ts # Popup logic (paste, detect, download, theme)
│ │ └── style.css # Popup styles with light/dark theme variables
│ └── shared/
│ ├── content-utils.ts # DOM helpers: waitForElement, fillInput, findButton
│ ├── platforms.ts # Platform configs and detectPlatform()
│ └── types.ts # Shared TypeScript interfaces
├── dist/ # Build output (load this into the browser)
├── package.json
├── tsconfig.json
└── vite.config.ts # Vite config with CRXJS manifest declaration
- Node.js 18 or later
- A Chromium-based browser (Chrome, Edge, Brave, Opera, etc.)
# Clone the repository
git clone https://github.com/your-username/fetcho.git
cd fetcho
# Install dependencies
npm install
# Build the extension
npm run buildThe compiled extension is placed in the dist/ directory.
Each downloader site has a dedicated content script (e.g. igram.ts for Instagram). Each script calls the shared runContentScript() factory function and then works with the specific service's DOM:
// Example: src/content/igram.ts
import { runContentScript } from "./content-factory";
runContentScript({
platformId: "instagram",
waitSelector: 'input[type="text"], input[type="url"], #url',
inputSelectors: ["#url", 'input[type="text"]', 'input[type="url"]'],
buttonPattern: /download|submit|search|get/i,
siteName: "igram.world",
});The factory function:
- Reads
downloadUrlandplatformIdfromchrome.storage.local - Clears the storage to prevent re-triggering
- Waits for a matching input field to appear (up to 5 seconds)
- Sets the input value using a native setter to trigger framework listeners
- Dispatches
inputandchangeDOM events - Waits 500 ms, then finds and clicks the download button
This pattern keeps each content script to under 10 lines while supporting any number of downloader sites.
All configuration lives in vite.config.ts where the extension manifest is declared:
- Content script matches -- update the
content_scriptsarray to add or modify downloader site injection rules - Host permissions -- update the
host_permissionsarray to grant access to additional domains - Platform definitions -- add or edit entries in
src/shared/platforms.tsto support new social networks
Theme preference is automatically persisted to chrome.storage.local under the theme key.
| Permission | Justification |
|---|---|
clipboardRead |
Read the clipboard when the Paste button is clicked |
storage |
Pass the URL and platform ID from the popup to content scripts |
tabs |
Open the downloader site in a new browser tab |
Important
Fetcho uses only the minimum set of permissions required for its functionality. The extension makes no network requests of its own -- all data flows through standard Chrome extension APIs and user gestures.
# Start Vite dev server with HMR
npm run dev
# Type-check and build for production
npm run build
# Preview the production build
npm run previewDuring development, run npm run dev and load the dist/ folder as an unpacked extension. Reload the extension from chrome://extensions/ after each build. The CRXJS Vite plugin provides HMR for the popup and content scripts.
- Add the platform definition to
src/shared/platforms.ts(URL pattern, target URL, badge color) - Create a content script in
src/content/that callsrunContentScript()with the appropriate selectors - Register the content script match and host permission in
vite.config.ts - Rebuild and reload the extension
Contributions are welcome. Please open an issue first to discuss the change you would like to make.
- Fork the repository
- Create a feature branch
- Run
npm run buildto verify the extension compiles - Submit a pull request
This project is licensed under the ISC License.
Built with ❤ by nightrunner91

