{"id":389280,"date":"2026-10-28T19:10:32","date_gmt":"2026-10-28T19:10:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/forge-media-library\/"},"modified":"2026-10-28T19:10:19","modified_gmt":"2026-10-28T19:10:19","slug":"forgedbi-media-organizer","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/forgedbi-media-organizer\/","author":23588826,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.2.2","stable_tag":"0.2.2","tested":"7.1.4","requires":"6.8","requires_php":"8.2","requires_plugins":null,"header_name":"ForgeDBI Media Organizer","header_author":"ForgeDBI","header_description":"Media organization, usage visibility, and reversible cleanup for WordPress.","assets_banners_color":"ffffff","last_updated":"2026-10-28 19:10:19","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":78,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.2.2":{"tag":"0.2.2","author":"forgestudio","date":"2026-10-28 19:10:19","revision":3771436}},"upgrade_notice":{"0.2.2":"<p>Fixes activation being refused because of a leftover entry for the earlier build.<\/p>","0.2.1":"<p>Deactivate &quot;Forge Media Library&quot; before activating this plugin, if you had the earlier build.<\/p>","0.2.0":"<p>New name and a new, always-encrypted quarantine folder under uploads. Existing folders, settings and quarantined files carry over.<\/p>","0.1.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3771436,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3771436,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3771436,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3771436,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.2.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3771436,"resolution":"1","location":"assets","locale":"","width":1120,"height":768},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3771436,"resolution":"2","location":"assets","locale":"","width":1120,"height":768},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3771436,"resolution":"3","location":"assets","locale":"","width":1120,"height":768},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3771436,"resolution":"4","location":"assets","locale":"","width":1120,"height":768},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3771436,"resolution":"5","location":"assets","locale":"","width":1120,"height":768}},"screenshots":{"1":"The Library: folders, smart views, and where each file is used.","2":"Scan &amp; Usage: coverage by source, findings, and what was not checked.","3":"The quarantine confirmation: what will happen, and what must be acknowledged.","4":"The Quarantine tab: held files, restore, and permanent deletion after the recovery window.","5":"Settings: the recovery window, scan sources, protection and permissions."}},"plugin_section":[],"plugin_tags":[29823,9747,253777,233,219749],"plugin_category":[],"plugin_contributors":[289315],"plugin_business_model":[],"class_list":["post-389280","plugin","type-plugin","status-publish","hentry","plugin_tags-duplicates","plugin_tags-folders","plugin_tags-media-cleanup","plugin_tags-media-library","plugin_tags-unused-media","plugin_contributors-forgestudio","plugin_committers-forgestudio"],"banners":{"banner":"https:\/\/ps.w.org\/forgedbi-media-organizer\/assets\/banner-772x250.png?rev=3771436","banner_2x":"https:\/\/ps.w.org\/forgedbi-media-organizer\/assets\/banner-1544x500.png?rev=3771436","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/forgedbi-media-organizer\/assets\/icon-128x128.png?rev=3771436","icon_2x":"https:\/\/ps.w.org\/forgedbi-media-organizer\/assets\/icon-256x256.png?rev=3771436","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/forgedbi-media-organizer\/assets\/screenshot-1.png?rev=3771436","caption":"The Library: folders, smart views, and where each file is used."},{"src":"https:\/\/ps.w.org\/forgedbi-media-organizer\/assets\/screenshot-2.png?rev=3771436","caption":"Scan &amp; Usage: coverage by source, findings, and what was not checked."},{"src":"https:\/\/ps.w.org\/forgedbi-media-organizer\/assets\/screenshot-3.png?rev=3771436","caption":"The quarantine confirmation: what will happen, and what must be acknowledged."},{"src":"https:\/\/ps.w.org\/forgedbi-media-organizer\/assets\/screenshot-4.png?rev=3771436","caption":"The Quarantine tab: held files, restore, and permanent deletion after the recovery window."},{"src":"https:\/\/ps.w.org\/forgedbi-media-organizer\/assets\/screenshot-5.png?rev=3771436","caption":"Settings: the recovery window, scan sources, protection and permissions."}],"raw_content":"<!--section=description-->\n<p>ForgeDBI Media Organizer adds a workspace under <strong>Media \u2192 Media Organizer<\/strong> with three things WordPress's own library does not have:<\/p>\n\n<p><strong>Folders that never move files.<\/strong> Nested folders, drag and drop, bulk moves, and folders inside WordPress's own media picker. A folder is a label: moving a file between folders changes no URL and touches no file on disk.<\/p>\n\n<p><strong>Where used.<\/strong> A scan reads your content \u2014 the block and classic editors, featured images, galleries, site identity, core widgets, Elementor layouts and templates, and ACF image and gallery fields \u2014 and records every place each file is used, with a link to it. The scan says exactly what it checked and what it could not; \"no references found\" is reported as what it is, evidence from the sources read, never as proof a file is unused.<\/p>\n\n<p><strong>Cleanup you can take back.<\/strong> Instead of deleting, you quarantine: the file's addresses stop working, the file and its record are held, and everything can be restored exactly as it was with one click. Nothing is ever deleted automatically. Permanent deletion is a separate, explicit, Administrator-only step after a recovery window, with the filename typed to confirm. Protect any file or folder and it can never be quarantined or deleted, whatever a scan finds.<\/p>\n\n<p>Also: exact duplicate detection by file contents, missing-file detection, smart views (saved filters, personal or shared), an activity log of every change and who made it, a Settings screen for the recovery window, scan sources and role permissions, and WP-CLI commands for all of it.<\/p>\n\n<h4>What it will not do<\/h4>\n\n<p>ForgeDBI Media Organizer never rewrites your content, merges or renames files, or deletes anything on its own. Those are deliberate. It reads; you decide.<\/p>\n\n<h4>Where quarantined files are kept<\/h4>\n\n<p>Quarantined files are moved into the plugin's own folder in your uploads directory (<code>uploads\/forgedbi-media-organizer\/<\/code>, wherever WordPress says uploads are), under a randomly named subfolder. Many web servers serve everything in uploads, so every file held there is encrypted (libsodium, or OpenSSL where libsodium is missing), and so is the record of where each belongs. The encryption key is kept in your database, never in that folder, so the files cannot be read even if someone finds and downloads them. The folder also carries deny rules and an empty index for servers that honour them. If the server cannot encrypt, or the folder cannot be written, new quarantines are switched off and anything already held stays restorable.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin makes no request to any outside service. The only request it sends is from your site to itself, to check whether the web server would serve the quarantine folder (whose contents are encrypted either way). Nothing about your media leaves your server.<\/p>\n\n<h4>Source code and build<\/h4>\n\n<p>The admin interface in <code>build\/<\/code> is compiled from the TypeScript and React source shipped with the plugin in <code>admin\/src\/<\/code>. To rebuild it: install Node.js 24, run <code>npm ci<\/code>, then <code>npm run build<\/code>. PHP dependencies are declared in <code>composer.json<\/code>; the only runtime dependency is Action Scheduler (GPL-3.0), bundled in <code>vendor\/<\/code>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin through <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>, or copy the <code>forgedbi-media-organizer<\/code> folder to <code>wp-content\/plugins<\/code>.<\/li>\n<li>Activate it. The plugin creates its own tables and grants Editors the organizing, protecting and scanning capabilities; quarantine and permanent deletion stay with Administrators.<\/li>\n<li>Open <strong>Media \u2192 Media Organizer<\/strong>. Run a scan from <strong>Scan &amp; Usage<\/strong> to see where your files are used.<\/li>\n<\/ol>\n\n<p>Requires PHP 8.2 or newer and WordPress 6.8 or newer. Multisite is not supported in this version.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20moving%20a%20file%20to%20a%20folder%20change%20its%20url%3F\"><h3>Does moving a file to a folder change its URL?<\/h3><\/dt>\n<dd><p>No. Folders are labels in the database. No file is moved, renamed or copied by organizing.<\/p><\/dd>\n<dt id=\"is%20%22no%20references%20found%22%20the%20same%20as%20unused%3F\"><h3>Is \"No references found\" the same as unused?<\/h3><\/dt>\n<dd><p>No, and the plugin says so wherever it shows that result. A scan reads the sources listed under <strong>Scan &amp; Usage \u2192 Coverage<\/strong>. Theme templates, plugin settings, emails, other websites and anything else it does not read may still use a file. That is why cleanup is a quarantine you can undo, not a deletion.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20a%20quarantined%20file%3F\"><h3>What happens to a quarantined file?<\/h3><\/dt>\n<dd><p>Its files are moved out of the uploads folder and its addresses stop working \u2014 a page that used it shows a broken image until it is restored. Its record, metadata, folder and every reference stay as they were. Restoring puts the files back byte for byte, verified by checksum. A file is only ever permanently deleted when an Administrator asks for that, after the recovery window, by typing its name.<\/p><\/dd>\n<dt id=\"does%20anything%20get%20deleted%20automatically%20when%20the%20recovery%20window%20ends%3F\"><h3>Does anything get deleted automatically when the recovery window ends?<\/h3><\/dt>\n<dd><p>No. Nothing in this plugin deletes a file on its own. The window ending only makes permanent deletion possible for an Administrator to request.<\/p><\/dd>\n<dt id=\"why%20are%20quarantined%20files%20encrypted%3F\"><h3>Why are quarantined files encrypted?<\/h3><\/dt>\n<dd><p>They are kept under uploads, which most web servers will serve to anyone who knows the address. Encrypted, they are useless to anyone without the key. The key is in your database (so in every database backup), or in <code>wp-config.php<\/code> if you define <code>FORGE_MEDIA_QUARANTINE_KEY<\/code>. Keep your backups: without the key, held files cannot be restored.<\/p><\/dd>\n<dt id=\"can%20i%20use%20it%20with%20an%20offloading%20plugin%20%28s3%20and%20the%20like%29%3F\"><h3>Can I use it with an offloading plugin (S3 and the like)?<\/h3><\/dt>\n<dd><p>Folders, scans, smart views and protection work. Quarantine, restore and permanent deletion are switched off while a known offloading plugin is active, because they move local files and the remote copy would keep being served.<\/p><\/dd>\n<dt id=\"which%20page%20builders%20and%20custom%20fields%20are%20scanned%3F\"><h3>Which page builders and custom fields are scanned?<\/h3><\/dt>\n<dd><p>The block and classic editors, featured images, galleries, site identity and core widgets, Elementor layouts and saved templates, and ACF image and gallery fields (including inside groups and repeaters). Others are not read, and the scan's coverage screen lists what was and was not checked for each scan.<\/p><\/dd>\n<dt id=\"i%20installed%20an%20earlier%20build%20named%20%22forge%20media%20library%22.%20what%20happens%3F\"><h3>I installed an earlier build named \"Forge Media Library\". What happens?<\/h3><\/dt>\n<dd><p>ForgeDBI Media Organizer is the same plugin under its new name. Deactivate the old copy first (activation is refused while it is active, and the old copy is left running); then activate this one, and your folders, settings, activity and quarantined files carry over as they are. Files quarantined by the earlier build stay where that build put them and can still be restored or permanently deleted from there; nothing new is written to the old folder. Then delete the old copy from the Plugins screen. Its uninstall routine removes nothing.<\/p><\/dd>\n<dt id=\"does%20deleting%20the%20plugin%20remove%20my%20folders%20or%20quarantined%20files%3F\"><h3>Does deleting the plugin remove my folders or quarantined files?<\/h3><\/dt>\n<dd><p>No. Deactivating or deleting the plugin leaves your folders, the activity log, quarantined files and their manifests in place, so nothing is lost by removing it. The runbook in the plugin's documentation explains how to put held files back by hand.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.2.2<\/h4>\n\n<ul>\n<li>An entry for the earlier build left in the active plugins list after its files were deleted no longer blocks activation.<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>Activation checks every requirement first and is refused, with a message, while the earlier \"Forge Media Library\" build is active. The plugin never deactivates another plugin.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Renamed to ForgeDBI Media Organizer (slug and text domain <code>forgedbi-media-organizer<\/code>). Data from the earlier build carries over unchanged.<\/li>\n<li>Quarantined files are now kept in the plugin's own folder under uploads, found at runtime with <code>wp_upload_dir()<\/code>, and are always stored encrypted, their manifests included. The key is never written to that folder.<\/li>\n<li>When files cannot be held encrypted or the folder cannot be written, new quarantines are switched off; restoring and permanent deletion keep working.<\/li>\n<li>Quarantines made by the earlier build are restored and deleted from where they are.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release: folders, scans and where-used evidence, smart views, duplicates and missing files, protection, quarantine with restore and explicit permanent deletion, Settings, WP-CLI commands.<\/li>\n<\/ul>","raw_excerpt":"Folders for your media, evidence of where each file is used, and a cleanup that can always be undone.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/389280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=389280"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/forgestudio"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=389280"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=389280"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=389280"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=389280"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=389280"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=389280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}