A web-based application for managing bookmarks with advanced organization features, authentication, and cross-device sync.
- User Authentication: Secure registration and login with JWT
- Bookmark Management: Add, edit, and delete bookmarks with metadata
- Tag Management: Organize bookmarks with customizable tags and bulk editing
- Folder System: Hierarchical folder organization with drag-and-drop functionality
- Advanced Search: Filter bookmarks by tags, keywords, and dates
- Font Customization: Adjust font settings with Google Fonts integration
- Metadata Extraction: Automatically fetches titles, descriptions and favicons
- Import/Export: Import bookmarks from browsers or export for backup
- Browser Extension: Add bookmarks directly from Chrome/Firefox with enhanced popup UI and context menu; now supports pre-filling bookmark forms with current page information when not logged in
- Bookmarklet: Add bookmarks from any webpage with a single click using the bookmarklet
- Auto-Backup System: Automatic backups before every write operation to protect against data loss
- Server-Side Metadata: Secure metadata extraction without third-party proxies
- Rate Limiting: Protection against brute-force attacks on authentication endpoints
Before installing, ensure you have the following:
| Requirement | Version | How to Check |
|---|---|---|
| Node.js | v20+ | node --version |
| npm | v9+ | npm --version |
| Docker | Latest | docker --version |
Windows (WSL2):
# Install Node.js (using nvm recommended)
curl -o- https://raw-githubusercontent-com.shimmerl.top/nvm-sh/nvm/v0.39.0/install.sh | bash
nvm install 20
nvm use 20
# Install Docker Desktop for Windows
# Download from: https://www.docker.com/products/docker-desktop/Linux:
# Install Node.js
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USERgit clone <repository-url>
cd bookmarks-managernpm installThis installs all required packages including:
- React 18.2.0 (Frontend)
- Express 4.21.2 (Backend)
- MongoDB/Mongoose 8.0.3 (Database)
- Vite 6.3.5 (Build tool)
- Tailwind CSS 3.3.0 (Styling)
Create a .env file in the project root:
cp .env.example .envIf .env.example doesn't exist, create .env manually:
# MongoDB Connection
MONGODB_URI=mongodb://localhost:27017/bookmarking-app
# JWT Secret (generate with `openssl rand -base64 64`)
JWT_SECRET=your-super-secret-jwt-key-change-this-in-production
# Server Port
PORT=5015
# Frontend Port (for Vite)
VITE_PORT=5170
# CORS Origin (set to frontend URL in production)
CORS_ORIGIN=http://localhost:5170Important: Change JWT_SECRET to a random string for production:
# Generate a random secret
openssl rand -base64 64The application uses MongoDB with Docker for easy setup and data persistence.
# Make the script executable
chmod +x start-mongo.sh
# Run the script to start MongoDB container
./start-mongo.shThis script will:
- Check if Docker is running
- Create a MongoDB container named
mongodb-container - Mount persistent storage to
~/mongodb - Expose MongoDB on port
27017
Verify MongoDB is running:
docker ps | grep mongodb-containerYou should see:
mongodb-container mongo:latest "docker-entrypoint.s…" Up X minutes
# Create data directory for persistence
mkdir -p ~/mongodb
# Start MongoDB container
docker run -d \
--hostname=mongodb-container \
--name=mongodb-container \
--network=bridge \
-p 27017:27017 \
-v ~/mongodb:/data/db \
-v /data/configdb \
--restart=unless-stopped \
mongo:latestIf you have MongoDB installed locally or use MongoDB Atlas:
-
Local MongoDB:
# Install MongoDB locally sudo apt-get install -y mongodb-org # Start MongoDB service sudo systemctl start mongod
Update
.env:MONGODB_URI=mongodb://localhost:27017/bookmarking-app
-
MongoDB Atlas (Cloud):
Update
.env:MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/bookmarking-app
Test the MongoDB connection:
# Using mongosh (MongoDB shell)
docker exec mongodb-container mongosh bookmarking-app --eval "db.getCollectionNames()"Expected output:
[]
(Empty array is correct - collections are created when you add data)
Start both frontend and backend:
npm run dev:fullThis starts:
- Backend API on http://localhost:5015
- Frontend on http://localhost:5170
Or start them separately:
# Terminal 1 - Backend
npm run start
# Terminal 2 - Frontend
npm run dev# Build frontend assets
npm run build
# Start production server
npm run serve-
Open your browser and navigate to http://localhost:5170
-
Click "Create a new account"
-
Fill in the registration form:
- Username (min 3 characters)
- Email address
- Password (min 6 characters)
-
Click "Register"
-
You'll be automatically logged in and redirected to the dashboard
| Service | URL | Description |
|---|---|---|
| Frontend | http://localhost:5170 | Main application UI |
| Backend API | http://localhost:5015 | REST API endpoints |
| MongoDB | localhost:27017 | Database connection |
The application uses the bookmarking-app database with these collections:
| Collection | Description |
|---|---|
users |
User accounts and authentication |
bookmarks |
Bookmark entries with metadata |
folders |
Folder hierarchy for organization |
bookmarkextensions |
Browser extension data |
- Location:
~/mongodbon your host system - Docker Volume:
/data/dbinside container - Survives: Container restarts, deletions, WSL reinstallation
The app automatically creates backups before every write operation:
- Location:
./backups/auto/ - Keeps: 5 most recent backups
- Format: Human-readable JSON
# Create a full backup
node admin-scripts/backup-database.js
# Advanced backup with offsite storage
node admin-scripts/robust-backup-improved.jsAdd to crontab for daily backups at 2 AM:
crontab -e0 2 * * * cd /mnt/g/www/bookmarks-manager && node admin-scripts/backup-database.js >> /tmp/bookmark-backup.log 2>&1
Problem: MongooseServerSelectionError: connect ECONNREFUSED
Solution:
# Check if MongoDB container is running
docker ps | grep mongodb-container
# If not running, start it
./start-mongo.sh
# Or restart existing container
docker restart mongodb-containerProblem: Error: listen EADDRINUSE: address already in use :::5015
Solution:
# Find and kill process using the port
lsof -ti:5015 | xargs kill -9
lsof -ti:5170 | xargs kill -9
# Restart the application
npm run dev:fullProblem: Got permission denied while trying to connect to the Docker daemon socket
Solution:
# Add your user to the docker group
sudo usermod -aG docker $USER
# Log out and log back in, or run:
newgrp dockerProblem: Blank page or loading spinner
Solution:
# Clear browser cache
# Or try incognito/private window
# Check frontend is running
curl http://localhost:5170
# Restart frontend
pkill -f vite
npm run devProblem: No backups in ./backups/auto/
Solution:
# Check directory exists
ls -la ./backups/auto/
# Create if missing
mkdir -p ./backups/auto
# Check server logs for errors
tail -f /tmp/bookmark-backup.logAfter installation:
- ✅ Create your user account at http://localhost:5170
- ✅ Add your first bookmark using the "+" button
- ✅ Create folders to organize bookmarks
- ✅ Add tags for easy searching
- ✅ Install browser extension (optional) from
extension/folder - ✅ Set up bookmarklet for quick bookmarking
- Changelog: See
CHANGELOG.mdfor version history and recent fixes - Documentation: See
documentation/folder for detailed guides - API Endpoints: See
documentation/dataSources.md - Backup Strategy: See
documentation/AUTO-BACKUP-SYSTEM.md - Browser Extension: See
extension/README.md
For issues or questions:
- Check existing documentation in
documentation/folder - Review troubleshooting section above
- Check server logs for error messages
Happy Bookmarking! 🎉