voyvodka/All-in-one-Extension
Chrome MV3 extension — download buttons for YouTube, Instagram, and Twitter/X, plus an Instagram follower analyzer with trends and dashboards.
README Snapshot
All-in-One Extension
All-in-One Extension is a Chrome Manifest V3 project that adds download actions to YouTube, Instagram, and Twitter/X.
Source code is written in TypeScript (strict mode). A lightweight tsc compile step produces the runtime JavaScript that Chrome loads from extension-dist/.
Supported features
- YouTube
- adds audio and video download actions to the share panel
- Instagram
- adds audio, video, single-image, and multi-image download actions across reels, post, and dialog surfaces
- Instagram Analyzer — a per-account follower analysis tool with a compact drawer and a full-screen dashboard overlay (non-followers detection, whitelist management, scan history with diffs, trend charts, quick compare, and hover cards on usernames)
- Twitter / X
- adds audio, video, and image download actions to the tweet action menu
Project structure
extension/ # TypeScript source (+ fragile .js DOM files)
background/ # download orchestration, message router
features/ # feature-first content/background entrypoints + platform shared DOM logic
popup/ # popup and options UI
shared/ # storage, i18n, contracts
_locales/ # extension locale metadata
icons/ # extension icons
extension-dist/ # compiled output (gitignored) — Chrome loads this folder
docs/ # architecture, install, release, smoke checklist
scripts/ # build, validation, packaging, and dev-mode scripts
Architecture summary
extension/content.ts- boots content-side behavior on supported domains
- loads feature modules from
shared/contracts/feature-registry.ts
extension/background/index.ts- routes runtime messages through centralized contracts
- manages downloads, retry, cancel, and job lifecycle
extension/popup/popup.ts- renders settings and download state
- uses view-model helpers to keep presentation logic separate
extension/features/*-download/*- holds feature-first content and background entrypoints
extension/features/ig-unfollowers/content/index.ts- compact analyzer drawer (launcher, scan controls, results, whitelist, history)
extension/features/ig-unfollowers/content/dashboard.ts- standalone full-screen analytics dashboard (KPI cards, charts, compare, user list with hover cards, scan history)
extension/features/{youtube,instagram,twitter}/shared.js- contains fragile DOM integration logic and should be changed carefully
- these files stay as plain JavaScript with
.d.tsdeclarations for TypeScript integration
For more detail, see:
docs/ARCHITECTURE.mddocs/INSTALL.mddocs/LOCAL_DEV.mddocs/RELEASE.mddocs/SMOKE_CHECKLIST.md
Local development
For the full developer setup guide, see docs/LOCAL_DEV.md.
Prerequisites
- Node.js 20+
- Yarn 1.x (
corepack enable && corepack prepare [email protected] --activate)
Build and load
yarn install
yarn build # compile TS + copy static assets → extension-dist/
- Open
chrome://extensions - Enable
Developer mode - Click
Load unpacked - Select the
extension-dist/folder (notextension/)
Watch mode
yarn dev # tsc --watch + static asset watcher in parallel
Edit .ts files → extension-dev-dist/ updates automatically → reload extension in Chrome.
Available scripts
yarn dev # recommended watch mode -> extension-dev-dist/ (separately branded dev build)
yarn dev:prod # watch mode for production-like output -> extension-dist/
yarn build # one-shot compile + copy static assets
yarn build:dev # build separately branded dev output -> extension-dev-dist/
yarn build:check # type-check only (no emit)
yarn verify # build:check + validate:manifest + check:repo
yarn validate:manifest # validate manifest.json structure
yarn check:repo # repo hygiene (no .DS_Store, no secrets, etc.)
yarn package:extension # build + package zip into artifacts/
yarn package:extension:unpacked # unpacked zip only (no build)
yarn package:extension:unpacked:dev # branded dev zip for side-by-side install
yarn release <patch|minor|major> # bump version + generate changelog draft
yarn release:verify # verify version/tag/changelog alignment
yarn verifyis the main pre-commit / CI gate.yarn build:checkruns the TypeScript compiler in check-only mode.yarn package:extensionproduces release-ready zip files fromextension-dist/.
Release artifacts
Tagged releases publish:
all-in-one-toolkit-unpacked-vX.Y.Z.zip- contains a single
All-in-One Toolkit/folder and anINSTALL.txthelper file
- contains a single
Release flow details live in docs/RELEASE.md.
CI / delivery / release
.github/workflows/ci.yml- validates the repo and packages an artifact on pull requests and non-tag pushes
.github/workflows/delivery.yml- builds both package variants for every
mainpush
- builds both package variants for every
.github/workflows/release.yml- runs on
vX.Y.Ztags, verifies release metadata, packages both variants, and publishes the GitHub Release
- runs on
Versioning
- Source of truth:
extension/manifest.json - Tag format:
vX.Y.Z CHANGELOG.mdmust contain a matching section before a tag is created
Privacy and terms
extension/PRIVACY_POLICY.mdextension/terms.md
High-risk areas
extension/features/instagram/shared.js- fragile Instagram DOM selectors and observer logic
extension/features/twitter/shared.js- fragile tweet action-bar integration
extension/features/youtube/shared.js- fragile share-panel integration
extension/background/providers/loaderTo.ts- shared external dependency for multiple download flows
Contributing
See CONTRIBUTING.md before opening a pull request.
Changelog
Changelog
0.5.0
- Added a step-by-step update wizard that takes over the popup body when a new version is available, guiding users through download, extract, and reload in three clear steps.
- Added install path memory so users enter their extension folder once and see it pre-filled on every future update, with copy and change actions.
- Added
yarn release <patch|minor|major>command that bumps the manifest version, generates a changelog draft, commits, tags, pushes, and adds release notes to GitHub — all in one step. - Added automatic release notes extraction from CHANGELOG.md to GitHub Releases.
- Removed the legacy nested zip packaging layout; only the user-friendly unpacked variant is produced now.
- Removed unused i18n keys and dead CSS to reduce bundle noise.
- Fixed Instagram story UI visibility and added avatar image fallbacks.
- Fixed release script to run format and verify checks before committing.
0.4.2
- Added direct unfollow actions to both Instagram Analyzer surfaces (compact drawer and full dashboard), including durable account updates so removed users immediately disappear from non-follower and following snapshots.
- Expanded retry support in download history for Instagram image ZIP jobs and Twitter image/image-ZIP jobs by persisting retry image URL lists in job metadata.
- Improved Analyzer launch and messaging resilience with clearer popup/background error feedback when Instagram tabs are not ready or extension contexts are reloaded.
- Refined Analyzer dashboard and i18n polish: richer hover cards, localized history pill labels, and broader TR/EN copy consistency updates.
0.4.1
- Hardened loader.to polling so long-running
ProcessingContextjobs and transient request stalls fail more predictably instead of timing out too early. - Serialized download state writes to stop failed jobs from being overwritten by stale progress updates and getting stuck in the active list at 99%.
- Improved popup behavior by automatically switching to the active downloads tab when a new download starts and tightening the empty-state layout so the icon aligns with the text.
- Refined Instagram action button injection to better target the real action row across more DOM variants while reducing noisy runtime console output.
0.4.0
- Added the first Instagram Analyzer foundation with account-aware local state storage separated from download history.
- Added a compact popup summary card that shows last scan age, account label, freshness, and analyzer counts without mixing data between Instagram accounts.
- Added an Instagram-side analyzer launcher and compact drawer shell as the manual scan entry point in the page UI.
- Wired the Instagram Analyzer drawer to a real manual background scan flow with persisted progress, per-account isolation, and graceful fallback for extension reload invalidation.
- Refined the Instagram Analyzer UX with a hidden-by-default top-right launcher, theme/language syncing, whitelist management, copy/export actions, and an in-drawer non-follower results list.
- Fixed popup toolbar selects so the active language and theme values render correctly.
- Expanded the Instagram Analyzer with scan history, per-scan diff details, paginated result rendering, profile shortcuts, and lighter storage writes for larger accounts.
- Polished analyzer interactions by preserving search focus and list scroll, confirming destructive whitelist clears, improving history tooltips and empty states, and auto-opening the drawer when Instagram is launched from the popup.
- Added durable IndexedDB-backed analyzer payload storage, stronger account username resolution, and a dashboard-like history detail flow for large-account analysis.
- Added a standalone full-screen Instagram Analyzer Dashboard that opens as a separate overlay alongside the compact drawer — accessible via a new "Dashboard" button in the top-right launcher group.
- Dashboard includes KPI cards with sparklines and scan-over-scan deltas, line trend charts for following/followers/non-followers, a grouped bar chart for per-scan follow/unfollow changes, a quick compare section with expandable diff lists, a searchable and paginated user list covering non-followers/whitelist/following/followers, and a collapsible scan history with per-entry detail stats.
- Dashboard is theme-aware (light/dark/system), account-scoped, and updates live when a background scan completes via storage change listeners.
- Added a hover card on username links in the dashboard user list — shows avatar, display name, verified badge, private/whitelist tags, and quick-action buttons (open profile, whitelist toggle); card position tracks scroll via requestAnimationFrame and flips above/below the anchor based on available space.
0.3.4
- Refined the popup update footer with a calmer loading state, clearer action grouping, and inline tooltips for download, guide, reload, and manual check actions.
- Added manual
Check nowandReloadactions so unpacked installs can update directly from the popup without openingchrome://extensions. - Updated the user install guide to describe the new popup-based manual update flow.
0.3.3
- Added a separately branded local development build so live and dev installs are easier to distinguish on the same machine.
- Made
yarn devwrite toextension-dev-dist/by default, while keepingyarn dev:prodfor production-like watch output. - Added documentation and packaging support for side-by-side dev installs, including a branded dev zip and ignored dev build output.
0.3.2
- Redesigned the popup into a denser layout with a fixed header/footer and a more compact downloads list.
- Added GitHub-based update detection in the popup footer with direct access to the latest unpacked release zip.
- Simplified user installation and update docs, and changed the unpacked release zip to ship a single
All-in-One Toolkitfolder for easier manual upgrades.
0.3.1
- Improved Instagram image downloads for carousel posts by correctly detecting the active slide on feed and post pages.
- Added clearer YouTube share-panel download buttons with distinct video and audio icons that better match the native UI.
- Added a bulk image download action for Instagram carousel posts when multiple photos are available.
0.3.0
- Migrated the entire codebase from plain JavaScript to TypeScript with
strictmode enabled. - Added a lightweight build pipeline:
tsccompilesextension/→extension-dist/, which Chrome now loads. - Added
yarn devwatch mode for development (tsc --watch + static asset watcher, no extra dependencies). - Removed all legacy compatibility bridge files (8 content + 4 background handlers).
- Fixed download progress tracking: added missing
registerDownloadIdcalls in YouTube, Instagram, and Twitter download handlers. - Improved loader.to polling resilience: adaptive timeout for init-phase statuses (InitialisingContext), network error tolerance during polling, and deduplicated polling logic.
- Added runtime validation for all message payloads in the background service worker to prevent undefined values from reaching providers.
- Fixed
updatedAtnot being set on job state changes in the download store. - Updated all documentation (README, CONTRIBUTING, ARCHITECTURE, INSTALL, RELEASE, SMOKE_CHECKLIST, AGENTS) to reflect the TypeScript build workflow.
0.2.0
- Physically moved content and background leaf implementations into feature-first folders while keeping legacy paths as compatibility bridges.
- Redesigned the popup into a more compact modern layout and kept the existing settings and download-management behaviors intact.
- Added dual release packaging: a legacy nested zip and a user-friendly unpacked zip with quick installation notes.
- Strengthened repo hygiene and manifest guardrails to reduce registry/resource drift during future refactors.
0.1.6
- Added shared runtime contracts for message types and feature registry metadata.
- Refactored background routing to use centralized handlers and removed the Instagram image handler dependency on content-side feature code.
- Prepared popup code for a full redesign by extracting view-model and theme helpers.
- Added README, release docs, packaging scripts, and GitHub Actions workflows for CI, delivery, and tagged releases.
Releases
- v0.5.0
- Added a step-by-step update wizard that takes over the popup body when a new version is available, guiding users through download, extract, and reload in three clear steps. - Added install path memory so users enter their extension folder once and see it pre-filled on every future update, with copy and change actions. - Added `yarn release <patch|minor|major>` command that bumps the manifest version, generates a changelog draft, commits, tags, pushes, and adds release notes to GitHub — all in one step. - Added automatic release notes extraction from CHANGELOG.md to GitHub Releases. - Removed the legacy nested zip packaging layout; only the user-friendly unpacked variant is produced now. - Removed unused i18n keys and dead CSS to reduce bundle noise. - Fixed Instagram story UI visibility and added avatar image fallbacks. - Fixed release script to run format and verify checks before committing.
Open on GitHub - v0.4.2
- Added Instagram Analyzer unfollow actions in drawer and dashboard - Expanded retry support for Instagram/Twitter image ZIP flows - Improved analyzer open error handling and i18n/dashboard polish - Updated TypeScript tooling/config for TS6 compatibility by removing deprecated baseUrl usage and explicitly loading Chrome types **Full Changelog**: https://github.com/voyvodka/All-in-one-Extension/compare/v0.4.1...v0.4.2
Open on GitHub - v0.4.1
**Full Changelog**: https://github.com/voyvodka/All-in-one-Extension/compare/v0.4.0...v0.4.1
Open on GitHub - v0.4.0
## Highlights - Ship the new Instagram Analyzer flow with account-scoped scans, durable IndexedDB storage, whitelist management, history diffs, and popup summary support. - Add the standalone Instagram Analyzer Dashboard with KPI cards, sparklines, trend charts, quick compare, searchable user lists, and scan history drill-downs. - Add username hover cards in the dashboard and update release docs, smoke checklist, README, and AGENTS for the v0.4.0 workflow. **Full Changelog**: https://github.com/voyvodka/All-in-one-Extension/compare/v0.3.4...v0.4.0
Open on GitHub - v0.3.4
**Full Changelog**: https://github.com/voyvodka/All-in-one-Extension/compare/v0.3.3...v0.3.4
Open on GitHub - v0.3.3
**Full Changelog**: https://github.com/voyvodka/All-in-one-Extension/compare/v0.3.2...v0.3.3
Open on GitHub - v0.3.2
**Full Changelog**: https://github.com/voyvodka/All-in-one-Extension/compare/v0.3.1...v0.3.2
Open on GitHub - v0.3.1
**Full Changelog**: https://github.com/voyvodka/All-in-one-Extension/compare/v0.3.0...v0.3.1
Open on GitHub - v0.3.0
## What's Changed * feat: migrate codebase to TypeScript with strict mode (v0.3.0) by @voyvodka in https://github.com/voyvodka/All-in-one-Extension/pull/3 **Full Changelog**: https://github.com/voyvodka/All-in-one-Extension/compare/v0.2.0...v0.3.0
Open on GitHub - v0.2.0
## Highlights - Move content and background leaf implementations into feature-first entrypoints while keeping legacy paths as compatibility bridges. - Redesign the popup into a more compact modern UI without changing the existing settings and download-management flows. - Add dual release packaging with both nested and user-friendly unpacked zip variants. - Add CONTRIBUTING guidance, install docs, release docs, and a manual smoke checklist. ## Release Assets - `all-in-one-toolkit-unpacked-v0.2.0.zip` - recommended for manual installation - contains `manifest.json` at the archive root - `all-in-one-toolkit-v0.2.0.zip` - legacy nested layout - archive root contains the `extension/` folder ## Verification - `yarn verify` - `yarn release:verify` - `yarn package:extension`
Open on GitHub