Archive Instagram profiles automatically — posts, reels, stories, highlights, and profile pictures. Available for macOS (native SwiftUI app) and Windows (portable .exe + installer).
| Platform | Download | Requirements |
|---|---|---|
| macOS | Build from source (Xcode) | macOS 13.0+, Xcode 15+ |
| Windows x64 | Releases | Windows 10/11 |
| Windows ARM64 | Releases | Windows 10/11 ARM (Surface Pro X, Copilot+ PCs) |
Both versions share the same core feature set:
- Full profile downloads — posts, reels, IGTV videos, stories, highlights, profile pictures
- Concurrent downloads — multiple profiles and files simultaneously (configurable)
- Duplicate detection — O(1) set-based index, never downloads the same file twice
- File validation — detects missing files and re-downloads them automatically
- Background scheduling — automatic periodic checks from hourly to weekly
- Web dashboard — browser-based management UI at
http://localhost:8485 - Password protection — optional login for the web interface
- Export/Import — save and load your profile list as JSON
- Per-profile stats — media counts by type, storage usage, last checked time
- Sync controls — trigger sync for one profile or all at once
- Profile refresh — re-download posts while keeping time-sensitive stories, highlights, and profile pictures
A native SwiftUI app with menu bar extra, full macOS integration, and a built-in web interface.
📁 Source: root of this repository — open InstaArchive.xcodeproj in Xcode.
- Native SwiftUI UI — full macOS app with sidebar, detail views, and media grid
- Menu bar extra — quick-access widget in the menu bar
- macOS Notifications — notified when new content is found
- Launch at login — via
SMAppService - Built-in Instagram login — WKWebView captures session cookies automatically
- Open in Finder — one-click access to downloaded media
git clone https://github.com/eMacTh3Creator/InstaArchive.git
cd InstaArchive
open InstaArchive.xcodeprojBuild and run with ⌘R. See the macOS architecture section below for full details.
A Python-based port that runs as a system tray icon and serves the same browser dashboard at http://localhost:8485. Available as a portable single-file .exe or a proper Windows installer.
📁 Source: windows/ directory of this repository.
Option A — Portable .exe (recommended)
- Download
InstaArchive.exefrom Releases - Double-click — a tray icon appears and your browser opens the dashboard
- Add profiles and start archiving
Option B — Installer
- Download
InstaArchive-Setup-1.0.0.exefrom Releases - Run the installer — adds InstaArchive to Start Menu, optional desktop shortcut and startup entry
Option C — Run from source
git clone https://github.com/eMacTh3Creator/InstaArchive.git
cd InstaArchive\windows
pip install -r requirements.txt
python src\main.pyRequires Python 3.11+ on Windows.
cd windows
build.batProduces windows\dist\InstaArchive.exe — a single portable executable with no Python required.
ARM64 builds: run build.bat on an ARM64 Windows machine with ARM64 Python installed. PyInstaller automatically produces a native ARM64 executable.
See windows/README.md for full Windows documentation.
Settings are identical across platforms:
| Key | Default | Description |
|---|---|---|
download_path |
Platform default¹ | Where media is saved |
check_interval_hours |
24 |
Scheduled check interval |
download_posts |
true |
Download photo posts |
download_reels |
true |
Download reels |
download_videos |
true |
Download IGTV videos |
download_highlights |
true |
Download story highlights |
download_stories |
false |
Download active stories |
max_concurrent_profiles |
3 |
Profiles downloaded in parallel |
max_concurrent_files |
6 |
Files per profile in parallel |
web_server_port |
8485 |
Web dashboard port |
web_server_password |
"" |
Set to require login (blank = open) |
¹ macOS: ~/Pictures/InstaArchive · Windows: %USERPROFILE%\Pictures\InstaArchive
Both platforms expose the same REST API at http://localhost:8485:
| Method | Path | Description |
|---|---|---|
GET |
/ |
Web dashboard |
GET |
/login |
Login page (if password set) |
POST |
/api/login |
Authenticate {"password": "..."} |
POST |
/api/logout |
Clear session |
GET |
/api/profiles |
List all profiles |
POST |
/api/profiles |
Add profile {"username": "..."} |
DELETE |
/api/profiles/{username} |
Remove profile |
GET |
/api/profile/{username} |
Profile detail + stats |
GET |
/api/status |
App status (downloading, counts) |
POST |
/api/sync/all |
Sync all profiles |
POST |
/api/sync/{username} |
Sync one profile |
POST |
/api/refresh/{username} |
Delete and re-download posts for one profile |
GET |
/api/settings |
Get current settings |
POST |
/api/settings |
Update settings |
GET |
/api/export |
Download profiles as JSON |
InstaArchive/ ← macOS (SwiftUI)
├── InstaArchiveApp.swift # App entry point, menus, focused values
├── Models/
│ ├── Profile.swift # Profile data model + MediaType enum
│ ├── MediaItem.swift # Downloaded media item model
│ ├── AppSettings.swift # UserDefaults-backed settings
│ └── ProfileStore.swift # Observable profile list
├── Views/
│ ├── ContentView.swift # Main split view + HomeView
│ ├── SidebarView.swift # Profile list with stop/skip controls
│ ├── ProfileDetailView.swift # Media grid with async thumbnails
│ ├── AddProfileView.swift # Add profile sheet
│ ├── SettingsView.swift # Settings panel
│ ├── MenuBarView.swift # Menu bar extra widget
│ ├── OnboardingView.swift # First-run setup
│ └── InstagramLoginView.swift # WKWebView Instagram login
├── Services/
│ ├── InstagramService.swift # Instagram API (v1, GraphQL, HTML)
│ ├── DownloadManager.swift # Concurrent download orchestration
│ ├── StorageManager.swift # File I/O and persistence
│ ├── SchedulerService.swift # Background scheduling
│ ├── ThumbnailCache.swift # 3-tier thumbnail cache
│ └── WebServer.swift # Built-in HTTP server + web UI
└── Utilities/
└── LaunchAtLogin.swift # SMAppService wrapper
windows/ ← Windows (Python)
├── src/
│ ├── main.py # Entry point — wires all components
│ ├── app_settings.py # Settings (%APPDATA%\InstaArchive\)
│ ├── profile_store.py # Profile list (add/remove/export/import)
│ ├── instagram_service.py # Instagram API (v1, GraphQL, HTML)
│ ├── storage_manager.py # File I/O, directory management, index
│ ├── download_manager.py # Concurrent downloads with stop/skip
│ ├── thumbnail_cache.py # 3-tier thumbnail cache (Pillow)
│ ├── scheduler.py # APScheduler background scheduling
│ ├── web_server.py # Flask API + embedded HTML/JS/CSS UI
│ └── tray_app.py # pystray Windows system tray icon
├── requirements.txt # Python dependencies
├── InstaArchive.spec # PyInstaller build configuration
├── version_info.txt # Windows exe version metadata
├── build.bat # One-click build script
├── installer.iss # Inno Setup installer script
└── README.md # Full Windows documentation
Log in via Settings → Log In to Instagram — a WKWebView window opens, log in normally, and session cookies are captured automatically.
- Open
http://localhost:8485 - Go to Settings → Log In to Instagram
- A browser window opens — log in to Instagram normally
- Cookies are saved to
%APPDATA%\InstaArchive\cookies.json
In both cases, your credentials are sent directly to Instagram — InstaArchive never sees your password.
MIT License. See LICENSE for details.
For personal archiving only. Respect Instagram's Terms of Service and the privacy of content creators. Only archive content you have permission to save.
- Everett Jenkins
- OpenAI Codex