A desktop GUI application (built with PyQt6) to organize and manage bookmarks imported from Chrome and Edge browsers.
- Multi-Browser Support: Import bookmarks from Chrome and Edge browsers
- Multi-Profile Support: Detects and imports from all browser profiles
- Full-Text Search: Search bookmarks by title, URL, or notes using SQLite FTS5
- Folder Navigation: Browse bookmarks by their original folder structure
- Dead Link Detection: Check for broken links with parallel URL checking
- Duplicate Detection: Find exact and similar duplicate bookmarks
- Page Thumbnails: Generate preview thumbnails for bookmarks (requires Playwright)
- Delete from Browsers: Remove dead links and duplicates from browser bookmark files
- Database Backup: Create timestamped backups before operations
- Refresh All: One-click backup, import, duplicate check, and dead link check
Coming soon
- Python 3.10+
- PyQt6
- psutil (for browser process detection)
- Playwright (optional, for page thumbnails)
# Clone the repository
git clone https://github.com/Earththing/Bookmark_Manager.git
cd Bookmark_Manager
# Create virtual environment (optional but recommended)
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install required dependencies
pip install PyQt6 psutil
# Install optional dependencies for page thumbnails
pip install playwright
playwright install chromiumTo enable page thumbnail generation, install Playwright:
pip install playwright
playwright install chromiumThis downloads a headless Chromium browser (~150MB) used to capture page screenshots. Without Playwright, thumbnail features will show placeholder images.
From the project root:
python -m src.guiThis launches the graphical user interface where you can browse, search, and manage your bookmarks.
For a command-line import (useful for scripting):
python -m src.main- Click "Refresh All..." button or go to File > Refresh All...
- Keep all options checked and click Start
- The application will:
- Backup any existing database
- Create a fresh database
- Import all bookmarks from detected browser profiles
- Find duplicate bookmarks
- Check for dead links
- File > Import from Browsers... (Ctrl+I) - Import bookmarks only
- File > Check Dead Links... (Ctrl+D) - Check for broken links
- File > Find Duplicates... (Ctrl+U) - Find duplicate bookmarks
- File > Generate Thumbnails... (Ctrl+T) - Generate page preview thumbnails
- File > Delete from Browsers... (Ctrl+Shift+D) - Remove bookmarks from browser files
- F5 - Refresh the view
- Use the folder tree on the left to navigate
- Click "All Bookmarks" to see everything
- Use the search bar to find specific bookmarks
- Double-click a bookmark to open it in your browser
| Column | Description |
|---|---|
| Title | Bookmark title |
| URL | The bookmark URL |
| Folder | Original folder name |
| Browser/Profile | Source browser and profile |
| Dead | Red "X" if link is dead |
| Exact Dup | Number of exact duplicates |
| Similar | Number of similar URLs |
The application stores data in the following locations:
- Database:
~/.bookmark_manager/bookmarks.db- SQLite database with bookmarks - Thumbnails:
~/.bookmark_manager/thumbnails/- Cached page screenshots - Backups:
~/.bookmark_manager/browser_backups/- Browser bookmark file backups
For advanced users, the following views are available:
vw_bookmarks_with_location- All bookmarks with folder and profile infovw_dead_links- Dead links with bookmark detailsvw_duplicates_exact- Exact duplicate groupsvw_duplicates_similar- Similar URL groups
Bookmark_Manager/
├── src/
│ ├── main.py # Application entry point
│ ├── models/
│ │ ├── database.py # SQLite database setup
│ │ ├── bookmark.py # Bookmark model
│ │ ├── folder.py # Folder model
│ │ └── browser_profile.py # Browser profile model
│ ├── services/
│ │ ├── profile_detector.py # Browser profile detection
│ │ ├── bookmark_parser.py # Chromium bookmark file parser
│ │ └── import_service.py # Import orchestration
│ ├── ui/
│ │ ├── main_window.py # Main application window
│ │ ├── import_dialog.py # Import progress dialog
│ │ ├── dead_link_dialog.py # Dead link checker
│ │ ├── duplicate_dialog.py # Duplicate finder
│ │ └── refresh_all_dialog.py # Refresh all operations
│ └── utils/
│ └── browser_paths.py # Browser path utilities
├── README.md
└── .gitignore
The application automatically detects Chrome and Edge profiles by looking in standard locations:
-
Windows:
- Chrome:
%LOCALAPPDATA%\Google\Chrome\User Data\ - Edge:
%LOCALAPPDATA%\Microsoft\Edge\User Data\
- Chrome:
-
macOS:
- Chrome:
~/Library/Application Support/Google/Chrome/ - Edge:
~/Library/Application Support/Microsoft Edge/
- Chrome:
-
Linux:
- Chrome:
~/.config/google-chrome/ - Edge:
~/.config/microsoft-edge/
- Chrome:
Exact Duplicates: URLs are normalized before comparison:
- Lowercases domain
- Removes
www.prefix - Removes trailing slashes
- Sorts query parameters
- Strips tracking parameters (utm_*, fbclid, gclid, etc.)
Similar URLs: Uses fuzzy matching to find URLs that are similar but not identical (configurable threshold, default 85%).
- Uses HEAD requests for efficiency (falls back to GET if needed)
- Parallel checking with configurable number of threads (default 10)
- Only checks each unique URL once (duplicates share results)
- Considers 4xx and 5xx status codes as dead
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with PyQt6
- Uses SQLite with FTS5 for full-text search