{"id":321963,"date":"2026-06-04T12:05:17","date_gmt":"2026-06-04T12:05:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/abc-remote-media-sync\/"},"modified":"2026-06-04T12:05:09","modified_gmt":"2026-06-04T12:05:09","slug":"bromate-remote-media-bridge","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/bromate-remote-media-bridge\/","author":13763669,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0","stable_tag":"1.0","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Bromate Remote Media Bridge","header_author":"bromate","header_description":"Use a remote WordPress uploads directory without copying your entire media library.","assets_banners_color":"344058","last_updated":"2026-06-04 12:05:09","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/bromate-remote-media-bridge\/","header_author_uri":"https:\/\/www.moriskelly.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":36,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0":{"tag":"1.0","author":"Sophabed","date":"2026-06-04 12:05:09"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.jpg":{"filename":"icon-128x128.jpg","revision":3560870,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3560870,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3560870,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3560870,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Remote Media Sync settings page.","2":"Remote uploads URL configuration.","3":"Download while navigating option."}},"plugin_section":[],"plugin_tags":[1346,734,84,19979,1558],"plugin_category":[50],"plugin_contributors":[265819],"plugin_business_model":[],"class_list":["post-321963","plugin","type-plugin","status-publish","hentry","plugin_tags-attachments","plugin_tags-development","plugin_tags-media","plugin_tags-staging","plugin_tags-sync","plugin_category-media","plugin_contributors-sophabed","plugin_committers-sophabed"],"banners":{"banner":"https:\/\/ps.w.org\/bromate-remote-media-bridge\/assets\/banner-772x250.jpg?rev=3560870","banner_2x":"https:\/\/ps.w.org\/bromate-remote-media-bridge\/assets\/banner-1544x500.jpg?rev=3560870","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/bromate-remote-media-bridge\/assets\/icon-128x128.jpg?rev=3560870","icon_2x":"https:\/\/ps.w.org\/bromate-remote-media-bridge\/assets\/icon-256x256.jpg?rev=3560870","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Bromate Remote Media Bridge helps WordPress installations share the same database across multiple environments without requiring a full copy of the uploads directory.<\/p>\n\n<p>Instead of synchronizing gigabytes of media files between environments, the plugin allows WordPress to use a remote uploads directory while keeping the local media library structure intact.<\/p>\n\n<p>The plugin can:<\/p>\n\n<ul>\n<li>Rewrite attachment URLs generated by WordPress.<\/li>\n<li>Rewrite responsive image URLs in srcset attributes.<\/li>\n<li>Redirect media requests to a remote uploads directory.<\/li>\n<li>Progressively cache remote media files locally while visitors browse your site.<\/li>\n<li>Reduce deployment complexity for large media libraries.<\/li>\n<\/ul>\n\n<p>This is particularly useful for:<\/p>\n\n<ul>\n<li>Local development environments using a production database.<\/li>\n<li>Staging and pre-production environments.<\/li>\n<li>WordPress redesign and migration projects.<\/li>\n<li>Large sites where synchronizing the entire uploads directory is impractical.<\/li>\n<li>Long-running projects where the production media library changes frequently.<\/li>\n<\/ul>\n\n<h3>Example<\/h3>\n\n<p>A local site generates:<\/p>\n\n<pre><code>https:\/\/local.example.test\/wp-content\/uploads\/2026\/05\/image.jpg\n<\/code><\/pre>\n\n<p>Bromate Remote Media Bridge rewrites it to:<\/p>\n\n<pre><code>https:\/\/production.example.com\/wp-content\/uploads\/2026\/05\/image.jpg\n<\/code><\/pre>\n\n<p>When \"Download while navigating\" is enabled, the file may also be downloaded automatically and stored locally the first time it is requested.<\/p>\n\n<p>This creates a progressively warmed local media cache containing only the files that have actually been viewed.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li>Rewrite WordPress attachment URLs.<\/li>\n<li>Rewrite responsive image URLs (srcset).<\/li>\n<li>Redirect direct media requests.<\/li>\n<li>Progressive local media caching while browsing.<\/li>\n<li>Automatic local storage of viewed remote media files.<\/li>\n<li>Excluded URL support.<\/li>\n<li>Environment-specific configuration through constants.<\/li>\n<li>Optional debug logging.<\/li>\n<li>No custom database tables.<\/li>\n<li>No front-end assets.<\/li>\n<li>Works with shared databases across development, staging and production environments.<\/li>\n<\/ul>\n\n<h3>Configuration<\/h3>\n\n<p>The remote uploads URL should point directly to the uploads directory of the environment containing the media files.<\/p>\n\n<p>Example:<\/p>\n\n<pre><code>https:\/\/www.example.com\/wp-content\/uploads\n<\/code><\/pre>\n\n<p>You may also configure the plugin using constants in wp-config.php:<\/p>\n\n<pre><code>define( 'BROMATE_REMOTE_MEDIA_BRIDGE_ENABLED', true );\n\ndefine( 'BROMATE_REMOTE_MEDIA_BRIDGE_BASE_URL', 'https:\/\/www.example.com\/wp-content\/uploads' );\n\ndefine( 'BROMATE_REMOTE_MEDIA_BRIDGE_DOWNLOAD_WHILE_NAVIGATING', true );\n\ndefine( 'BROMATE_REMOTE_MEDIA_BRIDGE_DEBUG', false );\n<\/code><\/pre>\n\n<p>Constants take precedence over saved settings.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin through the WordPress Plugins screen or install it manually.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Navigate to Settings &gt; Remote Media Sync.<\/li>\n<li>Enable media URL rewriting.<\/li>\n<li>Configure the remote uploads base URL.<\/li>\n<li>Optionally enable \"Download while navigating\".<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20copy%20media%20files%3F\"><h3>Does this copy media files?<\/h3><\/dt>\n<dd><p>Not by default.<\/p>\n\n<p>The plugin primarily rewrites URLs and redirects requests to a remote uploads directory.<\/p>\n\n<p>If \"Download while navigating\" is enabled, media files can be progressively cached and stored locally as they are viewed.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20very%20large%20media%20libraries%3F\"><h3>Does this work with very large media libraries?<\/h3><\/dt>\n<dd><p>Yes.<\/p>\n\n<p>The plugin was designed specifically for environments where synchronizing the entire uploads directory would be impractical or unnecessary.<\/p><\/dd>\n<dt id=\"is%20download%20while%20navigating%20a%20full%20media%20synchronization%20tool%3F\"><h3>Is Download while navigating a full media synchronization tool?<\/h3><\/dt>\n<dd><p>No.<\/p>\n\n<p>The feature progressively builds a local cache of media files that have actually been viewed. It is intended to reduce storage requirements and simplify development workflows, not to guarantee a complete copy of the remote media library.<\/p>\n\n<p>For complete migrations, a dedicated media migration workflow may still be required.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20cdns%3F\"><h3>Does this work with CDNs?<\/h3><\/dt>\n<dd><p>Yes.<\/p>\n\n<p>Any uploads-compatible URL can be used, including CDN endpoints.<\/p><\/dd>\n<dt id=\"does%20this%20work%20when%20the%20web%20server%20returns%20a%20404%20before%20wordpress%20loads%3F\"><h3>Does this work when the web server returns a 404 before WordPress loads?<\/h3><\/dt>\n<dd><p>URL rewriting still works because URLs are generated by WordPress.<\/p>\n\n<p>Direct media redirects require the request to reach WordPress. If your server handles missing files before WordPress loads, additional server configuration may be required.<\/p><\/dd>\n<dt id=\"why%20are%20media%20files%20not%20downloading%20locally%3F\"><h3>Why are media files not downloading locally?<\/h3><\/dt>\n<dd><p>Some servers, CDNs, security services, anti-hotlinking protections or rate-limiting rules may block automated server-to-server downloads.<\/p>\n\n<p>In these situations URL rewriting still works, but local media caching may be limited or unavailable.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<li>Remote media URL rewriting.<\/li>\n<li>Upload request redirection.<\/li>\n<li>Progressive local media caching.<\/li>\n<li>Excluded URL support.<\/li>\n<li>Environment-specific configuration.<\/li>\n<li>Optional debug logging.<\/li>\n<\/ul>","raw_excerpt":"Use a remote WordPress uploads directory without copying your entire media library. Optionally cache media files locally as visitors browse your site.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/321963","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=321963"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sophabed"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=321963"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=321963"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=321963"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=321963"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=321963"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=321963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}