Harvester is a local-first Firefox extension for artists, musicians, editors, researchers, and people who collect source material online for later. It saves the original media, makes a practical audio derivative, and records enough provenance to remember where it came from—all in ordinary files on your Mac.
It works with individual Instagram, YouTube, and Reddit posts, visible video or audio on other sites, and one local file at a time. It can also work through your Instagram Saved collection in small, deliberately paced batches, starting with the oldest things you saved.
Harvester is intentionally focused. It is not a general scraper, feed crawler, playlist downloader, media library, or batch converter. It only acts when you ask it to harvest something.
Harvester does the clerical work of helping you archive a sound or video while the discovery is still fresh. It preserves the source, makes an immediately useful audio file, and keeps provenance beside the media. Carousels stay together as one post; long-lived Saved collections can be worked through gradually; and everything lands in normal files that can go straight into a sampler, DAW, NLE, VJ setup, collage folder, or research notebook. Harvester does not try to become your creative environment. It brings interesting material to the environment you already use.
Harvester has two parts: the Firefox extension you click and a small local companion that handles downloads and media processing.
Install Homebrew if you do not already have it.
Open Terminal and install Harvester's media tools:
brew install python ffmpeg yt-dlp deno
Download and extract harvester-macos-companion-1.0.2.tar.gz. In Terminal,
enter the extracted folder and run:
scripts/install-macos-companion
Download the Mozilla-signed .xpi.
In Firefox, open about:addons, click the gear, choose Install Add-on From
File…, and select the .xpi.
Open Harvester. If it says Local companion ready, you're ready to go.
V1.0.2 supports Firefox desktop 142 or newer on macOS.
Open Settings first. Choose an output folder with the Finder button, choose the audio format you normally want, and leave the Firefox profile path alone unless you deliberately use a different Firefox profile. Once the popup says Local companion ready, pick the workflow that matches what you found:
Keep Firefox open while a harvest is running. Please only harvest material you are legally allowed to preserve and use.
blob:/MSE, DRM, an
inaccessible frame, an expiring address, or authentication the companion cannot
use. Harvester does not inspect network traffic or capture private headers to get
around those boundaries.Each harvest becomes a self-contained folder with:
metadata.json, containing provenance and useful media facts.Instagram archival folders have compact, naturally sorted names such as
0044__people-dancing. The Instagram identifier still lives in the
metadata and private ledger, where it is useful, instead of cluttering Finder.
No Harvester account. No cloud service. No analytics, advertising, telemetry, or automatic bug reports. Your settings, archive state, diagnostics, and harvested media stay on your Mac. Firefox remains in charge of Firefox authentication.
If something goes wrong, Settings → Prepare bug report shows you exactly what would be shared. Page addresses are excluded unless you explicitly add a sanitized version. Reports never include cookies, credentials, query parameters, media URLs, headers, filesystem paths, or raw downloader output. You decide whether to copy the report or open a GitHub issue, and nothing is submitted for you.
Archival Harvest exists for one specific job: slowly working through your own Instagram Saved pages and collections without losing your place. Each configured collection has its own queue and progress, while shared posts use one copy of the media on disk.
Scanning starts with the newest saved posts and stops after five consecutive posts already known to the private ledger. Harvesting then works oldest-first, one item at a time. You choose a batch size from 1–25 and a randomized delay from 10–300 seconds. Ordinary failures are not retried during the same batch, and authentication or rate-limit trouble stops the run.
Automated access can trigger Instagram restrictions. Larger batches and shorter delays increase that risk, so Harvester keeps hard minimums and makes you start each batch yourself. You are responsible for deciding whether and how to proceed.
The Firefox extension is plain HTML, CSS, and JavaScript under
extension/firefox. It talks through Firefox Native Messaging
to the Python companion under src/harvester. There is no bundler,
transpiler, minifier, hosted backend, or Node runtime in the product.
Harvester's boundaries are deliberate:
The implementation contracts and acceptance records are in docs,
including the browser-extension specification,
visible-media acceptance test, and
archival acceptance test.
Harvester requires Python 3.11+ and FFmpeg/FFprobe on PATH.
python3 -m unittest discover -s tests -v
The release test suite and Mozilla's extension validator must pass before a package is published.
scripts/build-firefox-extension
scripts/build-macos-companion
The companion archive includes the installer and Python source, but no user
settings, authentication material, ledger, diagnostics, or harvested media. See
docs/release-checklist.md for the complete release
procedure.
Interesting source material has a habit of disappearing—or becoming impossible to find the moment inspiration strikes. Harvester is a small tool for catching those fragments.
23 commits
Python
77.8%
JavaScript
16.7%
HTML
2.6%
CSS
1.7%
Shell
1.2%
Harvester is a local-first Firefox extension for artists, musicians, editors, researchers, and people who collect source material online for later. It saves the original media, makes a practical audio derivative, and records enough provenance to remember where it came from—all in ordinary files on your Mac.
It works with individual Instagram, YouTube, and Reddit posts, visible video or audio on other sites, and one local file at a time. It can also work through your Instagram Saved collection in small, deliberately paced batches, starting with the oldest things you saved.
Harvester is intentionally focused. It is not a general scraper, feed crawler, playlist downloader, media library, or batch converter. It only acts when you ask it to harvest something.
Harvester does the clerical work of helping you archive a sound or video while the discovery is still fresh. It preserves the source, makes an immediately useful audio file, and keeps provenance beside the media. Carousels stay together as one post; long-lived Saved collections can be worked through gradually; and everything lands in normal files that can go straight into a sampler, DAW, NLE, VJ setup, collage folder, or research notebook. Harvester does not try to become your creative environment. It brings interesting material to the environment you already use.
Harvester has two parts: the Firefox extension you click and a small local companion that handles downloads and media processing.
Install Homebrew if you do not already have it.
Open Terminal and install Harvester's media tools:
brew install python ffmpeg yt-dlp deno
Download and extract harvester-macos-companion-1.0.2.tar.gz. In Terminal,
enter the extracted folder and run:
scripts/install-macos-companion
Download the Mozilla-signed .xpi.
In Firefox, open about:addons, click the gear, choose Install Add-on From
File…, and select the .xpi.
Open Harvester. If it says Local companion ready, you're ready to go.
V1.0.2 supports Firefox desktop 142 or newer on macOS.
Open Settings first. Choose an output folder with the Finder button, choose the audio format you normally want, and leave the Firefox profile path alone unless you deliberately use a different Firefox profile. Once the popup says Local companion ready, pick the workflow that matches what you found:
Keep Firefox open while a harvest is running. Please only harvest material you are legally allowed to preserve and use.
blob:/MSE, DRM, an
inaccessible frame, an expiring address, or authentication the companion cannot
use. Harvester does not inspect network traffic or capture private headers to get
around those boundaries.Each harvest becomes a self-contained folder with:
metadata.json, containing provenance and useful media facts.Instagram archival folders have compact, naturally sorted names such as
0044__people-dancing. The Instagram identifier still lives in the
metadata and private ledger, where it is useful, instead of cluttering Finder.
No Harvester account. No cloud service. No analytics, advertising, telemetry, or automatic bug reports. Your settings, archive state, diagnostics, and harvested media stay on your Mac. Firefox remains in charge of Firefox authentication.
If something goes wrong, Settings → Prepare bug report shows you exactly what would be shared. Page addresses are excluded unless you explicitly add a sanitized version. Reports never include cookies, credentials, query parameters, media URLs, headers, filesystem paths, or raw downloader output. You decide whether to copy the report or open a GitHub issue, and nothing is submitted for you.
Archival Harvest exists for one specific job: slowly working through your own Instagram Saved pages and collections without losing your place. Each configured collection has its own queue and progress, while shared posts use one copy of the media on disk.
Scanning starts with the newest saved posts and stops after five consecutive posts already known to the private ledger. Harvesting then works oldest-first, one item at a time. You choose a batch size from 1–25 and a randomized delay from 10–300 seconds. Ordinary failures are not retried during the same batch, and authentication or rate-limit trouble stops the run.
Automated access can trigger Instagram restrictions. Larger batches and shorter delays increase that risk, so Harvester keeps hard minimums and makes you start each batch yourself. You are responsible for deciding whether and how to proceed.
The Firefox extension is plain HTML, CSS, and JavaScript under
extension/firefox. It talks through Firefox Native Messaging
to the Python companion under src/harvester. There is no bundler,
transpiler, minifier, hosted backend, or Node runtime in the product.
Harvester's boundaries are deliberate:
The implementation contracts and acceptance records are in docs,
including the browser-extension specification,
visible-media acceptance test, and
archival acceptance test.
Harvester requires Python 3.11+ and FFmpeg/FFprobe on PATH.
python3 -m unittest discover -s tests -v
The release test suite and Mozilla's extension validator must pass before a package is published.
scripts/build-firefox-extension
scripts/build-macos-companion
The companion archive includes the installer and Python source, but no user
settings, authentication material, ledger, diagnostics, or harvested media. See
docs/release-checklist.md for the complete release
procedure.
Interesting source material has a habit of disappearing—or becoming impossible to find the moment inspiration strikes. Harvester is a small tool for catching those fragments.
23 commits
Python
77.8%
JavaScript
16.7%
HTML
2.6%
CSS
1.7%
Shell
1.2%