How Breazzy backs up your Android photos

Updated May 2026 · ~6 min read

TL;DR.

Breazzy reads your phone's photo library, signs each upload with S3 SigV4 using credentials you provide, and PUTs the file directly to your own bucket on Backblaze B2, Cloudflare R2, or Amazon S3. There is no Breazzy server in the middle, no Breazzy account, and no proprietary file format. Originals only; videos included; background sync optional.

The architecture, in one sentence

Your phone is the client; your S3-compatible bucket is the server; Breazzy is the bridge that turns "photo on phone" into "object in bucket". Nothing else exists.

The five things Breazzy actually does

  1. Reads your photo library via Android's MediaStore through the photo_manager Flutter plugin. Breazzy never copies your library into its own database — it just keeps a list of which photo IDs have already been uploaded.
  2. Filters by album and rules. You pick which albums to back up. You can restrict uploads to Wi-Fi only, charging only, or always-on. Defaults favour Wi-Fi + charging because that is what most people actually want.
  3. Signs the request with S3 SigV4. The credentials you paste (access key + secret) never leave the device. They are used to compute an HMAC-SHA256 signature for each upload, the same algorithm awscli, rclone, and Cyberduck use.
  4. PUTs the object directly to your bucket. Each photo is uploaded as a single S3 PUT request to your provider's endpoint — for example https://s3.us-west-004.backblazeb2.com/your-bucket/IMG_2026_05_20.jpg. The phone talks to the storage provider directly. Breazzy never sees the bytes.
  5. Records the upload locally. A small SQLite-style record on the device tracks which photo IDs are done. If you swap phones, you re-link the bucket and Breazzy resumes from what is already in the bucket.

Background sync, explained

Once initial backup is done, Breazzy registers a foreground service (using flutter_foreground_task) and a periodic worker (workmanager). When Android tells the app that new photos exist — or every few hours, whichever comes first — Breazzy wakes briefly, uploads anything new, and goes back to sleep. The foreground service shows a small notification while it is working so Android does not kill it; the notification disappears when the queue is empty.

Battery usage is dominated by radio time for the actual upload, not by the app itself. A 5 MB photo over Wi-Fi costs roughly the same battery as opening an Instagram story.

What the files look like in your bucket

Breazzy preserves the original file extension and writes a flat layout by default:

your-bucket/
├── IMG_20260518_142233.jpg
├── IMG_20260518_142234.heic
├── VID_20260519_090114.mp4
└── ...

No re-encoding, no thumbnails, no proprietary index file. If you want a folder structure (by year, by album), set it in the app's destination settings. The bucket remains useful with any S3 client.

What it does not do

Why direct-to-bucket matters

Most photo backup apps proxy your uploads through their own infrastructure. That has three consequences: they can see your photos, they can lose your photos in an outage, and they have to charge you to cover their bandwidth bill. Direct-to-bucket sidesteps all three. The trade-off is that you configure a bucket once. That is a 5–10 minute task, walked through here: