No description
  • JavaScript 97.6%
  • HTML 1.2%
  • CSS 1.2%
Find a file
Alex 2c47d20a81 Fix BrowserView not resizing on external window-manager maximize
BrowserView bounds were only recalculated on Electron's 'resize' event,
which some Linux window managers (e.g. KDE/KWin) don't reliably fire
when the window is resized externally. Use setAutoResize so the view
tracks the window's content size at the native layer instead.

Also stop tracking .serena/ (local tool cache).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-11 00:51:17 +02:00
assets Initial commit: Instagram desktop wrapper with custom download button 2026-07-07 00:31:34 +02:00
build/icons Initial commit: Instagram desktop wrapper with custom download button 2026-07-07 00:31:34 +02:00
extensions Initial commit: Instagram desktop wrapper with custom download button 2026-07-07 00:31:34 +02:00
src Fix BrowserView not resizing on external window-manager maximize 2026-07-11 00:51:17 +02:00
.gitignore Fix BrowserView not resizing on external window-manager maximize 2026-07-11 00:51:17 +02:00
package-lock.json Initial commit: Instagram desktop wrapper with custom download button 2026-07-07 00:31:34 +02:00
package.json Initial commit: Instagram desktop wrapper with custom download button 2026-07-07 00:31:34 +02:00
README.md Initial commit: Instagram desktop wrapper with custom download button 2026-07-07 00:31:34 +02:00

Instagram for Linux

An unofficial Instagram desktop client for Linux, built with Electron. It wraps the real instagram.com in a native window and adds desktop-specific extras:

  • Persistent login (session cookies survive restarts)
  • Native app menu, system tray (close hides to tray instead of quitting)
  • Custom video controls injected over every video: seek bar, time, playback speed (0.5x2x), mute, fullscreen
  • One-click download button on hover for photos and videos, saved to ~/Downloads/Instagram
  • Keyboard shortcuts: f fullscreen the focused video, m mute, Shift+←/→ seek 5s
  • Support for loading unpacked Chrome extensions (video controls, downloaders, ad blockers, etc.)

Running from source

npm install
npm start

Building the AppImage

npm run dist:appimage

Output goes to release/Instagram-<version>.AppImage.

chmod +x release/Instagram-*.AppImage
./release/Instagram-*.AppImage

Adding Chrome extensions

Two ways:

  1. Recommended: launch the app, go to menu Extensions → Open Extensions Folder, and drop unpacked extension folders (must contain a manifest.json) there. Then Extensions → Reload Extensions. This folder lives in your user profile (~/.config/Instagram/extensions) and survives app updates/rebuilds.
  2. Or place them in the bundled extensions/ folder before building, so they ship inside the AppImage.

To get an "unpacked" folder from a Chrome Web Store extension, install it in Chrome/Chromium, then copy its folder out of ~/.config/google-chrome/Default/Extensions/<id>/<version>/.

Known extension limitations (Electron, not this app)

  • chrome.tabs, chrome.windows, chrome.identity, bookmarks/history APIs are not available.
  • Manifest V3 service workers are only partially supported; classic content-script extensions (most video-control/downloader extensions) work best.
  • Instagram's strict CSP may block extensions that inject remote scripts.

Known platform issues

  • AppImage won't launch / "FUSE" error: newer distros (Ubuntu 22.04+, some Arch setups) don't ship libfuse2 by default. Install it, or run the AppImage with --appimage-extract-and-run.
  • Crashes as root or in some sandboxed environments: run with --no-sandbox.

Project layout

src/main.js      Electron main process: window, session, menu, tray, downloads, extension loading
src/preload.js   Injected into instagram.com: video controls, download buttons, IPC bridge
extensions/      Bundled unpacked Chrome extensions (ships inside the AppImage)
build/icons/     App icons