>_SPENCERLABSECURITY · INFRASTRUCTURE SERVING FROM THE HOMELAB|0 INBOUND PORTS
GitHub

About

A working record, not a résumé.

SpencerLab is a self-hosted technical journal. Infrastructure gets stood up, faults get diagnosed, lab systems get pentested and assessed — and each one is written up honestly: the commands, the wrong turns, and why each fix mattered.

Write-ups are published straight from two in-house tools — AuditForge for assessment reports and Fieldnote for build notes — through a token-gated, secret-scanned publishing API.

Focus
Cybersecurity · networking · cloud · SaaS
Published
15 posts across 4 topics
Hosting
Homelab VM · FastAPI · Cloudflare Tunnel · 0 inbound ports
Analytics
First-party visit log on the same box · no cookies · details
Elsewhere
github.com/spencerawlson

What I work on

Cybersecurity

Penetration testing, vulnerability assessment and security analysis on authorized lab scope — with evidence, findings and remediation.

Networking

Network design, routing & switching, VLANs, VPN and firewalls — plus software-defined networking with GNS3, Open vSwitch and segmentation.

Cloud computing

AWS, Azure and GCP — infrastructure-as-code, containers, serverless and resilient multi-account architecture.

SaaS development

Full-stack SaaS platforms — FastAPI and React, REST APIs, microservices and AI-driven features, from data model to shipped product.

AI & automation

Infrastructure as code, CI/CD, scripting and monitoring — and agents that reason over real signals and act through consented pipelines.

Projects

Tools & stack

How this site runs

Everything here is served from a VM in the homelab. Nothing on the home network accepts a connection from the internet.

Live lab →
  1. Your browserRequests spencerlab.tech over HTTPS.
  2. Cloudflare edgeTerminates TLS and hides the home IP address.
  3. Outbound tunnelThe server dials out to Cloudflare, so there are 0 inbound ports to open.
  4. Homelab VMA small FastAPI app renders the pages from flat files.

Live telemetry

The server samples its own CPU, memory, disk, edge round-trip and service health every 30 seconds, and a set of HA agents reviews it every five minutes. That feeds the live lab and the home page. Only coarse numbers are published: no addresses, hostnames or versions.

Publishing pipeline

Write-ups arrive from AuditForge and Fieldnote through a token-gated API. Each one has to clear its source tool's sensitivity review and an automated secret scan before it goes live.

Self-hosted analytics

Page views are logged on the same VM that serves them, in a local database, with no analytics service, no tracking script and no cookies. The owner reads them on a private, token-locked dashboard.

Privacy: what's recorded when you visit

Plain terms, because this is a security site and you should be able to check.

Recorded, for each page you open

  • The time, the page, and whether it loaded.
  • Your IP address, and the approximate location Cloudflare derives from it (country, and where available region and city).
  • The page that linked you here, and any utm_source tag in the link.
  • Your browser, operating system and device type, taken from the user-agent header, and whether it looks like a bot.

Not done

  • No cookies, fingerprinting or tracking scripts. Nothing is stored in your browser.
  • No analytics or advertising service. The log never leaves this server, and it isn't sold or shared.
  • Stylesheets, images, video and API calls aren't logged, only page views.
  • Records are deleted automatically after 90 days.

Two third parties are involved in any visit: Cloudflare, which carries all traffic to this site, and Google Fonts, which serves the typefaces. Their own policies apply to what they see. To have your records removed sooner, get in touch through GitHub.

Certifications

Certifications will be listed here as they're earned. Until then, the projects, labs and write-ups on this site are the demonstration — the paper trail is catching up.

Let's build something.

Open to new opportunities, collaborations and challenging projects.

GitHub →