diff --git a/README.md b/README.md new file mode 100644 index 0000000..eec20d6 --- /dev/null +++ b/README.md @@ -0,0 +1,146 @@ +# URL Launcher + +A Chrome extension for opening a list of URLs as tabs — ideal for workflows that involve opening the same set of pages repeatedly (dashboards, research sessions, daily reading lists, etc.). + +Paste a raw list of URLs, or dump any arbitrary text and let the extension extract the links automatically. Tabs can be opened immediately or loaded lazily — only when you actually focus them — with optional staggered timers so your browser isn't hammered all at once. + + +### Why this exists + +Chrome Web Store extensions are a well-documented supply chain attack vector. Extensions can be silently updated after installation, sold to new owners, or compromised to inject malicious code into your browser — with full access to cookies, form data, and page content. Several popular tab-management extensions have been hijacked this way. + +This extension was built as a self-hostable, auditable alternative to a Chrome Store extension I relied on. The entire codebase is four short files you can read in a few minutes. Because you load it as an unpacked extension, it never updates without you explicitly pulling changes — and you can review every diff before you do. + +--- + +## Features + +- **Bulk open URLs** — paste one URL per line and open them all as background tabs in one click +- **Extract URLs from text** — paste any text (emails, docs, HTML, markdown, Slack messages) and extract every link automatically, deduplicated and cleaned of trailing punctuation +- **Wait for focus** — tabs open as lightweight placeholder pages and only navigate to their target URL when you switch to them, keeping memory and network usage low +- **Delayed load** — each tab gets a staggered auto-load countdown (1s, 2s, 3s…) so URLs load progressively even without you focusing them, preventing browser overload +- Live URL counter with instant validation +- "Load now" escape hatch on every placeholder page + +--- + +## Screenshots + +![URL Launcher](screenshot.png) + +--- + +## Installation + +This extension is not on the Chrome Web Store. Install it in developer mode: + +1. Download or clone this repository +2. Open Chrome and navigate to `chrome://extensions` +3. Enable **Developer mode** (toggle in the top-right corner) +4. Click **Load unpacked** +5. Select the repository folder (the one containing `manifest.json`) +6. The **URL Launcher** icon will appear in your Chrome toolbar + +To update after pulling new changes, go back to `chrome://extensions` and click the **↺ refresh** icon on the extension card. + +--- + +## Usage + +### Basic — open a list of URLs + +1. Click the extension icon in the toolbar +2. Paste one URL per line into the text box +3. Click **Open URLs** + +All URLs open as background tabs. Invalid lines are silently skipped. + +### Extract URLs from arbitrary text + +1. Paste any text into the box — an email thread, a webpage, a markdown document, anything +2. Click **Extract URLs** +3. The text box is replaced with one clean URL per line, duplicates removed +4. Click **Open URLs** + +### Wait for focus to load + +When the **Wait for focus to load** checkbox is enabled (default), each tab opens as a minimal placeholder page instead of loading the real URL immediately. The target URL only loads when you click on that tab. + +This is useful when opening many tabs at once — the browser stays responsive and pages don't all race to load in parallel. + +### Delayed load + +When **Delayed load** is also enabled (default, requires Wait for focus), each placeholder page gets an automatic countdown timer: + +| Tab | Auto-loads after | +|-----|-----------------| +| 1st | 1 second | +| 2nd | 2 seconds | +| 3rd | 3 seconds | +| … | … | + +The placeholder shows a live countdown with a shrinking progress bar. Clicking **Load now →** on any placeholder page bypasses the timer immediately. + +This staggers network requests so your browser isn't hit by all pages at once, while still loading everything in the background without you having to manually focus each tab. + +--- + +## Options reference + +| Option | Default | Description | +|---|---|---| +| Wait for focus to load | ✅ On | Opens a placeholder page; navigates only on tab focus | +| Delayed load | ✅ On | Adds a staggered per-tab countdown (requires Wait for focus) | + +The mode badge in the popup header shows the current active mode: **lazy**, **lazy + delay**, or **eager**. + +--- + +## File structure + +``` +url-launcher/ +├── manifest.json # Extension manifest (Manifest V3) +├── popup.html # Toolbar popup UI +├── popup.js # Popup logic — URL parsing, extraction, tab creation +├── loader.html # Lightweight placeholder page shown in lazy mode +└── loader.js # Placeholder logic — focus detection and countdown timer +``` + +--- + +## Permissions + +| Permission | Why it's needed | +|---|---| +| `tabs` | To open new tabs via `chrome.tabs.create` | + +No data is collected, sent anywhere, or stored. Everything runs locally. + +--- + +## Browser compatibility + +Requires a Chromium-based browser with Manifest V3 support: + +- Google Chrome 88+ +- Microsoft Edge 88+ +- Brave, Opera, Vivaldi (recent versions) + +Firefox is not supported (uses a different extension API). + +--- + +## Contributing + +Bug reports and pull requests are welcome. When reporting an issue, please include: + +- Chrome version (`chrome://version`) +- A description of the URLs or text you were working with +- What you expected vs. what happened + +--- + +## License + +MIT — do whatever you want with it. \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000..15edc2b Binary files /dev/null and b/screenshot.png differ