Restore

O Operator
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/file_changes.html
SiteDriftSense self-monitor on local
Kindlocal
Captured at2026-07-11 23:34:34
Captured SHA126e96514828d71ec93899bbca2cad4ff7736510a2ba2c9f76dc596148091995
Current state on disk
Live check just now. If SHAs match, the restore is a no-op.
File presentyes
Size4423 bytes
Current SHA5e80aec5f8bb
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, -8 deletions, 56 unchanged context lines.
11<div class="page-head">
22 <span class="page-eyebrow"><span class="dot"></span> Monitor</span>
33 <h1 class="page-title">File changes</h1>
44 <p class="page-subtitle">Every file change captured on every watched path. Click a row to view the full diff and restore point.</p>
5</div>
6
7<div class="ds-guide">
8 <div class="dsg-icon">i</div>
9 <div>
10 <span class="dsg-title">Reading the list:</span>
11 Each row is one captured change. Click the <strong>filename</strong> or <strong>blob SHA</strong> to open the diff viewer, or the <strong>Restore</strong><span class="ds-help" data-help-title="What Restore does" data-help-body="Writes this captured version's content back to its original path. Current on-disk content is backed up to <code>&lt;path&gt;.drift_restore_backup_&lt;epoch&gt;</code> before the overwrite. Post-write SHA is verified. Every attempt is logged to <code>RESTORE_LOG</code> whether it succeeded or failed."></span> chip to write it back to disk. The <strong>30-day rhythm</strong><span class="ds-help" data-help-title="Sparkline" data-help-body="A tiny bar chart of how often this file changed over the last 30 days. Files with a busy sparkline are likely <em>live-config</em> files &mdash; consider pinning them via <a href='/pin_hotspots.cgi'>Pin hotspots</a>."></span> sparkline shows the file's activity pattern. The <strong>ts</strong> pill means &quot;timestamp only&quot; (mtime touched but bytes identical) &mdash; usually noise.
12 </div>
135</div>
146
157$picker_html
168
179<form method="get" action="/file_changes.cgi" style="display:flex;gap:8px;align-items:center;margin-bottom:16px">
1810 <input type="hidden" name="days" value="7">
1911 <span class="rb-label" style="font-size:11px;letter-spacing:1.4px;text-transform:uppercase;color:var(--text-muted);font-weight:700">Path filter</span>
2012 <input type="text" name="q" value="$q" placeholder="e.g. /etc/nginx or file.conf" style="flex:1;background:var(--bg-2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:6px 12px;font-size:12.5px;font-family:inherit">
2113 <button type="submit" class="tr-chip is-active" style="border:none">Apply</button>
2214 [if:$q]<a class="tr-chip" href="/file_changes.cgi">Clear</a>[/if]
2315</form>
2416
2517<div class="module glow-teal">
2618 <div class="module-head"><div class="left">
2719 <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" 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"/></svg></div>
2820 <div class="module-title">Changes captured</div>
2921 <span class="module-subtitle">Content dedup via SHA-256 in BLOB_STORE. Timestamp-only changes marked so you can filter noise. $total match this window.</span>
3022 </div></div>
3123 <div class="module-body tight">
3224 [if:$has_rows]
3325 <table class="tbl">
3426 <thead><tr>
3527 <th style="width:100px">Status</th>
3628 <th>File</th>
3729 <th style="width:110px">30-day rhythm</th>
3830 <th style="width:110px">Server</th>
3931 <th style="width:90px">Blob</th>
4032 <th style="width:180px">When</th>
4133 <th style="width:80px">Restore</th>
4234 </tr></thead>
4335 <tbody>
4436 [loop:@rows]
4537 <tr>
4638 <td><span class="pill $status_pill">$status</span>[if:$is_ts_only] <span class="pill pill-mute" style="font-size:9px">ts</span>[/if]</td>
4739 <td class="mono" style="font-size:12px"><a href="$diff_url" style="color:var(--accent-hi);text-decoration:none">$file_name_h</a></td>
4840 <td>$sparkline_svg</td>
4941 <td class="dim">$server_name</td>
5042 <td class="mono dim"><a href="$diff_url" style="color:var(--accent-hi);text-decoration:none">$blob_short</a></td>
5143 <td class="mono dim"><span class="ts" data-ts="$ts_epoch" data-fmt="datetime">$date_time</span></td>
5244 <td>[if:$can_restore]<a href="$restore_url" class="tr-chip" style="padding:3px 10px;font-size:11px">Restore</a>[/if]</td>
5345 </tr>
5446 [/loop]
5547 </tbody>
5648 </table>
5749 [/if]
5850 [if:!$has_rows]
5951 <div style="padding:36px 14px;text-align:center;color:var(--text-dim);font-size:13.5px">
6052 No file changes captured in this window. Try widening the range with the chips above, or configure a file monitor in <a href="[url:file_monitors]" style="color:var(--accent-hi)">File monitors</a>.
6153 </div>
6254 [/if]
6355 </div>
6456</div>
Confirm restore
Backs current content to <target>.drift_restore_backup_<epoch>, writes the captured content, verifies SHA post-write.
Cancel Logged to RESTORE_LOG regardless of outcome.