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.

0stars
0forks
0watchers
0open issues
status: CORElanguage: TypeScriptbranch: mainlicense: MIT Licenseupdated: 3/31/2026, 12:44:13 PMlast push: 3/31/2026, 12:41:46 PM
chrome-extensiondownloaderfollower-analysisinstagraminstagram-analyzermanifest-v3media-downloadertwittertypescriptxyoutube

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.ts declarations for TypeScript integration

For more detail, see:

  • docs/ARCHITECTURE.md
  • docs/INSTALL.md
  • docs/LOCAL_DEV.md
  • docs/RELEASE.md
  • docs/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/
  1. Open chrome://extensions
  2. Enable Developer mode
  3. Click Load unpacked
  4. Select the extension-dist/ folder (not extension/)

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 verify is the main pre-commit / CI gate.
  • yarn build:check runs the TypeScript compiler in check-only mode.
  • yarn package:extension produces release-ready zip files from extension-dist/.

Release artifacts

Tagged releases publish:

  • all-in-one-toolkit-unpacked-vX.Y.Z.zip
    • contains a single All-in-One Toolkit/ folder and an INSTALL.txt helper file

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 main push
  • .github/workflows/release.yml
    • runs on vX.Y.Z tags, verifies release metadata, packages both variants, and publishes the GitHub Release

Versioning

  • Source of truth: extension/manifest.json
  • Tag format: vX.Y.Z
  • CHANGELOG.md must contain a matching section before a tag is created

Privacy and terms

  • extension/PRIVACY_POLICY.md
  • extension/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 ProcessingContext jobs 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 now and Reload actions so unpacked installs can update directly from the popup without opening chrome://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 dev write to extension-dev-dist/ by default, while keeping yarn dev:prod for 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 Toolkit folder 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 strict mode enabled.
  • Added a lightweight build pipeline: tsc compiles extension/extension-dist/, which Chrome now loads.
  • Added yarn dev watch 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 registerDownloadId calls 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 updatedAt not 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