Open-source Chrome extension to save tabs, links, and notes while you browse.
Local-first personal board with optional Google Keep checklist sync.
Quick start · Features · Use cases · Usage · Keep sync · Development · FAQ
KeepTab is a free, open-source Chrome extension (Manifest V3) that helps you capture browser tabs, bookmarked links, and quick notes without leaving the page you are on.
Use it as a lightweight tab saver, link bookmark manager, or read-it-later board that lives entirely in your browser. Data stays on your device in chrome.storage.local. If you want a backup or second copy, turn on optional Google Keep sync to append each save as a checklist line in your own Keep note.
No sign-up. No API keys. No analytics. No third-party server.
| What it does | Captures page titles, URLs, pasted links, and free-text notes into a compact personal board |
| Where data lives | Locally in Chrome storage on your device. Optional sync to your own Google Keep checklist note |
| Who it is for | Researchers, developers, shoppers, and anyone collecting tabs, links, or quick notes without copy-paste |
| Setup time | About 2 minutes to load the extension. About 5 minutes to link a Keep note if you want sync |
| Cost | Free and open source. No accounts, no API keys, no cloud backend |
- What is KeepTab?
- Why KeepTab exists
- Quick start
- How it works
- Features
- Use cases
- Item types
- Output format
- Install from source
- Usage guide
- Google Keep sync
- Upgrading from v1
- Privacy and data
- Permissions explained
- Development
- Project structure
- Architecture
- Testing
- FAQ
- Troubleshooting
- Related projects
- Contributing
- License
- GitHub repo metadata
You find something worth keeping — a product page, a docs link, a reminder — and the usual workflow looks like this:
- Copy the URL
- Switch to Keep, Notion, or a notes app
- Paste and format the line
- Repeat for every tab
That adds friction dozens of times a day. KeepTab reduces it to save, next.
Stay on the page you are already on. Open the popup and click the tab icon to save, or paste a link or note. KeepTab stores a clean entry locally. If you enable Keep sync, each save can append a formatted line to your checklist note in the background.
No spreadsheet middleman. No manual formatting. No account required.
Already have the extension built? Skip to step 3.
git clone https://github.com/THEFZNKHAN/KeepTab.git
cd KeepTab
npm install
npm run icons
npm run build- Open
chrome://extensions, enable Developer mode, click Load unpacked, and select theKeepTabfolder. - Pin KeepTab to your Chrome toolbar.
- Visit any website, open the KeepTab popup, and click the tab icon to save the current page.
- Open the KeepTab popup to see your saved item.
Want automatic Keep sync? Jump to Google Keep sync.
flowchart LR
subgraph capture [Capture]
PopupSave[Popup input or Save tab]
end
subgraph core [Background]
BG[Service worker]
Storage[(chrome.storage.local)]
Format[format.ts]
end
subgraph output [Output]
Shelf[Popup board]
Badge[Toolbar badge]
Keep[Google Keep optional]
end
PopupSave --> BG
BG --> Storage
BG --> Format
BG --> Keep
Storage --> Shelf
Storage --> Badge
- Capture — Save from the popup: paste a link or note, or capture the current tab with the tab icon.
- Store — The background service worker deduplicates and persists items in
chrome.storage.local. - Use — View, copy, or delete items in the popup. Optionally append each save to Google Keep.
- Save from popup — Paste a URL or type a note in the input field and click Save
- Save current tab — Tab icon button in the popup captures the active tab's title and URL
- Smart input — Valid URLs save as links; plain text saves as notes
- Duplicate detection — Same URL or note text is not saved twice
- Compact popup UI — 360×480px board with Inter typography and Material Symbols icons
- Scrollable list — All saved items in one view, newest first
- Hover details — Themed overlay card shows full title and URL without shifting the layout
- Multi-select — Checkbox per row for bulk actions
- Copy all / Copy selected — Export formatted lines to clipboard
- Delete selected — Remove checked items
- Clear all — Wipe the board with a confirmation dialog
- Toolbar badge — Green count badge on the extension icon
- Auto-append — Each save adds a formatted line to your Keep checklist note
- Test sync — Verify your Keep note URL before relying on it
- Graceful fallback — On failure, copies the line to clipboard and opens your Keep note
- Manifest V3 — Modern Chrome extension architecture
- TypeScript + esbuild — Typed source with fast bundled output
- Unit tests — Format, storage, migration, and Keep settings coverage
- v1 migration — Automatically imports legacy
myLeadsdata on first popup open
KeepTab works well when you need a fast, private capture tool instead of a full notes app:
| Scenario | How KeepTab helps |
|---|---|
| Research tabs | Save docs, articles, and reference pages with the popup tab icon |
| Shopping comparisons | Collect product URLs and short notes before deciding what to buy |
| Developer bookmarks | Stash GitHub repos, Stack Overflow threads, and API docs in a clean export format |
| Meeting follow-ups | Jot quick action items in the popup and copy them into Slack or email |
| Read-it-later queue | Build a lightweight link backlog locally, then copy all lines into Keep or another tool |
| Google Keep users | Auto-append saves to a Keep checklist note so your board and Keep stay in sync |
KeepTab stores three internal item types. They are not shown as badges in the UI, but they affect how items are captured and deduplicated.
| Type | How it is saved | Stored fields |
|---|---|---|
| Tab | Save current tab from the popup | Page title, full URL, optional favicon |
| Link | Paste a URL in the popup input | Derived title (host + path), full URL |
| Note | Paste or type non-URL text in the popup input | Note body, short display title |
Dedupe rules:
- Tab / Link — Normalized URL (lowercase host, no trailing slash, no hash)
- Note — Trimmed, case-insensitive body text
KeepTab uses one canonical line format for clipboard export and Google Keep sync.
Tabs and links:
Page Title | https://example.com/path
github.com/user/repo | https://github.com/user/repo
Notes:
Remember to follow up with the client
Rules:
- Tabs and links:
{title} | {full URL} - Notes: plain text only
- No type prefixes (
[Tab],[Link],[Note]) - No dates in the exported line
- Google Chrome 120 or newer
- Node.js 18 or newer
- Python 3 with Pillow (for icon generation only)
# Clone the repository
git clone https://github.com/THEFZNKHAN/KeepTab.git
cd KeepTab
# Install dependencies
npm install
# Generate circular icons (16, 32, 48, 128) from icons/icon.png
npm run icons
# Build extension bundles into dist/
npm run build- Open
chrome://extensions - Enable Developer mode (top-right toggle)
- Click Load unpacked
- Select the
KeepTabfolder (the repo root, notdist/alone) - Pin KeepTab from the extensions menu
npm run buildThen click the Reload button on the KeepTab card at chrome://extensions.
For continuous rebuilds during development:
npm run watch- Open the KeepTab popup
- Paste a URL into the input field (e.g.
https://github.com/user/repo) - Click Save
The item appears in your board with the page host/path as the subtitle.
- Open the popup
- Type any non-URL text (e.g.
Call dentist tomorrow) - Click Save
From the popup:
- Navigate to the page you want to save
- Open the KeepTab popup
- Click the tab icon next to the input field
- Copy all — Copies every item on the board as formatted lines
- Copy selected — Check one or more rows, then click Copy selected
Paste the result into Keep, Slack, email, or any text field.
- Delete selected — Check rows, then click the trash icon
- Clear all — Click the clear icon, then confirm in the dialog
Clearing KeepTab does not remove lines already appended to Google Keep.
Hover over any list row. A themed overlay card shows the full title and URL (or full note text) without moving other items.
KeepTab can automatically append each saved item to a Google Keep checklist note you own.
- In Google Keep, create or open a checklist note
- Copy the full URL from your browser address bar. It should contain
#LIST/followed by a long ID:https://keep.google.com/#LIST/1vOq_nsNuaC7HtFeKuzCI_AaGu-MD4YIAN4XpCY-lLkgRZUVq-Jug6cb07iUMKg - Open KeepTab popup → Settings (gear icon)
- Enable Auto-add saves to Google Keep
- Paste your note URL into Board note URL
- Click Test Keep sync — a test line should appear in your Keep note
- Click Save settings
Each save adds one checklist item using the output format:
ALL-IN-ONE PACKAGE TRACKING | 17TRACK | https://t.17track.net/en
Remember to follow up
KeepTab will:
- Copy the formatted line to your clipboard
- Open your Keep note in a new tab so you can paste manually
- Show an error toast in the popup
Common causes: incomplete Keep URL, Keep note not open recently, or Chrome blocking the background tab.
KeepTab works fully offline and locally without Keep. Sync is opt-in only.
KeepTab v1 was a simple popup scratchpad that saved strings to localStorage under the key myLeads.
v2 migrates automatically:
- Build and load v2 as described above
- Open the KeepTab popup once
- Legacy strings import into the new board:
- Strings that look like URLs → link items
- Everything else → note items
- The old
myLeadskey is removed after migration
You should see a toast: Imported N items from KeepTab v1.
| Data | Location | Shared? |
|---|---|---|
| Saved items (titles, URLs, notes) | chrome.storage.local on your device |
Never |
| Keep settings (note URL, enabled flag) | chrome.storage.local on your device |
Never |
| Google Keep lines | Your Keep account (if sync enabled) | Only to your own note |
KeepTab has:
- No analytics
- No remote server
- No user accounts
- No telemetry
All processing happens in your browser. Keep sync writes directly to your Google Keep note via an automated tab — KeepTab never sends data to a third-party backend.
| Permission | Why KeepTab needs it |
|---|---|
storage |
Save board items and Keep settings locally |
tabs |
Read the active tab's title and URL when you save a tab |
scripting |
Run the Keep list-append helper on keep.google.com |
debugger |
Insert trusted keyboard input so Google Keep persists checklist items |
https://keep.google.com/* |
Open and update your Keep checklist note during sync |
KeepTab does not inject UI into web pages. It only captures the page title and URL when you explicitly save from the popup.
| Command | Description |
|---|---|
npm run build |
Bundle TypeScript to dist/ and copy popup HTML/CSS |
npm run watch |
Rebuild automatically on file changes |
npm test |
Run all unit tests |
npm run icons |
Generate 16/32/48/128 PNG icons from icons/icon.png |
| Layer | Choice |
|---|---|
| Platform | Chrome Extension Manifest V3 |
| Language | TypeScript 5.7 (strict mode) |
| Build | esbuild → IIFE bundles |
| Storage | chrome.storage.local |
| UI | Vanilla HTML/CSS/TypeScript (no framework) |
| Icons | Inter + Material Symbols Outlined |
| Tests | Node built-in test runner |
The manifest points to dist/:
dist/
background.js ← Service worker
popup.html ← Popup shell
popup.css ← Popup styles
popup.js ← Popup logic
Source lives in src/. Edit source files, run npm run build, then reload the extension.
KeepTab/
├── manifest.json # MV3 extension manifest
├── package.json
├── tsconfig.json
├── icons/
│ ├── icon.png # Master icon (source for generation)
│ ├── icon16.png
│ ├── icon32.png
│ ├── icon48.png
│ └── icon128.png
├── scripts/
│ ├── build.mjs # esbuild bundler
│ ├── build-test.mjs # Compile shared modules for tests
│ └── generate-icons.mjs # Pillow icon generator
├── src/
│ ├── background/
│ │ └── main.ts # Message router, badge init, Keep hook
│ ├── popup/
│ │ ├── popup.html # Board + settings + confirm dialog
│ │ ├── popup.css # Design tokens and layout
│ │ └── popup.ts # List rendering, actions, settings
│ └── shared/
│ ├── types.ts # BoardItem, message types
│ ├── storage.ts # CRUD, dedupe, badge
│ ├── format.ts # Input parsing, export lines
│ ├── messaging.ts # MV3 service worker wake retry
│ ├── tab-capture.ts # Active tab / page metadata
│ ├── migrate.ts # v1 myLeads import
│ ├── keep-settings.ts # Keep note URL parsing
│ ├── keep-sync.ts # Keep append orchestration
│ ├── keep-append-page.ts# Injected Keep DOM script
│ └── keep-debugger.ts # Trusted text input via debugger API
├── tests/
│ ├── format.test.mjs
│ ├── storage.test.mjs
│ ├── migrate.test.mjs
│ └── keep-settings.test.mjs
└── dist/ # Built output (load via manifest)
The popup communicates with the background service worker through a typed message bus:
| Action | Description |
|---|---|
save |
Save a board item (with dedupe + optional Keep sync) |
saveTab |
Capture and save the active browser tab |
getAll |
Return all board items |
delete |
Remove items by ID |
clear |
Remove all items |
getKeepSettings / setKeepSettings |
Read/write Keep configuration |
testKeepAppend |
Append a test line to Keep |
getLastKeepResult |
Last Keep sync status for popup toast |
The messaging layer retries up to three times to handle MV3 service worker wake delays.
When Keep sync is enabled, each save triggers:
- Open or reuse a Keep tab with your checklist note
- Prepare — Inject a script to focus the list field and check for duplicates
- Insert — Use the Chrome debugger API for trusted text input
- Commit — Click "Add list item" in Keep's UI
- Verify — Confirm the line persisted
If any step fails, the formatted line is copied to clipboard and the Keep note opens for manual paste.
npm testThis compiles shared modules to dist-test/ and runs:
| Test file | Covers |
|---|---|
format.test.mjs |
URL detection, title derivation, export line formatting |
storage.test.mjs |
Save, dedupe, delete, badge updates |
migrate.test.mjs |
Legacy myLeads string import |
keep-settings.test.mjs |
Keep URL parsing and settings normalization |
All tests use Node's built-in test runner with mocked chrome.storage.
Does KeepTab work on chrome:// pages?
No. Chrome blocks extensions from reading tabs on browser internal pages (chrome://, etc.). Navigate to a regular website first, then use Save current tab from the popup.
Why does KeepTab need the debugger permission?
Google Keep only persists checklist items from trusted keyboard input. KeepTab uses the debugger API briefly to simulate that input, then detaches immediately.
Can I use a regular Keep note instead of a checklist?
Keep sync is designed for checklist notes (#LIST/... URLs). Regular text notes (#NOTE/...) may not work reliably.
Will duplicates sync to Keep twice?
No. The Keep append script checks existing list items before inserting. Duplicate saves are detected both locally and in Keep.
Does clearing KeepTab delete my Keep note?
No. Clear all only removes items from KeepTab's local storage. Lines already in Keep stay untouched.
Can I sync to multiple Keep notes?
Not currently. v2 supports one board note URL. Use Copy all to move items elsewhere manually.
Is KeepTab related to KeepShelf?
KeepTab and KeepShelf share the same architecture (TypeScript, MV3, Keep sync pipeline) but serve different purposes. KeepShelf tracks movies, series, anime, and books from specific sites. KeepTab is a general-purpose link and note board.
- Run
npm run buildand confirmdist/containsbackground.js,popup.js,popup.html, andpopup.css - Run
npm run iconsif icon files are missing fromicons/ - Load the repo root folder, not
dist/alone
Reload the extension at chrome://extensions. MV3 service workers sleep when idle; the messaging layer retries automatically, but a full reload fixes persistent failures.
Restricted URLs (chrome://, chrome-extension://, edge://, about:) cannot be saved from the tab API. Navigate to a regular website first.
- Paste the full Keep URL from your browser (the long
#LIST/...link) - Open the Keep note manually once before testing
- Use Test Keep sync in Settings
- Check that Keep sync is enabled and settings are saved
- On failure, paste the copied line from your clipboard manually
Migration runs once on first popup open after upgrading. If you already opened v2 before v1 data existed, or myLeads was empty, nothing imports. Legacy data must still be in popup localStorage under the key myLeads.
After editing source files:
npm run buildThen reload KeepTab at chrome://extensions.
| Project | Purpose |
|---|---|
| KeepShelf | Save movies, series, anime, and books from Google, IMDb, Goodreads, and more |
Both extensions share a similar MV3 architecture, popup design language, and Google Keep sync pipeline.
Issues and pull requests are welcome.
- Fork the repository
- Create a feature branch
- Run
npm run buildandnpm test - Open a pull request with a clear description of what changed and why
Please keep user-facing copy free of em-dashes. Use periods, commas, or colons instead.
MIT. Free to use, modify, and distribute.