A minimal Chrome extension popup for managing quick links (pins). Save URLs with optional labels, reorder and edit them, import/export as JSON, and sync across devices via Chrome Sync.
Author: Andrej Spinej
License: MIT
Repository: github.com/Father1993/SpeedPin
- Add links with optional labels
- Edit and delete pins
- Reorder pins (move up / down)
- Import and export pins as JSON (
quick-pins.json) - Automatic favicon display with fallback placeholder
- Instant popup startup via a Manifest V3 service worker cache
- Sync across devices via
chrome.storage.sync(withlocalfallback for large lists) - Compact glassmorphism UI with custom scrollbar
- Manifest V3, single
storagepermission, no build step
- Open Releases
- Download
SpeedPin-vX.Y.Z.zipfrom the latest release - Unzip to a folder
- Open
chrome://extensions/→ enable Developer mode - Click Load unpacked → select the unzipped folder
git clone https://github.com/Father1993/SpeedPin.git
cd SpeedPin- Open
chrome://extensions/in Chrome - Enable Developer mode
- Click Load unpacked and select the project folder
- Pin the extension from the Extensions menu
Load the repository root (where
manifest.jsonlives), not a subfolder.
- Open the popup (SpeedPin icon in the toolbar)
- Enter a URL (e.g.
https://example.com) - Optionally add a label
- Click Добавить (Add) — the pin appears at the top of the list
- Click a pin name to open the link in a new tab
- Hover a row to reveal actions:
- ↑ / ↓ — reorder
- ✎ — edit (fills the form; click again to cancel)
- ✕ — delete
- Экспорт — download
quick-pins.json - Импорт — restore pins from a JSON file (replaces current list after confirmation)
background.jspreloads pins fromchrome.storage.syncandchrome.storage.localinto a service worker cache- On startup,
popup.jsrenders immediately, asks the service worker for cached pins, and falls back to direct storage reads if needed - New pins are added to the top; duplicate URLs replace the existing entry
- Lists under ~7 KB are stored in
chrome.storage.sync; larger lists usechrome.storage.local - On save, the inactive storage area is cleared to avoid sync/local desync
- Favicons are loaded lazily from Google's favicon service by hostname, with an inline SVG fallback before load or on error
[
{ "url": "https://example.com", "label": "Example" }
]Also accepts { "items": [...] }.
SpeedPin has no npm/webpack build. Packaging copies extension files into a ZIP.
Linux / macOS / Git Bash:
./build.shWindows (CMD / PowerShell):
prepare-zip.batOutput:
| File | Use |
|---|---|
dist/SpeedPin-v1.0.2.zip |
GitHub Releases |
extension.zip |
Chrome Web Store (same content) |
Regenerate icons:
python scripts/generate-icons.py
./build.shVerify ZIP structure (files must be at ZIP root):
unzip -l dist/SpeedPin-v1.0.2.zipFull beginner-friendly guide: RELEASE.md
Summary:
- Bump
versioninmanifest.json - Update
CHANGELOG.md - Test locally → run
./build.sh - Create git tag:
git tag -a v1.0.2 -m "SpeedPin v1.0.2" - Push tag:
git push origin v1.0.2 - Create release on GitHub and attach
dist/SpeedPin-v1.0.2.zip
See CHANGELOG.md for version history.
SpeedPin/
├── manifest.json # Extension config (Manifest V3)
├── popup.html # Popup markup
├── popup.js # Extension logic
├── background.js # Service worker cache for instant popup startup
├── styles.css # UI styles
├── icons/ # Extension icons (16, 48, 128 px)
├── scripts/
│ ├── build-extension.sh # Packaging script (canonical)
│ └── generate-icons.py # Icon generator (stdlib only)
├── build.sh # Shortcut → scripts/build-extension.sh
├── prepare-zip.bat # Windows packaging
├── prepare-zip.sh # Alias for build.sh
├── dist/ # Build output (gitignored)
├── CHANGELOG.md # Version history
├── RELEASE.md # GitHub release guide
├── PRIVACY_POLICY.md # Privacy policy (Chrome Web Store)
├── PUBLISH_GUIDE.md # Chrome Web Store guide
├── CONTRIBUTING.md # Contribution guidelines
└── README.md
To publish on the Chrome Web Store:
- Build the ZIP:
./build.sh - Follow
PUBLISH_GUIDE.md - Upload
extension.zipto the Developer Dashboard
SpeedPin stores your links locally in Chrome. With Chrome Sync enabled, data syncs across your signed-in devices. Your saved links are not sent to third-party servers. Favicon requests go to Google CDN (hostname only).
Full details: PRIVACY_POLICY.md
- Styles: edit
styles.css - Logic: edit
popup.js— keep it simple (KISS)
| Item | Value |
|---|---|
| Manifest | V3 |
| Permissions | storage |
| Storage | chrome.storage.sync (+ local fallback) |
| Background | MV3 service worker cache |
| UI language | Russian (popup labels) |
See CONTRIBUTING.md. Issues and pull requests are welcome.
Version: 1.0.2
Last updated: July 2026