{"id":361796,"date":"2026-09-07T15:58:13","date_gmt":"2026-09-07T15:58:13","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/kazcode-universal-storage\/"},"modified":"2026-09-08T13:53:26","modified_gmt":"2026-09-08T13:53:26","slug":"kazcode-universal-storage","status":"publish","type":"plugin","link":"https:\/\/sr.wordpress.org\/plugins\/kazcode-universal-storage\/","author":23557343,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.1","requires":"6.7","requires_php":"8.3","requires_plugins":null,"header_name":"KAZCODE Universal Storage","header_author":"KAZCODE","header_description":"Offload your WordPress Media Library to Amazon S3, Cloudflare R2, or S3-compatible object storage while keeping the native Media Library UX and attachment metadata in WordPress.","assets_banners_color":"3d4a67","last_updated":"2026-09-08 13:53:26","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/kazcode.net\/universal-storage\/","header_author_uri":"https:\/\/kazcode.net\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":67,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"kazmij","date":"2026-09-08 13:53:26","revision":3686762}},"upgrade_notice":{"1.0.1":"<p>Reliability, data-integrity, and compatibility hotfix. Update recommended for all sites.<\/p>","1.0.0":"<p>First public release. Requires PHP 8.3+.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3686778,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3686778,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3686778,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3686778,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3686790,"resolution":"1","location":"assets","locale":"","width":1416,"height":868},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3686790,"resolution":"2","location":"assets","locale":"","width":1416,"height":868},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3686790,"resolution":"3","location":"assets","locale":"","width":1416,"height":868},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3686790,"resolution":"4","location":"assets","locale":"","width":1416,"height":868},"screenshot-5.jpg":{"filename":"screenshot-5.jpg","revision":3686790,"resolution":"5","location":"assets","locale":"","width":1416,"height":868},"screenshot-6.jpg":{"filename":"screenshot-6.jpg","revision":3686790,"resolution":"6","location":"assets","locale":"","width":1416,"height":868}},"screenshots":{"1":"Dashboard with storage status, media statistics, and health overview.","2":"Configure Amazon S3, Cloudflare R2, or another S3-compatible storage endpoint.","3":"Native WordPress Media Library with remote-storage status and actions.","4":"Migrate existing WordPress media to object storage in resumable batches.","5":"Verify storage health and repair missing or failed media objects.","6":"Guided settings and connection testing before enabling offload."}},"plugin_section":[],"plugin_tags":[6918,255106,255105,19386,217],"plugin_category":[59],"plugin_contributors":[279599],"plugin_business_model":[],"class_list":["post-361796","plugin","type-plugin","status-publish","hentry","plugin_tags-amazon-s3","plugin_tags-cloudflare-r2","plugin_tags-media-offload","plugin_tags-object-storage","plugin_tags-s3","plugin_category-utilities-and-tools","plugin_contributors-kazmij","plugin_committers-kazmij"],"banners":{"banner":"https:\/\/ps.w.org\/kazcode-universal-storage\/assets\/banner-772x250.png?rev=3686778","banner_2x":"https:\/\/ps.w.org\/kazcode-universal-storage\/assets\/banner-1544x500.png?rev=3686778","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/kazcode-universal-storage\/assets\/icon-128x128.png?rev=3686778","icon_2x":"https:\/\/ps.w.org\/kazcode-universal-storage\/assets\/icon-256x256.png?rev=3686778","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/kazcode-universal-storage\/assets\/screenshot-1.jpg?rev=3686790","caption":"Dashboard with storage status, media statistics, and health overview."},{"src":"https:\/\/ps.w.org\/kazcode-universal-storage\/assets\/screenshot-2.jpg?rev=3686790","caption":"Configure Amazon S3, Cloudflare R2, or another S3-compatible storage endpoint."},{"src":"https:\/\/ps.w.org\/kazcode-universal-storage\/assets\/screenshot-3.jpg?rev=3686790","caption":"Native WordPress Media Library with remote-storage status and actions."},{"src":"https:\/\/ps.w.org\/kazcode-universal-storage\/assets\/screenshot-4.jpg?rev=3686790","caption":"Migrate existing WordPress media to object storage in resumable batches."},{"src":"https:\/\/ps.w.org\/kazcode-universal-storage\/assets\/screenshot-5.jpg?rev=3686790","caption":"Verify storage health and repair missing or failed media objects."},{"src":"https:\/\/ps.w.org\/kazcode-universal-storage\/assets\/screenshot-6.jpg?rev=3686790","caption":"Guided settings and connection testing before enabling offload."}],"raw_content":"<!--section=description-->\n<p>KAZCODE Universal Storage moves your Media Library's binary files \u2014 originals and every generated image size \u2014 to S3 or S3-compatible storage, and can serve them from your bucket or a CDN. WordPress stays the source of truth: attachment posts, titles, alt text, and metadata never leave your database.<\/p>\n\n<ul>\n<li>Auto-offload new uploads and generated sizes (per-object inventory and partial\/retry-safe uploads)<\/li>\n<li>A storage profile with admin CRUD and profile-scoped delivery URLs<\/li>\n<li>Dashboard, Media, Storage, Migration, Health, and Logs admin screens<\/li>\n<li>Migrate, verify, restore, adopt-existing, health scan, and repair tools<\/li>\n<li>Provider presets (AWS, Cloudflare R2, DigitalOcean Spaces, MinIO, Wasabi, Backblaze B2)<\/li>\n<li>WP-CLI, REST batch APIs, and resumable background jobs<\/li>\n<li>Optional Pro add-on for multiple storage profiles, cross-provider migration wizard, orphan scan, and advanced health tools \u2014 a separate plugin, not a trial or license key on this one<\/li>\n<\/ul>\n\n<p>Theme and plugin static assets are never rewritten \u2014 only Media Library attachments.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>KAZCODE Universal Storage connects only to object-storage services explicitly selected and configured by the site administrator. It does not send media, credentials, telemetry, or site data to any KAZCODE-owned service, and KAZCODE does not proxy your media through its own servers.<\/p>\n\n<p>The plugin can connect to Amazon S3, Cloudflare R2, DigitalOcean Spaces, Wasabi, Backblaze B2 through its S3-compatible API, MinIO, or another administrator-supplied S3-compatible endpoint. An account with the selected storage provider may be required. Connections occur only when the administrator configures or tests storage, or uses storage operations such as upload\/offload, download\/restore, HEAD\/verification, migration\/adoption of existing objects, or remote delete when that behavior is configured.<\/p>\n\n<p>Media files and storage API requests move directly between this WordPress site and the administrator-selected storage provider. Credentials are used only to authenticate to the configured storage provider and are not sent to KAZCODE servers. Data sent to the configured provider can include media\/object binary data, object keys and paths, and metadata or protocol fields required by the S3-compatible API.<\/p>\n\n<p>Amazon S3 \u2014 https:\/\/aws.amazon.com\/s3\/\nCustomer Agreement: https:\/\/aws.amazon.com\/agreement\/ \u2014 Privacy: https:\/\/aws.amazon.com\/privacy\/<\/p>\n\n<p>Cloudflare R2 \u2014 https:\/\/developers.cloudflare.com\/r2\/\nTerms: https:\/\/www.cloudflare.com\/legal\/terms\/ \u2014 Privacy: https:\/\/www.cloudflare.com\/privacypolicy\/<\/p>\n\n<p>DigitalOcean Spaces \u2014 https:\/\/www.digitalocean.com\/products\/spaces\nTerms: https:\/\/www.digitalocean.com\/legal\/terms-of-service-agreement \u2014 Privacy: https:\/\/www.digitalocean.com\/legal\/privacy-policy<\/p>\n\n<p>Wasabi Object Storage \u2014 https:\/\/wasabi.com\/product-terms\nLegal: https:\/\/wasabi.com\/legal \u2014 Privacy: https:\/\/wasabi.com\/legal\/privacy-policy<\/p>\n\n<p>Backblaze B2 Cloud Storage \u2014 https:\/\/www.backblaze.com\/cloud-storage\nTerms: https:\/\/www.backblaze.com\/company\/policy\/terms-of-service \u2014 Privacy: https:\/\/www.backblaze.com\/company\/policy\/privacy<\/p>\n\n<p>MinIO and other self-hosted or generic S3-compatible endpoints \u2014 the plugin talks directly to the administrator-configured endpoint; applicable terms and privacy depend on whoever operates it, not on KAZCODE. (https:\/\/min.io\/)<\/p>\n\n<h3>Development<\/h3>\n\n<p>The human-readable development source and release build tools for KAZCODE Universal Storage are maintained at:<\/p>\n\n<p>https:\/\/github.com\/kazmij\/kazcode-universal-storage-free<\/p>\n\n<p>Release builds use Composer and PHP-Scoper (third-party dependencies are namespace-prefixed to avoid collisions with other plugins). Build instructions are in that repository's BUILD.md.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/kazcode-universal-storage\/<\/code><\/li>\n<li>Activate through the <strong>Plugins<\/strong> menu<\/li>\n<li>Open <strong>Universal Storage \u2192 Settings<\/strong>, enter bucket credentials, and test the connection<\/li>\n<li>Enable offload and migrate existing media from <strong>Universal Storage \u2192 Migration<\/strong><\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20replace%20the%20media%20library%3F\"><h3>Does this replace the Media Library?<\/h3><\/dt>\n<dd><p>No. WordPress keeps attachment records; S3 stores the binary files.<\/p><\/dd>\n<dt id=\"which%20s3%20providers%20are%20supported%3F\"><h3>Which S3 providers are supported?<\/h3><\/dt>\n<dd><p>AWS S3 and S3-compatible APIs (R2, Spaces, MinIO, Wasabi, B2, generic endpoint).<\/p><\/dd>\n<dt id=\"what%27s%20the%20difference%20between%20free%20and%20pro%3F\"><h3>What's the difference between Free and Pro?<\/h3><\/dt>\n<dd><p>Free (this plugin) is a complete, non-trial product: automatic offload, migrate, verify, retry, restore, one storage profile, and full native Media Library integration. The separate Pro add-on unlocks multiple storage profiles with independent credentials, cross-provider\/cross-bucket migration with verify-before-switch, orphan scan, advanced health, and multisite network defaults. Deactivating Pro never deletes data or breaks media that's already being served.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20connect%20to%20any%20external%20service%3F\"><h3>Does this plugin connect to any external service?<\/h3><\/dt>\n<dd><p>Only the storage endpoint you configure yourself \u2014 Amazon S3, Cloudflare R2, DigitalOcean Spaces, Wasabi, Backblaze B2, MinIO, or another S3-compatible service \u2014 using the credentials and bucket you provide under Universal Storage \u2192 Storage. KAZCODE Universal Storage does not send your media files, credentials, or site data to any KAZCODE-owned server; there is no telemetry, tracking, or phone-home in this plugin.<\/p><\/dd>\n<dt id=\"does%20uninstalling%20delete%20my%20bucket%20files%3F\"><h3>Does uninstalling delete my bucket files?<\/h3><\/dt>\n<dd><p>No. Uninstalling never deletes remote storage objects, never contacts your storage provider, and never deletes WordPress attachments or local media files. By default it only removes disposable runtime state (locks, caches, queued job state) and preserves your storage profiles, credentials, and object inventory so a reinstall can recover them. An explicit \"Delete Universal Storage data when uninstalling\" setting (off by default) additionally removes that local plugin data \u2014 still never remote objects or media \u2014 if you want a full local cleanup.<\/p><\/dd>\n<dt id=\"where%20can%20i%20find%20documentation%3F\"><h3>Where can I find documentation?<\/h3><\/dt>\n<dd><p>Full documentation \u2014 installation, storage-provider setup, migration, restore, health, WP-CLI, troubleshooting, and Pro \u2014 is at https:\/\/kazcode.net\/universal-storage\/docs\/.<\/p><\/dd>\n<dt id=\"where%20can%20i%20get%20support%3F\"><h3>Where can I get support?<\/h3><\/dt>\n<dd><p>Use this plugin's WordPress.org support forum first. For direct contact, see https:\/\/kazcode.net\/universal-storage\/support\/ or reach KAZCODE at kazmij@gmail.com.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Strengthened remote verification before local media cleanup.<\/li>\n<li>Improved recovery behavior during transient storage-provider failures.<\/li>\n<li>Hardened shared-media and multi-profile object handling.<\/li>\n<li>Fixed remote-only media compatibility with WordPress editor and REST workflows.<\/li>\n<li>Improved restore and partial-failure safety.<\/li>\n<li>Hardened concurrent attachment operations against stale workers.<\/li>\n<li>Fixed Amazon S3 preset handling so stale custom endpoint settings cannot be reused for AWS connections.<\/li>\n<li>Added a global admin control to disable onboarding tutorials across plugin screens.<\/li>\n<li>Improved Composer and AWS SDK dependency isolation for compatibility with other plugins and Composer-based WordPress installations.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release<\/li>\n<li>Object inventory (<code>s3ms_objects<\/code>), storage profiles, derived attachment status, queue jobs<\/li>\n<li>Admin IA: Dashboard, Media, Storage (profile CRUD), Migration, Health, Logs, Settings<\/li>\n<li>Partial upload handling, retry for failed\/partial attachments, restore clears meta and inventory<\/li>\n<li>Profile-scoped public URLs, storage migration wizard, health\/repair\/adopt tools<\/li>\n<li>Free\/Pro feature separation, with the Pro-only implementation physically packaged in the separate Pro add-on rather than shipped (gated) inside this plugin; default plan is Free\/Lite unless the Pro add-on is active<\/li>\n<li>PHP-Scoper release builds (<code>Kazcode\\WpStorage\\Vendor<\/code> prefix)<\/li>\n<\/ul>","raw_excerpt":"Offload WordPress media to Amazon S3, Cloudflare R2, and S3-compatible storage while keeping the native Media Library experience.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/361796","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=361796"}],"author":[{"embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kazmij"}],"wp:attachment":[{"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=361796"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=361796"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=361796"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=361796"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=361796"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=361796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}