5.4 KiB
5.4 KiB
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 identifierurl- Bookmark URL (duplicates allowed)title- Display titledescription- Optional descriptionnotes- User notestags- Array of tag namesfavicon_url- Icon URLpath- Folder structurecreated_at,updated_at- Timestampsvisit_count- Number of visitsis_bookmarked- Bookmarked statussource_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
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
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.