Kybern S3 Storage

Description

Kybern S3 Storage can keep regular WordPress Media Library files local while offloading attachments matched by configured Fluent Forms routing rules. It can also use one FileBird folder as the local exception: attachments assigned to any other FileBird folder are queued for S3 offload, while unfiled uploads remain local until an editor assigns a folder. Offloaded attachment URLs remain usable from WordPress, and the plugin can restore them back into local uploads later if you need a fallback.

It also adds optional Fluent Forms, FileBird, and protected PDF upload workflows:

  • Route selected Fluent Forms IDs into custom upload subdirectories such as documents.
  • Offload only those routed uploads into your S3 root prefix.
  • Assign matching Media Library attachments into a chosen FileBird folder.
  • Auto-create FileBird folders by name when a rule does not specify a folder ID.
  • Generate signed URLs for private buckets.
  • Preserve old /wp-content/uploads/... links for offloaded private files by redirecting them through signed S3 URLs.
  • Use CloudFront-compatible public delivery URLs for public buckets.
  • Queue migration batches in WordPress cron instead of one browser request.
  • Restore offloaded Media Library files from S3 back into local WordPress uploads with one recovery action.
  • Retry failed migration items without rerunning the whole library.
  • Export and import non-secret plugin settings as JSON without exposing AWS credentials.
  • Test your S3 credentials and permissions before migrating.

The plugin adds a settings page where you can configure:

  • Bucket name
  • Region
  • Optional custom endpoint
  • Optional public base URL or CDN URL
  • Optional CloudFront base URL
  • Root S3 prefix such as example.com/media-library
  • Whether local copies of routed uploads should be deleted after successful upload
  • A Local FileBird Folder ID that keeps one folder on the server while all other assigned FileBird folders offload to S3
  • Whether S3 offload is limited to Form Routing Rules when no Local FileBird Folder ID is configured
  • Whether private-bucket signed URLs should be used
  • Per-form Fluent Forms routing rules
  • Which FileBird folder should receive matching uploads, by ID or by auto-created folder name
  • Multiple dedicated FileBird folders for Circulars, with year-based S3 keys such as circolari/2026/1234-circolare.pdf
  • An administrator-only, resumable Circulars reorganisation tool for already offloaded PDFs
  • An administrator-only, read-only S3 Delivery Health audit with background batches, status, and retryable failed checks
  • An opt-in five-minute Circulars S3 incoming importer for verified direct S3 PDF uploads
  • An authenticated KybernAI callback for registering a PDF already uploaded to its final Circulars S3 path

External services

This plugin connects to an S3-compatible object storage service that you configure, such as Amazon S3 or another provider with an S3-compatible API.

It sends:

  • Uploaded file contents when offloading Media Library items or workflow-specific uploads
  • File names, MIME types, and object keys derived from your WordPress upload paths
  • Request metadata required by the S3 API, including bucket name, region, endpoint path, and AWS Signature V4 authorization headers generated from your configured credentials

This happens only when you:

  • Run the S3 connection test
  • Offload new or existing files to your configured bucket
  • Delete remote objects during cleanup
  • Recover an offloaded file back into local WordPress uploads

Service providers may include:

  • Amazon S3: https://aws.amazon.com/s3/
  • Any S3-compatible endpoint you configure yourself

If you use Amazon S3, review:

  • AWS Customer Agreement: https://aws.amazon.com/agreement/
  • AWS Service Terms: https://aws.amazon.com/service-terms/
  • AWS Privacy Notice: https://aws.amazon.com/privacy/

If you use another S3-compatible provider, review that provider’s terms of service and privacy policy before enabling offload.

Screenshots

Installation

  1. Upload the kybern-s3-storage folder to /wp-content/plugins/.
  2. Activate the plugin through the WordPress Plugins screen.
  3. Go to Settings > Kybern S3 Storage.
  4. Enter your S3 bucket configuration.
  5. Set the bucket name to my-site-media or your preferred no-dot bucket name.
  6. Set the root prefix you want to use in the bucket, for example example.com/media-library.
  7. If you want selected uploads routed into a custom path, add a form routing rule and optionally the FileBird folder ID or folder name.
  8. Save the settings.
  9. Run the S3 connection test.
  10. If needed, start the background migration to offload eligible attachments in non-Local FileBird folders, or attachments matched by Form Routing Rules when folder scope is not configured.
  11. To route Circulars, enter the comma-separated FileBird folder IDs used for the Circulars year folders, for example 56,52,28,27, and keep the Circulars S3 Subdirectory as circolari.
  12. Assign new Circular attachments to one of those FileBird folders. Kybern will queue the upload and store the files under circolari/[year]/ while keeping the permanent WordPress URL.
  13. Use S3 Delivery Health after configuration changes or a migration to verify every saved S3 mapping. The audit reads S3 metadata only and never repairs, moves, downloads, or deletes files.
  14. To import a Circular uploaded directly to S3, enable S3 Circulars Import and upload only to circolari/incoming/[year]/, for example circolari/incoming/2026/Circolare-N.01-2026.pdf. The importer runs every five minutes, creates a Media Library item, assigns the matching CIRCOLARI YYYY FileBird folder, verifies the final remote object, and removes the incoming source only after the mapping is saved.

FAQ

Does this plugin replace Cloud Storage Manager for Fluent Forms?

Yes, if your goal is to keep one owner for S3 offload and avoid overlapping Fluent Forms upload logic.

Does FileBird change the real upload path in WordPress?

No. FileBird organizes Media Library attachments, while Kybern S3 Storage controls the remote S3 object key structure for matched uploads.

Do Fluent Forms file fields need to save into the Media Library?

Yes, if you want FileBird assignment and consistent Media Library offload behavior.

Can I use a private bucket?

Yes. Enable signed URLs and set the expiration window that best fits your caching and access needs.

Do old upload links from form email notifications still work with a private bucket?

Yes. Since version 2.1.2, when signed URLs are enabled, Kybern S3 Storage keeps the original /wp-content/uploads/... link stable and generates a fresh signed S3 URL only when the link is opened. This prevents old emails, circular links and cached pages from retaining an expired 15-minute S3 URL while the bucket remains private.

What bucket name should I use for public files?

For direct public S3 URLs, prefer a bucket name without dots, such as my-site-media. AWS documents SSL limitations for virtual-hosted bucket names that contain periods.

Can I use CloudFront with this plugin?

Yes. Enable CloudFront delivery and enter the distribution or custom CDN base URL to serve public files without exposing direct S3 URLs.

Can I export these settings to another site?

Yes. The plugin can export and import settings as JSON. AWS access keys, secret keys, and session tokens are never included, so configure credentials separately on the destination site.

Can I delete local copies immediately?

Yes, but it is safer to leave local copies enabled until you have confirmed your S3 URLs, permissions, and backups.

How does Circulars routing work?

Set the comma-separated Circulars FileBird Folder IDs in the Transfer Fluent Forms to FileBird Folders Workflow section. When a new, not-yet-offloaded attachment is assigned to one of those folders, Kybern stores its main file and generated sizes under the configured root prefix followed by circolari/[year]/. The attachment ID is included in the object name to prevent files with the same filename from overwriting one another.

This route does not automatically change historical S3 objects or saved mappings. Historical Circulars are changed only when an administrator explicitly starts the controlled reorganisation workflow described below.

How does the S3 Circulars incoming importer work?

The importer is disabled by default. When enabled, it inspects only the configured incoming prefix below the plugin Root Prefix, which defaults to circolari/incoming/. It accepts only files stored directly in a four-digit year folder whose filename begins with Circolare and ends in .pdf, for example circolari/incoming/2026/Circolare-N.01-2026.pdf.

Every five minutes it verifies the source object, downloads it temporarily to confirm the PDF signature and size, creates the WordPress Media Library attachment, assigns the configured CIRCOLARI 2026 FileBird folder, copies and verifies the final object at circolari/2026/[attachment-id]-[filename], saves the WordPress mapping, and then deletes both the local temporary copy and the incoming S3 object. Existing circolari/[year]/ archive objects are never listed or changed. A saved incoming-source reference prevents duplicate attachments if a cleanup retry is needed.

How does KybernAI direct Circular registration work?

For the KybernAI platform, enable KybernAI Direct Circular Import instead of the incoming importer. After KybernAI has uploaded a PDF to its final S3 location under circolari/[year]/, it sends the exact object key to the authenticated WordPress endpoint. The plugin verifies that the key belongs to the configured Circulars archive, confirms the PDF signature and size, creates the Media Library attachment, assigns the configured CIRCOLARI YYYY FileBird folder, and maps that same S3 object to the permanent WordPress upload URL.

The direct integration never lists the archive, moves objects, creates a second final object, or deletes the original S3 PDF. A saved source key makes repeated KybernAI notifications idempotent.

How does the Circulars S3 reorganisation work?

Use the two-step guide in the Circulars S3 Reorganisation panel. In Step 1, select the Circulars year and click Preview Eligible PDFs. The preview does not move files or change WordPress mappings. Wait for its confirmation, then verify the year and totals shown in Latest Preview before continuing.

In Step 2, select the same verified year, choose the batch size, and click Start or Resume Circulars Reorganisation. Follow the live progress bar while WordPress processes background batches. The run is finished when its status is Completed and progress reaches 100%. Use Retry Failed Circulars only if failed IDs remain after the main run.

The selected CIRCOLARI YYYY FileBird folder is the authoritative year: this supports documents imported after their publication year. The worker selects only attachments that are PDFs, assigned to that configured Circulars FileBird folder, and whose stored filename begins with Circolare, or whose attachment title begins with Circolare when a legacy CIRC... filename was retained.

For every eligible attachment, the worker copies each mapped S3 object to circolari/[year]/[attachment-id]-[filename], verifies the copied object size, updates the WordPress mapping, and only then removes the previous S3 object. It runs in resumable background batches, with preview, stop, and retry controls. Attachments without a stored S3 mapping are reported but left unchanged.

What does S3 Delivery Health check?

The administrator-only delivery audit checks every attachment marked as offloaded and every S3 object saved in its WordPress mapping. It uses S3 metadata requests only, so it does not download media or modify WordPress, local uploads, or S3. A failed check remains queued for a controlled retry and is not repaired automatically. Use it after a bulk operation, changing S3 credentials or paths, or when diagnosing a missing file.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Kybern S3 Storage” is open source software. The following people have contributed to this plugin.

Contributors

Translate “Kybern S3 Storage” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

2.6.7

  • Retained failed FileBird S3 uploads in a durable queue with automatic delayed retries and administrator-visible errors.
  • Added administrator controls to retry failed uploads and requeue locally available Circular PDFs by year for S3 verification.
  • Removed AWS credentials and session tokens from exported settings files.

2.6.6

  • Added a guided two-step interface for previewing and starting Circulars S3 reorganisation safely.
  • Added clear preview validation, live-progress completion, stop, and failed-item retry guidance.
  • Documented the complete two-step Circulars workflow in both plugin readme files.

2.6.5

  • Separated S3, Fluent Forms, and Brevo configuration into individual modern settings cards.
  • Updated both workflow headings and applied the Dashboard status-table styling to their settings tables.
  • Added a responsive sticky save action while preserving one secure WordPress settings form.

2.6.4

  • Split the admin interface into dedicated Dashboard and Settings views with accessible navigation tabs.
  • Moved connection testing and all background-operation tools to Dashboard while keeping configuration fields in Settings.
  • Avoided loading operation state and progress polling while editing settings.

2.6.3

  • Restored readable dark text in success and error notices on the Kybern S3 Storage admin page.

2.6.2

  • Redesigned the settings and background-operation interface with responsive cards and clearer action groups.
  • Added live progress bars, elapsed time, and estimated remaining time for migration, delivery audit, Circulars reorganisation, incoming import, and recovery.
  • Added protected status polling and reliable per-operation totals without reloading the settings page.
  • Reordered start, stop, retry, and preview controls to match each operation’s workflow.

2.6.1

  • Added authenticated KybernAI direct Circular registration for PDFs already stored in the final circolari/[year]/ S3 archive.
  • Created the matching WordPress Media Library attachment and FileBird year assignment without scanning, copying, moving, or deleting the final S3 object.
  • Added exact-object duplicate protection and PDF size/signature verification for the direct callback.

2.6.0

  • Added an opt-in five-minute S3-to-WordPress importer for direct Circular PDF uploads placed in the dedicated circolari/incoming/[year]/ prefix.
  • Restricted imports to verified Circolare*.pdf files, a configured FileBird Circulars year folder, a 50 MB limit, and a PDF signature check.
  • Added copy-and-size verification, duplicate protection, incoming-source cleanup only after WordPress mapping, and administrator-visible import status.

2.5.1

  • Replaced private S3 PDF-preview thumbnails in the WordPress Media Library grid with WordPress’s local document icon.
  • Kept the original protected document URL and signed S3 delivery unchanged when an editor opens or downloads a PDF.
  • Removed the per-document redirect and remote-preview waterfall that delayed the Media Library when CVs and Circulars were visible.

2.5.0

  • Added an administrator-only S3 Delivery Health audit that verifies every saved remote object mapping in safe background batches.
  • Added live audit status for attachments checked, healthy attachments, S3 objects checked, failed checks and queued attachment IDs.
  • Added stop and retry controls. The audit is read-only: it never downloads, moves, repairs or deletes files.

2.4.2

  • Verified every mapped S3 object and its size before allowing local attachment files to be removed.
  • Re-uploaded a mapped file when its remote object is missing or does not match the local size, instead of trusting a stale mapping.
  • Kept the local file and returned a clear error if upload verification cannot complete.
  • Restored private S3 delivery for generated image sizes whose paths are stored in an attachment object map, preventing costly WordPress 404 pages in the Media Library.

2.4.1

  • Updated historical Circulars reorganisation to identify the selected FileBird year folder as the authoritative year, rather than the later WordPress upload date.
  • Added compatibility for historical Circular PDFs whose stored filenames use legacy CIRC... names but whose attachment titles begin with Circolare.
  • Documented the selective S3 operating rule: keep normal editorial media local and use S3 only for approved form documents and Circular PDF folders.

2.4.0

  • Added an administrator-only, resumable Circulars S3 reorganisation workflow for historical files.
  • Added preview, stop, and retry controls with per-item status reporting.
  • Restricted relocation to PDF attachments in configured Circulars FileBird folders, for the selected upload year, whose stored filename begins with Circolare.
  • Added server-side S3 copy and object-size verification before WordPress mappings are changed and old objects are removed.

2.3.0

  • Added a dedicated FileBird Circulars route with year-based S3 object keys.
  • Preserved permanent WordPress attachment URLs and Kybern object mappings.
  • Prevented filename collisions by including the attachment ID in new Circular object keys.
  • Left existing S3-only attachments and WPvivid backup paths unchanged.

2.2.1

  • Added a direct Settings link on the Plugins screen.

2.2.0

  • Added FileBird folder-based offload scope with one Local folder exception.
  • Moving an attachment to a non-Local FileBird folder queues S3 offload without blocking the Media Library UI.
  • Moving an existing S3-only attachment into the configured Local folder restores its local files automatically.
  • Kept unfiled uploads local until an editor assigns a FileBird folder.

2.1.4

  • Added form-routing-only S3 scope: ordinary Media Library uploads remain local while configured Fluent Forms routing rules continue to offload to S3.
  • Restricted local-file deletion to successfully offloaded routed attachments.
  • Kept the Brevo and FileBird workflow local when form-routing-only scope is enabled.
  • Prevented background migration from scanning ordinary Media Library attachments in form-routing-only mode.

2.1.3

  • Serve restored local media files directly instead of redirecting them back through S3.
  • Keep explicitly marked static attachments, and future files named as logos or headers, in local WordPress uploads after offload.
  • Preserve S3 offload for ordinary Media Library files while protecting theme branding and header delivery.

2.1.2

  • Kept private attachment, image-size and srcset links on stable WordPress uploads URLs.
  • Generated a fresh signed S3 URL at request time through the existing legacy-upload redirect.
  • Prevented cached pages and form emails from retaining expired signed URLs.

2.1.1

  • Added legacy uploads URL handling for offloaded Media Library files.
  • Fixed old form-upload email links so private S3 buckets return signed URLs instead of unsigned S3 redirects.
  • Removed the need for static Apache S3 redirect rules for offloaded routed documents.

2.1.0

  • Confirmed compatibility with WordPress 7.1.
  • Updated the plugin author link to KybernAI.
  • Optimized migration and recovery batches to avoid slow Media Library meta queries.

0.2.6

  • Replaced the inline settings-page script with a properly enqueued admin script.
  • Expanded the external services disclosure for Amazon S3 and other S3-compatible providers.
  • Updated WordPress compatibility metadata for the current release.

0.2.5

  • Replaced discouraged temporary file deletion calls with WordPress-native file deletion.
  • Hardened settings import temp-file validation.
  • Reworked background batch attachment lookups to avoid direct SQL queries.
  • Added the missing languages directory expected by the plugin header.

0.2.4

  • Added a recovery workflow that restores offloaded Media Library files from S3 back into the local WordPress uploads directory.
  • Added a background recovery section and button on the settings page.
  • Added S3 object download support to the bundled client.

0.2.3

  • Reworked Fluent Forms routing so uploads are tagged after processing instead of overriding the live upload path.
  • Fixed the form rule flow that could break Fluent Forms AJAX uploads with a 500 error.

0.2.2

  • Removed the Fluent Forms temporary upload path override that could trigger 500 errors during AJAX file uploads.

0.2.1

  • Added FileBird folder auto-create by folder name.
  • Added retry mode for failed migration items.
  • Added settings export and import.
  • Added CloudFront-compatible delivery mode for public files.
  • Improved migration status display and retry safety.

0.2.0

  • Added per-form Fluent Forms routing rules.
  • Added signed URL support for private buckets.
  • Added S3 connection test.
  • Added cron-backed background migration.
  • Improved S3-compatible endpoint handling.

0.1.0

  • Initial release.
  • S3 offload for WordPress Media Library attachments.
  • Attachment URL rewriting for original images and image sizes.
  • Fluent Forms routing into a dedicated subdirectory.
  • Optional FileBird folder assignment for HR uploads.
  • Admin migration tool for existing Media Library items.