194 lines
5.4 KiB
Markdown
194 lines
5.4 KiB
Markdown
# LinkSyncServer
|
|
|
|
A self-hosted bookmark server with advanced collection and query capabilities, designed to work with browser extensions for bookmark synchronization.
|
|
|
|
## Overview
|
|
|
|
LinkSyncServer replaces the need for workarounds in existing bookmark sync solutions. It provides:
|
|
|
|
- **True Collections** - First-class collection objects with saved queries
|
|
- **Advanced Query Engine** - Supports AND, OR, XOR set operations
|
|
- **Firefox-Compatible Fields** - All bookmark attributes natively supported
|
|
- **Multi-User Support** - Authentication with admin and regular user roles
|
|
- **RESTful API** - Full CRUD operations for links and collections
|
|
- **Web Interface** - Modern UI for browsing, searching, and managing collections
|
|
- **Docker-Ready** - Easy deployment with Docker Compose
|
|
|
|
## Features
|
|
|
|
### Collections
|
|
|
|
Two types of collections:
|
|
|
|
| Type | Description |
|
|
|------|-------------|
|
|
| **Static** | Explicit set of link IDs |
|
|
| **Dynamic** | Query expression evaluated on each access |
|
|
|
|
#### Dynamic Collection Query Syntax
|
|
|
|
```
|
|
('term1', 'term2', 'term3') OR tagA AND tagB XOR url:example.com
|
|
```
|
|
|
|
- Parentheses evaluated first (innermost to outermost)
|
|
- Left-to-right evaluation otherwise
|
|
- Precedence: `()` > XOR > AND > OR
|
|
|
|
### Set Operations
|
|
|
|
Query builder supports visual set operations:
|
|
|
|
```
|
|
Set1 AND Set2 XOR Set3 OR Set4
|
|
```
|
|
|
|
This evaluates as: `(((Set1 AND Set2) XOR Set3) OR Set4)`
|
|
|
|
### Synchronization Modes
|
|
|
|
| Mode | Browser → Server | Server → Browser |
|
|
|------|------------------|------------------|
|
|
| **Bi-directional** | Add/update | Add/update |
|
|
| **Browser Authoritative** | Add/update | Overwrite |
|
|
| **Server Authoritative** | Download only | Overwrite |
|
|
|
|
Optional: Enable deletions for all modes.
|
|
|
|
### Bookmarks (Links)
|
|
|
|
All Firefox bookmark attributes supported:
|
|
|
|
- `id` - Unique identifier
|
|
- `url` - Bookmark URL (duplicates allowed)
|
|
- `title` - Display title
|
|
- `description` - Optional description
|
|
- `notes` - User notes
|
|
- `tags` - Array of tag names
|
|
- `favicon_url` - Icon URL
|
|
- `path` - Folder structure
|
|
- `created_at`, `updated_at` - Timestamps
|
|
- `visit_count` - Number of visits
|
|
- `is_bookmarked` - Bookmarked status
|
|
- `source_set_id` - Collection that added this link
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────┐
|
|
│ LinkSyncServer │
|
|
│ │
|
|
│ ┌──────────────┐ ┌─────────────┐ │
|
|
│ │ API Layer │ │ Auth │ │
|
|
│ └──────────────┘ └─────────────┘ │
|
|
│ ┌──────────────┐ ┌─────────────┐ │
|
|
│ │ Query │ │ Models │ │
|
|
│ │ Engine │ │ (SQLAlchemy)│ │
|
|
│ └──────────────┘ └─────────────┘ │
|
|
│ ┌──────────────┐ ┌─────────────┐ │
|
|
│ │ Templates │ │ Static │ │
|
|
│ └──────────────┘ │ Files │ │
|
|
│ ┌──────────────┐ └─────────────┘ │
|
|
│ │ PostgreSQL │ │ │
|
|
│ │ │ │ │
|
|
│ └──────────────┘ │ │
|
|
└─────────────────────────────────────┘
|
|
```
|
|
|
|
## Quick Start
|
|
|
|
### Prerequisites
|
|
|
|
- Docker and Docker Compose
|
|
- Port 5000 available (or configurable)
|
|
|
|
### Docker Compose
|
|
|
|
```yaml
|
|
version: '3.8'
|
|
|
|
services:
|
|
web:
|
|
build: .
|
|
ports:
|
|
- "5000:5000"
|
|
environment:
|
|
- DATABASE_URL=postgresql://user:password@db:5432/linksync
|
|
- SECRET_KEY=your-secret-key-here
|
|
- ADMIN_USERNAME=admin
|
|
- ADMIN_PASSWORD=admin123
|
|
depends_on:
|
|
- db
|
|
|
|
db:
|
|
image: postgres:15-alpine
|
|
environment:
|
|
- POSTGRES_DB=linksync
|
|
- POSTGRES_USER=user
|
|
- POSTGRES_PASSWORD=password
|
|
volumes:
|
|
- linkdata:/var/lib/postgresql/data
|
|
|
|
volumes:
|
|
linkdata:
|
|
```
|
|
|
|
### Build and Run
|
|
|
|
```bash
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
### Initial Login
|
|
|
|
- URL: `http://localhost:5000`
|
|
- Admin credentials from environment variables
|
|
- Create first admin account
|
|
- Admin can create regular users and admin users
|
|
|
|
## API Documentation
|
|
|
|
See `/api/docs` or `/api/openapi.json` for complete API specification.
|
|
|
|
## Configuration
|
|
|
|
Environment variables:
|
|
|
|
| Variable | Description | Default |
|
|
|----------|-------------|---------|
|
|
| `DATABASE_URL` | PostgreSQL connection string | Required |
|
|
| `SECRET_KEY` | JWT secret key | Required |
|
|
| `ADMIN_USERNAME` | Initial admin username | - |
|
|
| `ADMIN_PASSWORD` | Initial admin password | - |
|
|
| `DEBUG` | Debug mode | False |
|
|
| `HOST` | Bind address | 0.0.0.0 |
|
|
| `PORT` | Port | 5000 |
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
LinkSyncServer/
|
|
├── README.md
|
|
├── TODOs.txt
|
|
├── design.md
|
|
├── tasks.md
|
|
├── AGENTS.md
|
|
├── docker-compose.yml
|
|
├── Dockerfile
|
|
├── requirements.txt
|
|
├── app.py
|
|
├── config/
|
|
├── api/
|
|
├── models/
|
|
├── queries/
|
|
├── templates/
|
|
└── static/
|
|
```
|
|
|
|
## License
|
|
|
|
MIT License
|
|
|
|
## Support
|
|
|
|
For issues and feature requests, see the GitHub repository. |