#memories #download #photo #backup #snapchat

app snatch-cli

Snatch your memories back from Snapchat - download photos & videos from data exports with overlays, EXIF metadata, and correct timestamps

1 stable release

Uses new Rust 2024

new 1.1.0 Jan 28, 2026
1.0.0 Jan 27, 2026

#166 in Images

MIT license

82KB
1.5K SLoC

Snatch

Snatch your memories back from Snapchat.

A high-performance Rust tool for downloading your Snapchat memories from a data export. Downloads photos and videos, burns overlay images (stickers, text, drawings), embeds EXIF metadata, and sets correct file timestamps.

Features

  • Fast concurrent downloads - Configurable parallelism for maximum throughput
  • Overlay burning - Composites stickers, text, and drawings onto photos and videos
  • EXIF metadata - Embeds capture date and GPS coordinates into JPEGs
  • Video metadata - Embeds correct timestamps and GPS coordinates into MP4 files
  • Correct timestamps - Sets file modified time to match when the memory was taken
  • Unique filenames - Includes media ID to prevent collisions for burst photos
  • Resume support - Skips already-downloaded files
  • Progress tracking - Real-time progress bars for downloads, overlays, and metadata

Requirements

  • Rust 1.70+ (for building)
  • FFmpeg (optional, for video overlay burning)

Installation

cargo install snatch-cli

From source

cargo install --git https://github.com/Zk2u/snatch

Usage

1. Request your Snapchat data export

  1. Go to accounts.snapchat.com
  2. Navigate to "My Data"
  3. Request a data export with "Export your Memories" and "Export JSON Files" selected
  4. Wait for the email and download your export

2. Extract the export

Snapchat may send you multiple zip files (e.g., mydata~123456789.zip, mydata~123456789(1).zip, etc.). Extract all of them to the same folder:

# Create destination folder and extract all zip files into it
mkdir -p snap_export
for f in mydata*.zip; do unzip -o "$f" -d snap_export; done

You should end up with a structure like:

snap_export/
├── json/
│   └── memories_history.json
└── memories/
    ├── 2024-01-15_abc123-main.jpg
    ├── 2024-01-15_abc123-overlay.png
    └── ...

3. Snatch your memories

# Basic usage (auto-detects overlay directory)
snatch path/to/json/memories_history.json -o ./downloads

# With custom concurrency
snatch path/to/json/memories_history.json -o ./downloads -c 20

# Disable overlay burning
snatch path/to/json/memories_history.json -o ./downloads --burn-overlays false

# Disable EXIF metadata
snatch path/to/json/memories_history.json -o ./downloads --no-exif

Options

Arguments:
  [JSON_FILE]  Path to memories_history.json [default: json/memories_history.json]

Options:
  -o, --output <OUTPUT>      Output directory [default: ./downloads]
  -c, --concurrent <N>       Max concurrent downloads [default: 40]
      --no-exif              Disable EXIF metadata embedding
      --no-skip-existing     Re-download existing files
      --burn-overlays <BOOL> Burn overlay images [default: true]
      --overlays-dir <PATH>  Override overlay directory path
      --workers <N>          Processing worker threads [default: CPU cores - 1]
  -h, --help                 Print help
  -V, --version              Print version

How It Works

  1. Parse JSON - Reads memories_history.json to get download URLs and metadata
  2. Download - POSTs to Snapchat's API to get CDN URLs, then downloads the media
  3. Overlay - Matches media IDs with overlay files and composites them:
    • Images: Direct alpha blending using the image crate
    • Videos: FFmpeg filter graph with scaling to match dimensions
  4. Metadata:
    • JPEGs: Embeds EXIF data (date, GPS) using little_exif
    • MP4s: Embeds creation_time and GPS location via FFmpeg (ISO 6709 format)
  5. Timestamps - Sets file modified time to the capture date

Output Filenames

Files are named using the capture timestamp plus the first 8 characters of the media ID:

2024-01-15_14-30-45_a1b2c3d4.jpg
2024-01-15_14-30-45_e5f6g7h8.mp4

This format:

  • Sorts chronologically
  • Prevents collisions when multiple memories have the same timestamp (e.g., burst photos)
  • Remains human-readable

Architecture

Snatch uses a pipelined architecture for efficiency:

  • Download workers - Async tasks using tokio + reqwest
  • Processing workers - Thread pool for CPU-bound overlay/EXIF work
  • Bounded channel - Connects downloaders to processors with backpressure

This ensures downloads and processing happen concurrently rather than sequentially.

Troubleshooting

  • Many failed downloads? - Snapchat download links expire. Request a fresh export.
  • Occasional HTTP 500 errors? - Some memories may no longer be available on Snapchat's servers. This is normal and expected for a small percentage of files.
  • Missing memories_history.json? - Make sure you selected "Export JSON Files" when requesting your data.
  • Video overlays not working? - Install FFmpeg and make sure it's in your PATH.
  • WebP overlay errors? - Snatch handles WebP files disguised as PNGs automatically.
  • Wrong dates in photo apps? - Snatch embeds correct timestamps in both file metadata and MP4 container metadata, so apps like Immich should display the correct date.

Compatibility

This tool is confirmed working as of January 2026. Snapchat may change their export format or API at any time. If you encounter issues, please open an issue on GitHub.

License

MIT

Dependencies

~30–48MB
~859K SLoC