{"id":13477070,"url":"https://github.com/vaeth/bookmarkdupes","last_synced_at":"2026-03-17T21:34:51.572Z","repository":{"id":49802935,"uuid":"109415221","full_name":"vaeth/bookmarkdupes","owner":"vaeth","description":"A WebExtension which can display/remove duplicate bookmarks or empty folders","archived":false,"fork":false,"pushed_at":"2023-08-24T15:36:56.000Z","size":719,"stargazers_count":130,"open_issues_count":14,"forks_count":12,"subscribers_count":12,"default_branch":"main","last_synced_at":"2025-07-30T18:39:20.506Z","etag":null,"topics":["bookmark","firefox","firefox-webextension"],"latest_commit_sha":null,"homepage":"https://addons.mozilla.org/en-US/firefox/addon/bookmark-dupes/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vaeth.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null}},"created_at":"2017-11-03T16:00:46.000Z","updated_at":"2025-06-28T08:31:43.000Z","dependencies_parsed_at":"2024-02-18T06:40:46.273Z","dependency_job_id":null,"html_url":"https://github.com/vaeth/bookmarkdupes","commit_stats":null,"previous_names":[],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/vaeth/bookmarkdupes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaeth%2Fbookmarkdupes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaeth%2Fbookmarkdupes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaeth%2Fbookmarkdupes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaeth%2Fbookmarkdupes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vaeth","download_url":"https://codeload.github.com/vaeth/bookmarkdupes/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaeth%2Fbookmarkdupes/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30632016,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T17:32:55.572Z","status":"ssl_error","status_checked_at":"2026-03-17T17:32:38.732Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["bookmark","firefox","firefox-webextension"],"created_at":"2024-07-31T16:01:37.898Z","updated_at":"2026-03-17T21:34:51.556Z","avatar_url":"https://github.com/vaeth.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# bookmarkdupes\n\n(C) Martin Väth \u003cmartin@mvath.de\u003e, \u003cmvath.develop@gmail.com\u003e\n\nThis project is under the GNU Public License 2.0.\n\nA WebExtension which can display/remove duplicate bookmarks, empty folders, or descriptions\n\nAvailable on AMO here:\nhttps://addons.mozilla.org/firefox/addon/bookmark-dupes/\n\nAfter installing bookmarkdupes, the usage is rather simple:\n\nTo open bookmarkdupes, click the extension symbol (duplicate stars) or\nuse the link in the options page of the extension.\n**Do not enable “Expert Mode”** (unless you fully understand the consequences,\nsee separate section).\nThen select what you want to display:\n\n1. Bookmark duplicates\n2. Empty folders\n3. Non-duplicate bookmarks\n4. All bookmarks\n\nAfter this, you will be offered the list of bookmarks with checkboxes;\nin case 1 the numbers indicate the order in which matching bookmarks\nwere added according to the internally stored date.\nThere are also buttons to select/unselect convenient sets of checkboxes.\n\nFinally, there are buttons to remove the selected bookmarks in cases 1-3\nor to strip the descriptions of the selected bookmarks in case 4.\n(The latter has some side effects, see section **Known Bugs**).\n\n**Be aware that removing bookmarks or stripping descriptions is irreversible!**\n*It is recommended to make backups of your bookmarks first!*\n\nCurrently, there is no working version of the extension available for android\n(see section **Known Bugs**).\n\n## Important\n\nWhen you reorganized/added/removed bookmarks, make sure to update the\ndisplayed list (by pressing the corresponding button) before removing\nbookmarks or stripping descriptions!\nIn particular, stripping descriptions with an outdated list will move\nthe corresponding bookmarks to their previous location in the bookmark menu!\n\n## Permissions\n\nThe extension requires the following permissions for these reasons:\n\n1. “bookmarks” to read/modify bookmarks\n2. “storage” to store/restore the customized rules in expert mode.\n   Unfortunately, “storage” is not one of the optional permissions which might\n   be required only if that feature is actually requested by the user, see\n   https://developer.mozilla.org/en-US/Add-ons/WebExtensions/manifest.json/optional_permissions\n\n## Expert Mode\n\nWhen selecting the checkbox for expert mode, details can be configured to\nignore certain bookmarks when calculating the list or under which cases\nbookmarks are considered to be dupes of each other.\n\nIn non-expert mode, two bookmarks are considered to be duplicates of each\nother if their URL coincides.\nIn expert mode there are custom rules by which the URL which is actually\nused for comparison is to be modified. The details are as follows.\n\nFor every bookmark the rules are applied in the given order.\nThere are 2 types of rules: Filter rules and URL modification rules\n(there are also disabled rules which are only listed but have no effect).\n\nFor both types of rules 4 regular expressions can be specified which are used\nto determine if the rule applies: If the corresponding regular expression is\nnonempty, the corresponding condition must be satisfied or the rule will not\napply. (In the case of filter rules, at least one of these 4 regular\nexpressions must be nonempty or that filter rules will not apply either.)\n\nThe 4 regular expressions refer to the bookmark's name or url, respectively,\nand the regular expressions must either match or not match, respectively.\n\n- The term “regular expression” refers to a javascript type regular expression\n  as described e.g. in\n  https://wiki.selfhtml.org/wiki/JavaScript/Objekte/RegExp\n  or\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n- The bookmark's name refers to the full bookmark path as it appears in the\n  browser with folder names separated by the null character.\n  For instance, if you have in “Bookmark Menu” a folder “Collection”\n  which contains your bookmark \"Example\", the bookmark's name becomes\n  `Bookmark Menu\\0Collection\\0Example` (where `\\0` denotes the null character\n  which can be matched by the regular expression with `\\0` or `\\x00`).\n- The bookmark's URL refers to the bookmark URL after possible modifications\n  by previous modifier rules.\n\nIf a filter rule applies, the corresponding bookmark is ignored, i.e.,\nit will not be considered as a duplicate and will neither appear in the\nlist of empty folders nor of all bookmarks.\n\nIf a URL modification rule applies, a text replacement will occur:\nAll parts matching a specified regular expression are substituted by a\nreplacement text (which might be empty).\nThe rules for this correspond to the javascript String.prototype.replace\nfunction with the global modifier, see e.g.\nhttps://wiki.selfhtml.org/wiki/JavaScript/Objekte/String/replace\nor\nhttps://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/replace\n\nIn particular, the replacement text can contain symbols like\n`$\u0026` or `$1` to refer to the whole matched text or to the\nmatch of the first brace in the regular expression, respectively.\n\nThe following 5 replacement texts have a special meaning which goes beyond\nthe standard javascript replacement rules.\n\nNote that this special meaning is only active if this is the full replacement\ntext. In other words, to get the special meaning, the replacement text must not\ncontain anything else than these 4-6 characters.\n(This does not really restrict the functionality, because one can combine\nseveral rules to work around that limitation if necessary.)\n\n1. `\\L$\u0026` is the match in lower case.\n2. `\\U$\u0026` is the match in upper case.\n3. `$URL` is the url before any other rules have been applied.\n4. `$NAME` is the bookmark's full name/path with folders separated by the\n    null character, e.g. “Bookmark Menu\\0Collection\\0Example”\n5. `$TITLE` is the bookmark's title without the path; for instance, for the\n    bookmark name “Bookmark Menu | Collection | Example” it is “Example”.\n\nCases 3-5 can be preceeded or followed by `$$\u0026` to prepend or append the match.\n\n## Examples for special tasks which can be done in Expert Mode\n\n### Task\n\n1. Consider two bookmarks as duplicate if their URL differs only in `https:` vs. `http:` at the beginnning.\n\n2. Consider two bookmarks as duplicate if their URL matches up to the first `?` symbol, i.e. only their additional information differs.\n\n3. Do not consider any bookmark from any folder named ``Mr. Dupe`` as a duplicate.\n\n4. Add all bookmarks to the list of duplicates, whether duplicate or not.\n\n5. Add all bookmarks from the folder `Bookmark Menu | Remove` to the list of duplicates (no matter whether they actually are duplicates).\n\n6. Consider two bookmarks as duplicate if they have the same name (instead of the same URL).\n\n7. Consider two bookmarks as duplicate if they reside in the same folder.\n\n### How to do the above tasks in Expert Mode\n\n1. Use the replacement rule: “Replace URL matches” `^http:` “by” `^https:`\n\nExplanation: By replacing everywhere the URL beginnning with `http:`\nby `https:`, it does not matter whether the actual URL started with `http:`\nor `https:`. Of course, we could have exchanged the roles of `http`\nand `https` in our rule.\n\n2. Use the replacement rule: “Replace URL matches” `\\?.*` “by” ` ` (empty string)\n\nExplanation: Simply omit the ? symbol and all other symbols following it\nin all URLs.\n\n3. Use the filter rule: “Name matches” `\\0Mr\\. Dupe\\0` or `\\0Mr[.] Dupe\\0`\n\nExplanation: If a bookmark is in a folder named “Mr. Dupe”, its full name (path) will contain the text “\\0Mr. Dupe\\0”; so match that text. Since the “.” symbol has a special meaning for regular expressions, we have to quote it. This can be done by either `\\.` or by looking for a character class `[…]` which contains only the single symbol `.`.\n\n4. Use the replacement rule: “Replace URL matches” `.+` “by” `http://dummy`\n\nExplanation: Pretend that every bookmark has the URL `http://dummy` by replacing all characters (`.+`) of the original URL by that text.\n\n5. Use the replacement rule: “Name Matches” `^Bookmark Menu\\0Remove\\0` “Replace URL matches” `.+` “by” `http://dummy`\n\nAs in 4, but only for bookmarks whose full name starts with the matching path.\nThis works only if the folder contains at least 2 bookmarks (because otherwise `http://dummy` is not a duplicate URL). Of course, one might use an actually duplicate URL instead of `http://dummy` to work around this limitation.\n\n6. Use the replacement rule: “Replace URL matches” `.+` “by” `$TITLE`\n\nExplanation: Replace all bookmark URLs by the corresponding bookmark title when looking for dupes.\n\n7. Use the replacement rule “Replace URL matches” `.+` “by” `$NAME` followed by a further replacement rule “Replace URL matches” `[^\\0]*$` “by” ` ` (empty string)\n\nExplanation: First replace the URL by its full name path, and then omit the last component of this path by cutting of the longest sequence of non-`\\0`-symbols at the end.\n\n## Known Bugs\n\n1. Live bookmarks are falsely recognized as empty folders, see\n   https://github.com/vaeth/bookmarkdupes/issues/4\n2. Stripping of descriptions works by replacing the bookmark by a freshly\n   created one. In particular, it updates the bookmark creation date.\n3. Stripping of descriptions creates bookmarks in the place where it was when\n   the displayed list was calculated, see\n   https://github.com/vaeth/bookmarkdupes/issues/11 and the second part of\n   https://github.com/vaeth/bookmarkdupes/issues/8\n4. In some firefox versions (e.g. 55.0.3) it has been reported that pressing\n   the duplicate stars does not open a new tab. You can try to use the link\n   in the options page of the extension instead if you have this problem.\n   The reason for the problem is still unknown, see\n   https://github.com/vaeth/bookmarkdupes/issues/38\n5. Android lacks the bookmark API necessary for bookmarkdupes:\n   https://github.com/vaeth/bookmarkdupes/issues/53\n\n## Contributors\n\n(in alphabetical order)\n\n- Essam Ambr aka (JaMaYcKa) https://github.com/JaMaYcKa2B1 (Arabic translation)\n- Sopor https://github.com/Sopor (Swedish translation)\n- Henaro aka Ironwool https://github.com/perdolka (Russian and Ukrainian translation; redesign icon in svg; provide favicon)\n- Juan Salvador Aleixandre Talens https://github.com/juaalta (Spanish translation)\n- YFdyh000 \u003cyfdyh000 at gmail.com\u003e https://github.com/yfdyh000 (Simplified Chinese translation)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvaeth%2Fbookmarkdupes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvaeth%2Fbookmarkdupes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvaeth%2Fbookmarkdupes/lists"}