{"id":343431,"date":"2026-08-05T08:23:19","date_gmt":"2026-08-05T08:23:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/bitsplit-media-delivery\/"},"modified":"2026-08-05T08:22:58","modified_gmt":"2026-08-05T08:22:58","slug":"bitsplit-media-delivery","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/bitsplit-media-delivery\/","author":23535988,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.4","stable_tag":"1.2.4","tested":"7.0.2","requires":"5.6","requires_php":"7.4","requires_plugins":null,"header_name":"BitSplit Media Delivery","header_author":"frolpaxa","header_description":"Stop serving ready-to-download media files. Add friction to direct downloads, hotlinking, and generic scraping.","assets_banners_color":"","last_updated":"2026-08-05 08:22:58","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/bitsplit.site\/","header_author_uri":"https:\/\/github.com\/frolpaxa","rating":0,"author_block_rating":0,"active_installs":0,"downloads":30,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.4":{"tag":"1.2.4","author":"frolpaxa","date":"2026-08-05 08:22:58"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.4"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[274497,163,84,188691],"plugin_category":[50],"plugin_contributors":[274498],"plugin_business_model":[],"class_list":["post-343431","plugin","type-plugin","status-publish","hentry","plugin_tags-anti-hotlink","plugin_tags-images","plugin_tags-media","plugin_tags-scraping","plugin_category-media","plugin_contributors-frolpaxa","plugin_committers-frolpaxa"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/bitsplit-media-delivery.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>BitSplit changes the delivery workflow for public WordPress images. Instead of\nleaving a finished image at one public URL, it converts the original and generated\nsizes to incomplete BitSplit blocks. The browser obtains short-lived reconstruction\ndata and rebuilds each image on demand.<\/p>\n\n<p>Learn more at <a href=\"https:\/\/bitsplit.site\/\">bitsplit.site<\/a>.<\/p>\n\n<p>This adds friction to:<\/p>\n\n<ul>\n<li>direct \"copy URL and download\" workflows;<\/li>\n<li>hotlinking;<\/li>\n<li>generic image downloaders and scrapers;<\/li>\n<li>bulk collection of ready-to-use image files.<\/li>\n<\/ul>\n\n<p>BitSplit is <strong>not encryption, DRM, or a promise that downloading is impossible<\/strong>.\nA determined viewer can inspect the browser flow, automate reconstruction, or\ncapture rendered content. Use it when raising the cost of casual downloading is\nvaluable; use established encryption and access control when confidentiality is\nrequired.<\/p>\n\n<h4>Included functionality<\/h4>\n\n<p>The plugin protects any number of image attachments. All image functionality\nshipped in this WordPress.org package is available without payment, a license,\na trial, or a usage quota.<\/p>\n\n<p>It includes public or logged-in-only access, Gutenberg image support,\nfeatured-image and <code>srcset<\/code> handling, and backup\/recovery tools.<\/p>\n\n<h4>Delivery flow<\/h4>\n\n<ol>\n<li>WordPress stores each image as an incomplete BitSplit block, with reconstruction\ndata stored separately in attachment metadata.<\/li>\n<li>Front-end image markup receives a placeholder instead of the original image URL.<\/li>\n<li>The browser establishes an ephemeral P-256 ECDH session.<\/li>\n<li>Reconstruction data is transported with HKDF and AES-256-GCM.<\/li>\n<li>Block bytes require a short-lived, session-bound signed token.<\/li>\n<li>The browser reconstructs the image into a temporary Blob URL.<\/li>\n<\/ol>\n\n<p>The transport encryption protects reconstruction data in transit; the BitSplit\nblock itself is not encrypted and contains most source bytes.<\/p>\n\n<h4>Access modes<\/h4>\n\n<ul>\n<li><strong>Public visitors<\/strong> - public images remain viewable; BitSplit adds download and\nscraping friction.<\/li>\n<li><strong>Logged-in users only<\/strong> - anonymous visitors cannot obtain reconstruction data\nor block bytes.<\/li>\n<\/ul>\n\n<h4>WordPress coverage<\/h4>\n\n<p>BitSplit handles normal attachment images, Gutenberg Image and Gallery blocks,\nfeatured images, <code>srcset<\/code>, classic content containing <code>wp-image-ID<\/code>, and the\n    [bitsplit id=\"123\"] shortcode.<\/p>\n\n<h4>Storage<\/h4>\n\n<p>Incomplete blocks are stored in a plugin-owned directory resolved through\n    wp_upload_dir(), while reconstruction data stays in WordPress post metadata.\nThe plugin does not write web-server configuration files or require users to edit\nserver configuration.<\/p>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>PHP 7.4 or newer<\/li>\n<li>GMP extension<\/li>\n<li>OpenSSL with ECDH support<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>bitsplit-media-delivery<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate <strong>BitSplit Media Delivery<\/strong>.<\/li>\n<li>Open <strong>Tools -&gt; BitSplit<\/strong>.<\/li>\n<li>Choose an access mode.<\/li>\n<li>Enable split image delivery.<\/li>\n<li>Export the recovery manifest and store it safely.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20bitsplit%20make%20downloading%20impossible%3F\"><h3>Does BitSplit make downloading impossible?<\/h3><\/dt>\n<dd><p>No. Public content must reach the viewer's browser. BitSplit removes the simple\nready-file URL and makes downloaders reproduce the reconstruction protocol.<\/p><\/dd>\n<dt id=\"is%20bitsplit%20encryption%3F\"><h3>Is BitSplit encryption?<\/h3><\/dt>\n<dd><p>No. The reconstruction-data transport uses standard cryptography, but the stored\nBitSplit block is an incomplete, unencrypted representation of the source.<\/p><\/dd>\n<dt id=\"is%20any%20included%20functionality%20locked%20behind%20payment%3F\"><h3>Is any included functionality locked behind payment?<\/h3><\/dt>\n<dd><p>No. Every feature and all executable code included in this WordPress.org package\nare available without payment, a license, a trial, or a quota.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20deactivate%20or%20delete%20the%20plugin%3F\"><h3>What happens when I deactivate or delete the plugin?<\/h3><\/dt>\n<dd><p>The plugin attempts to restore protected image attachments to their normal public\npaths before removing its metadata. Keep a current exported manifest and filesystem\nbackup before bulk operations.<\/p><\/dd>\n<dt id=\"does%20it%20need%20python%3F\"><h3>Does it need Python?<\/h3><\/dt>\n<dd><p>No. The codec is implemented in PHP with GMP and in browser JavaScript.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Make the directory package a self-contained image plugin with no locked functionality.<\/li>\n<li>Move separately distributed media-type integrations out of the directory package.<\/li>\n<li>Store images only as keyless blocks and do not write web-server configuration.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Store images as keyless blocks and migrate records created by earlier versions.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Improve activation and deactivation recovery.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Preserve protected image settings during updates.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Add unlimited image attachment protection.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Add public and logged-in-only access policies.<\/li>\n<li>Add short-lived session-bound tokens and same-origin checks.<\/li>\n<li>Add Gutenberg Image\/Gallery, featured-image, classic-content, and srcset coverage.<\/li>\n<li>Stream block creation for large image files.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial image delivery prototype with ECDH key transport, browser reconstruction,\nand recovery manifests.<\/li>\n<\/ul>","raw_excerpt":"Add friction to direct image downloads, hotlinking, and generic scraping.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/343431","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=343431"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/frolpaxa"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=343431"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=343431"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=343431"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=343431"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=343431"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=343431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}