1 stable release
Uses new Rust 2024
| new 1.1.0 | Jan 28, 2026 |
|---|---|
| 1.0.0 |
|
#166 in Images
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
From crates.io (recommended)
cargo install snatch-cli
From source
cargo install --git https://github.com/Zk2u/snatch
Usage
1. Request your Snapchat data export
- Go to accounts.snapchat.com
- Navigate to "My Data"
- Request a data export with "Export your Memories" and "Export JSON Files" selected
- 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
- Parse JSON - Reads
memories_history.jsonto get download URLs and metadata - Download - POSTs to Snapchat's API to get CDN URLs, then downloads the media
- Overlay - Matches media IDs with overlay files and composites them:
- Images: Direct alpha blending using the
imagecrate - Videos: FFmpeg filter graph with scaling to match dimensions
- Images: Direct alpha blending using the
- Metadata:
- JPEGs: Embeds EXIF data (date, GPS) using
little_exif - MP4s: Embeds creation_time and GPS location via FFmpeg (ISO 6709 format)
- JPEGs: Embeds EXIF data (date, GPS) using
- 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