146 lines
5.3 KiB
Markdown
146 lines
5.3 KiB
Markdown
# 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
|
|
|
|

|
|
|
|
---
|
|
|
|
## 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. |