Skip to content

PolPuigdo/Dropframe

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Dropframe ✦

A small private tool for preparing Instagram media for download.

Dropframe lets you paste an Instagram link, preview the available media, and download an individual item or an entire carousel as a ZIP. It is designed for personal, private use and keeps downloaded files only temporarily.

What you can download 📥

  • Photos, videos, posts, and reels
  • Photo and video carousels
  • Active stories and highlights
  • Private content only when the Instagram session in cookies.txt already has access

Dropframe downloads the best version Instagram makes available. That may not be the original file uploaded by its author.

Use it responsibly 🤝

Only download content you own or have permission to use. Dropframe is not affiliated with, endorsed by, or an official tool of Instagram.

Getting started 🚀

1. Optional: add an Instagram session

Public posts may work without signing in. For stories, highlights, private content, or more reliable access, export your browser's logged-in Instagram session to Netscape/Mozilla cookie format and save it as:

auth/cookies.txt

The file is intentionally ignored by Git and never copied into the Docker image. See the cookie setup guide before adding it.

2. Run locally

Open two terminals.

# Terminal 1 — API
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --host 127.0.0.1 --port 8000
# Terminal 2 — web app
cd frontend
npm install
npm run dev

Then visit the local address printed by Vite, normally http://127.0.0.1:5173.

Deploy on a Raspberry Pi 🥧

Build and publish an ARM64 image in your own registry, then reference it from your Compose file:

ghcr.io/your-account/dropframe:latest

Mount the optional cookie directory as read-only:

instagram-downloader:
  image: ghcr.io/your-account/dropframe:latest
  restart: unless-stopped
  ports:
    - "127.0.0.1:8082:8080"
  volumes:
    - /srv/dropframe/auth:/app/auth:ro

If you use cookies.txt, the application runs as UID 10001. Give that user read access on the host while keeping the file private:

sudo chown -R 10001:10001 /srv/dropframe/auth
sudo chmod 750 /srv/dropframe/auth
sudo chmod 600 /srv/dropframe/auth/cookies.txt

After a new image is published:

docker compose pull instagram-downloader
docker compose up -d --force-recreate instagram-downloader

A few useful notes ✨

  • Files and job metadata are temporary and are removed automatically after 15 minutes.
  • cookies.txt is optional. Without it, Dropframe attempts public content only.
  • If Instagram asks you to log in again or access stops working, export a fresh cookies.txt from a browser session that can view the target content.
  • There is no user account, database, or permanent media storage in Dropframe.

Built with 🛠️

React + TypeScript, FastAPI, gallery-dl, yt-dlp, FFmpeg, Nginx, Docker, and GitHub Actions.


Keep it private, keep your cookies private. 🔒

About

A private, self-hosted Instagram media downloader with secure previews and temporary downloads.

Resources

Stars

Watchers

Forks

Contributors

Languages