원문 캡처 · github.com
원문 캡처 · github.com

HelixSync는 사용자가 직접 운영하는 서버를 통해 여러 Chromium 기반 브라우저의 북마크와 방문 기록을 종단 간 암호화해 동기화하는 오픈소스 프로젝트다. 탭·창·탭 그룹 동기화도 선택할 수 있으며, 구글·마이크로소프트 등 제3자 계정은 필요하지 않다. 서버는 PostgreSQL에 암호문만 저장하고 비밀번호는 기기를 떠나지 않는다는 것이 프로젝트의 설명이다.

저장소와 설치 안내는 GitHub, 확장 프로그램은 Chrome 웹 스토어에서 확인할 수 있다. Helium과 Chrome, Brave, Edge, Vivaldi 등 Chromium 기반 브라우저에서 Manifest V3 확장 프로그램으로 동작하며 Chromium 116 이상이 필요하다. 암호, 쿠키, 사이트 로그인 세션은 동기화 대상이 아니다. 암호 관리에는 프로젝트가 Vaultwarden을 별도로 안내한다.

  • 북마크는 폴더와 이동을 포함해 동기화한다. 방문 기록은 각 브라우저의 자체 기록에 반영하며, 탭과 창은 선택 사항으로 복원할 수 있다. 탭 그룹은 제목·색상·접힘 상태까지 동기화한다.
  • 기기 수에는 제한이 없다고 안내하며, 웹 대시보드에서 연결된 브라우저를 확인하거나 접근을 취소할 수 있다. 충돌 해결은 최종 기록 우선 방식 대신 작업 로그를 기반으로 한다. 자세한 내용은 동기화 프로토콜 문서에 있다.
  • Docker Compose를 사용하면 API 서버, 데이터베이스, 웹 대시보드를 함께 실행할 수 있다. 계정당 저장 한도는 기본 5 GiB다.

설치와 초기 설정

설치는 서버 실행, 계정 생성, 확장 프로그램 설치, 브라우저 연결 순으로 진행한다. Docker Compose 사전 빌드 이미지, 소스에서 빌드, Portainer 같은 스택 관리 화면, HTTPS 리버스 프록시 구성, Docker 없는 설치, localhost 시험 실행 방법을 제공한다. Docker 방식 A~C에는 Docker Compose 플러그인이 필요하고, Docker 없이 설치하려면 안정 버전 Rust 도구체인과 C 컴파일러, Node.js 22, PostgreSQL 16이 필요하다.

다른 기기에서 사용하려면 HTTPS가 필요하다. 대시보드 세션 쿠키는 Secure로 설정되고 확장 프로그램도 https:// 주소만 허용한다. 예외는 localhost, 127.0.0.1, [::1]이며 이 주소에서는 HTTP를 쓸 수 있다. A~C 방식은 기본적으로 5173 포트에서 HTTP로 대시보드를 제공하므로 외부에서 접속할 때는 TLS를 종료하는 프록시를 앞에 둬야 한다. 프록시는 확장 프로그램의 WebSocket 업그레이드와 X-Forwarded-Proto, X-Forwarded-For 전달을 지원해야 한다. nginx를 쓸 때는 기본 1 MB 요청 제한을 넘겨야 큰 방문 기록 업로드가 413 오류로 실패하지 않는다. 배포 세부 사항은 배포 문서에 있다.

Compose 배포는 저장소를 받아 .env를 만들고 비밀값을 설정한다. Portainer에서는 저장소를 서버에 복제하지 않아도 Compose 파일과 환경변수를 입력해 배포할 수 있다.

sh
git clone https://github.com/GhaziAlibi/helixsync.git
cd helixsync
cp .env.example .env
sed -i "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$(openssl rand -hex 32)|" .env
sed -i "s|^JWT_SIGNING_KEY=.*|JWT_SIGNING_KEY=$(openssl rand -base64 48)|" .env

위 명령의 sed는 GNU 버전 기준이며 macOS에서는 sed -i ''를 사용한다. POSTGRES_PASSWORD는 데이터베이스를 보호한다. 연결 URL에 들어가므로 /나 @처럼 URL을 깨뜨릴 수 있는 문자가 없는 16진수 값을 쓰도록 안내한다. 예시처럼 생성한 값은 32바이트 무작위 값이다. 서버는 기본 문구가 남아 있으면 시작을 거부한다. JWT_SIGNING_KEY는 기기 접근 토큰에 서명하며 최소 32자여야 한다. change-me나 replace-me 같은 기본값이면 서버가 시작하지 않는다. 이 값을 바꾸면 발급된 접근 토큰은 무효가 되지만 갱신 토큰에는 영향을 주지 않는다. 공개 대시보드 출처가 필요한 구성에서는 CORS_ALLOWED_ORIGINS에 https://sync.example.com 같은 주소를 설정한다. 기본 단일 출처 구성에서는 다른 출처의 요청만 검사한다.

사전 빌드 이미지를 사용하는 권장 Compose 방식은 .env에 배포할 버전을 지정한 뒤 실행한다. 버전 지정은 필수이며 움직이는 latest 태그를 따라가지 않는다. 이미지 빌드는 로컬에서 하지 않고 데이터베이스 마이그레이션은 서버 시작 시 자동 실행된다.

sh
# in the helixsync directory, with .env created as above:
# set HELIXSYNC_VERSION in .env to a released version, for example
# HELIXSYNC_VERSION=1.0.0
docker compose -f docker-compose.prod.yml up -d

소스에서 빌드하는 방법은 다음과 같다. 첫 빌드는 Rust 서버 컴파일과 대시보드 빌드 때문에 몇 분 걸릴 수 있으며, 대시보드는 http://localhost:5173에서 열린다.

sh
# in the helixsync directory, with .env created as above
docker compose up -d --build

Portainer 등에서는 docker-compose.prod.yml을 스택 편집기에 붙여 넣고, .env.example의 변수 중 최소한 POSTGRES_PASSWORD, JWT_SIGNING_KEY, CORS_ALLOWED_ORIGINS, HELIXSYNC_VERSION을 입력한다. 다른 Compose 파일을 받는 관리 도구도 같은 방식으로 사용할 수 있다.

Caddy는 같은 Docker 네트워크의 web 서비스를 대상으로 다음처럼 구성할 수 있다.

text
sync.example.com {
 reverse_proxy web:80
}

nginx 구성 예시는 다음과 같다. 기본 요청 본문 한도 1 MB를 늘리고, WebSocket 관련 헤더와 프록시 정보를 전달한다.

text
location / {
 proxy_pass http://web:80;
 proxy_http_version 1.1;
 proxy_set_header Host $host;
 proxy_set_header X-Forwarded-For $remote_addr;
 proxy_set_header X-Forwarded-Proto $scheme;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";

 # nginx's default request limit (1 MB) is far below the server's upload
 # limit, so raise it, or large history uploads fail with 413.
 client_max_body_size 150m;
 proxy_read_timeout 3600s;
}

Traefik 등 다른 프록시도 같은 세 가지 전달 설정과 큰 요청 본문 허용이 필요하다. 실제 클라이언트 IP를 속도 제한기에 전달하는 법과 WEB_TRUSTED_PROXY_CIDRS를 좁혀야 하는 경우는 배포 문서를 참조한다.

Docker 없이 설치할 때는 PostgreSQL과 서버 바이너리를 직접 실행하고, 원하는 웹 서버로 대시보드 정적 파일을 제공한다. 프로젝트는 PostgreSQL 사용자와 데이터베이스를 만든 뒤 서버와 대시보드를 빌드하도록 안내한다.

sh
git clone https://github.com/GhaziAlibi/helixsync.git
cd helixsync

# 1. Database (run as the PostgreSQL superuser; use a plain alphanumeric password)
sudo -u postgres createuser helixsync
sudo -u postgres createdb -O helixsync helixsync
sudo -u postgres psql -c "ALTER ROLE helixsync PASSWORD 'choose-a-password'"

# 2. Server. Builds offline from the committed query cache: no database is needed to compile.
cd server
SQLX_OFFLINE=true cargo build --release --locked

# 3. Dashboard: builds static files into web/dist
cd ../web
npm ci
npm run build

서버를 실행할 디렉터리에 .env를 만들고 권한을 제한한다.

sh
cd ../server
cp .env.example .env
chmod 600 .env

.env의 DATABASE_URL은 postgres://helixsync:choose-a-password@127.0.0.1:5432/helixsync로 설정하고, JWT_SIGNING_KEY에는 openssl rand -base64 48의 결과를 넣는다. BEHIND_PROXY=true와 CORS_ALLOWED_ORIGINS=https://sync.example.com을 추가한다. 프록시만 서버에 접근할 수 있도록 BIND_ADDR=127.0.0.1:8080을 유지한 다음 서버를 실행한다.

sh
./target/release/helixsync-server

서버는 시작할 때 데이터베이스 마이그레이션을 적용한다. 계속 실행하려면 서비스 관리자를 사용한다. systemd 예시는 배포 문서에 있다. TLS를 사용하는 한 출처에서 web/dist를 제공하고 /api/를 서버로 전달해야 한다. Caddy 예시는 다음과 같다.

text
sync.example.com {
 handle /api/* {
 reverse_proxy 127.0.0.1:8080 {
 # the server trusts this header for rate limiting (BEHIND_PROXY=true)
 header_up X-Real-IP {remote_host}
 }
 }
 handle {
 root * /var/www/helixsync
 try_files {path} /index.html
 file_server
 }
}

BEHIND_PROXY=true는 이 예처럼 사용자가 통제하는 프록시만 서버에 접근할 때 설정한다. 이 방식은 web 이미지의 nginx가 추가하는 보안 헤더를 제공하지 않으므로 web/security-headers.conf의 설정을 프록시에 복사해야 한다.

도메인이나 인증서 없이 시험하려면 소스 빌드 방식으로 실행한 뒤 http://localhost:5173을 연다. 확장 프로그램의 서버 주소에도 같은 URL을 입력한다. Compose는 기본적으로 WEB_PORT를 모든 네트워크 인터페이스에 공개한다. 공유 네트워크에서는 web 서비스의 포트 매핑을 "127.0.0.1:${WEB_PORT:-5173}:80"로 바꾸면 로컬 컴퓨터에서만 접근할 수 있다.

대시보드에서 Register를 선택하고 이메일과 비밀번호를 입력해 계정을 만든다. 데이터를 암호화하는 계정 키는 브라우저에서 생성되고 비밀번호로 잠긴다. 따라서 서버 운영자와 개발자는 비밀번호 없이 이를 풀거나 데이터를 읽을 수 없다고 프로젝트는 설명한다. 대시보드는 복구 코드를 한 번만 보여 준다. 비밀번호를 잊었을 때 데이터를 잃지 않고 새 비밀번호를 설정하는 유일한 방법이므로 오프라인의 안전한 장소나 암호 관리자에 보관해야 한다. 가입은 기본적으로 열려 있다. 인터넷에 공개한 인스턴스에서는 계정을 만든 뒤 ALLOW_REGISTRATION=false로 설정해 가입을 닫아야 한다.

확장 프로그램은 Chrome 웹 스토어에서 설치하거나, Releases에서 helixsync-extension-<version>.zip을 받아 압축을 풀 수 있다. 압축 파일을 이용할 때는 chrome://extensions 또는 해당 브라우저의 확장 프로그램 페이지에서 개발자 모드를 켜고 압축해제된 확장 프로그램을 불러온다. 소스에서 빌드하는 경우에는 extension 디렉터리에서 npm ci와 npm run build를 실행한 뒤 extension/dist/를 불러온다.

연결할 때는 확장 프로그램 아이콘을 누르고 서버 주소, 이메일, 비밀번호, 기기 이름을 입력한다. 서버 주소는 대시보드와 같은 출처여야 한다. 연결을 누르면 해당 서버 주소에만 접근하도록 브라우저가 권한을 요청한다. 확장 프로그램은 모든 사이트에 대한 권한을 요청하지 않는다. 동기화할 각 브라우저에서 같은 계정으로 이 과정을 반복한다. 이미 연결된 브라우저의 팝업에서 문구가 일치하는지 확인하고 승인하면 비밀번호 대신 기기 로그인을 이용할 수도 있다. 계정을 만든 뒤 .env에서 ALLOW_REGISTRATION=false로 설정하고 서버를 재시작한다. 기존 계정과 로그인, 기기에는 영향이 없다. 초기 동기화는 즉시 시작되며 큰 방문 기록은 백그라운드에서 나누어 업로드되므로 프로필이 크면 첫 전체 동기화에 시간이 걸릴 수 있다.

동기화 관리와 보안

확장 프로그램 팝업은 전체 확장 프로그램 인터페이스로, 동기화 상태와 마지막 동기화 시각을 보여 준다. 연결 후 설정에서 북마크·방문 기록·탭·탭 그룹별 동기화 여부, 탭 복원 방식(사용 안 함, 확인 후 복원, 자동 복원), 방문 기록 보존 기간(7일~무제한)을 정할 수 있다. 연결 해제는 서버에서 해당 기기의 권한을 취소하고 로컬 데이터를 제거한다. 다른 브라우저나 대시보드가 해당 기기로 로그인을 요청하면 아이콘에 표시가 나타나며, 팝업에서 문구를 확인하고 승인하거나 거부할 수 있다.

웹 대시보드에서는 연결 상태와 마지막 동기화, 기기 수, 동기화된 북마크·방문 기록·탭 수, 저장 공간 사용량과 최근 기기를 확인한다. 기기 페이지에서는 브라우저 이름을 바꾸거나 연결을 취소할 수 있고, 동기화 페이지에서는 팝업과 같은 설정을 관리한다. 보안 페이지에서는 암호화 상태와 웹 세션을 확인·취소하고, 비밀번호 변경, 복구 코드 재발급, 계정 삭제를 할 수 있다. 비밀번호를 바꾸면 계정 키를 새 비밀번호로 다시 감싼다. 이미 동기화된 데이터는 계속 읽을 수 있고 각 브라우저는 새 비밀번호로 다시 로그인한다.

비밀번호를 잊으면 로그인 화면에서 이메일, 복구 코드, 새 비밀번호를 입력해 재설정한다. 데이터는 계속 읽을 수 있고 모든 웹 세션에서 로그아웃되며 새 복구 코드가 발급된다. 복구 코드는 각각 한 번만 사용할 수 있다. 대시보드에만 들어가려면 연결된 브라우저의 승인을 받는 기기 로그인을 이용할 수 있다. 비밀번호와 복구 코드를 모두 잃으면 운영자는 계정을 삭제해 다시 가입하도록 할 수 있지만 기존 데이터는 복구할 수 없다. 운영자가 실행하는 명령은 다음과 같다.

sh
helixsync-server delete-account <email>

계정 삭제는 Security → Danger zone에서 진행하며 비밀번호와 DELETE 입력을 요구한다. 계정과 그 아래 저장된 모든 항목을 영구 삭제하고 연결된 브라우저의 동기화를 멈춘다.

주요 환경변수는 다음과 같다.

  • POSTGRES_PASSWORD: 기본값 없음, 필수. 데이터베이스 비밀번호다.
  • JWT_SIGNING_KEY: 기본값 없음, 필수. 기기 접근 토큰에 서명하며 32자 이상이어야 하고 기본 문구를 사용할 수 없다.
  • HELIXSYNC_VERSION: 기본값 없음. docker-compose.prod.yml을 쓸 때 필요한 릴리스 이미지 버전이다.
  • CORS_ALLOWED_ORIGINS: 기본값은 빈 값. 다른 출처에서 API를 호출할 때 허용할 출처다.
  • ALLOW_REGISTRATION: 기본값 true. 계정 생성 후 가입을 닫으려면 false로 설정한다.
  • REQUIRE_ENCRYPTION: 기본값 true. 암호화되지 않은 동기화 데이터를 거부한다. 실제 데이터를 다룰 때는 켜 둬야 한다.
  • MAX_ACCOUNT_STORAGE_BYTES: 기본값 5 GiB. 계정별 동기화 데이터 저장 한도다.
  • WEB_PORT: 기본값 5173. 대시보드가 사용하는 호스트 포트다.
  • WEB_TRUSTED_PROXY_CIDRS: 기본값은 사설 네트워크 범위다. X-Forwarded-For를 신뢰할 프록시 범위이며, web을 직접 공개한다면 범위를 좁혀야 한다.
  • LOG_FORMAT: 기본값 text. json으로 설정하면 로그 한 줄마다 JSON 객체를 기록한다.

Docker 밖에서 실행할 때도 같은 변수 이름을 쓰며 DATABASE_URL, 기본값이 127.0.0.1:8080인 BIND_ADDR, BEHIND_PROXY가 추가된다. 전체 변수는 서버 환경변수 예시와 배포 문서에 있다. 서버는 시작할 때 설정을 검사하고 잘못된 값이 있으면 변수 이름을 표시하며 실행을 거부한다.

인터넷에 공개하기 전에는 web 앞에 HTTPS 리버스 프록시를 두고 강력하고 고유한 POSTGRES_PASSWORD, JWT_SIGNING_KEY를 설정해야 한다. REQUIRE_ENCRYPTION=true를 유지하고 계정을 만든 뒤 ALLOW_REGISTRATION=false로 바꾼다. 가입을 열어 두면 URL을 아는 누구나 가입해 기본 한도인 계정당 5 GiB까지 서버 공간을 사용할 수 있다. 데이터베이스 백업을 만들고 복원도 시험해야 한다. 백업은 잊어버린 비밀번호를 해결하지 못하며 이 경우 복구 코드가 필요하다. 사전 빌드 이미지를 쓸 때는 HELIXSYNC_VERSION을 릴리스 버전에 고정하고 업데이트를 직접 결정한다. web을 프록시 내부에서만 접근하게 하지 않고 직접 공개한다면 WEB_TRUSTED_PROXY_CIDRS를 좁히거나 WEB_PORT를 루프백에 바인딩한다.

새 사전 빌드 버전으로 업데이트할 때는 .env의 HELIXSYNC_VERSION을 바꾸고 이미지를 가져온 뒤 다시 시작한다.

sh
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d

소스 빌드 방식은 저장소를 갱신하고 다시 빌드한다.

sh
git pull && docker compose up -d --build

릴리스에는 호환성을 깨는 변경이 있을 수 있으므로 먼저 변경 기록과 업그레이드 안내를 읽는다. 마이그레이션은 자동 실행된다. 데이터베이스는 사용자와 데이터베이스 이름을 바꿨다면 명령의 값을 조정해 pg_dump로 백업한다.

sh
docker compose exec postgres pg_dump -U helixsync helixsync > backup.sql

덤프에는 계정 키가 암호로 감싼 형태로만 들어 있으므로 계정 비밀번호 없이는 사용할 수 없다. 하지만 계정 이메일과 기기 이름도 들어 있으므로 데이터베이스와 같은 수준으로 비공개 보관해야 한다. 복원과 재해 복구 절차는 배포 문서에 있다.

제약과 문제 해결

서버가 JWT_SIGNING_KEY 오류로 시작하지 않으면 값이 없거나 32자보다 짧거나 change-me·replace-me가 남았는지 확인하고 openssl rand -base64 48로 생성한다. DATABASE_URL과 기본값 관련 오류는 POSTGRES_PASSWORD가 예시 값으로 남았을 때 발생할 수 있다. openssl rand -hex 32로 새 값을 만들 수 있다. PostgreSQL은 처음 실행할 때 설정한 비밀번호를 유지하므로 이미 스택을 실행했다면 다음 명령으로 데이터베이스 역할의 비밀번호도 바꿔야 한다.

sh
docker compose exec postgres psql -U helixsync -c "ALTER ROLE helixsync PASSWORD '<the new value>'"

다른 변수 이름이 오류에 나오면 값의 형식이나 범위를 확인한다. docker compose가 HELIXSYNC_VERSION is missing a value라고 하면 .env에 HELIXSYNC_VERSION=1.0.0처럼 릴리스 버전을 지정한다. 확장 프로그램이 서버 주소에 https://를 요구하면 localhost, 127.0.0.1, [::1] 이외에는 TLS 프록시를 사용한다. 대시보드가 바로 로그아웃하거나 HTTPS 경고를 내면 HTTPS 또는 localhost에서 접속한다. registration_disabled 오류는 ALLOW_REGISTRATION=false일 때 나타나며 계정을 추가해야 할 때만 임시로 true로 바꾼다.

사용자가 비밀번호를 잊었다면 로그인 화면에서 복구 코드로 재설정한다. 복구 코드도 없다면 요청자를 확인한 뒤 계정을 삭제하고 다시 가입하게 할 수 있다.

sh
docker compose exec server /app/helixsync-server delete-account <email>

확장 프로그램이 “update the HelixSync extension” 오류를 보이면 더 최신 형식으로 기록된 동기화 데이터를 만난 것이다. 확장 프로그램을 업데이트하면 데이터는 손실되지 않으며 자동으로 다시 시도한다. 한 클라이언트의 문제 뒤 모두 429 속도 제한 오류를 받는다면 제한기가 프록시 주소를 모든 클라이언트 주소로 인식하는지 확인한다. 프록시가 X-Forwarded-For를 설정해야 한다. 그 밖의 문제는 docker compose logs server와 확장 프로그램의 서비스 워커 콘솔을 확인하고, 비밀값이나 동기화 데이터를 포함하지 않은 이슈를 등록한다.

방문 기록에는 브라우저 API 때문에 몇 가지 제약이 있다. 다른 기기에서 온 기록은 동기화된 날짜로 표시되고 제목이 없다. HelixSync는 URL을 브라우저 자체 기록에 추가하므로 chrome://history와 주소창 제안에 나타난다. Chrome 확장 API의 chrome.history.addUrl은 과거 시각이나 제목을 지정할 수 없고 방문 시점만 기록한다. 페이지를 열기 전까지 제목이 비어 있을 수 있다. 서로 다른 HTTP·HTTPS URL은 각각 한 번 추가하며, 브라우저에 이미 있는 URL은 건드리지 않는다. 첫 가져오기를 포함해 방문 기록을 전부 읽으므로 큰 프로필은 오래 걸릴 수 있고, CPU 사용량을 낮추도록 작업 속도를 조절한다.

보존 기간의 계산 단위는 정확한 시각이 아니라 시간 단위 구간이다. 대시보드의 동기화된 방문 기록 수는 시간별 구간으로 추적되므로 보존 기간 경계에 가까운 방문은 정확한 기준 시각보다 최대 한 시간 더 길거나 짧게 집계될 수 있다. 숨겨진 리디렉션 경유 기록만 있는 URL은 항상 집계할 수 있는 것도 아니다. Chrome 기록 API가 중간 리디렉션 방문을 모두 확장 프로그램에 제공하지 않아 가져오는 동안 일부 방문을 나열하지 못할 수 있다.

비밀번호와 복구 코드를 모두 잃으면 데이터도 잃는다. 데이터는 비밀번호나 복구 코드로만 풀 수 있는 무작위 계정 키로 암호화되며 서버는 어느 쪽도 보지 못한다. 운영자와 개발자는 키를 재설정하거나 데이터를 복구할 수 없고 계정을 삭제해 다시 시작하게 할 수 있을 뿐이다. 복구 코드는 비밀번호처럼 모든 데이터를 열 수 있으므로 비공개로 보관해야 한다. 자세한 내용은 암호화 문서의 9절에 있다.

데이터베이스 하나당 서버 프로세스 하나만 지원한다. 속도 제한, 단기 인증 캐시, WebSocket 알림이 서버 메모리에 저장되므로 로드 밸런서 뒤에서 여러 복제본을 실행하는 구성은 지원하지 않는다. 대시보드는 서버가 코드를 제공하므로 신뢰할 수 있는 서버에서만 사용해야 한다. 서버가 침해되면 대시보드에 입력한 비밀번호가 탈취될 수 있다. 별도로 설치되는 확장 프로그램은 이와 무관하다. 탭 그룹 동기화에는 각 브라우저의 권한이 필요하다. 설정을 켤 때 권한을 요청하며 다른 곳에서 켰다면 팝업 설정을 열고 저장을 눌러야 한다. 탭·탭 그룹·복원 동작은 Chromium과 Helium에서 종단 간 시험했다고 안내하며 다른 Chromium 빌드의 제보도 받는다.

문서와 프로젝트 정보

배포 문서는 프록시, 실제 클라이언트 IP, 설정, 백업, 마이그레이션, 상태 점검, 계정 삭제를 다룬다. 아키텍처 문서는 구성 요소와 데이터 흐름, 배포 구조를 설명한다. 프로토콜 문서는 동기화 프로토콜과 REST·WebSocket API의 기준이다. 암호화 문서는 키 계층, 키 유도, 암호화 형식과 한계를 다루고, 보안 문서는 보안·위협 모델과 알려진 한계를 설명한다. 릴리스 제작 안내는 releasing.md, 확장 프로그램의 접근 정보와 데이터 흐름은 PRIVACY.md, 취약점 비공개 제보 방법은 SECURITY.md, 변경 사항은 CHANGELOG.md에 있다. 기여 방법과 각 구성 요소의 개발 환경, CI 검사, 변경 제안은 CONTRIBUTING.md를 참조한다. 동기화 동작을 바꾸는 제안은 프로토콜 및 암호화 문서를 먼저 읽도록 안내한다. 보안 문제는 공개 이슈 대신 SECURITY.md의 절차에 따라 비공개로 제보한다.

프로젝트 라이선스는 MIT다. 각 빌드에는 포함된 제3자 코드의 라이선스가 THIRD_PARTY_LICENSES.txt에 함께 들어간다. 서버 이미지에서는 /app/, 대시보드에서는 웹 루트의 https://sync.example.com/THIRD_PARTY_LICENSES.txt, 확장 프로그램에서는 ZIP 파일 루트에서 확인할 수 있다.