{"id":361915,"date":"2026-08-31T12:37:18","date_gmt":"2026-08-31T12:37:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/coywolf-files\/"},"modified":"2026-08-31T12:36:57","modified_gmt":"2026-08-31T12:36:57","slug":"coywolf-files","status":"publish","type":"plugin","link":"https:\/\/ory.wordpress.org\/plugins\/coywolf-files\/","author":115787,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.9","stable_tag":"1.0.9","tested":"7.1","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"Coywolf Files","header_author":"Coywolf","header_description":"Upload any-sized file to Cloudflare R2 or Amazon S3 and embed it with a Coywolf File block \u2014 a download card with light and dark themes, plus an All Files library that tracks which posts and pages use each file.","assets_banners_color":"","last_updated":"2026-08-31 12:36:57","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/coywolf.com\/apps\/coywolf-files\/","header_author_uri":"https:\/\/coywolf.com\/jon-henshaw\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":47,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.9":{"tag":"1.0.9","author":"jonhenshaw","date":"2026-08-31 12:36:57","revision":3674213}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3674213,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3674213,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":{"coywolf\/file":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"coywolf\/file","title":"Coywolf File","category":"media","icon":"media-default","description":"Upload a file to Cloudflare R2 or Amazon S3, or pick one from your library, and show a download card visitors can download or copy a link to.","keywords":["file","download","attachment","upload","document"],"textdomain":"coywolf-files","supports":{"html":false,"align":["wide","full"],"anchor":true},"attributes":{"fileId":{"type":"string","default":""},"fileName":{"type":"string","default":""},"title":{"type":"string","default":""},"description":{"type":"string","default":""},"mime":{"type":"string","default":""},"ext":{"type":"string","default":""},"size":{"type":"number","default":0},"uploaded":{"type":"string","default":""},"showIcon":{"type":"boolean"},"showDescription":{"type":"boolean"},"showMeta":{"type":"boolean"},"showDownload":{"type":"boolean"},"showCopyLink":{"type":"boolean"},"align":{"type":"string"}},"editorScript":"coywolf-files-block","editorStyle":"coywolf-files-block-editor","viewScript":"coywolf-files-view","style":"coywolf-files-view"}},"tagged_versions":["1.0.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3674213,"resolution":"1","location":"assets","locale":"","width":1998,"height":1692},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3674213,"resolution":"2","location":"assets","locale":"","width":2154,"height":1712},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3674213,"resolution":"3","location":"assets","locale":"","width":2158,"height":1710}},"screenshots":{"1":"A published download card \u2014 colored file-type badge, file name, description, and a \"type \u00b7 size \u00b7 uploaded date\" meta line, with Download and Copy-link controls. Light and dark themes follow the visitor's system.","2":"The All Files library: every file currently placed in a post or page, with per-file download, post, and page counts. Deleting a file here removes it from storage and from every post or page that used it.","3":"The Appearance settings, with a live preview card that updates as you change the color scheme, accent color, and display toggles."}},"plugin_section":[],"plugin_tags":[6918,255106,568,260],"plugin_category":[],"plugin_contributors":[265832],"plugin_business_model":[],"class_list":["post-361915","plugin","type-plugin","status-publish","hentry","plugin_tags-amazon-s3","plugin_tags-cloudflare-r2","plugin_tags-download","plugin_tags-file","plugin_contributors-jonhenshaw","plugin_committers-jonhenshaw"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/coywolf-files\/assets\/icon-128x128.png?rev=3674213","icon_2x":"https:\/\/ps.w.org\/coywolf-files\/assets\/icon-256x256.png?rev=3674213","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/coywolf-files\/assets\/screenshot-1.png?rev=3674213","caption":"A published download card \u2014 colored file-type badge, file name, description, and a \"type \u00b7 size \u00b7 uploaded date\" meta line, with Download and Copy-link controls. Light and dark themes follow the visitor's system."},{"src":"https:\/\/ps.w.org\/coywolf-files\/assets\/screenshot-2.png?rev=3674213","caption":"The All Files library: every file currently placed in a post or page, with per-file download, post, and page counts. Deleting a file here removes it from storage and from every post or page that used it."},{"src":"https:\/\/ps.w.org\/coywolf-files\/assets\/screenshot-3.png?rev=3674213","caption":"The Appearance settings, with a live preview card that updates as you change the color scheme, accent color, and display toggles."}],"raw_content":"<!--section=description-->\n<p>Coywolf Files stores your downloadable files in your own object storage \u2014 Cloudflare R2 or Amazon S3 \u2014 instead of the WordPress media library, and gives you a Coywolf File block to add them to posts and pages. Files upload straight from the browser to your bucket, so there is no upload-size limit from PHP.<\/p>\n\n<p>Features:<\/p>\n\n<ul>\n<li>Coywolf File block \u2014 upload a new file or browse to one you have already uploaded, then rename it and add a description for that placement, just like any other block. Per-block toggles control the file-type icon, description, meta line, and the Download \/ Copy-link buttons.<\/li>\n<li>Any-sized uploads \u2014 files upload directly from the browser to your bucket using presigned URLs, with large files sent in resumable chunks. Nothing passes through PHP, so the maximum size is your bucket's, not your host's.<\/li>\n<li>Download card \u2014 a clean card with a colored file-type badge, the file name, a \"type \u00b7 size \u00b7 uploaded date\" line, and Download and Copy-link controls, with light and dark themes.<\/li>\n<li>Two providers, one connection \u2014 Cloudflare R2 and Amazon S3 both speak the S3 API, so you connect one bucket with an access key, secret key, bucket name, and region (or Cloudflare account ID).<\/li>\n<li>Private or public buckets \u2014 keep your bucket private (the default) and files are served through short-lived signed links behind a stable URL on your own site, or point downloads at a public bucket \/ CDN URL.<\/li>\n<li>All Files library \u2014 a table of the files currently added to posts and pages, with per-file counts of how many posts and pages use each one (each count links to a filtered list) and a download counter. Deleting a file here removes it from storage and from every post or page that used it.<\/li>\n<li>Secure credentials \u2014 the secret key is stored encrypted, or kept entirely out of the database in wp-config.php.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the object-storage provider you configure \u2014 one of Cloudflare R2 or Amazon S3 \u2014 to store and serve your files. Nothing is sent anywhere until you enter credentials and connect a bucket.<\/p>\n\n<p>What is sent and when:<\/p>\n\n<ul>\n<li>When you connect a bucket or click Test connection, your WordPress server calls the provider's S3 API (for example s3.amazonaws.com or .r2.cloudflarestorage.com) using your access key and secret key to verify the bucket, to start and finish uploads, to confirm and delete objects, and to sign download links.<\/li>\n<li>When you upload a file, your browser uploads the file's bytes directly to your bucket's storage host using a short-lived signed URL that your server generated.<\/li>\n<li>When a visitor downloads a file, their browser is redirected to a short-lived signed URL (or your configured public URL) on the storage host to fetch the file.<\/li>\n<\/ul>\n\n<p>The provider is the one you choose; consult its terms and privacy policy:<\/p>\n\n<ul>\n<li>Amazon S3 \u2014 Service Terms: https:\/\/aws.amazon.com\/service-terms\/ \u00b7 Privacy Notice: https:\/\/aws.amazon.com\/privacy\/<\/li>\n<li>Cloudflare R2 \u2014 Terms: https:\/\/www.cloudflare.com\/website-terms\/ \u00b7 Privacy Policy: https:\/\/www.cloudflare.com\/privacypolicy\/<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to wp-content\/plugins\/coywolf-files or install the zip from Plugins &gt; Add New &gt; Upload Plugin.<\/li>\n<li>Activate it.<\/li>\n<li>Go to Files &gt; Settings and connect your Cloudflare R2 or Amazon S3 bucket (access key, secret key, bucket, and region or Cloudflare account ID), then click Test connection.<\/li>\n<li>Add a CORS rule to your bucket so the browser can upload to it \u2014 the exact policy is on the Files &gt; Documentation screen.<\/li>\n<li>Add the Coywolf File block to a post or page and upload or select a file.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20are%20my%20files%20stored%3F\"><h3>Where are my files stored?<\/h3><\/dt>\n<dd><p>In your own object-storage bucket \u2014 Cloudflare R2 or Amazon S3. WordPress stores only a small record of each file (name, size, type, and which posts and pages use it) and your settings. Files are not copied into the WordPress media library.<\/p><\/dd>\n<dt id=\"is%20there%20an%20upload%20size%20limit%3F\"><h3>Is there an upload size limit?<\/h3><\/dt>\n<dd><p>The plugin itself imposes no size limit. Files upload directly from the browser to your bucket, so PHP's upload_max_filesize and memory limits do not apply \u2014 the limit is whatever your storage provider allows.<\/p><\/dd>\n<dt id=\"why%20do%20i%20need%20to%20set%20a%20cors%20rule%20on%20my%20bucket%3F\"><h3>Why do I need to set a CORS rule on my bucket?<\/h3><\/dt>\n<dd><p>Because the browser uploads directly to your bucket, the bucket has to allow cross-origin uploads from your site. It is a one-time setting; the Documentation screen gives you the exact policy to paste in.<\/p><\/dd>\n<dt id=\"can%20visitors%20see%20my%20storage%20credentials%3F\"><h3>Can visitors see my storage credentials?<\/h3><\/dt>\n<dd><p>No. The secret key never reaches the browser. Uploads use short-lived presigned URLs, and downloads go through a link on your own site that redirects to a short-lived signed URL (or your public bucket URL, if you configure one).<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20delete%20a%20file%3F\"><h3>What happens when I delete a file?<\/h3><\/dt>\n<dd><p>Deleting a file from the All Files screen removes the object from your bucket and strips its block from every post or page that used it. Deleting the plugin does not delete your files from the bucket.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Point the Plugin URI at the plugin's home page and add plugin screenshots.<\/li>\n<li>Packaging: the WordPress.org build now passes Plugin Check with zero errors and warnings and carries no self-updater references. No functional change.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Confirm WordPress 7.1 compatibility (Tested up to: 7.1) (#9).<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Code quality: inline the option and settings-group names at their call sites (WordPress.org prefix-visibility best practice). No functional or data change.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Rename the block to \"Coywolf File\" to avoid confusion with WordPress's built-in File block.<\/li>\n<li>Streamline storage support to Cloudflare R2 and Amazon S3.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Settings: constrain the appearance preview to a card-like width so it no longer spans the full row.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Settings: add a live appearance preview \u2014 a sample download card that updates as you change the color scheme, accent color, and display toggles.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Settings: hide the access key, secret key, bucket, storage location, advanced, and connection fields until a provider is selected, so the form reveals itself step by step.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Settings: show only the storage-location field relevant to the selected provider \u2014 Region for Amazon S3, Cloudflare account ID for Cloudflare R2.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Add a Check CORS button to Settings that runs a real test upload from the browser and reports exactly what to fix (including a missing ExposeHeaders: ETag).<\/li>\n<li>Expand Documentation with per-provider, step-by-step instructions for getting credentials and configuring the bucket CORS rule (Cloudflare R2, Amazon S3).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: the Coywolf File block, direct-to-storage uploads for Cloudflare R2 \/ Amazon S3, the download card with light and dark themes, and the All Files library.<\/li>\n<\/ul>","raw_excerpt":"Upload any-sized file to Cloudflare R2 or Amazon S3 and embed it with a Coywolf File block visitors can download or copy a link to.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/361915","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=361915"}],"author":[{"embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jonhenshaw"}],"wp:attachment":[{"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=361915"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=361915"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=361915"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=361915"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=361915"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ory.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=361915"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}