added more samples and identified ideal candidates
This commit is contained in:
@@ -0,0 +1,483 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>River Rooks | Technical Notes & Blog (Stream Lander)</title>
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,500;0,700;1,400&family=Inter:wght@400;500;700&family=JetBrains+Mono:ital,wght@0,400;0,500;1,400&display=swap');
|
||||
|
||||
:root {
|
||||
--bg-canvas: #0d0f12; /* Deep slate/charcoal canvas */
|
||||
--bg-surface: #121417; /* Card surface background */
|
||||
--bg-elevated: #1c1f26; /* Hovered / elevated state */
|
||||
--border-color: #2b303b; /* Low-contrast 1px border */
|
||||
--text-primary: #e0e6f0; /* Off-white prose */
|
||||
--text-muted: #8a95a5; /* Monospaced metadata gray */
|
||||
--accent-cyan: #00f0ff; /* Primary terminal accent */
|
||||
--accent-green: #00e676; /* Operational indicator */
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--bg-canvas);
|
||||
color: var(--text-primary);
|
||||
font-family: 'Inter', sans-serif;
|
||||
line-height: 1.65;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 48px 20px 64px 20px;
|
||||
}
|
||||
|
||||
/* Reading container strictly capped at 65ch */
|
||||
.stream-container {
|
||||
width: 100%;
|
||||
max-width: 65ch;
|
||||
}
|
||||
|
||||
/* POSIX Path Top Banner */
|
||||
.top-path-bar {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.78rem;
|
||||
color: var(--text-muted);
|
||||
margin-bottom: 24px;
|
||||
padding-bottom: 10px;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
.path-display {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.status-dot {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
background-color: var(--accent-green);
|
||||
display: inline-block;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
color: var(--accent-green);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* Identity Section */
|
||||
.author-name {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 2rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
letter-spacing: -0.02em;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.author-role {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.85rem;
|
||||
color: var(--accent-cyan);
|
||||
letter-spacing: 0.05em;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.author-bio {
|
||||
font-size: 0.98rem;
|
||||
color: var(--text-primary);
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
/* Topic Filter Pills */
|
||||
.filter-section {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.78rem;
|
||||
margin-bottom: 28px;
|
||||
}
|
||||
|
||||
.filter-label {
|
||||
color: var(--text-muted);
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.filter-pill {
|
||||
background-color: var(--bg-surface);
|
||||
border: 1px solid var(--border-color);
|
||||
color: var(--text-muted);
|
||||
padding: 3px 8px;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
transition: none; /* Instant snap */
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.filter-pill:hover {
|
||||
border-color: var(--accent-cyan);
|
||||
color: var(--text-primary);
|
||||
background-color: var(--bg-elevated);
|
||||
}
|
||||
|
||||
.filter-pill.active {
|
||||
background-color: var(--accent-cyan);
|
||||
color: var(--bg-canvas);
|
||||
border-color: var(--accent-cyan);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
/* Section Divider */
|
||||
.section-divider {
|
||||
border: 0;
|
||||
border-top: 1px solid var(--border-color);
|
||||
margin: 28px 0;
|
||||
}
|
||||
|
||||
/* Article Stream Entries */
|
||||
.articles-stream {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 36px;
|
||||
}
|
||||
|
||||
.article-entry {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.article-entry.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.article-meta {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.78rem;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.article-date {
|
||||
color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
.article-title-link {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 1.22rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
text-decoration: none;
|
||||
line-height: 1.35;
|
||||
display: inline-block;
|
||||
transition: none; /* Instant snap */
|
||||
}
|
||||
|
||||
.article-title-link::before {
|
||||
content: '> ';
|
||||
color: var(--border-color);
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.article-title-link:hover {
|
||||
color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
.article-title-link:hover::before {
|
||||
color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
.article-title-link:focus {
|
||||
outline: 2px solid var(--accent-cyan);
|
||||
outline-offset: 2px;
|
||||
}
|
||||
|
||||
.article-abstract {
|
||||
font-size: 0.94rem;
|
||||
color: var(--text-primary);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.article-tags {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.75rem;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.article-tag {
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.article-read-cta {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.8rem;
|
||||
color: var(--accent-cyan);
|
||||
text-decoration: none;
|
||||
align-self: flex-start;
|
||||
margin-top: 2px;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.article-read-cta:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Piped Footer */
|
||||
.stream-footer {
|
||||
margin-top: 48px;
|
||||
padding-top: 24px;
|
||||
border-top: 1px solid var(--border-color);
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.82rem;
|
||||
color: var(--text-muted);
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.footer-links {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.footer-link {
|
||||
color: var(--text-primary);
|
||||
text-decoration: none;
|
||||
padding: 2px 4px;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.footer-link:hover {
|
||||
background-color: var(--accent-cyan);
|
||||
color: var(--bg-canvas);
|
||||
}
|
||||
|
||||
.footer-link:focus {
|
||||
outline: 2px solid var(--accent-cyan);
|
||||
}
|
||||
|
||||
.pipe {
|
||||
color: var(--border-color);
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<main class="stream-container">
|
||||
|
||||
<!-- POSIX Path Top Banner -->
|
||||
<header class="top-path-bar">
|
||||
<div class="path-display">
|
||||
<span class="status-dot" title="Cluster state: operational"></span>
|
||||
<span>~/blog/notes/</span>
|
||||
</div>
|
||||
<div class="status-badge">[5 POSTS • FEED ONLINE]</div>
|
||||
</header>
|
||||
|
||||
<!-- Identity & Bio -->
|
||||
<section class="identity-section" aria-label="Author Identity">
|
||||
<h1 class="author-name">River Rooks</h1>
|
||||
<div class="author-role">Systems Architecture & Cybersecurity</div>
|
||||
<p class="author-bio">
|
||||
Cybersecurity student at the University of Alabama College of Engineering, focusing on network forensics, self-hosted infrastructure, and bare-metal systems. Field notes, architecture specs, and low-level security research.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<!-- Quick Topic Filters -->
|
||||
<nav class="filter-section" aria-label="Filter Articles by Topic">
|
||||
<span class="filter-label">Filter:</span>
|
||||
<button class="filter-pill active" data-filter="all" onclick="filterArticles('all', this)">[All (5)]</button>
|
||||
<button class="filter-pill" data-filter="security" onclick="filterArticles('security', this)">[#security (3)]</button>
|
||||
<button class="filter-pill" data-filter="homelab" onclick="filterArticles('homelab', this)">[#homelab (2)]</button>
|
||||
<button class="filter-pill" data-filter="networking" onclick="filterArticles('networking', this)">[#networking (2)]</button>
|
||||
<button class="filter-pill" data-filter="unix" onclick="filterArticles('unix', this)">[#unix (1)]</button>
|
||||
</nav>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- Articles Stream (Reverse Chronological) -->
|
||||
<section class="articles-stream" id="articlesStream" aria-label="Article Feed">
|
||||
|
||||
<!-- Post 1: Firmware -->
|
||||
<article class="article-entry" data-category="security firmware">
|
||||
<div class="article-meta">
|
||||
<time datetime="2026-07-20" class="article-date">2026-07-20</time>
|
||||
<span>•</span>
|
||||
<span>8 min read</span>
|
||||
<span>•</span>
|
||||
<span>~/notes/iot-firmware-spi-extraction.md</span>
|
||||
</div>
|
||||
<h2 class="article-title">
|
||||
<a href="#" class="article-title-link">Reverse Engineering IoT Firmware: SPI Flash Extraction</a>
|
||||
</h2>
|
||||
<p class="article-abstract">
|
||||
In security audits of embedded systems, retrieving the firmware is the critical first step. When over-the-air updates are encrypted and debug ports (UART, JTAG) are disabled in production silicon, dumping physical SPI Flash memory becomes necessary. This writeup covers extracting firmware from an 8-pin SOP SPI flash chip using a Bus Pirate and flashrom to bypass bootloader lockdowns.
|
||||
</p>
|
||||
<div class="article-tags">
|
||||
<span class="article-tag">[#firmware]</span>
|
||||
<span class="article-tag">[#hardware]</span>
|
||||
<span class="article-tag">[#security]</span>
|
||||
<span class="article-tag">[#bus-pirate]</span>
|
||||
</div>
|
||||
<a href="#" class="article-read-cta">Read Writeup [8 min] →</a>
|
||||
</article>
|
||||
|
||||
<!-- Post 2: Traefik Docker -->
|
||||
<article class="article-entry" data-category="homelab networking">
|
||||
<div class="article-meta">
|
||||
<time datetime="2026-07-15" class="article-date">2026-07-15</time>
|
||||
<span>•</span>
|
||||
<span>12 min read</span>
|
||||
<span>•</span>
|
||||
<span>~/notes/ha-traefik-docker.md</span>
|
||||
</div>
|
||||
<h2 class="article-title">
|
||||
<a href="#" class="article-title-link">Building a High-Availability Traefik Router with Docker Compose</a>
|
||||
</h2>
|
||||
<p class="article-abstract">
|
||||
Architecting automated TLS wildcard certificate propagation, Docker provider label routing, zero-downtime container updates, and backend health-check failover routes on bare-metal infrastructure.
|
||||
</p>
|
||||
<div class="article-tags">
|
||||
<span class="article-tag">[#homelab]</span>
|
||||
<span class="article-tag">[#docker-traefik]</span>
|
||||
<span class="article-tag">[#networking]</span>
|
||||
</div>
|
||||
<a href="#" class="article-read-cta">Read Writeup [12 min] →</a>
|
||||
</article>
|
||||
|
||||
<!-- Post 3: POSIX sh -->
|
||||
<article class="article-entry" data-category="unix">
|
||||
<div class="article-meta">
|
||||
<time datetime="2026-07-10" class="article-date">2026-07-10</time>
|
||||
<span>•</span>
|
||||
<span>6 min read</span>
|
||||
<span>•</span>
|
||||
<span>~/notes/posix-sh-vs-bash.md</span>
|
||||
</div>
|
||||
<h2 class="article-title">
|
||||
<a href="#" class="article-title-link">POSIX sh vs. Bash: Portability in Modern Scripts</a>
|
||||
</h2>
|
||||
<p class="article-abstract">
|
||||
Analyzing edge-case incompatibilities, syntax overhead, eliminating bashisms, and writing fast, bulletproof bootstrapping scripts for Alpine and embedded targets conforming to IEEE Std 1003.1.
|
||||
</p>
|
||||
<div class="article-tags">
|
||||
<span class="article-tag">[#posix-sh]</span>
|
||||
<span class="article-tag">[#shell]</span>
|
||||
<span class="article-tag">[#unix]</span>
|
||||
</div>
|
||||
<a href="#" class="article-read-cta">Read Writeup [6 min] →</a>
|
||||
</article>
|
||||
|
||||
<!-- Post 4: Heap Exploitation -->
|
||||
<article class="article-entry" data-category="security">
|
||||
<div class="article-meta">
|
||||
<time datetime="2026-06-28" class="article-date">2026-06-28</time>
|
||||
<span>•</span>
|
||||
<span>15 min read</span>
|
||||
<span>•</span>
|
||||
<span>~/notes/ctf-heap-glibc-2-35.md</span>
|
||||
</div>
|
||||
<h2 class="article-title">
|
||||
<a href="#" class="article-title-link">CTF Write-up: Heap Exploitation in glibc 2.35</a>
|
||||
</h2>
|
||||
<p class="article-abstract">
|
||||
Deconstructing modern glibc memory allocator defenses: tcache safe-linking pointer mangling, bypass primitives, and House of Apple file structure hijacking for arbitrary code execution.
|
||||
</p>
|
||||
<div class="article-tags">
|
||||
<span class="article-tag">[#ctf]</span>
|
||||
<span class="article-tag">[#binary-exploitation]</span>
|
||||
<span class="article-tag">[#security]</span>
|
||||
</div>
|
||||
<a href="#" class="article-read-cta">Read Writeup [15 min] →</a>
|
||||
</article>
|
||||
|
||||
<!-- Post 5: Zero Trust Network -->
|
||||
<article class="article-entry" data-category="networking security homelab">
|
||||
<div class="article-meta">
|
||||
<time datetime="2026-06-14" class="article-date">2026-06-14</time>
|
||||
<span>•</span>
|
||||
<span>10 min read</span>
|
||||
<span>•</span>
|
||||
<span>~/notes/zero-trust-wireguard-opnsense.md</span>
|
||||
</div>
|
||||
<h2 class="article-title">
|
||||
<a href="#" class="article-title-link">Zero-Trust Network Isolation with WireGuard & OPNsense VLANs</a>
|
||||
</h2>
|
||||
<p class="article-abstract">
|
||||
Designing strict zone-based firewall rules across isolated VLANs (Management, Server DMZ, IoT, Trusted Clients) with point-to-point WireGuard cryptographic routing.
|
||||
</p>
|
||||
<div class="article-tags">
|
||||
<span class="article-tag">[#networking]</span>
|
||||
<span class="article-tag">[#wireguard]</span>
|
||||
<span class="article-tag">[#security]</span>
|
||||
</div>
|
||||
<a href="#" class="article-read-cta">Read Writeup [10 min] →</a>
|
||||
</article>
|
||||
|
||||
</section>
|
||||
|
||||
<!-- Piped Footer -->
|
||||
<footer class="stream-footer">
|
||||
<div>River Rooks © 2026</div>
|
||||
<nav class="footer-links" aria-label="Footer Links">
|
||||
<a href="feed.xml" class="footer-link">RSS Feed</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="https://git.rooks.dev" target="_blank" rel="noopener" class="footer-link">Git Forge</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="https://github.com" target="_blank" rel="noopener" class="footer-link">GitHub</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="mailto:river@rooks.dev" class="footer-link">river@rooks.dev</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="#" title="PGP: 0x4A8E92F1C0B3D4E7" class="footer-link">PGP Key</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="index.html" class="footer-link">Catalog ↗</a>
|
||||
</nav>
|
||||
</footer>
|
||||
|
||||
</main>
|
||||
|
||||
<script>
|
||||
function filterArticles(category, btn) {
|
||||
// Toggle active pill
|
||||
document.querySelectorAll('.filter-pill').forEach(el => el.classList.remove('active'));
|
||||
btn.classList.add('active');
|
||||
|
||||
const entries = document.querySelectorAll('.article-entry');
|
||||
entries.forEach(entry => {
|
||||
if (category === 'all') {
|
||||
entry.classList.remove('hidden');
|
||||
} else {
|
||||
const cats = entry.getAttribute('data-category') || '';
|
||||
if (cats.includes(category)) {
|
||||
entry.classList.remove('hidden');
|
||||
} else {
|
||||
entry.classList.add('hidden');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user