Original Idea
Bookmark Decay Tracker A browser extension that highlights bookmarks you haven't visited in months and suggests cleanup or reminds you why you saved them.
Product Requirements Document (PRD): Bookmark Decay Tracker
1. Executive Summary
The Bookmark Decay Tracker is a privacy-first browser extension designed to eliminate "link rot" and digital hoarding. By leveraging modern browser APIs and local-first AI, the tool identifies broken, duplicate, and stale bookmarks—defined as those unvisited for a user-set period. It provides a centralized dashboard for batch cleanup and uses on-device AI to summarize saved content, helping users decide whether to keep or discard forgotten resources.
2. Problem Statement
Internet users suffer from "digital hoarding," accumulating hundreds of bookmarks that eventually become obsolete (broken links) or forgotten (decay). Standard browser bookmark managers are static repositories that offer no insight into usage patterns or link health. This leads to cluttered workspaces, reduced search utility, and a "save-and-forget" mentality that hinders knowledge management.
3. Goals & Success Metrics
Goals
- Automate the identification of dead and stale links.
- Reduce the total volume of unused bookmarks for active users.
- Provide a local-first, privacy-compliant solution for metadata enrichment.
Success Metrics
- Decay Rate Reduction: 30% average reduction in total bookmarks per user within the first 3 months.
- Accuracy: >98% accuracy in detecting 404/DNS errors.
- Retention: 40% of users performing at least one "Cleanup Session" per month.
- Performance: Background scans must consume <50MB of RAM and <2% CPU.
4. User Personas
- The Researcher (Dr. Elena): Saves hundreds of academic papers and articles. Needs to know what links still work and why she saved them.
- The Developer (Alex): Bookmarks documentation and GitHub repos. Needs to prune outdated versions of tech stacks.
- The Digital Hoarder (Sam): Bookmarks everything "just in case." Needs a low-friction way to batch-delete thousands of items.
5. User Stories
- As a researcher, I want to see a summary of a 2-year-old bookmark so that I don't have to re-read the whole page to decide if it's still relevant.
- As a developer, I want to automatically flag links that return 404 errors so that I can remove dead documentation.
- As a student, I want to be reminded of bookmarks I haven't opened in 6 months so that I can keep my browser organized.
- As a privacy-conscious user, I want all my bookmark data to be processed locally so that my browsing habits aren't sold to third parties.
6. Functional Requirements
6.1 Bookmark Auditing
- FR-1: Background scanning of all browser bookmarks using
chrome.bookmarksAPI. - FR-2: Real-time tracking of "Last Visited" timestamps via
chrome.historyandchrome.tabslisteners. - FR-3: Detection of 404, 500, and DNS errors using
fetchHEAD requests withwebRequest.onErrorOccurredfor DNS specificity.
6.2 The Cleanup Dashboard
- FR-4: Filter bookmarks by "Health" (Broken, Stale, Healthy).
- FR-5: Batch actions: "Delete Selected," "Move to Archive Folder," "Snooze for 30 Days."
- FR-6: Duplicate detection based on URL normalization (ignoring UTM parameters).
6.3 AI Insights (Nice-to-Have / Phase 2)
- FR-7: On-device summarization using Chrome’s native
ai.summarizerAPI (Gemini Nano). - FR-8: Key-point extraction for long-form articles to provide context in the dashboard.
6.4 Sync & Security
- FR-9: Optional E2EE sync to a PostgreSQL cloud backup using PGlite replication.
- FR-10: Configurable "Decay Thresholds" (e.g., mark as stale after 90 days).
7. Technical Requirements
7.1 Tech Stack (2026 Standards)
- Node.js: v24.13.0 (LTS)
- Frontend Framework: React v19.2.1
- Styling: Tailwind CSS v4.1.18 (Oxide Engine)
- Build Tool: Vite 7 with WXT (Web Extension Toolbox)
- State/Storage: PGlite (PostgreSQL WASM) for local relational data; IndexedDB for persistent storage.
- Background Context: Manifest V3 Service Workers.
7.2 Integrations
- Chrome Bookmarks API: Primary data source.
- Chrome Summarizer API: Local LLM processing.
- Orama: WASM-based full-text search engine for local bookmark indexing.
8. Data Model
Entity: BookmarkNode
id: UUIDbrowserId: String (Native browser ID)url: Stringtitle: Stringstatus: Enum (active, broken, stale, pending)lastVisitedAt: TimestampaddedAt: Timestampsummary: Text (AI Generated)isSynced: Boolean
Entity: ScanLog
scanId: UUIDtimestamp: TimestamplinksChecked: IntegererrorsFound: Integer
9. API Specification (Internal Messaging)
Since this is an extension, the "API" primarily consists of messages between the Content Script, Side Panel, and Service Worker.
GET_HEALTH_STATS
- Request:
{ action: "audit_summary" } - Response:
{ brokenCount: 12, staleCount: 45, totalCount: 500 }
TRIGGER_CLEANUP
- Request:
{ action: "delete_bookmarks", ids: ["123", "456"] } - Response:
{ success: true, deletedCount: 2 }
10. UI/UX Requirements
- Side Panel Interface: The primary interaction point should be the Chrome Side Panel (standardized in 2026) to allow users to manage bookmarks while browsing.
- Visual Decay Indicators: Use color-coding (Green = Healthy, Yellow = Stale, Red = Broken).
- Confirmatory Modals: Destructive batch deletes must require a "double-check" confirmation.
- Dark Mode: Native support using Tailwind
dark:classes and system preference detection.
11. Non-Functional Requirements
- Performance: Link health checks must be debounced (max 5 concurrent requests) to avoid IP flagging.
- Privacy: No bookmark URLs should be sent to an external server unless the user explicitly enables Cloud Sync with E2EE.
- Accessibility: WCAG 2.1 Level AA compliance; full keyboard navigability for cleanup actions.
12. Out of Scope
- Social sharing of bookmark folders.
- In-page annotation tools (highlighting text on the live page).
- Support for Manifest V2 (Obsolete).
13. Risks & Mitigations
- Risk: Servers blocking "HEAD" requests as bot traffic.
- Mitigation: Fallback to GET requests with
Rangeheaders; implement randomized delays.
- Mitigation: Fallback to GET requests with
- Risk: Service Worker termination during long scans.
- Mitigation: Use
chrome.alarmsto chunk scan tasks into 30-second intervals.
- Mitigation: Use
- Risk: High Memory usage by PGlite in WASM.
- Mitigation: Only load the database when the Dashboard or Side Panel is active.
14. Implementation Tasks
Phase 1: Project Setup & Infrastructure
- [ ] Initialize project using WXT with React 19.2.1 and Tailwind 4.1.18
- [ ] Configure Manifest V3 permissions (
bookmarks,history,storage,sidePanel,webRequest) - [ ] Set up PGlite with IndexedDB persistence layer
- [ ] Implement basic Service Worker boilerplate with top-level event listeners
Phase 2: Core Auditing Logic
- [ ] Create
BookmarkScannerservice to traversechrome.bookmarkstree - [ ] Implement link health checker using
fetch(HEAD fallback to GET) - [ ] Add
webRequest.onErrorOccurredlistener to catch DNSERR_NAME_NOT_RESOLVED - [ ] Build logic to track
lastVisitedAtusingchrome.historysearch on initial scan
Phase 3: Dashboard & UI
- [ ] Build Side Panel UI for "Quick Cleanup" view
- [ ] Create main Dashboard page using Tailwind 4 native CSS variables
- [ ] Implement Orama search for sub-millisecond bookmark filtering
- [ ] Develop batch action handlers (Delete, Archive, Snooze)
Phase 4: AI & Enrichment (Nice-to-Have)
- [ ] Integrate Chrome
ai.summarizercapabilities check - [ ] Create
Offscreen APIdocument for DOM parsing of article text - [ ] Implement "Summarize on Demand" button for stale links
Phase 5: Optimization & Launch
- [ ] Implement adaptive rate limiting for background health checks
- [ ] Add E2EE logic for optional PostgreSQL cloud sync (via PowerSync or similar)
- [ ] Conduct performance audit (Memory/CPU profiling)
- [ ] Submit to Chrome Web Store, Firefox Add-ons, and Mac App Store (Safari)