added more samples and identified ideal candidates
This commit is contained in:
@@ -0,0 +1,587 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>River Rooks | Node Gateway & System Hub</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 surface */
|
||||
--border-color: #2b303b; /* Low-contrast 1px border */
|
||||
--text-primary: #e0e6f0; /* Off-white prose */
|
||||
--text-muted: #8a95a5; /* Monospace metadata */
|
||||
--accent-cyan: #00f0ff; /* Primary terminal accent */
|
||||
--accent-green: #00e676; /* Operational indicator */
|
||||
--accent-amber: #ffb700; /* Internal / protected warning */
|
||||
}
|
||||
|
||||
* {
|
||||
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: 40px 20px 64px 20px;
|
||||
}
|
||||
|
||||
.hub-container {
|
||||
width: 100%;
|
||||
max-width: 780px;
|
||||
}
|
||||
|
||||
/* Top Breadcrumb & Status Bar */
|
||||
.top-status-bar {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.78rem;
|
||||
color: var(--text-muted);
|
||||
padding-bottom: 12px;
|
||||
margin-bottom: 28px;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.node-identifier {
|
||||
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-pill {
|
||||
color: var(--accent-green);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* Main Landing Narrative Section (Primary Focus) */
|
||||
.landing-hero {
|
||||
margin-bottom: 36px;
|
||||
}
|
||||
|
||||
.author-title {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 2.2rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
letter-spacing: -0.02em;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.author-tagline {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.85rem;
|
||||
color: var(--accent-cyan);
|
||||
margin-bottom: 20px;
|
||||
letter-spacing: 0.04em;
|
||||
}
|
||||
|
||||
.manifesto-prose {
|
||||
font-size: 1.02rem;
|
||||
color: var(--text-primary);
|
||||
line-height: 1.7;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.manifesto-prose p {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.callout-block {
|
||||
background-color: var(--bg-surface);
|
||||
border: 1px solid var(--border-color);
|
||||
border-left: 3px solid var(--accent-cyan);
|
||||
border-radius: 3px;
|
||||
padding: 14px 18px;
|
||||
font-size: 0.9rem;
|
||||
color: var(--text-muted);
|
||||
margin-bottom: 24px;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
line-height: 1.55;
|
||||
}
|
||||
|
||||
.callout-block strong {
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
/* 1px Solid Section Divider */
|
||||
.section-divider {
|
||||
border: 0;
|
||||
border-top: 1px solid var(--border-color);
|
||||
margin: 36px 0;
|
||||
}
|
||||
|
||||
.section-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: baseline;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.section-title {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.95rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
.section-meta {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.76rem;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
/* Direction to Services Router */
|
||||
.services-router {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.service-card {
|
||||
background-color: var(--bg-surface);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 4px;
|
||||
padding: 16px 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
transition: none; /* Instant snap */
|
||||
}
|
||||
|
||||
.service-card:hover {
|
||||
border-color: var(--accent-cyan);
|
||||
background-color: var(--bg-elevated);
|
||||
}
|
||||
|
||||
.service-card:focus {
|
||||
outline: 2px solid var(--accent-cyan);
|
||||
outline-offset: -1px;
|
||||
}
|
||||
|
||||
/* Highlighted Blog Service Card */
|
||||
.service-card.service-primary {
|
||||
border-left: 3px solid var(--accent-cyan);
|
||||
}
|
||||
|
||||
.service-top-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.service-name-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.service-name {
|
||||
font-size: 1.05rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.service-card:hover .service-name {
|
||||
color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
.service-badge {
|
||||
font-size: 0.72rem;
|
||||
padding: 2px 6px;
|
||||
border-radius: 2px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.badge-blog {
|
||||
background-color: var(--accent-cyan);
|
||||
color: var(--bg-canvas);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.badge-public {
|
||||
border: 1px solid var(--accent-green);
|
||||
color: var(--accent-green);
|
||||
}
|
||||
|
||||
.badge-internal {
|
||||
border: 1px solid var(--accent-amber);
|
||||
color: var(--accent-amber);
|
||||
}
|
||||
|
||||
.service-endpoint {
|
||||
color: var(--text-muted);
|
||||
font-size: 0.76rem;
|
||||
}
|
||||
|
||||
.service-desc {
|
||||
font-size: 0.9rem;
|
||||
color: var(--text-primary);
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.service-tags {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.74rem;
|
||||
color: var(--text-muted);
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
/* Recent Articles Feed Section */
|
||||
.articles-preview-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.article-item {
|
||||
background-color: var(--bg-surface);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 3px;
|
||||
padding: 14px 18px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.article-item:hover {
|
||||
border-color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
.article-meta-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.75rem;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.article-date {
|
||||
color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
.article-heading {
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.98rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
text-decoration: none;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.article-heading:hover {
|
||||
color: var(--accent-cyan);
|
||||
}
|
||||
|
||||
.article-summary-text {
|
||||
font-size: 0.88rem;
|
||||
color: var(--text-primary);
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.hub-footer {
|
||||
margin-top: 48px;
|
||||
padding-top: 24px;
|
||||
border-top: 1px solid var(--border-color);
|
||||
font-family: 'IBM Plex Mono', monospace;
|
||||
font-size: 0.8rem;
|
||||
color: var(--text-muted);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.footer-links {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.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);
|
||||
}
|
||||
|
||||
.pipe {
|
||||
color: var(--border-color);
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<main class="hub-container">
|
||||
|
||||
<!-- Top Status Line -->
|
||||
<header class="top-status-bar">
|
||||
<div class="node-identifier">
|
||||
<span class="status-dot"></span>
|
||||
<span>node: gw-node01.lan [RACK-01 / ALABAMA]</span>
|
||||
</div>
|
||||
<div class="status-pill">[SYSTEMS OPERATIONAL • 10GbE]</div>
|
||||
</header>
|
||||
|
||||
<!-- Main Landing Narrative (Core Focus) -->
|
||||
<section class="landing-hero" aria-label="System Introduction & Landing Manifesto">
|
||||
<h1 class="author-title">River Rooks</h1>
|
||||
<div class="author-tagline">SYSTEMS ARCHITECTURE • CYBERSECURITY • SELF-HOSTED CLUSTER</div>
|
||||
|
||||
<div class="manifesto-prose">
|
||||
<p>
|
||||
Welcome to my personal computing node and technical gateway. I am an engineering student at the University of Alabama specializing in network forensics, bare-metal hypervisors, and security systems.
|
||||
</p>
|
||||
<p>
|
||||
This server is not a commercial landing page or marketing platform. It is a sovereign, self-hosted operational command hub operating from a dedicated 10GbE home rack. All services below run on hardened local hypervisors (Proxmox VE, OPNsense, TrueNAS) routed through an automated Traefik reverse proxy with WireGuard zero-trust mesh peering.
|
||||
</p>
|
||||
<p>
|
||||
Use this landing portal to navigate the ecosystem. The <strong>Technical Blog</strong> contains deep-dive research notes and CTF post-mortems. The <strong>Public Services</strong> are live, free-to-use developer and cryptographic utilities available to the public, while the <strong>Internal Infrastructure</strong> links route directly to cluster monitoring and orchestration consoles.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="callout-block">
|
||||
<strong>ROUTING NOTICE:</strong> External ingress is authenticated and monitored via OPNsense Suricata IDS/IPS. Public utilities are open for interactive use without registration.
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- Direction to Services (With Blog as Primary Endpoint) -->
|
||||
<section aria-label="Homelab Services Directory">
|
||||
<div class="section-header">
|
||||
<h2 class="section-title">Directory of Hosted Services & Tools</h2>
|
||||
<span class="section-meta">Select a destination →</span>
|
||||
</div>
|
||||
|
||||
<div class="services-router">
|
||||
|
||||
<!-- Service 1: The Blog (Primary Service) -->
|
||||
<a href="blog-lander-stream.html" class="service-card service-primary" title="Go to Technical Blog & Dispatches">
|
||||
<div class="service-top-row">
|
||||
<div class="service-name-group">
|
||||
<span class="service-name">> Technical Notes & Engineering Blog</span>
|
||||
<span class="service-badge badge-blog">[BLOG / DISPATCHES]</span>
|
||||
</div>
|
||||
<span class="service-endpoint">~/blog/notes/ • rooks.dev/notes</span>
|
||||
</div>
|
||||
<p class="service-desc">
|
||||
The core writing repository. Reverse-chronological feed of technical articles covering IoT SPI flash extraction, glibc 2.35 heap exploitation, high-availability Traefik routing, and POSIX shell engineering.
|
||||
</p>
|
||||
<div class="service-tags">
|
||||
<span>[#ctf-writeups]</span>
|
||||
<span>[#firmware-reversing]</span>
|
||||
<span>[#traefik-docker]</span>
|
||||
<span>[#posix-sh]</span>
|
||||
<span style="color: var(--accent-cyan); font-weight: 500;">[OPEN BLOG FEED →]</span>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<!-- Service 2: Forgejo Git Server -->
|
||||
<a href="https://git.rooks.dev" target="_blank" rel="noopener" class="service-card" title="Open Self-Hosted Git Forge">
|
||||
<div class="service-top-row">
|
||||
<div class="service-name-group">
|
||||
<span class="service-name">Forgejo Git Server</span>
|
||||
<span class="service-badge badge-public">[PUBLIC FORGE]</span>
|
||||
</div>
|
||||
<span class="service-endpoint">https://git.rooks.dev • :2222/ssh</span>
|
||||
</div>
|
||||
<p class="service-desc">
|
||||
Lightweight, independent Git forge hosting infrastructure-as-code playbooks, dotfiles, POSIX shell parser modules, and bare-metal kernel bootstrap code.
|
||||
</p>
|
||||
<div class="service-tags">
|
||||
<span>[#iac]</span>
|
||||
<span>[#ansible]</span>
|
||||
<span>[#cortex-m]</span>
|
||||
<span>[#git]</span>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<!-- Service 3: CyberChef Workbench -->
|
||||
<a href="https://chef.rooks.dev" target="_blank" rel="noopener" class="service-card" title="Open CyberChef Workbench">
|
||||
<div class="service-top-row">
|
||||
<div class="service-name-group">
|
||||
<span class="service-name">CyberChef Security Workbench</span>
|
||||
<span class="service-badge badge-public">[PUBLIC TOOL]</span>
|
||||
</div>
|
||||
<span class="service-endpoint">https://chef.rooks.dev • :443</span>
|
||||
</div>
|
||||
<p class="service-desc">
|
||||
Client-side cryptographic Swiss Army knife for hex decoding, Base64 operations, XOR decryption, hashing algorithms, and CTF payload deconstruction.
|
||||
</p>
|
||||
<div class="service-tags">
|
||||
<span>[#cryptography]</span>
|
||||
<span>[#forensics]</span>
|
||||
<span>[#ctf-toolkit]</span>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<!-- Service 4: Stirling PDF Studio -->
|
||||
<a href="https://pdf.rooks.dev" target="_blank" rel="noopener" class="service-card" title="Open Stirling PDF Suite">
|
||||
<div class="service-top-row">
|
||||
<div class="service-name-group">
|
||||
<span class="service-name">Stirling PDF Studio</span>
|
||||
<span class="service-badge badge-public">[PUBLIC TOOL]</span>
|
||||
</div>
|
||||
<span class="service-endpoint">https://pdf.rooks.dev • :443</span>
|
||||
</div>
|
||||
<p class="service-desc">
|
||||
Locally hosted private document toolkit for OCR text extraction, PDF merging, splitting, sanitization, and password encryption without external cloud telemetry.
|
||||
</p>
|
||||
<div class="service-tags">
|
||||
<span>[#pdf-tools]</span>
|
||||
<span>[#ocr]</span>
|
||||
<span>[#privacy-first]</span>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<!-- Service 5: Proxmox VE & TrueNAS Cluster Management -->
|
||||
<a href="homelab.html" class="service-card" title="Inspect Homelab Infrastructure">
|
||||
<div class="service-top-row">
|
||||
<div class="service-name-group">
|
||||
<span class="service-name">Homelab Cluster & Storage</span>
|
||||
<span class="service-badge badge-internal">[INTERNAL / HYPERVISOR]</span>
|
||||
</div>
|
||||
<span class="service-endpoint">https://pve.rooks.dev • 48TB ZFS</span>
|
||||
</div>
|
||||
<p class="service-desc">
|
||||
Hypervisor cluster with AMD Ryzen 9 5900X (12C/24T), 128GB ECC RAM, and TrueNAS SCALE RaidZ2 storage pool. View node topology and live resource utilization telemetry.
|
||||
</p>
|
||||
<div class="service-tags">
|
||||
<span>[#proxmox-ve]</span>
|
||||
<span>[#truenas]</span>
|
||||
<span>[#10gbe-mesh]</span>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<!-- Service 6: Uptime Kuma System Telemetry -->
|
||||
<a href="https://status.rooks.dev" target="_blank" rel="noopener" class="service-card" title="Open Status Dashboard">
|
||||
<div class="service-top-row">
|
||||
<div class="service-name-group">
|
||||
<span class="service-name">Uptime Kuma Health Monitor</span>
|
||||
<span class="service-badge badge-public">[STATUS / TELEMETRY]</span>
|
||||
</div>
|
||||
<span class="service-endpoint">https://status.rooks.dev • :3001</span>
|
||||
</div>
|
||||
<p class="service-desc">
|
||||
Continuous synthetic HTTP, TCP, and ICMP health checks broadcasting real-time cluster uptime, DNS resolution latencies, and service availability.
|
||||
</p>
|
||||
<div class="service-tags">
|
||||
<span>[#uptime-100%]</span>
|
||||
<span>[#telemetry]</span>
|
||||
<span>[#prometheus]</span>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="section-divider">
|
||||
|
||||
<!-- Recent Technical Writing (Direct Excerpts from the Blog) -->
|
||||
<section aria-label="Latest Blog Dispatches">
|
||||
<div class="section-header">
|
||||
<h2 class="section-title">Latest Technical Dispatches From the Blog</h2>
|
||||
<a href="blog-lander-stream.html" style="color: var(--accent-cyan); font-family: 'IBM Plex Mono', monospace; font-size: 0.78rem; text-decoration: none;">View all 5 entries →</a>
|
||||
</div>
|
||||
|
||||
<div class="articles-preview-list">
|
||||
|
||||
<article class="article-item">
|
||||
<div class="article-meta-row">
|
||||
<time datetime="2026-07-20" class="article-date">2026-07-20 • 8 min read</time>
|
||||
<span>[#firmware] [#hardware]</span>
|
||||
</div>
|
||||
<a href="blog-lander-stream.html" class="article-heading">> Reverse Engineering IoT Firmware: SPI Flash Extraction</a>
|
||||
<p class="article-summary-text">
|
||||
Bypassing bootloader lockdowns by dumping physical SPI Flash memory from an 8-pin SOP chip using a Bus Pirate and flashrom.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="article-item">
|
||||
<div class="article-meta-row">
|
||||
<time datetime="2026-07-15" class="article-date">2026-07-15 • 12 min read</time>
|
||||
<span>[#homelab] [#docker-traefik]</span>
|
||||
</div>
|
||||
<a href="blog-lander-stream.html" class="article-heading">> Building a High-Availability Traefik Router with Docker Compose</a>
|
||||
<p class="article-summary-text">
|
||||
Architecting automated TLS wildcard certificate propagation, Docker provider label routing, zero-downtime container updates, and health checks.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="article-item">
|
||||
<div class="article-meta-row">
|
||||
<time datetime="2026-07-10" class="article-date">2026-07-10 • 6 min read</time>
|
||||
<span>[#posix-sh] [#unix]</span>
|
||||
</div>
|
||||
<a href="blog-lander-stream.html" class="article-heading">> POSIX sh vs. Bash: Portability in Modern Scripts</a>
|
||||
<p class="article-summary-text">
|
||||
Eliminating bashisms and writing bulletproof, zero-allocation bootstrapping scripts for minimal Alpine and embedded Linux environments.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="hub-footer">
|
||||
<div>River Rooks • Cluster gw-node01.lan</div>
|
||||
<nav class="footer-links" aria-label="Portal Footer Navigation">
|
||||
<a href="blog-lander-stream.html" class="footer-link">Blog</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="feed.xml" class="footer-link">RSS</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="mailto:river@rooks.dev" class="footer-link">Email</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="#" title="Fingerprint: 0x4A8E92F1C0B3D4E7" class="footer-link">PGP Key</a>
|
||||
<span class="pipe">|</span>
|
||||
<a href="index.html" class="footer-link">Samples Catalog →</a>
|
||||
</nav>
|
||||
</footer>
|
||||
|
||||
</main>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user