KAZCODE Universal Storage

Changelog

Release history

1.0.1 - reliability and compatibility hotfix

This release strengthens the data-safety contract around offloaded media: KAZCODE now keeps local files unless the correct remote object is proven, treats temporary provider failures as unknown instead of missing, and prevents stale background workers from overwriting newer media state with stale results.

Data integrity

  • Local media cleanup now requires size-verified remote objects, not only a successful existence check.
  • Timeouts, throttling, authentication failures, and provider outages are classified as unknown/provider errors rather than confirmed missing objects.
  • Changed local bytes are uploaded even when the remote key and byte length are unchanged.
  • Partial restores keep remaining recovery metadata and object inventory intact.
  • Partial provider batch-delete failures remain visible and retryable.

Multi-profile and shared media

  • Existing media is restored, verified, signed, materialized, and deleted through the Storage Profile where it was actually stored.
  • Changing the default upload profile no longer changes where older media is read from or operated on.
  • The Amazon S3 preset now ignores stale custom endpoint/path-style values, so a previous MinIO or custom S3 endpoint cannot break AWS S3 connection tests.
  • Remote delete now fails closed when an object may be shared by another attachment or ownership is ambiguous.
  • Cross-profile migration keeps verify-before-switch behavior and preserves the source when destination verification is uncertain.

WordPress compatibility

  • Remote-only media now works more reliably through WordPress REST and editor flows that inspect original image metadata.
  • Image Editor, regenerate, and local materialization paths use the bound Storage Profile instead of the current default profile.
  • WordPress 7.1 media metadata generation guards remain in place so cleanup cannot run while image sizes are still being generated.
  • Admin tutorials can now be disabled globally across plugin screens while still allowing manual replay.
  • Storage Profile delete controls now stay visible and explain why deletion is blocked when a profile is protected.

Concurrency and packaging

  • State-mutating attachment operations now use fenced leases with owner tokens and monotonic generations.
  • Expired workers cannot release a newer worker's lock or overwrite newer attachment state.
  • The release build improves Composer, AWS SDK, Guzzle, PSR, and Symfony isolation for coexistence with other plugins and Composer-based WordPress installs.

Upgrade notes

  • No database schema change is introduced in 1.0.1.
  • Existing settings, Storage Profiles, object inventory, license state, and offloaded media continue to work after updating.
  • The full physical-object reference model, crash-resumable multipart uploads, competitor importers, and deeper integration work remain deferred to later feature releases.

1.0.0 — first public release

Added

  • Amazon S3, Cloudflare R2, and S3-compatible storage (DigitalOcean Spaces, Wasabi, Backblaze B2, MinIO, or a custom endpoint)
  • Native WordPress Media Library integration — status column, row/bulk actions, unchanged Grid/List/modal/Featured Image/Gutenberg experience
  • Object-level media inventory, including every generated image size
  • Safe handling of partial uploads — a failed size is never falsely marked offloaded
  • Retry of failed or missing media objects, and restore back to WordPress on demand
  • Storage health checks and verification, with an AWS setup assistant (checklist + a ready-to-use least-privilege IAM policy)
  • Storage Profiles — connection, credentials, and delivery URL configuration
  • A first-run setup wizard and an in-admin overview of what KAZCODE Universal Storage Pro adds
  • PHP-Scoper–isolated AWS SDK, so it won't collide with other plugins bundling their own copy

Pro

KAZCODE Universal Storage Pro is a separate add-on. It adds multiple storage profiles with independent credentials, cross-provider/cross-bucket migration with verify-before-switch safety, a dry-run orphan scan, advanced storage health, and multisite network defaults. Deactivating Pro never deletes data or breaks media already being served.

Compatibility

  • Requires WordPress 6.7+ and PHP 8.3+
  • Verified against WordPress 7.1, PHP 8.3 / 8.4 / 8.5
  • Verified against Amazon S3, Cloudflare R2 (including a live S3 → R2 migration), and MinIO