# proton-backup

A Go CLI tool for backing up local directories to Proton Drive with rate limiting, retry logic, and resume support.

## Build

```bash
go build
```

## Install

```bash
cp proton-backup ~/bin/
```

## Run

```bash
proton-backup -source /path/to/backup -remote /proton/drive/path
```

## Project Structure

- `main.go` - Single-file implementation containing:
  - CLI argument parsing
  - Proton Drive authentication (username/password or env vars)
  - Credential caching (`~/.config/proton-backup/credentials.json`)
  - Directory walking and file upload
  - SQLite state tracking for resume (`~/.config/proton-backup/state.db`)
  - Rate limiting and exponential backoff on errors

## Dependencies

- `github.com/henrybear327/Proton-API-Bridge` - Proton Drive API with client-side encryption
- `github.com/mattn/go-sqlite3` - State tracking
- `golang.org/x/term` - Secure password input

## Key Configuration

The `AppVersion` header is required by Proton's API. Current value: `web-drive@5.2.0` (from Proton WebClients repo). If authentication fails with "Invalid app version", check https://github.com/ProtonMail/WebClients/blob/main/applications/drive/package.json for the current version.

## Authentication

First run prompts for credentials interactively. Alternatively, set environment variables:
- `PROTON_USERNAME`
- `PROTON_PASSWORD`

## Systemd Integration

Timer and service files are in `~/.config/systemd/user/`:
- `backup-immich-proton.service`
- `backup-immich-proton.timer`

## Testing

No automated tests yet. Manual testing:
```bash
# Dry run (still requires auth)
proton-backup -source /tank/immich/library -remote /backups/immich -dry-run

# Verbose output
proton-backup -source /tank/immich/library -remote /backups/immich -verbose
```
