A privacy-minded Chrome extension for saving, organizing, and finding links.
LinkSave keeps your useful pages in one personal collection. Sign in with Google, save the current tab or add a URL manually, then search, filter, copy, edit, or remove saved links from the extension popup.
The screenshots use generic sample account information.
- Save the active page from the popup or the browser context menu.
- Add links manually, with an optional custom title.
- Sign in with Google; links are scoped to the signed-in user.
- Search by title, URL, or domain, and filter by a date range.
- Edit titles, delete individual links, or copy the current results to the clipboard.
- Cache links locally so the popup opens quickly while it refreshes in the background.
- Extension: WXT, React, and TypeScript
- API: Express and Node.js
- Data: MongoDB with Mongoose
- Authentication: Chrome Identity API and Google OAuth
- Node.js 20 or later
- A MongoDB database (local or hosted)
- A Google OAuth client configured for a Chrome extension
npm ci
cd server && npm ci
cd ..Create server/.env from the example:
cp server/.env.example server/.envSet the following values:
MONGODB_URI=mongodb://127.0.0.1:27017/linksave
PORT=3001Create .env.local from the example:
cp .env.example .env.localFor local development, keep the default value:
VITE_API_BASE=http://localhost:3001/api
GOOGLE_OAUTH_CLIENT_ID=your-chrome-extension-client-id.apps.googleusercontent.comFor a deployed API, replace VITE_API_BASE with that API's public /api URL. Before distributing a build, configure GOOGLE_OAUTH_CLIENT_ID for your Chrome Web Store extension ID in Google Cloud. An OAuth client ID is public by design—it must be present in the built manifest—but sourcing it from .env.local keeps deployment configuration out of the repository. Never commit a client secret, database URI, access token, or a real .env file.
In one terminal, run the API:
cd server
npm run devIn another terminal, run the extension:
npm run devWXT builds the development extension and prints the location to load in Chrome. Open chrome://extensions, enable Developer mode, and load the generated extension directory.
npm run build
npm run zipThe build artifacts are created by WXT in the ignored output directory. Use npm run build:firefox or npm run zip:firefox for Firefox builds.
| File | Variable | Purpose |
|---|---|---|
.env.local |
VITE_API_BASE |
Public base URL of the LinkSave API, including /api. |
.env.local |
GOOGLE_OAUTH_CLIENT_ID |
Chrome-extension OAuth client ID, inserted into the build manifest. |
server/.env |
MONGODB_URI |
MongoDB connection string. Keep private. |
server/.env |
PORT |
Local API port; defaults to 3001. |
LinkSave requests only the permissions needed for its features:
identityfor Google sign-in;activeTabto read the URL and title of the page you choose to save;contextMenusto add Save to LinkSave to the browser menu;notificationsto show save results; andstoragefor extension storage support.
The API requires a valid Google access token for every link request and stores links against that user's Google account ID. Review and secure your own deployment before making it available to others.
All successful API responses use a data envelope; failures use an error object with a stable code, a readable message, and optional field-level details.
{ "data": { "link": {} } }{ "error": { "code": "VALIDATION_ERROR", "message": "One or more fields are invalid." } }| Endpoint | Success | Common errors |
|---|---|---|
GET /api/health |
200 |
— |
GET /api/me |
200 |
401 unauthenticated |
GET /api/links |
200 |
401, 503 database unavailable |
POST /api/links |
201 |
400 invalid input, 401, 409 duplicate link, 503 |
PUT /api/links/:id |
200 |
400 invalid ID/input, 401, 404, 503 |
DELETE /api/links/:id |
204 |
400 invalid ID, 401, 404, 503 |
The API accepts only http and https links. A compound database index prevents the same user from saving the same normalized URL more than once, including during concurrent requests.
Contributions are welcome. Please read CONTRIBUTING.md for the development workflow, CODE_OF_CONDUCT.md for community expectations, and SECURITY.md to report vulnerabilities responsibly.
LinkSave is released under the MIT License.

