Restore
Restore
Restore file to captured state
Every captured change carries its SHA-256-addressed content in BLOB_STORE. Restoring writes that content back to the original path — current file gets backed up to <path>.drift_restore_backup_<epoch> before overwrite.
What will change
Preview -- nothing has been written yet.
| Target file | /var/www/vhosts/3dshawn.com/site1/TEMPLATES/page_wrapper.html |
| Site | DriftSense self-monitor on local |
| Kind | local |
| Captured at | 2026-07-11 18:27:49 |
| Captured SHA | 74428de4f3ea6f608b4709b6db3c2572c0a18bfbefa2a5fa5bb868f0c7778d1a |
Current state on disk
Live check just now. If SHAs match, the restore is a no-op.
| File present | yes |
| Size | 6871 bytes |
| Current SHA | 5b6934827553 |
| Same as captured? | no -- restore will change it |
What restore will change — live diff
Left column shows current on-disk content; right shows what restore will write. +0 additions, -20 deletions, 94 unchanged context lines.
| 1 | 1 | <!doctype html> |
| 2 | 2 | <html lang="en"> |
| 3 | 3 | <head> |
| 4 | 4 | <meta charset="utf-8"> |
| 5 | 5 | <meta name="viewport" content="width=device-width, initial-scale=1"> |
| 6 | 6 | <title>$page_title -- $brand_name</title> |
| 7 | 7 | <link rel="stylesheet" href="/assets/styles/drift_sense.css?v=$asset_version"> |
| 8 | <link rel="stylesheet" href="/assets/styles/help_tips.css?v=$asset_version"> | |
| 9 | 8 | </head> |
| 10 | 9 | <body> |
| 11 | 10 | <div class="app"> |
| 12 | 11 | |
| 13 | 12 | <aside class="sidebar"> |
| 14 | 13 | <a class="sidebar-brand" href="[url:dashboard]"> |
| 15 | 14 | <div class="logo">DS</div> |
| 16 | 15 | <div> |
| 17 | 16 | <div class="name">Drift<span class="accent">Sense</span></div> |
| 18 | 17 | <div class="role">$brand_tagline</div> |
| 19 | 18 | </div> |
| 20 | 19 | </a> |
| 21 | 20 | |
| 22 | 21 | <div class="sidebar-section-label">Monitor</div> |
| 23 | 22 | <a href="[url:dashboard]" class="sidebar-link[if:$active_dashboard] active[/if]"> |
| 24 | 23 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="9"/><rect x="14" y="3" width="7" height="5"/><rect x="14" y="12" width="7" height="9"/><rect x="3" y="16" width="7" height="5"/></svg> |
| 25 | 24 | <span>Dashboard</span> |
| 26 | 25 | </a> |
| 27 | 26 | <a href="[url:file_changes]" class="sidebar-link[if:$active_file_changes] active[/if]"> |
| 28 | 27 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg> |
| 29 | 28 | <span>File changes</span> |
| 30 | 29 | </a> |
| 31 | 30 | <a href="[url:schema_changes]" class="sidebar-link[if:$active_schema_changes] active[/if]"> |
| 32 | 31 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5v6c0 1.7 4 3 9 3s9-1.3 9-3V5"/><path d="M3 11v6c0 1.7 4 3 9 3s9-1.3 9-3v-6"/></svg> |
| 33 | 32 | <span>Schema changes</span> |
| 34 | 33 | </a> |
| 35 | 34 | <a href="[url:table_locks]" class="sidebar-link[if:$active_table_locks] active[/if]"> |
| 36 | 35 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg> |
| 37 | 36 | <span>Table locks</span> |
| 38 | 37 | </a> |
| 39 | 38 | <a href="[url:named_releases]" class="sidebar-link[if:$active_named_releases] active[/if]"> |
| 40 | 39 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 13V7a2 2 0 0 0-2-2h-4l-2-3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5"/><path d="M14 19l2 2 4-4"/></svg> |
| 41 | 40 | <span>Named releases</span> |
| 42 | </a> | |
| 43 | <a href="/sites.cgi" class="sidebar-link[if:$active_sites] active[/if]"> | |
| 44 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg> | |
| 45 | <span>Sites ($sites_ct)</span> | |
| 46 | 41 | </a> |
| 47 | ||
| 48 | [if:$has_stables] | |
| 49 | <div class="sidebar-section-label">Stable versions</div> | |
| 50 | [loop:@stable_releases] | |
| 51 | <a href="$restore_url" class="sidebar-link ds-stable-link" title="Restore all pinned to this stable version"> | |
| 52 | <span class="ds-stable-tag">v</span> | |
| 53 | <span>$label</span> | |
| 54 | </a> | |
| 55 | [/loop] | |
| 56 | [/if] | |
| 57 | 42 | |
| 58 | 43 | <div class="sidebar-section-label">Notify & export</div> |
| 59 | 44 | <a href="/alerts.cgi" class="sidebar-link[if:$active_alerts] active[/if]"> |
| 60 | 45 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg> |
| 61 | 46 | <span>Alerts</span> |
| 62 | 47 | </a> |
| 63 | 48 | <a href="/export.cgi" class="sidebar-link[if:$active_export] active[/if]"> |
| 64 | 49 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg> |
| 65 | 50 | <span>Compliance export</span> |
| 66 | </a> | |
| 67 | <a href="/purge_log.cgi" class="sidebar-link[if:$active_purge_log] active[/if]"> | |
| 68 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"/><line x1="10" y1="11" x2="10" y2="17"/><line x1="14" y1="11" x2="14" y2="17"/></svg> | |
| 69 | <span>Purge log</span> | |
| 70 | 51 | </a> |
| 71 | 52 | |
| 72 | 53 | <div class="sidebar-section-label">Configuration</div> |
| 73 | 54 | <a href="[url:databases]" class="sidebar-link[if:$active_databases] active[/if]"> |
| 74 | 55 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.7-4 3-9 3s-9-1.3-9-3"/><path d="M3 5v14c0 1.7 4 3 9 3s9-1.3 9-3V5"/></svg> |
| 75 | 56 | <span>Databases</span> |
| 76 | 57 | </a> |
| 77 | 58 | <a href="[url:file_monitors]" class="sidebar-link[if:$active_file_monitors] active[/if]"> |
| 78 | 59 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg> |
| 79 | 60 | <span>File monitors</span> |
| 80 | 61 | </a> |
| 81 | 62 | <a href="[url:servers]" class="sidebar-link[if:$active_servers] active[/if]"> |
| 82 | 63 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="2" width="20" height="8" rx="2"/><rect x="2" y="14" width="20" height="8" rx="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg> |
| 83 | 64 | <span>Servers & agents</span> |
| 84 | 65 | </a> |
| 85 | 66 | <a href="[url:containers]" class="sidebar-link[if:$active_containers] active[/if]"> |
| 86 | 67 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/><polyline points="7.5 4.21 12 6.81 16.5 4.21"/><polyline points="7.5 19.79 7.5 14.6 3 12"/><polyline points="21 12 16.5 14.6 16.5 19.79"/></svg> |
| 87 | 68 | <span>Containers</span> |
| 88 | 69 | </a> |
| 89 | 70 | <a href="[url:settings]" class="sidebar-link[if:$active_settings] active[/if]"> |
| 90 | 71 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M12 1v6m0 10v6M4.22 4.22l4.24 4.24m7.08 7.08l4.24 4.24M1 12h6m10 0h6M4.22 19.78l4.24-4.24m7.08-7.08l4.24-4.24"/></svg> |
| 91 | 72 | <span>Settings</span> |
| 92 | 73 | </a> |
| 93 | 74 | </aside> |
| 94 | 75 | |
| 95 | 76 | <main class="app-main"> |
| 96 | 77 | <header class="topbar"> |
| 97 | 78 | <h1>$page_title</h1> |
| 98 | 79 | <div class="topbar-spacer"></div> |
| 99 | 80 | <div class="topbar-user"> |
| 100 | 81 | <span class="initials">$user_initials</span> |
| 101 | 82 | <span>$user_name</span> |
| 102 | 83 | </div> |
| 103 | 84 | </header> |
| 104 | 85 | <div class="app-content"> |
| 105 | 86 | $page_body |
| 106 | 87 | </div> |
| 107 | 88 | </main> |
| 108 | 89 | |
| 109 | 90 | </div> |
| 110 | 91 | <script src="/assets/js/tz_localize.js?v=$asset_version"></script> |
| 111 | 92 | <script src="/assets/js/ds_charts.js?v=$asset_version"></script> |
| 112 | <script src="/assets/js/ds_help.js?v=$asset_version"></script> | |
| 113 | 93 | </body> |
| 114 | 94 | </html> |
Confirm restore
Backs current content to <target>.drift_restore_backup_<epoch>, writes the captured content, verifies SHA post-write.