Syft client lets data scientists submit computations which are ran by data owners on private data — all through cloud storage their organizations already use (Google Drive, Microsoft 365, etc.). No new infrastructure required.
- Workflow — End-to-end privacy-preserving data analysis workflow
- API Reference — All public client methods and properties
- Authentication & Setup — Google Cloud OAuth setup for local/Jupyter usage
- Background Services — Email notifications, auto-approval, and TUI dashboard
- Permissions - Permissions for syft-client
- Privacy-preserving — Private data never leaves the data owner's machine; only approved results are shared
- Transport-agnostic — Works over Google Drive today, extensible to any file-based transport
- Offline-first — Full functionality even when peers are offline; changes sync when connectivity resumes
- Peer-to-peer with explicit auth — Data owners must approve each collaborator before any data flows
- Isolated job execution — Jobs run in sandboxed Python virtual environments with controlled access to private data
- Dataset sharing with mock/private separation — Data scientists explore mock data, then submit jobs that run on the real thing
uv pip install syft-client
import syft_client as sc# Login (colab auth, for non-colab pass token_path)
do = sc.login_do(email="[email protected]")
ds = sc.login_ds(email="[email protected]")
# Peer request & approve
ds.add_peer("[email protected]")
do.approve_peer_request("[email protected]")
# Create & sync dataset
do.create_dataset(
name="census",
mock_path="mock/",
private_path="private/",
users=["[email protected]"],
)
do.sync(); ds.sync()
datasets = ds.datasets.get_all()Write an analysis.py that reads the dataset and produces a result in our case this is just the length of the data. Inside a job, resolve_dataset_file_path automatically resolves to the private data:
# analysis.py
import json
import syft_client as sc
data_path = sc.resolve_dataset_file_path("census")
with open(data_path, "r") as f:
data = f.read()
with open("outputs/result.json", "w") as f:
json.dump({"length": len(data)}, f)Submit the job and retrieve results:
# Submit job
ds.submit_python_job(
user="[email protected]",
code_path="analysis.py",
)
ds.sync(); do.sync()
# Data owner Approves & runs job
do.jobs[0].approve()
do.process_approved_jobs()
do.sync(); ds.sync()
result = open(ds.jobs[-1].output_paths[0]).read()| Package | Description |
|---|---|
syft-datasets |
Dataset management and sharing |
syft-job |
Job submission and execution |
syft-permissions |
Permission system for Syft datasites |
syft-perm |
User-facing permission API for Syft datasites |
syft-bg |
Background services TUI dashboard for SyftBox |
syft-notebook-ui |
Jupyter notebook display utilities |
# Install in development mode
uv pip install -e .
# Run tests
just test-unit # Unit tests (fast, mocked)
just test-integration # Integration tests (slow, real API)Built by OpenMined — building open-source technology for privacy-preserving data science and AI.