Skip to content

Instantly share code, notes, and snippets.

@84em
Created January 12, 2026 15:19
Show Gist options
  • Select an option

  • Save 84em/d9c5592afb2ba57bd2cba9a3eb5da508 to your computer and use it in GitHub Desktop.

Select an option

Save 84em/d9c5592afb2ba57bd2cba9a3eb5da508 to your computer and use it in GitHub Desktop.
Example report for link check
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Link Check Report - January 12, 2026 at 2:34 PM</title>
<style>
* { box-sizing: border-box; }
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; margin: 20px; background: #f5f5f5; font-size: 14px; }
.container { margin: 0 auto; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
h1 { color: #333; margin-bottom: 10px; }
.summary { display: flex; gap: 20px; margin-bottom: 20px; padding: 15px; background: #f8f9fa; border-radius: 4px; }
.summary-item { text-align: center; }
.summary-item .number { font-size: 2em; font-weight: bold; }
.summary-item .label { color: #666; font-size: 0.9em; }
.ok { color: #28a745; }
.error { color: #dc3545; }
.table-wrapper { overflow-x: auto; margin-top: 20px; }
table { border-collapse: collapse; }
th, td { padding: 5px 10px; text-align: left; border-bottom: 1px solid #dee2e6; vertical-align: top; white-space: nowrap; }
th { background: #f8f9fa; font-weight: 600; cursor: pointer; }
th:hover { background: #e9ecef; }
tr:hover { background: #f8f9fa; }
td a { color: #007bff; text-decoration: none; font-family: monospace; font-size: 12px; }
td a:hover { text-decoration: underline; }
.badge { display: inline-block; padding: 4px 8px; border-radius: 4px; font-size: 0.85em; font-weight: 500; text-align: center; min-width: 45px; }
.status-ok { background: #d4edda; color: #155724; }
.status-error { background: #f8d7da; color: #721c24; }
.status-redirect { background: #fff3cd; color: #856404; }
.meta { color: #666; font-size: 0.9em; margin-bottom: 20px; }
.actions { margin-bottom: 20px; display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.btn { display: inline-block; padding: 8px 16px; background: #007bff; color: white; text-decoration: none; border-radius: 4px; cursor: pointer; border: none; font-size: 14px; }
.btn:hover { background: #0056b3; }
.btn-secondary { background: #6c757d; }
.btn-secondary:hover { background: #545b62; }
.search-box { padding: 8px 12px; border: 1px solid #dee2e6; border-radius: 4px; font-size: 14px; min-width: 250px; }
.fixed-cell { text-align: center; }
.fixed-checkbox { appearance: none; width: 20px; height: 20px; border: 2px solid #dee2e6; border-radius: 4px; cursor: pointer; position: relative; }
.fixed-checkbox:checked { background: #28a745; border-color: #28a745; }
.fixed-checkbox:checked::after { content: ""; position: absolute; left: 6px; top: 2px; width: 5px; height: 10px; border: solid white; border-width: 0 2px 2px 0; transform: rotate(45deg); }
</style>
</head>
<body>
<div class="container">
<h1>84EM Link Check Report</h1>
<p class="meta">Site: <a href="https://84em.com">https://84em.com</a></p>
<p class="meta">Scanned: January 12, 2026 at 2:34 PM</p>
<div class="summary">
<div class="summary-item"><div class="number">2</div><div class="label">Total URLs</div></div>
<div class="summary-item"><div class="number ok">0</div><div class="label">OK</div></div>
<div class="summary-item"><div class="number error">2</div><div class="label">Problems</div></div>
</div>
<div class="actions">
<input type="text" id="searchFilter" class="search-box" placeholder="Filter results..." onkeyup="filterTable()">
<button class="btn" onclick="saveAllAsCSV()">Save All as CSV</button>
<button class="btn btn-secondary" onclick="window.print()">Print</button>
</div>
<div class="table-wrapper">
<table id="results">
<thead><tr><th style="width:60px">Fixed</th><th onclick="sortTable(1)">Status</th><th onclick="sortTable(2)">URL</th><th onclick="sortTable(3)">Error</th><th onclick="sortTable(4)">Locations</th></tr></thead>
<tbody><tr>
<td class="fixed-cell"><input type="checkbox" class="fixed-checkbox" data-url="https://widget.clutch.co/"></td>
<td><span class="badge status-error">404</span></td>
<td><a href="https://widget.clutch.co/" target="_blank">https://widget.clutch.co/</a></td>
<td>Not Found</td>
<td><a href="https://84em.com/testimonials/" target="_blank">https://84em.com/testimonials/</a> (ID: 986)<br></td>
</tr><tr>
<td class="fixed-cell"><input type="checkbox" class="fixed-checkbox" data-url="https://84em.com/wp-content/uploads/84em-logo.png"></td>
<td><span class="badge status-error">404</span></td>
<td><a href="https://84em.com/wp-content/uploads/84em-logo.png" target="_blank">https://84em.com/wp-content/uploads/84em-logo.png</a></td>
<td>Not Found</td>
<td><a href="https://84em.com/wordpress-development-services-usa/alabama/" target="_blank">https://84em.com/wordpress-development-services-usa/alabama/</a> (ID: 2448)<br><a href="https://84em.com/wordpress-development-services-usa/alaska/" target="_blank">https://84em.com/wordpress-development-services-usa/alaska/</a> (ID: 2449)<br><a href="https://84em.com/wordpress-development-services-usa/arizona/" target="_blank">https://84em.com/wordpress-development-services-usa/arizona/</a> (ID: 2450)<br><a href="https://84em.com/wordpress-development-services-usa/arkansas/" target="_blank">https://84em.com/wordpress-development-services-usa/arkansas/</a> (ID: 2451)<br><a href="https://84em.com/wordpress-development-services-usa/california/" target="_blank">https://84em.com/wordpress-development-services-usa/california/</a> (ID: 2452)<br>... and 544 more</td>
</tr></tbody>
</table>
</div>
</div>
<script>
const STORAGE_KEY = "84em-linkcheck-fixed";
function getFixedUrls() { try { return new Set(JSON.parse(localStorage.getItem(STORAGE_KEY) || "[]")); } catch (e) { return new Set(); } }
function saveFixedUrl(url, isFixed) { const fixed = getFixedUrls(); if (isFixed) { fixed.add(url); } else { fixed.delete(url); } localStorage.setItem(STORAGE_KEY, JSON.stringify([...fixed])); }
function initCheckboxes() { const fixed = getFixedUrls(); document.querySelectorAll(".fixed-checkbox").forEach(cb => { cb.checked = fixed.has(cb.dataset.url); cb.addEventListener("change", function() { saveFixedUrl(this.dataset.url, this.checked); }); }); }
document.addEventListener("DOMContentLoaded", initCheckboxes);
function filterTable() { const filter = document.getElementById("searchFilter").value.toLowerCase(); const rows = document.getElementById("results").tBodies[0].rows; for (let i = 0; i < rows.length; i++) { let match = false; for (let j = 0; j < rows[i].cells.length; j++) { if (rows[i].cells[j].textContent.toLowerCase().indexOf(filter) > -1) { match = true; break; } } rows[i].style.display = match ? "" : "none"; } }
function sortTable(n) { const table = document.getElementById("results"); const tbody = table.tBodies[0]; const rows = Array.from(tbody.rows); const dir = table.dataset.sortDir === "asc" ? "desc" : "asc"; table.dataset.sortDir = dir; rows.sort((a, b) => { const aVal = a.cells[n].textContent.trim(); const bVal = b.cells[n].textContent.trim(); return dir === "asc" ? aVal.localeCompare(bVal) : bVal.localeCompare(aVal); }); rows.forEach(row => tbody.appendChild(row)); }
function saveAllAsCSV() { const rows = document.getElementById("results").querySelectorAll("tr"); let csv = []; rows.forEach((row, i) => { if (i === 0) { csv.push("Fixed,Status,URL,Error,Locations"); return; } const cols = row.querySelectorAll("td"); const cb = row.querySelector(".fixed-checkbox"); csv.push([cb && cb.checked ? "X" : "", ...Array.from(cols).slice(1).map(c => "\"" + c.textContent.trim().replace(/"/g, "\"\"") + "\"")].join(",")); }); const blob = new Blob([csv.join("\n")], {type: "text/csv"}); const link = document.createElement("a"); link.href = URL.createObjectURL(blob); link.download = "linkcheck-" + new Date().toISOString().slice(0,10) + ".csv"; link.click(); }
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment