I Built an Instagram Downloader Because I Didn't Want Another Web Service

Apps Software Development

Downloading a video from Instagram feels like one of those jobs a computer should manage without turning it into a whole event.

I wanted to copy a link, press a button and have the actual file on my Mac. That was it. I didn’t want a new workflow, an account or a monthly plan for the privilege of downloading a file.

The desktop apps I’d used for this over the years had stopped being supported. Some kept working for a while, then Instagram changed something and they became increasingly unreliable. That’s usually how these tools die. There’s rarely a dramatic ending, just one more error than you’re willing to put up with.

The obvious replacements were web services. There are plenty of sites where you can paste an Instagram URL and get something back, but I didn’t want to send every link through somebody else’s website. I also didn’t want to work out which download button was the real one, close three pop-ups and repeat the whole performance for the next post.

A website is probably fine for a video you download once a year. It gets old quickly when saving media is part of your work.

If you make content, you end up collecting a lot of reference material. You find an edit you want to study, a piece of audio worth keeping, a post to show a client or something you know you’ll need later. Instagram’s own saved collection is useful, but I wanted the files in folders I control, where I can preview them, search them and open them in the tools I already use.

So I built PostShelf, a Mac app that does the boring version of the job I had in mind.

Paste a post or Reel link, choose Video, Audio or Both, and download it. The media goes into a local library on the Mac, along with whatever useful metadata is available: the account, caption, date, duration, dimensions and tags. I can search the library, use Quick Look, reveal a file in Finder or open it somewhere else without digging through a downloads folder full of mystery filenames.

Speed mattered more than turning it into a grand platform. Command-L opens the download sheet, the link goes in, and the app gets on with it. Individual post and Reel downloads use the downloader bundled with PostShelf, so they don’t need Python, Homebrew or a collection of Terminal commands before the first file appears.

I added audio because sometimes the audio is the only part I need. PostShelf can keep the MP4, create an M4A using the media support already in macOS, or save both. That sounds like a small option, but it saves opening another app just to pull the track out of a Reel.

The library became as important as the download itself. Saving a file is easy enough. Finding it six weeks later, when all you remember is part of the caption or the account that posted it, is the bit most download tools leave for you to solve.

PostShelf also supports subscriptions for accounts and hashtags. An account can include posts, Reels, Stories, Highlights and tagged posts, with a date limit and refresh schedule. Automatic refresh only runs while the app is open. I didn’t want a background service quietly hitting Instagram all day after I’d forgotten about it.

Those broader downloads use gallery-dl, which has to be installed separately. Individual links work with the app as downloaded; accounts, hashtags and the other subscription features need the extra tool. That’s the kind of requirement that should be documented before somebody buys software, so the PostShelf documentation explains the setup up front.

There isn’t a PostShelf cloud account. The library index and media stay on the Mac, and the download requests go from the local downloader to Instagram. If a signed-in Instagram session is needed for private media or saved posts, the session cookies are stored in Keychain rather than sent to me. Lemon Squeezy handles the purchase and delivers the app.

That doesn’t make Instagram automation risk-free. Instagram can challenge, restrict or disable accounts it thinks are using automated tools, and PostShelf can’t wave that away. I put the warning in the app and on the site because people should know before connecting an account. Conservative refresh intervals are sensible, as is using an account you’re prepared to lose if you decide to automate downloads.

Instagram can also change its site tomorrow and break part of the process. That’s the reality of building a tool around a service you don’t control, and it’s why an unsupported downloader doesn’t stay useful for long. I can maintain PostShelf, but I can’t promise Instagram will stay still.

I built PostShelf to solve my own problem, and it does. It’s fast, it lives on my Mac and it keeps the files somewhere useful. It works on Apple silicon and Intel Macs running macOS 14 or newer.

I’ve put PostShelf up for US$10 as a one-off purchase. It’s especially useful if creating content means you’re regularly saving posts, Reels or audio for work and you’re tired of repeating the same web downloader routine.

The whole point is that it gets out of the way. I paste a link, the file lands on my Mac, and I get back to whatever I was doing before Instagram distracted me.