Download ALL your Snapchat memories completely FREE - don't pay for paid services. This tool runs entirely on your computer, preserving all metadata (dates, GPS locations) while keeping your data 100% private.
Three ways to use:
- 🌐 Web Version
- Upload your HTML file in browser (100% private, client-side)
- 🐍 Python Script - Command-line tool for local processing (instructions below)
- Desktop GUI (PyQt6) - Windowed interface for the Python script (instructions below)
Before using this tool, you need to download your data from Snapchat:
- Login to Snapchat's website
- Click the menu in the top left corner
- Mobile: Tap "Accounts"
- Desktop: Click "Account Settings"
- Click "My Data"
- Select the data you want to download:
- ✅ Memories (required for this tool)
- ✅ Chat Media (optional - now separate from Memories)
- ✅ Shared Stories (optional - now separate from Memories)
- Review all 8 types and select what you need
- Click "Submit Request"
- Wait for Snapchat to email you (can take 24-48 hours)
- Download the ZIP file from the email
- Extract it - you'll find
memories_history.htmlin thehtml/folder
Note: Chat Media and Shared Stories used to be included with Memories, but are now separate options at the bottom of the list.
- 100% FREE - Other services charge money. This costs nothing.
- Save Before Fees - Download now before Snapchat implements storage charges
- Open Source - Inspect the code yourself on GitHub
- No Upload Required - Your data never leaves your computer
- Runs Locally - Everything processes in your browser or on your machine
- No Account Needed - No signup, no email, no tracking
- Safer Than Paid Services - Don't trust your memories to third-party servers
- Downloads all memories from
memories_history.html - Sequential naming:
01.jpg,02.mp4,03.jpg, etc. - Timestamp-based filenames (Python) - Name files as
YYYY.MM.DD-HH-MM-SS.extfor easy sorting by date - Preserves ALL metadata: dates, GPS coordinates, media type
- Embeds EXIF metadata into images - GPS coordinates and dates show up in Photos apps
- Timezone-aware metadata - Converts UTC timestamps to local time based on GPS coordinates
- Sets file timestamps to match original capture date
- Handles ZIP files with overlays (extracts to
-mainand-overlayfiles) - Optional overlay merging - Combine overlay on top of main content (images and videos)
- Images: Fast, instant processing (supports JPG, PNG, WebP, GIF, BMP, TIFF)
- Videos: Requires FFmpeg, may take 1-5 minutes per video
- Merge existing files - Retroactively merge already-downloaded
-main/-overlayfiles without re-downloading - Duplicate detection (Python) - Automatically find and remove duplicate files based on MD5 hash, filesize, and date
- Multi-snap joining (Python) - Automatically detect and concatenate videos taken within 10 seconds of each other
- Saves complete
metadata.jsonwith all information - Resume/Retry support - Pick up where you left off or retry failed downloads
- Incremental metadata updates - Track download progress in real-time
Visit the web version
and upload your memories_history.html file. Everything runs in your browser -
your data never leaves your device!
- Merge overlays: Combine overlay content with main files (images and videos)
- Images: Fast processing in browser
- Videos: Uses FFmpeg.wasm (slower, may take 1-5 minutes per video)
- Videos only: Only download and process videos (useful for re-processing with overlay merging)
- Pictures only: Only download and process pictures (useful for re-processing with overlay merging)
- Batch size: Choose how many files per ZIP (50, 100, 200, or all in one)
- Batching helps with large collections and allows easier recovery if interrupted
- Each batch is downloaded as a separate ZIP:
snapchat-memories-batch-1.zip,snapchat-memories-batch-2.zip, etc.
If your download gets interrupted or has failures:
- Extract the
metadata.jsonfile from any downloaded batch ZIP - Go back to the web version
- Upload both
memories_history.htmlANDmetadata.json - It will skip already-downloaded files and retry failed ones
Note: The web version sets timestamps within the ZIP file and embeds EXIF metadata into images (GPS and capture dates). When you extract the files, most modern extraction tools will preserve these timestamps.
# 1. Setup (one-time)
./setup.sh
source venv/bin/activate
# 2. Download your memories
python download_memories.py
# 3. Done! Files saved to ./memories/-
Run the setup script:
./setup.sh
This creates a virtual environment and installs dependencies.
-
(Optional) Install FFmpeg for video overlay merging:
Platform Command macOS brew install ffmpegUbuntu/Debian sudo apt-get install ffmpegWindows (Chocolatey) choco install ffmpegWindows (manual) Download from ffmpeg.org Note: FFmpeg is only needed for merging video overlays. Without it, videos are saved as separate
-mainand-overlayfiles.
If you prefer a windowed app, run:
source venv/bin/activate
python snapchat_memories_gui.pyThe GUI exposes all CLI options with explanations. It still requires
memories_history.html and uses metadata.json in the output folder for
resume/retry.
Activate environment (do this each time you open a new terminal):
source venv/bin/activateTest mode (download first 3 files only):
python download_memories.py --testFull download:
python download_memories.pyCustom HTML file path:
# Direct file path
python download_memories.py /path/to/memories_history.html
# Or folder containing the HTML
python download_memories.py /path/to/html/folderResume/Retry:
# Resume interrupted download
python download_memories.py --resume
# Retry only failed downloads
python download_memories.py --retry-failedConvert UTC timestamps to local timezone based on GPS coordinates:
python download_memories.py --local-timezoneWhat this does:
- ✅ Automatically detects local timezone from GPS coordinates
- ✅ Converts all EXIF timestamps from UTC to local time
- ✅ Embeds modern EXIF offset tags (
OffsetTime,OffsetTimeOriginal,OffsetTimeDigitized) - ✅ Updates video metadata with local time and timezone info
- ✅ Photos show correct local capture time in photo library apps
Example:
If a photo was taken at 15:30 UTC in New York (EST = UTC-5), it will be stored as:
- EXIF timestamp:
2024:12:15 10:30:00 - EXIF offset:
-05:00
Requirements:
timezonefinderlibrary (installed by setup.sh)pytzlibrary (installed by setup.sh)- Valid GPS coordinates in Snapchat data
Special handling:
- Czech Republic coordinates automatically use
Europe/Praguetimezone - Graceful fallback to UTC if GPS data is missing
- Works with all image formats (JPEG, PNG, WebP, etc.)
Combine with other features:
# Timezone-aware + overlay merging + timestamp filenames
python download_memories.py --local-timezone --merge-overlays --timestamp-filenames
# Timezone-aware for re-processing existing videos
python download_memories.py --videos-only --local-timezoneCombine overlay files with main content:
python download_memories.py --merge-overlays- Images: Fast, instant processing
- Videos: Requires FFmpeg, 1-5 minutes per video
Re-process specific media type:
# Videos only
python download_memories.py --videos-only --merge-overlays
# Pictures only
python download_memories.py --pictures-only --merge-overlaysMerge already-downloaded files:
python download_memories.py --merge-existing ./memoriesCreates merged versions without deleting originals.
python download_memories.py -o /path/to/outputSaves files to a custom location instead of ./memories/
python download_memories.py --timestamp-filenamesNames files as 2024.11.30-14-30-45.jpg instead of 01.jpg
- ✅ Files sort by date in file managers
- ✅ Easy to identify when memories were taken
python download_memories.py --threads 4Downloads multiple memories at once for faster throughput. Use --threads 1
for sequential mode. Higher values use more bandwidth/CPU (especially if
video overlay merging is enabled).
python download_memories.py --remove-duplicatesChecks MD5 hash before saving each file and skips duplicates.
- ✅ Saves bandwidth - doesn't re-download existing files
- ✅ Perfect for resuming or re-running the script
- ✅ Handles cases where Snapchat exports the same memory multiple times
python download_memories.py --join-multi-snapsDetects videos taken within 10 seconds and concatenates them.
- ✅ Stitches long stories back together
- ✅ Requires FFmpeg
- ✅ Deletes originals after successful join
# All the features!
python download_memories.py \
-o ~/Desktop/memories \
--local-timezone \
--timestamp-filenames \
--remove-duplicates \
--merge-overlays \
--join-multi-snaps
# Resume with duplicate detection and timezone support
python download_memories.py --resume --remove-duplicates --local-timezone
# Re-process videos with timezone and overlay merging
python download_memories.py --videos-only --local-timezone --merge-overlays# View all options
python download_memories.py --help
# When done, deactivate virtual environment
deactivate- All memories are saved to the
memories/directory (or custom directory specified with--output) - Sequential naming (default):
01.jpg,02.mp4,03.jpg, etc. - Timestamp naming (with
--timestamp-filenames):2024.11.30-14-30-45.jpg,2024.12.15-09-22-13.mp4, etc. - Files with overlays are extracted as
XX-main.extandXX-overlay.ext(orYYYY.MM.DD-HH-MM-SS-main.extwith timestamp naming)
A metadata.json file is created with information about each memory:
{
"number": 1,
"date": "2025-11-30 00:31:09 UTC",
"media_type": "Video",
"latitude": "44.273846",
"longitude": "-105.43944",
"url": "https://...",
"status": "success",
"files": [
{
"path": "01.mp4",
"size": 4884414,
"type": "single"
}
]
}For memories with overlays (not merged):
{
"number": 42,
"date": "2024-06-15 14:30:00 UTC",
"media_type": "Image",
"latitude": "40.7128",
"longitude": "-74.0060",
"url": "https://...",
"status": "success",
"files": [
{
"path": "42-main.jpg",
"size": 450123,
"type": "main"
},
{
"path": "42-overlay.jpg",
"size": 125456,
"type": "overlay"
}
]
}For merged overlays (when using --merge-overlays flag):
{
"number": 42,
"date": "2024-06-15 14:30:00 UTC",
"media_type": "Image",
"latitude": "40.7128",
"longitude": "-74.0060",
"url": "https://...",
"status": "success",
"files": [
{
"path": "42.jpg",
"size": 487932,
"type": "merged"
}
]
}- Python 3.7+
requestslibrary (installed automatically by setup.sh)Pillowlibrary (for overlay merging and EXIF metadata, installed automatically by setup.sh)piexiflibrary (for EXIF metadata embedding, installed automatically by setup.sh)timezonefinderlibrary (for timezone detection, installed automatically by setup.sh)pytzlibrary (for timezone handling, installed automatically by setup.sh)
Optional:
- FFmpeg (for video overlay merging and multi-snap joining)
.
├── docs/
│ └── index.html # Web version (GitHub Pages)
├── html/
│ └── memories_history.html # Snapchat export HTML file (not included)
├── memories/ # Downloaded files (default output directory, created by script)
│ ├── 01.mp4 # Sequential naming (default)
│ ├── 02.jpg # or 2024.11.30-14-30-45.jpg (with --timestamp-filenames)
│ ├── 03.jpg
│ └── metadata.json
├── venv/ # Python virtual environment
├── download_memories.py # Main Python script
├── requirements.txt # Python dependencies
├── setup.sh # Setup script
├── .gitignore # Git ignore file
└── README.md # This file
- First Run: Creates
metadata.jsonwith all memories marked as "pending" - During Download: Updates each item to "in_progress" → "success" or "failed"
- Interrupted? Run with
--resumeto continue from where you left off - Failures? Run with
--retry-failedto retry only failed items
The metadata.json is saved after EACH download, so you can safely interrupt and resume at any time!
- Upload
memories_history.htmlto start - Download includes
metadata.jsonwith status tracking - To resume: Upload both HTML and
metadata.json - Skips successful downloads, retries pending/failed ones
- Downloads may take a while depending on file sizes and internet speed
- Failed downloads are logged in the metadata with error messages
- The script uses sequential numbering starting from 01
- File timestamps are set to match the original capture date, so when you sort by date modified in Finder/Explorer, you'll see them in chronological order by when they were taken, not when they were downloaded
- With
--local-timezoneflag: EXIF metadata shows local time of capture, not UTC. This helps photo libraries display memories with correct local timestamps.
- Web Version: All processing happens in your browser. No data is sent to any server.
- Python Script: Everything runs locally on your computer. No network requests except to Snapchat's download URLs.
- Your memories are downloaded directly from Snapchat's servers using the URLs in your data export.
If this tool helped you recover your memories, consider buying me a coffee!
Problem: Videos download successfully but won't play in Windows Media Player or Photos app.
Cause: Many Snapchat videos (especially from iPhones) use HEVC (H.265) codec, which Windows doesn't include by default.
Solution:
- Free Method (Recommended): Install "HEVC Video Extensions from Device Manufacturer" from Microsoft Store (FREE)
- Alternative: Install VLC Media Player - plays HEVC videos without codec installation
- Verify: Right-click video → Properties → Details tab → check if "Video codec" shows HEVC or H265
Note: This is NOT a bug with the downloader - the videos are downloading correctly. It's a Windows limitation that requires the HEVC codec to be installed separately.
If your videos are downloading but show as blank or black when you try to play them:
Cause: The download URLs from Snapchat may have expired, or the server is returning error pages instead of video files.
How to tell:
- The tool will show warnings like:
WARNING: File may not be a valid video (invalid MP4 signature) - Very small file sizes (under 100 bytes) indicate invalid files
- The log will show the first bytes of the file to help diagnose the issue
Solutions:
- Request a fresh data export from Snapchat
- URLs expire after some time
- Download sooner
- Process your Snapchat export as soon as you receive it
- Check the warnings
- The tool will alert you to potentially invalid files during download
Note: The tool validates video files and warns you about potential issues, but it cannot fix expired or invalid URLs from Snapchat's servers.
If you see: Warning: ffmpeg not found. Video overlay merging will be disabled.
Solution: Install FFmpeg:
- macOS:
brew install ffmpeg - Ubuntu/Debian:
sudo apt-get install ffmpeg - Windows:
choco install ffmpegor download from ffmpeg.org
The tool will still work without FFmpeg - videos will be saved as separate
-main and -overlay files.
If you see security/CORS errors in the browser console related to FFmpeg, this has been fixed in the latest version. Hard refresh the page: Ctrl+Shift+R (Windows/Linux) or Cmd+Shift+R (Mac).
MIT License - feel free to use and modify as needed.
Issues and pull requests are welcome!
Made by @andrefecto