added more samples and identified ideal candidates
This commit is contained in:
@@ -0,0 +1,780 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>River Rooks | Blog Lander (Tiling Hero & Feed)</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; /* Tile surface */
|
||||
--bg-elevated: #1c1f26; /* Hovered tile surface */
|
||||
--border-color: #2b303b; /* Crisp 1px solid border */
|
||||
--text-primary: #e0e6f0; /* Light off-white prose */
|
||||
--text-muted: #8a95a5; /* Monospace metadata */
|
||||
--accent-cyan: #00f0ff; /* Primary active accent */
|
||||
--accent-green: #00e676; /* Operational status indicator */
|
||||
--accent-amber: #ffb700; /* Warning / highlight accent */
|
||||
}
|
||||
|
||||
* {
|
||||
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.6;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 24px 16px 48px 16px;
|
||||
}
|
||||
|
||||
.tiling-layout {
|
||||
width: 100%;
|
||||
max-width: 1120px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
/* Top Global Status Header Bar (Gateway 3 Style) */
|
||||
.global-bar {
|
||||
background-color: var(--bg-surface);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 4px;
|
||||
padding: 10px 18px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.8rem;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.brand-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
color: var(--text-primary);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.status-indicator {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
background-color: var(--accent-green);
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.bar-nav {
|
||||
display: flex;
|
||||
gap: 14px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.bar-link {
|
||||
color: var(--text-muted);
|
||||
text-decoration: none;
|
||||
transition: none; /* Instant snap */
|
||||
}
|
||||
|
||||
.bar-link:hover {
|
||||
color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
.bar-link.active {
|
||||
color: var(--text-primary);
|
||||
border-bottom: 1px solid var(--accent-cyan);
|
||||
}
|
||||
|
||||
/* Hero Tile: Section Declaration & Synopsis */
|
||||
.hero-tile {
|
||||
background-color: var(--bg-surface);
|
||||
border: 1px solid var(--border-color);
|
||||
border-left: 3px solid var(--accent-cyan);
|
||||
border-radius: 4px;
|
||||
padding: 24px 28px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.hero-pretitle {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.8rem;
|
||||
color: var(--accent-cyan);
|
||||
letter-spacing: 0.06em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.hero-main-title {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 2.1rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
letter-spacing: -0.02em;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.hero-landing-text {
|
||||
font-size: 0.98rem;
|
||||
color: var(--text-primary);
|
||||
line-height: 1.65;
|
||||
max-width: 82ch;
|
||||
}
|
||||
|
||||
.filter-pills-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-top: 4px;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.78rem;
|
||||
}
|
||||
|
||||
.filter-tag-btn {
|
||||
background-color: var(--bg-canvas);
|
||||
border: 1px solid var(--border-color);
|
||||
color: var(--text-muted);
|
||||
padding: 3px 8px;
|
||||
border-radius: 2px;
|
||||
cursor: pointer;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.filter-tag-btn:hover {
|
||||
border-color: var(--accent-cyan);
|
||||
color: var(--text-primary);
|
||||
background-color: var(--bg-elevated);
|
||||
}
|
||||
|
||||
.filter-tag-btn.active {
|
||||
background-color: var(--accent-cyan);
|
||||
color: var(--bg-canvas);
|
||||
border-color: var(--accent-cyan);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
/* Asymmetric Split Grid */
|
||||
.split-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1.25fr 0.75fr;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
@media (max-width: 880px) {
|
||||
.split-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
/* Standard Tile Container */
|
||||
.tile {
|
||||
background-color: var(--bg-surface);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 4px;
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 14px;
|
||||
}
|
||||
|
||||
.tile-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: baseline;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.tile-title {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.92rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.tile-meta {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.74rem;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
/* Featured Lead Article Card (Inside Tile) */
|
||||
.featured-card-body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.featured-badge-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.76rem;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.badge-pinned {
|
||||
color: var(--accent-amber);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.featured-article-title {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 1.35rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
text-decoration: none;
|
||||
line-height: 1.3;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.featured-article-title:hover {
|
||||
color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
.featured-prose {
|
||||
font-size: 0.92rem;
|
||||
color: var(--text-primary);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Terminal Code Block Component */
|
||||
.terminal-code-box {
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 3px;
|
||||
background-color: var(--bg-canvas);
|
||||
overflow: hidden;
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
}
|
||||
|
||||
.code-titlebar {
|
||||
background-color: var(--bg-surface);
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
padding: 6px 12px;
|
||||
font-size: 0.74rem;
|
||||
color: var(--text-muted);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.code-content {
|
||||
padding: 12px;
|
||||
font-size: 0.78rem;
|
||||
overflow-x: auto;
|
||||
color: var(--text-primary);
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.featured-cta-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding-top: 10px;
|
||||
border-top: 1px solid var(--border-color);
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
}
|
||||
|
||||
.cta-button {
|
||||
background-color: var(--accent-cyan);
|
||||
color: var(--bg-canvas);
|
||||
padding: 6px 14px;
|
||||
font-weight: 700;
|
||||
font-size: 0.8rem;
|
||||
text-decoration: none;
|
||||
border-radius: 2px;
|
||||
border: 1px solid var(--accent-cyan);
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.cta-button:hover {
|
||||
background-color: transparent;
|
||||
color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
/* Sidebar Tile Elements */
|
||||
.sidebar-stats-box {
|
||||
background-color: var(--bg-canvas);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 3px;
|
||||
padding: 12px 14px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.78rem;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.stat-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.stat-val {
|
||||
color: var(--text-primary);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.topic-track-item {
|
||||
background-color: var(--bg-canvas);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 3px;
|
||||
padding: 10px 12px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
text-decoration: none;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.topic-track-item:hover {
|
||||
border-color: var(--accent-cyan);
|
||||
background-color: var(--bg-elevated);
|
||||
}
|
||||
|
||||
.topic-track-title {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.84rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.topic-track-item:hover .topic-track-title {
|
||||
color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
.topic-track-desc {
|
||||
font-size: 0.78rem;
|
||||
color: var(--text-muted);
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/* Full-Width Chronological Article Feed Tile */
|
||||
.feed-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.feed-card {
|
||||
background-color: var(--bg-canvas);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 3px;
|
||||
padding: 16px 18px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.feed-card:hover {
|
||||
border-color: var(--accent-cyan);
|
||||
background-color: var(--bg-elevated);
|
||||
}
|
||||
|
||||
.feed-meta-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.76rem;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.feed-date {
|
||||
color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
.feed-heading {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 1.1rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
text-decoration: none;
|
||||
line-height: 1.35;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.feed-card:hover .feed-heading {
|
||||
color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
.feed-excerpt {
|
||||
font-size: 0.9rem;
|
||||
color: var(--text-primary);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.feed-tags-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding-top: 6px;
|
||||
border-top: 1px solid var(--border-color);
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.74rem;
|
||||
color: var(--text-muted);
|
||||
flex-wrap: wrap;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.tag-cluster {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
/* Global Footer Tile (Gateway 3 Standard) */
|
||||
.footer-tile {
|
||||
background-color: var(--bg-surface);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 4px;
|
||||
padding: 12px 20px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.78rem;
|
||||
color: var(--text-muted);
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.footer-links-cluster {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.footer-btn {
|
||||
color: var(--text-primary);
|
||||
text-decoration: none;
|
||||
padding: 2px 4px;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.footer-btn:hover {
|
||||
background-color: var(--accent-cyan);
|
||||
color: var(--bg-canvas);
|
||||
}
|
||||
|
||||
.pipe {
|
||||
color: var(--border-color);
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<main class="tiling-layout">
|
||||
|
||||
<!-- Top Global Status Bar (Gateway 3 Match) -->
|
||||
<header class="global-bar">
|
||||
<div class="brand-group">
|
||||
<span class="status-indicator"></span>
|
||||
<span>RIVER ROOKS // BLOG & RESEARCH ARCHIVE</span>
|
||||
</div>
|
||||
<nav class="bar-nav" aria-label="Quick Navigation">
|
||||
<a href="service-gateway-tiling.html" class="bar-link">Gateway 3 ↗</a>
|
||||
<a href="#" class="bar-link active">> Dispatches</a>
|
||||
<a href="https://git.rooks.dev" target="_blank" rel="noopener" class="bar-link">Git Forge</a>
|
||||
<a href="feed.xml" class="bar-link">RSS Feed</a>
|
||||
<a href="index.html" class="bar-link">Catalog ↗</a>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<!-- Hero Tile: Blog Mission & Topic Filters -->
|
||||
<section class="hero-tile" aria-label="Blog Mission & Overview">
|
||||
<div class="hero-pretitle">TECHNICAL PUBLICATION REPOSITORY • ~/NOTES/INDEX.MD</div>
|
||||
<h1 class="hero-main-title">Engineering Notes, CTF Write-Ups & Systems Architecture</h1>
|
||||
|
||||
<p class="hero-landing-text">
|
||||
Documenting bare-metal systems, embedded hardware audits, and network isolation architectures. Writing zero-allocation POSIX scripts, reverse engineering production microcontrollers, and analyzing memory allocator exploitation primitives.
|
||||
</p>
|
||||
|
||||
<div class="filter-pills-row">
|
||||
<span style="color: var(--text-muted); margin-right: 4px;">TOPIC FILTER:</span>
|
||||
<button class="filter-tag-btn active" onclick="filterTopic('all', this)">[All Dispatches (5)]</button>
|
||||
<button class="filter-tag-btn" onclick="filterTopic('firmware', this)">[#firmware (1)]</button>
|
||||
<button class="filter-tag-btn" onclick="filterTopic('homelab', this)">[#homelab (2)]</button>
|
||||
<button class="filter-tag-btn" onclick="filterTopic('security', this)">[#security (3)]</button>
|
||||
<button class="filter-tag-btn" onclick="filterTopic('posix-sh', this)">[#posix-sh (1)]</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Split Grid: Featured Article + Research Index -->
|
||||
<div class="split-grid">
|
||||
|
||||
<!-- Left Column: Featured Article Tile -->
|
||||
<section class="tile" aria-label="Featured Technical Article">
|
||||
<div class="tile-header">
|
||||
<div class="tile-title">
|
||||
<span>// PINNED RESEARCH WRITE-UP</span>
|
||||
</div>
|
||||
<span class="tile-meta">SPI FLASH • 8 MIN READ</span>
|
||||
</div>
|
||||
|
||||
<div class="featured-card-body">
|
||||
<div class="featured-badge-row">
|
||||
<span class="badge-pinned">[FEATURED DEEP DIVE]</span>
|
||||
<span style="color: var(--text-muted);">2026-07-20 • ~/notes/iot-firmware-spi-extraction.md</span>
|
||||
</div>
|
||||
|
||||
<h2 style="margin: 0;">
|
||||
<a href="article-tiling-firmware.html" class="featured-article-title">Reverse Engineering IoT Firmware: SPI Flash Extraction</a>
|
||||
</h2>
|
||||
|
||||
<p class="featured-prose">
|
||||
In security audits of embedded systems, retrieving 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>
|
||||
|
||||
<!-- Terminal Code Box -->
|
||||
<div class="terminal-code-box">
|
||||
<div class="code-titlebar">
|
||||
<span>extract_firmware.sh</span>
|
||||
<span>POSIX sh</span>
|
||||
</div>
|
||||
<div class="code-content">
|
||||
<pre><code># Query the SPI flash details using flashrom via Bus Pirate
|
||||
flashrom -p buspirate_spi:dev=/dev/ttyUSB0,spispeed=1M -r firmware_dump.bin
|
||||
|
||||
# Verify the integrity of the binary dump by comparing hashes
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Dump successful. Running md5sum..."
|
||||
md5sum firmware_dump.bin
|
||||
fi</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="featured-cta-row">
|
||||
<div class="tag-cluster">
|
||||
<span style="color: var(--text-muted); font-size: 0.75rem;">[#firmware] [#hardware] [#security] [#bus-pirate]</span>
|
||||
</div>
|
||||
<a href="article-tiling-firmware.html" class="cta-button">READ FULL WRITEUP →</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Right Column: Quick Research Tracks & Telemetry -->
|
||||
<div style="display: flex; flex-direction: column; gap: 16px;">
|
||||
|
||||
<!-- Publication Stats Tile -->
|
||||
<section class="tile" aria-label="Archive Statistics">
|
||||
<div class="tile-header">
|
||||
<div class="tile-title">
|
||||
<span>// ARCHIVE TELEMETRY</span>
|
||||
</div>
|
||||
<span class="tile-meta">STATIC HTML</span>
|
||||
</div>
|
||||
|
||||
<div class="sidebar-stats-box">
|
||||
<div class="stat-row">
|
||||
<span>TOTAL ARTICLES:</span>
|
||||
<span class="stat-val">5 PUBLISHED</span>
|
||||
</div>
|
||||
<div class="stat-row">
|
||||
<span>TOTAL READING TIME:</span>
|
||||
<span class="stat-val">51 MINUTES</span>
|
||||
</div>
|
||||
<div class="stat-row">
|
||||
<span>ACTIVE TOPICS:</span>
|
||||
<span class="stat-val">7 CATEGORIES</span>
|
||||
</div>
|
||||
<div class="stat-row">
|
||||
<span>FORMAT COMPLIANCE:</span>
|
||||
<span class="stat-val">IEEE STD 1003.1</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Curated Focus Tracks -->
|
||||
<section class="tile" aria-label="Curated Topic Tracks">
|
||||
<div class="tile-header">
|
||||
<div class="tile-title">
|
||||
<span>// RESEARCH TRACKS</span>
|
||||
</div>
|
||||
<span class="tile-meta">CURATED</span>
|
||||
</div>
|
||||
|
||||
<div style="display: flex; flex-direction: column; gap: 8px;">
|
||||
<a href="#" class="topic-track-item">
|
||||
<div class="topic-track-title">> Embedded & Hardware Forensics</div>
|
||||
<div class="topic-track-desc">Flash memory dumping, bus tapping, silicon pinout discovery.</div>
|
||||
</a>
|
||||
<a href="#" class="topic-track-item">
|
||||
<div class="topic-track-title">> Network Routing & Homelab</div>
|
||||
<div class="topic-track-desc">Traefik reverse proxying, WireGuard full-mesh, VLAN firewalls.</div>
|
||||
</a>
|
||||
<a href="#" class="topic-track-item">
|
||||
<div class="topic-track-title">> Low-Level Memory Exploitation</div>
|
||||
<div class="topic-track-desc">glibc tcache safe-linking, heap corruption, House of Apple.</div>
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Full-Width Article Feed Tile -->
|
||||
<section class="tile" aria-label="Chronological Article Stream">
|
||||
<div class="tile-header">
|
||||
<div class="tile-title">
|
||||
<span>// CHRONOLOGICAL DISPATCHES FEED</span>
|
||||
</div>
|
||||
<span class="tile-meta">ALL ARTICLES ORDERED BY DATE</span>
|
||||
</div>
|
||||
|
||||
<div class="feed-list" id="feedList">
|
||||
|
||||
<!-- Post 2: Traefik -->
|
||||
<article class="feed-card" data-tags="homelab networking">
|
||||
<div class="feed-meta-row">
|
||||
<time datetime="2026-07-15" class="feed-date">2026-07-15 • 12 min read</time>
|
||||
<span>~/notes/ha-traefik-docker.md</span>
|
||||
</div>
|
||||
<h3 style="margin: 0;">
|
||||
<a href="article-tiling-traefik.html" class="feed-heading">> Building a High-Availability Traefik Router with Docker Compose</a>
|
||||
</h3>
|
||||
<p class="feed-excerpt">
|
||||
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="feed-tags-row">
|
||||
<div class="tag-cluster">
|
||||
<span>[#homelab]</span>
|
||||
<span>[#docker-traefik]</span>
|
||||
<span>[#networking]</span>
|
||||
</div>
|
||||
<a href="article-tiling-traefik.html" style="color: var(--accent-cyan); text-decoration: none;">Read Entry →</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<!-- Post 3: POSIX sh -->
|
||||
<article class="feed-card" data-tags="posix-sh security">
|
||||
<div class="feed-meta-row">
|
||||
<time datetime="2026-07-10" class="feed-date">2026-07-10 • 6 min read</time>
|
||||
<span>~/notes/posix-sh-vs-bash.md</span>
|
||||
</div>
|
||||
<h3 style="margin: 0;">
|
||||
<a href="#" class="feed-heading">> POSIX sh vs. Bash: Portability in Modern Scripts</a>
|
||||
</h3>
|
||||
<p class="feed-excerpt">
|
||||
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="feed-tags-row">
|
||||
<div class="tag-cluster">
|
||||
<span>[#posix-sh]</span>
|
||||
<span>[#shell]</span>
|
||||
<span>[#unix]</span>
|
||||
</div>
|
||||
<a href="#" style="color: var(--accent-cyan); text-decoration: none;">Read Entry →</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<!-- Post 4: Heap Exploitation -->
|
||||
<article class="feed-card" data-tags="security">
|
||||
<div class="feed-meta-row">
|
||||
<time datetime="2026-06-28" class="feed-date">2026-06-28 • 15 min read</time>
|
||||
<span>~/notes/ctf-heap-glibc-2-35.md</span>
|
||||
</div>
|
||||
<h3 style="margin: 0;">
|
||||
<a href="article-tiling-heap.html" class="feed-heading">> CTF Write-up: Heap Exploitation in glibc 2.35</a>
|
||||
</h3>
|
||||
<p class="feed-excerpt">
|
||||
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="feed-tags-row">
|
||||
<div class="tag-cluster">
|
||||
<span>[#ctf]</span>
|
||||
<span>[#binary-exploitation]</span>
|
||||
<span>[#security]</span>
|
||||
</div>
|
||||
<a href="article-tiling-heap.html" style="color: var(--accent-cyan); text-decoration: none;">Read Entry →</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<!-- Post 5: Zero-Trust WireGuard -->
|
||||
<article class="feed-card" data-tags="networking security homelab">
|
||||
<div class="feed-meta-row">
|
||||
<time datetime="2026-06-14" class="feed-date">2026-06-14 • 10 min read</time>
|
||||
<span>~/notes/zero-trust-wireguard-opnsense.md</span>
|
||||
</div>
|
||||
<h3 style="margin: 0;">
|
||||
<a href="#" class="feed-heading">> Zero-Trust Network Isolation with WireGuard & OPNsense VLANs</a>
|
||||
</h3>
|
||||
<p class="feed-excerpt">
|
||||
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="feed-tags-row">
|
||||
<div class="tag-cluster">
|
||||
<span>[#networking]</span>
|
||||
<span>[#wireguard]</span>
|
||||
<span>[#security]</span>
|
||||
</div>
|
||||
<a href="#" style="color: var(--accent-cyan); text-decoration: none;">Read Entry →</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Global Footer Tile (Matching Gateway 3 Exactly) -->
|
||||
<footer class="footer-tile">
|
||||
<div>River Rooks • University of Alabama College of Engineering</div>
|
||||
<nav class="footer-links-cluster" aria-label="Global Footer Links">
|
||||
<a href="service-gateway-tiling.html" class="footer-btn">Gateway Lander</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="feed.xml" class="footer-btn">RSS</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="https://git.rooks.dev" target="_blank" rel="noopener" class="footer-btn">Forgejo</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="mailto:river@rooks.dev" class="footer-btn">river@rooks.dev</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="#" title="Fingerprint: 0x4A8E92F1C0B3D4E7" class="footer-btn">PGP</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="index.html" class="footer-btn">Catalog ↗</a>
|
||||
</nav>
|
||||
</footer>
|
||||
|
||||
</main>
|
||||
|
||||
<script>
|
||||
function filterTopic(topic, btn) {
|
||||
document.querySelectorAll('.filter-tag-btn').forEach(el => el.classList.remove('active'));
|
||||
btn.classList.add('active');
|
||||
|
||||
const cards = document.querySelectorAll('#feedList .feed-card');
|
||||
cards.forEach(card => {
|
||||
if (topic === 'all') {
|
||||
card.style.display = 'flex';
|
||||
} else {
|
||||
const tags = card.getAttribute('data-tags') || '';
|
||||
if (tags.includes(topic)) {
|
||||
card.style.display = 'flex';
|
||||
} else {
|
||||
card.style.display = 'none';
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user