{"id":13910724,"url":"https://github.com/mtalcott/google-photos-deduper","last_synced_at":"2026-04-13T06:25:03.234Z","repository":{"id":140970662,"uuid":"354720672","full_name":"mtalcott/google-photos-deduper","owner":"mtalcott","description":"Locally run web app and Chrome extension to remove duplicates from Google Photos","archived":false,"fork":false,"pushed_at":"2024-11-17T23:05:31.000Z","size":796,"stargazers_count":208,"open_issues_count":17,"forks_count":18,"subscribers_count":8,"default_branch":"main","last_synced_at":"2024-11-18T00:20:34.384Z","etag":null,"topics":["chrome-extension","crxjs","docker-compose","google-photos","google-photos-api","image-embeddings","mediapipe","mui","python","react","typescript","vite"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mtalcott.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-05T04:48:03.000Z","updated_at":"2024-11-16T18:16:18.000Z","dependencies_parsed_at":"2024-05-29T06:13:13.219Z","dependency_job_id":"5458d116-db64-463d-8341-b6a8d2b93e04","html_url":"https://github.com/mtalcott/google-photos-deduper","commit_stats":null,"previous_names":["mtalcott/google-photos-deduper"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtalcott%2Fgoogle-photos-deduper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtalcott%2Fgoogle-photos-deduper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtalcott%2Fgoogle-photos-deduper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtalcott%2Fgoogle-photos-deduper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mtalcott","download_url":"https://codeload.github.com/mtalcott/google-photos-deduper/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":226388713,"owners_count":17617321,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chrome-extension","crxjs","docker-compose","google-photos","google-photos-api","image-embeddings","mediapipe","mui","python","react","typescript","vite"],"created_at":"2024-08-07T00:01:43.871Z","updated_at":"2026-04-13T06:25:03.225Z","avatar_url":"https://github.com/mtalcott.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"# Google Photos Deduper\n\n[![CI Badge](https://github.com/mtalcott/google-photos-deduper/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/mtalcott/google-photos-deduper/actions/workflows/ci.yml?query=branch%3Amain)\n\nA Chrome extension that finds and removes duplicate photos from your Google Photos library.\n\nUses [Google Photos Toolkit (GPTK)](https://github.com/xob0t/Google-Photos-Toolkit) to access your library via Google Photos' web interface. Built with [Plasmo](https://plasmo.com/), [MediaPipe](https://developers.google.com/mediapipe), [React](https://react.dev/), and [MUI](https://mui.com/). \n\n## Demo\n\n[![Demo](https://google-photos-deduper-public.s3.amazonaws.com/demo-2026-l.webp?1)](https://youtu.be/SeOX98uTVwQ)\n\n## Install\n\n**[⬇ Download latest release](https://github.com/mtalcott/google-photos-deduper/releases/latest/download/google-photos-deduper.zip)**\n\n1. Unzip to a permanent folder (don't delete it — Chrome needs it to stay there)\n2. Open `chrome://extensions` → enable **Developer mode** (toggle, top-right)\n3. Click **Load unpacked** → select the unzipped folder\n4. Pin the extension icon in your toolbar for easy access\n\n## Usage\n\n1. Open Google Photos in Chrome with the extension installed\n2. Click the extension icon → **Open Deduper**\n3. Click **Scan Library** - the extension fetches your media items and uses MediaPipe image embeddings locally to find visually identical photos\n4. Review the duplicate groups, select which to keep, and click **Move to Trash**\n\nNo OAuth setup. No Google Cloud project. No data leaves your browser.\n\n## Development\n\n### Setup\n\n**Prerequisites:** Google Chrome, Node.js 24\n\n```bash\ngit clone https://github.com/mtalcott/google-photos-deduper.git\ncd google-photos-deduper\ngit submodule update --init --recursive\nnpm install\nnpm run dev  # builds into build/chrome-mv3-dev/\n```\n\nLoad in Chrome: `chrome://extensions` → enable **Developer mode** → **Load unpacked** → select `build/chrome-mv3-dev/`.\n\n### Commands\n\n```bash\n# Start the Plasmo dev server (rebuilds on file changes)\nnpm run dev\n\n# Build the Chrome extension (builds into build/chrome-mv3-prod/)\nnpm run build\n\n# Run unit and integration tests\nnpm test\n\n# Run full E2E tests (requires Chrome with remote debugging — see below)\nnpm run test:e2e\n```\n\n### Full E2E Tests\n\nFull E2E tests connect to a running Chrome instance via the [Chrome DevTools Protocol (CDP)](https://chromedevtools.github.io/devtools-protocol/). Start Chrome with remote debugging before running:\n\n**macOS:**\n```bash\n\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\" \\\n  --remote-debugging-port=9222 \\\n  --user-data-dir=\"$HOME/chrome-debug\"\n```\n\n**Windows [WSL](https://learn.microsoft.com/en-us/windows/wsl/):**\n```bash\n\"/mnt/c/Program Files/Google/Chrome/Application/chrome.exe\" \\\n  --remote-debugging-port=9222 \\\n  --user-data-dir=\"C:\\Users\\\u003cyou\u003e\\Chrome Profiles\\chrome-debug\"\n```\n\nThen run: `npm run test:e2e`\n\n## Motivation\n\nGoogle deprecated the Photos Library API's write access in 2025, and duplicate detection has never been a built-in Google Photos feature. This extension uses [@xob0t](https://github.com/xob0t)'s [Google Photos Toolkit (GPTK)](https://github.com/xob0t/Google-Photos-Toolkit) — an open-source wrapper around Google Photos' undocumented web API — to access your library without OAuth, and runs MediaPipe's MobileNet V3 image embedder locally to find visually identical photos.\n\n## Support\n\nFound a bug or have a feature request? [Open an issue](https://github.com/mtalcott/google-photos-deduper/issues/new/choose).\n\nHave questions? [Post on the discussions page](https://github.com/mtalcott/google-photos-deduper/discussions).\n\n## Say Thanks\n\nIf you found this project useful, give it a star!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmtalcott%2Fgoogle-photos-deduper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmtalcott%2Fgoogle-photos-deduper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmtalcott%2Fgoogle-photos-deduper/lists"}