{"id":350181,"date":"2026-08-16T20:15:49","date_gmt":"2026-08-16T20:15:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/digipacket-wp-backup\/"},"modified":"2026-08-16T20:15:35","modified_gmt":"2026-08-16T20:15:35","slug":"digipacket","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/digipacket\/","author":23519881,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.1","stable_tag":"2.0.1","tested":"7.0.4","requires":"6.8","requires_php":"8.2","requires_plugins":null,"header_name":"Digipacket Backup Toolkit","header_author":"Digipacket","header_description":"Professional backup, restore, import and export toolkit for WordPress.","assets_banners_color":"1d6b84","last_updated":"2026-08-16 20:15:35","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/digipacket.net\/plugins\/digipacket","header_author_uri":"https:\/\/digipacket.net","rating":0,"author_block_rating":0,"active_installs":0,"downloads":19,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.0.1":{"tag":"2.0.1","author":"digipacket","date":"2026-08-16 20:15:35"}},"upgrade_notice":{"1.6.6":"<p>Backups move out of the plugin directory, where a plugin update used to delete them.\nExisting archives are carried over automatically when the files were replaced by hand.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3650163,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3650163,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3650163,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3650163,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3650163,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3650163,"resolution":"1","location":"assets","locale":"","width":1280,"height":1010},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3650163,"resolution":"2","location":"assets","locale":"","width":1280,"height":877},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3650163,"resolution":"3","location":"assets","locale":"","width":1280,"height":559},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3650163,"resolution":"4","location":"assets","locale":"","width":1280,"height":774},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3650163,"resolution":"5","location":"assets","locale":"","width":1280,"height":761},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3650163,"resolution":"6","location":"assets","locale":"","width":1280,"height":2126},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3650163,"resolution":"7","location":"assets","locale":"","width":1280,"height":684},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3650163,"resolution":"8","location":"assets","locale":"","width":1280,"height":839}},"screenshots":{"1":"The dashboard: one verdict on whether the site is protected, and the shortcut that fixes what is missing.","2":"The Backup Manager: every archive with its size, its origin and what the last integrity check concluded.","3":"Starting a backup, with the size the archive is expected to reach.","4":"The restore wizard: choosing the restore point, before anything is written.","5":"Scheduled backups: the hour each task starts at, its retention rule, and when it next runs.","6":"Security: what encryption covers, the keyring, and the master password that lets an archive travel.","7":"Settings: what deleting the plugin does to your archives \u2014 nothing, unless you say so.","8":"Logs: every journal the plugin keeps of its own work, ready to be read or cleared."}},"plugin_section":[],"plugin_tags":[151,12167,4155,152,264458],"plugin_category":[59],"plugin_contributors":[268121],"plugin_business_model":[],"class_list":["post-350181","plugin","type-plugin","status-publish","hentry","plugin_tags-backup","plugin_tags-encryption","plugin_tags-migration","plugin_tags-restore","plugin_tags-scheduled-backups","plugin_category-utilities-and-tools","plugin_contributors-digipacket","plugin_committers-digipacket"],"banners":{"banner":"https:\/\/ps.w.org\/digipacket\/assets\/banner-772x250.png?rev=3650163","banner_2x":"https:\/\/ps.w.org\/digipacket\/assets\/banner-1544x500.png?rev=3650163","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/digipacket\/assets\/icon.svg?rev=3650163","icon":"https:\/\/ps.w.org\/digipacket\/assets\/icon.svg?rev=3650163","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/digipacket\/assets\/screenshot-1.png?rev=3650163","caption":"The dashboard: one verdict on whether the site is protected, and the shortcut that fixes what is missing."},{"src":"https:\/\/ps.w.org\/digipacket\/assets\/screenshot-2.png?rev=3650163","caption":"The Backup Manager: every archive with its size, its origin and what the last integrity check concluded."},{"src":"https:\/\/ps.w.org\/digipacket\/assets\/screenshot-3.png?rev=3650163","caption":"Starting a backup, with the size the archive is expected to reach."},{"src":"https:\/\/ps.w.org\/digipacket\/assets\/screenshot-4.png?rev=3650163","caption":"The restore wizard: choosing the restore point, before anything is written."},{"src":"https:\/\/ps.w.org\/digipacket\/assets\/screenshot-5.png?rev=3650163","caption":"Scheduled backups: the hour each task starts at, its retention rule, and when it next runs."},{"src":"https:\/\/ps.w.org\/digipacket\/assets\/screenshot-6.png?rev=3650163","caption":"Security: what encryption covers, the keyring, and the master password that lets an archive travel."},{"src":"https:\/\/ps.w.org\/digipacket\/assets\/screenshot-7.png?rev=3650163","caption":"Settings: what deleting the plugin does to your archives \u2014 nothing, unless you say so."},{"src":"https:\/\/ps.w.org\/digipacket\/assets\/screenshot-8.png?rev=3650163","caption":"Logs: every journal the plugin keeps of its own work, ready to be read or cleared."}],"raw_content":"<!--section=description-->\n<p>Digipacket Backup Toolkit copies your files and your database into a single <code>.dpbackup<\/code>\narchive, puts that archive back when you need it, and can seal it with AES-256-GCM\nso a stolen copy is worth nothing without your key.<\/p>\n\n<p>Everything runs on your own server. The plugin makes <strong>no outbound connection<\/strong>,\nhas no account, no telemetry and no paid tier hidden behind a button.<\/p>\n\n<h4>Built for hosts that cut you off<\/h4>\n\n<p>Shared hosting kills long requests. Every operation here is therefore cut into\nslices that fit inside <code>max_execution_time<\/code> and resume where they stopped \u2014 the\nfile scan, the SQL dump, the compression, the encryption, the extraction and the\nrow-by-row replay of the database. A 100,000-file site is backed up and restored\nwith flat memory, in as many requests as it takes.<\/p>\n\n<h4>What it does today<\/h4>\n\n<ul>\n<li><strong>Backups<\/strong> \u2014 full site, database only, <code>wp-content<\/code>, plugins, themes or uploads.\nProgress is reported live, with the size, the duration and the checksum of the archive.<\/li>\n<li><strong>Backup Manager<\/strong> \u2014 search, filters, sorting, pagination, integrity check, rename,\nduplicate, download and delete, plus a detail card showing the manifest and the\njournal the archive carries inside itself.<\/li>\n<li><strong>Import<\/strong> \u2014 upload an archive produced on another site, in slices. Every entry is\nverified before publication: signature, checksums, manifest, directory traversal,\nZip Slip and symbolic links are all refused.<\/li>\n<li><strong>Restore<\/strong> \u2014 a seven step wizard with preflight checks. A safety snapshot of the\ncurrent site is taken <strong>before a single byte is written<\/strong>, and a failure half way\nthrough rolls the site back to it automatically.<\/li>\n<li><strong>Scheduled backups<\/strong> \u2014 hourly to monthly, or a custom cron expression. Retention\nby count or by age, run history, pause, duplicate, and a Run Now button. Deleting a\nschedule never deletes the backups it produced.<\/li>\n<li><strong>Encryption<\/strong> \u2014 AES-256-GCM over the whole container, a keyring that survives\nrotation, an optional master password, and transparent decryption when you import\nor restore. Existing backups can be sealed afterwards, and sealed ones opened again.<\/li>\n<li><strong>Logs<\/strong> \u2014 every operation writes what it did and why it stopped. Read a journal by\nseverity or by search, delete one, or clear the ones older than your retention rule.<\/li>\n<\/ul>\n\n<h4>Where your backups live<\/h4>\n\n<p>In <code>wp-content\/digipacket-backups\/<\/code>, outside the plugin directory \u2014 because\nWordPress deletes a plugin's own folder before installing a new version, and a\nbackup plugin that stored its archives there would destroy them at every update.<\/p>\n\n<p>The folder is protected by an <code>.htaccess<\/code> and a silent <code>index.php<\/code>, both written\nat activation. Nginx ignores <code>.htaccess<\/code>, so on Nginx the equivalent rule has to\nbe added by hand \u2014 see the FAQ below. The <code>digipacket_wp_backup_storage_path<\/code>\nfilter moves the whole thing anywhere you like, including outside the web root,\nwhich is stronger than any web server rule.<\/p>\n\n<h4>What it does not do<\/h4>\n\n<ul>\n<li>No export to Google Drive, Dropbox, S3 or OneDrive yet. That is the next release.<\/li>\n<li>No incremental backups: every run produces a complete archive.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin through <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>, or extract it into\n   wp-content\/plugins\/.<\/li>\n<li>Activate it. Eight storage directories are created, with their protection files.\nNo database table is added.<\/li>\n<li>Open <strong>Backup Toolkit \u2192 New Backup<\/strong> and take your first backup.<\/li>\n<li>Optionally visit <strong>Backup Toolkit \u2192 Settings<\/strong> to decide what deleting the plugin does\nto your archives. It destroys nothing unless you ask it to.<\/li>\n<\/ol>\n\n<p>The plugin needs PHP 8.2, WordPress 6.8, and the <code>zip<\/code> and <code>openssl<\/code> PHP extensions.\nIf any of these is missing it stays inert and explains why in a notice, rather than\nfailing with an error.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"are%20my%20backups%20sent%20anywhere%3F\"><h3>Are my backups sent anywhere?<\/h3><\/dt>\n<dd><p>No. The plugin makes no outbound connection of any kind. Your archives stay on your\nserver until you download them yourself.<\/p><\/dd>\n<dt id=\"the%20task%20says%20active%2C%20the%20hour%20has%20passed%2C%20and%20nothing%20ran.\"><h3>The task says Active, the hour has passed, and nothing ran.<\/h3><\/dt>\n<dd><p>Open <strong>Backup Toolkit \u2192 Scheduled Backups<\/strong>. If the screen says WP-Cron is not firing,\nthat is the answer: WordPress only runs scheduled work when a request comes in,\nand it triggers that work through a request the server makes to itself. A local\ninstall, a firewall or an HTTP password blocks it, and nothing ever runs.<\/p>\n\n<p>The fix is a real cron. Add to <code>wp-config.php<\/code>:<\/p>\n\n<pre><code>define('DISABLE_WP_CRON', true);\n<\/code><\/pre>\n\n<p>then, every five minutes:<\/p>\n\n<pre><code>curl -s https:\/\/example.com\/wp-cron.php?doing_wp_cron &gt; \/dev\/null\n<\/code><\/pre>\n\n<p>Check the timezone too. The <strong>Next run<\/strong> tile is written on the site's clock, in\n<strong>Settings \u2192 General<\/strong>, which is not always the one on your wall.<\/p><\/dd>\n<dt id=\"my%20scheduled%20backup%20never%20ran.%20why%3F\"><h3>My scheduled backup never ran. Why?<\/h3><\/dt>\n<dd><p>Two reasons, usually together. First, a new schedule fires one full interval after\nyou create it \u2014 a daily task runs in 24 hours, not tonight. The <strong>Next run<\/strong> column\ntells you exactly when. Second, WP-Cron only wakes up when someone loads a page, so\non a site with no traffic nothing happens until your next visit. For a dependable\nschedule, disable WP-Cron and call <code>wp-cron.php<\/code> from a real system cron.<\/p><\/dd>\n<dt id=\"can%20i%20choose%20the%20hour%20a%20scheduled%20backup%20runs%20at%3F\"><h3>Can I choose the hour a scheduled backup runs at?<\/h3><\/dt>\n<dd><p>Yes. Pick <strong>Every day<\/strong> or <strong>Every week<\/strong>, then fill <strong>Start at<\/strong> \u2014 and for a\nweekly one, tick the days. The hour is the one on your site's clock, and it stays\nthat hour when the clocks change.<\/p>\n\n<p>Leave it empty and the frequency behaves as a plain interval: a daily task\ncreated at 14:07 runs at 14:07 the next day.<\/p><\/dd>\n<dt id=\"my%20scheduled%20backup%20says%20it%20failed.%20where%20do%20i%20see%20why%3F\"><h3>My scheduled backup says it failed. Where do I see why?<\/h3><\/dt>\n<dd><p>The notice names the cause itself. The full account is in <strong>Backup Toolkit \u2192 Logs<\/strong>,\njournal <code>schedule<\/code>, and in the task's own <strong>History<\/strong> \u2014 the \u22ee menu of its row.<\/p>\n\n<p>One cause looks like a failure but is not: if a backup was already running when\nthe schedule fired \u2014 a manual one whose tab was closed keeps the engine busy for\nup to an hour \u2014 the task simply waits and starts on its own within minutes. It\nis not marked failed and its next run is not pushed to tomorrow.<\/p><\/dd>\n<dt id=\"what%20is%20this%20pre_restore_%E2%80%A6%20file%3F\"><h3>What is this pre_restore_\u2026 file?<\/h3><\/dt>\n<dd><p>The safety snapshot. Before a restore writes anything, the plugin takes a complete\nbackup of the site as it stands, so a failure can be undone. It is a normal backup,\nmarked \"Safety copy\" in the library. It is never deleted automatically \u2014 delete it\nyourself once you are satisfied the restore worked.<\/p><\/dd>\n<dt id=\"i%20lost%20my%20master%20password.%20can%20you%20recover%20my%20archives%3F\"><h3>I lost my master password. Can you recover my archives?<\/h3><\/dt>\n<dd><p>No, and neither can anyone else. That is what encryption means. The keyring in\n    storage\/keys\/keyring.json opens the archives sealed on this site; back it up\nsomewhere safe, or set a master password so an archive can travel to another site.<\/p><\/dd>\n<dt id=\"can%20i%20restore%20a%20backup%20on%20a%20different%20site%3F\"><h3>Can I restore a backup on a different site?<\/h3><\/dt>\n<dd><p>Yes. Import the archive on the other site, then restore it. If the archive is\nencrypted and the other site does not have your keyring, the import pauses and asks\nfor the master password instead of failing.<\/p><\/dd>\n<dt id=\"does%20deleting%20the%20plugin%20delete%20my%20backups%3F\"><h3>Does deleting the plugin delete my backups?<\/h3><\/dt>\n<dd><p>No. Uninstalling removes nothing by default. There is a setting to opt into a full\ncleanup, and it is off unless you turn it on.<\/p><\/dd>\n<dt id=\"i%20run%20nginx.%20how%20do%20i%20protect%20the%20backup%20folder%3F\"><h3>I run Nginx. How do I protect the backup folder?<\/h3><\/dt>\n<dd><p>Nginx never reads <code>.htaccess<\/code>, so the guard the plugin writes has no effect there.\nAdd this to your <code>server { }<\/code> block, before the generic <code>location ~ \\.php$<\/code> block,\nthen reload with <code>nginx -t &amp;&amp; systemctl reload nginx<\/code>:<\/p>\n\n<pre><code>location ~* \/wp-content\/digipacket-backups\/ { deny all; return 403; }\n<\/code><\/pre>\n\n<p>If you moved the storage with the <code>digipacket_wp_backup_storage_path<\/code> filter, use\nyour own path in that rule. Better still, point the filter at a directory outside\nthe document root \u2014 <code>\/var\/backups\/digipacket\/<\/code>, readable and writable by the PHP\nuser \u2014 and no web server rule is needed at all, because there is no URL that can\nreach the archives.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20shared%20hosting%3F\"><h3>Does it work on shared hosting?<\/h3><\/dt>\n<dd><p>That is what it is designed for. Every long operation resumes across requests, so a\n30 second <code>max_execution_time<\/code> is enough.<\/p><\/dd>\n<dt id=\"where%20do%20i%20get%20help%3F\"><h3>Where do I get help?<\/h3><\/dt>\n<dd><p>Ask in the support forum here, or write to us directly at\nhttps:\/\/dynetwork.net\/contact.php \u2014 the link is on the plugins list and on the Logs\nscreen. If something failed, send the records from <strong>Backup Toolkit \u2192 Logs<\/strong> with it:\nthat file is what explains a failure after the fact.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.1<\/h4>\n\n<ul>\n<li><code>Security<\/code> now owns every superglobal read in the plugin, and hands back\nnothing until the request has proved its nonce and its capability. Handlers\nused to verify once and then read <code>$_POST<\/code> from a dozen small private helpers:\nthe check did run first, but nothing in the code said so, and a reader called\nfrom a new path tomorrow would have read unproved input without anything\nfailing. Reading input and proving the request are now the same act.<\/li>\n<li>Covered that rule with a suite, after finding that the WordPress stand-in used\nby the tests had no <code>wp_verify_nonce<\/code> at all \u2014 so every authorisation check in\nthe suite had been passing on a function that did not exist.<\/li>\n<li>Removed the Nginx sample file. It protected <code>wp-content\/plugins\/\u2026\/storage\/<\/code>,\nwhich has not been where the archives live since 1.6.6, so its rules guarded an\nempty directory. The correct rule is in the FAQ, pointing at the real path.<\/li>\n<li>Text domain aligned with the directory slug.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Renamed to Digipacket Backup Toolkit. The plugin directory does not allow a\nstandalone \"WP\" in a plugin's public naming, so the display name, the slug,\nthe text domain and the sidebar entry all changed. Nothing about how the\nplugin works changed with them: the storage path, the settings, the filters\nand the archives already on disk are untouched.<\/li>\n<\/ul>\n\n<h4>1.9.10<\/h4>\n\n<ul>\n<li>Dropped the empty storage skeleton the package still carried from the layout\nused before 1.6.6. The storage has lived in <code>wp-content\/digipacket-backups\/<\/code>\nsince then, where activation creates every directory and writes its own\n  .htaccess and <code>index.php<\/code>; the copies inside the plugin were byte-identical\ndead weight, and one stray <code>index.json<\/code> had no business shipping at all.<\/li>\n<li>Declared compatibility with WordPress 7.0.<\/li>\n<\/ul>\n\n<h4>1.9.9<\/h4>\n\n<ul>\n<li>Statistic tiles no longer cut their value short. \"August 3, 2026 17:37\" is what\nthe default WordPress date format produces, and it does not fit a quarter of\nthe screen: every date tile ended in an ellipsis. The value wraps instead.<\/li>\n<li>Refreshed the screenshots of the listing.<\/li>\n<\/ul>\n\n<h4>1.9.8<\/h4>\n\n<ul>\n<li>The dashboard card no longer outlines itself in amber when it has a warning to\ngive \u2014 \"Backups are not encrypted\" and its siblings. The dot beside the title\nalready says it.<\/li>\n<\/ul>\n\n<h4>1.9.7<\/h4>\n\n<ul>\n<li>The \u22ee menu of a row is no longer cut off by the table. It was positioned\ninside the wrapper that scrolls the table sideways, and anything positioned\ninside a box with <code>overflow<\/code> set is clipped by it: everything past the third\nentry disappeared at the edge. It now floats above the screen, opens upward\nwhen the row sits near the bottom of the window, and closes when the page\nscrolls under it.<\/li>\n<\/ul>\n\n<h4>1.9.6<\/h4>\n\n<ul>\n<li><strong>Scheduled backups now run.<\/strong> Every one of them was dying on the same line:\nWP-Cron runs with nobody logged in, WordPress answers that with a user whose\nlogin is <code>false<\/code> rather than an empty string, and five copies of the same\nthree-line method returned it from a function declared to return a string. The\nresulting TypeError killed the request before the backup had recorded\nanything, so the task kept its lock, wrote no failure, and did nothing \u2014\nsilently, every five minutes.<\/li>\n<li>There is now one place that answers \"who triggered this\", it answers \"system\"\nwhen nobody did, and a test runs a whole scheduled backup as nobody.<\/li>\n<\/ul>\n\n<h4>1.9.5<\/h4>\n\n<ul>\n<li>A scheduled run now writes down what killed it. A backup that runs at three in\nthe morning has no witness: when the request carrying it dies \u2014 memory\nexhausted, execution time exceeded, a fatal error in another plugin \u2014 every\nline it would have written dies with it, and the journal shows a start\nfollowed by silence. The plugin now arms a witness before touching the engine\nand records the fatal, with its message, its file and its line.<\/li>\n<li>Anything thrown out of the engine is caught and recorded as a failure of the\ntask, instead of ending the request without a word.<\/li>\n<\/ul>\n\n<h4>1.9.4<\/h4>\n\n<ul>\n<li>A run whose request is killed before it can record what it started no longer\njams its task. The lock it left behind was held for its full fifteen minutes,\nthe task started again, died in the same place and waited again \u2014 a loop that\nproduced nothing and reported nothing, while the journal read\n\"skipped: locked\" every five minutes.<\/li>\n<li>A lock with no run behind it is now taken back after two minutes, and the\njournal says so as a warning, with what to look at next.<\/li>\n<\/ul>\n\n<h4>1.9.3<\/h4>\n\n<ul>\n<li>The Scheduled Backups screen now says when WP-Cron is not firing at all, and\nwhen the scheduler was last woken up. A site whose loopback request is blocked\n\u2014 a local install, a firewall, an HTTP password \u2014 ran nothing and said nothing,\nwhich is indistinguishable from a plugin that does not work.<\/li>\n<\/ul>\n\n<h4>1.9.2<\/h4>\n\n<ul>\n<li>A paused scheduled backup now says so at the top of the screen, and says how\nto resume it. It used to sit in a column with a \"Next run\" that had already\ngone by, which reads exactly like a backup that failed silently.<\/li>\n<li>A paused task no longer advertises a next run it will never honour.<\/li>\n<li>The Status column says \"Active\" rather than \"Running\": \"Running\" also meant a\nbackup being written at that moment, and one word could not carry both.<\/li>\n<li>The next run is printed on the clock of the site, like the tile above it. The\ntwo disagreed by the offset of whoever was looking at the screen.<\/li>\n<\/ul>\n\n<h4>1.9.1<\/h4>\n\n<ul>\n<li>A scheduled backup can now be given the hour it starts at, and a weekly one\nthe days it runs on. The hour is read in the timezone of the site and follows\nit through daylight saving; a hand written cron expression is still read in\nUTC, as it always was.<\/li>\n<li>Fixed the \u22ee menu of the task table and of the Backup Manager. It opened and\nclosed on the same click, which made every row action unreachable.<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>Backups are named after the day they were taken \u2014 \"Backup Aug 01, 2026\" \u2014\nin the library, the restore wizard and the Security screen. The identifier\nstays what it always was: it names the file on disk, it is still what every\naction uses, and it is shown in the detail card.<\/li>\n<li>A backup you renamed keeps the name you gave it.<\/li>\n<li>Searching matches what the row reads, and still matches the identifier.<\/li>\n<\/ul>\n\n<h4>1.8.2<\/h4>\n\n<ul>\n<li>A scheduled backup that could not start because another backup was already\nrunning is no longer reported as a failure. It kept its failure count, and it\npushed the next run to the following day \u2014 so one abandoned manual backup cost\na whole night. The task now waits and starts on its own at the next tick.<\/li>\n<li>Failure notices say why. \"Scheduled backup X failed.\" carried no cause, and\nthe reason sat in the journal where nobody was told to look.<\/li>\n<\/ul>\n\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>The administration canvas is now a pale wash instead of white, so the cards\nread as surfaces sitting on top of it. The cards themselves stay white.<\/li>\n<li>The footer credit reads \"Built by dynetwork\".<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>Rebuilt the interface on a single design system: one file now holds every\ncolour, radius, shadow, spacing step and duration, and every screen paints\nfrom it. A test refuses any value written anywhere else.<\/li>\n<li>White canvas, white surfaces separated by hairline borders, one blue for\nanything actionable, and more room between things.<\/li>\n<li>Icons throughout: the statistic tiles, the card headings and the main actions\nnow carry an inline Lucide icon. Nothing is fetched from a third party.<\/li>\n<li>Motion is uniform: every transition now runs between 150 and 200ms, and the\nwhole interface stops moving when the system asks for reduced motion.<\/li>\n<li>Fixed the labels of the Settings and Security checkboxes, which were printed\nbold and broken onto two lines.<\/li>\n<li>Fixed the Security screen's own styles, which had never applied: the rule that\ncarried them could not match the element it was written for.<\/li>\n<\/ul>\n\n<h4>1.7.3<\/h4>\n\n<ul>\n<li>The plugin now signs its own screens: \"Built by dynetwork.net\" replaces the\nWordPress footer sentence on its pages, and nowhere else.<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Added a support link, on the plugins list and on the Logs screen.<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Fixed the \"Delete this journal\" button on the Logs screen: red text on a red\nblock, which is to say no button at all.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Added the Logs screen: read any journal by severity or by search, delete one, or\nclear the ones older than the retention rule.<\/li>\n<li>Dates now read as dates. The dashboard, the Security screen and the schedule\ntable were printing raw ISO timestamps, which overflowed their tiles.<\/li>\n<li>Schedule states read as words instead of machine values.<\/li>\n<li>\"Last archive\" on the New Backup screen showed 0 B instead of the real size.<\/li>\n<li>Added the Settings screen. The uninstall preference existed since the first release\nand no screen offered it: you could never turn it on, nor be sure it was off.<\/li>\n<li>Encrypting or decrypting an archive is now written to the security journal.<\/li>\n<li>The Security dashboard repaints after every action instead of showing stale figures.<\/li>\n<li>Added skeleton loading and icons to the Security screen.<\/li>\n<\/ul>\n\n<h4>1.6.7<\/h4>\n\n<ul>\n<li>The Type, Status and Integrity badges now read as words instead of machine values.<\/li>\n<\/ul>\n\n<h4>1.6.6<\/h4>\n\n<ul>\n<li><strong>Backups are no longer stored inside the plugin directory.<\/strong> Updating the plugin\nused to delete them. They now live in <code>wp-content\/digipacket-backups\/<\/code>, and anything\nleft by an older layout is carried over on activation.<\/li>\n<\/ul>\n\n<h4>1.6.5<\/h4>\n\n<ul>\n<li>Added a download button on every row of the Backup Manager.<\/li>\n<\/ul>\n\n<h4>1.6.4<\/h4>\n\n<ul>\n<li>Added a delete button on every row of the Backup Manager.<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Fixed the Restore screen hanging forever on \"Analyse this backup\".<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Fixed the Restore screen listing no backup at all.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Fixed unreadable panels on machines using a dark system theme.<\/li>\n<li>The dashboard now reports the real state of the site instead of a placeholder.<\/li>\n<li>Plugin updates now run the installation routine again.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Added encryption: AES-256-GCM, keyring, master password, key rotation, migration of\nexisting backups, and transparent decryption on import and restore.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added scheduled backups, retention rules, run history and notifications.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added the Backup Manager: search, filters, sorting, integrity checks and downloads.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Added the restore engine, with preflight checks, safety snapshot and rollback.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added the import of archives produced on another site.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added the backup engine.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Back up, restore, import and encrypt your WordPress site. Resumable on any host, AES-256-GCM sealed, and nothing leaves your server.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/350181","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=350181"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/digipacket"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=350181"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=350181"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=350181"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=350181"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=350181"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=350181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}