electronics · self-hosted
● Active
Noise Impact Logger
Two ceiling-mounted ESP32 boards with INMP441 I2S microphones track upstairs neighbor activity in real time. Custom firmware applies a 30–480 Hz bandpass IIR filter with a 63 Hz HVAC notch and a dual-EMA adaptive baseline — a fast gated tracker for impact detection paired with a 2-minute slow tracker for HVAC noise compensation — so footstep events stay detectable even when the AC is running. Each impact is timestamped, dB-rated, and drained over WiFi to a self-hosted Flask server where an auto-tuning classifier labels it HUMAN or UNKNOWN, then groups confirmed impacts into walking sessions classified by cadence: STROLL, WALK, ACTIVE, RUN, or INTENSE. A Claude-backed Telegram bot gives natural-language access to live activity data and sends alerts for loud sessions, sustained pacing, and late-night activity. Firmware updates over OTA. No cloud, no subscription.
ESP32
INMP441
I2S
C++
Python
Flask
SQLite
OTA
Telegram
Confirmed
—
Human
—
Captures
—
detectorESP32 · INMP441 I2S · bandpass IIR
analyzerESP32 · 2.5 s spectrum capture · OTA
fwdetector v2.6.5 · analyzer v1.2.2
baselinedual EMA · gate-protected · HVAC-follow
serverCT 100 · Flask · SQLite · auto-tuner
alertsTelegram · session cadence · HVAC state
● Active
rf · self-hosted
RF Spectrum Observatory
An RTL-SDR dongle on the home server continuously sweeps 88–1300 MHz every 5 minutes, averaging multiple hardware passes for a clean noise floor. Signal strength across FM broadcast, aviation, weather satellite, amateur radio, ISM, and ADS-B bands is recorded in SQLite — full resolution for 24 hours, hourly averages beyond that. A canvas-based spectrogram viewer renders a color-graded waterfall: frequency on X, time on Y, dark green to yellow as power climbs.
hardwareRTL-SDR · RTL2838 · R820T tuner
range88–1300 MHz · ~175 kHz bins
interval5 min · 5 min integration average
serverCT 100 · Flask · SQLite
last sweep—
RTL-SDR
Python
Flask
SQLite
Canvas API
● Active
homelab
Beelink Proxmox Node
The hardware everything runs on. A Beelink Mini PC running Proxmox VE — webserver, Pi-hole, and Home Assistant all live here. No cloud, no rent, no monthly bill.
hostBeelink Mini PC
hypervisorProxmox VE
containersCT 100 webserver · CT 101 Pi-hole
vmVM 102 Home Assistant
egressCloudflare Tunnel · no open ports
Proxmox VE
LXC
Debian 13
◌ In Progress
home automation
Smart Home Stack
Home Assistant is up and running — locally hosted, no cloud account, no subscription. The foundation is solid. Zigbee, MQTT, and automations are next; this is the part of the stack that's actively being built out rather than just maintained.
platformHome Assistant OS · VM 102
hostinglocal-only · no cloud account
nextZigbee · MQTT · automations
Home Assistant
HAOS
Pi-hole
local-first
● Active
networking
Pi-hole DNS
Network-wide ad blocking and DNS filtering for the whole home — LAN and IoT. The OpenWrt router pushes Pi-hole as the DNS server to every device on the network. 92,000+ domains blocked, no per-device configuration needed.
versionPi-hole v6
hostLXC CT 101 · Proxmox
scopeLAN + IoT · network-wide
domains blocked92,000+
routerOpenWrt · DHCP pushes Pi-hole
Pi-hole v6
LXC
DNS
OpenWrt
● Active
self-hosted · web
RepairmanRay.com
A personal site served from a home server over a Cloudflare Tunnel — no hosting provider, no managed platform. The terminal aesthetic fits the stack: plain HTML/CSS/JS, a Python HTTP server, and a self-hosted pipeline that gets the job done without a cloud bill.
serverCT 100 · Python HTTP
tunnelCloudflare · no open ports
stackHTML · CSS · JS
hosting cost$0
HTML
CSS
JS
Python
Cloudflare Tunnel
◌ In Progress
electronics · LoRa
LoRa Alarm Mesh
A LoRa mesh network for monitoring doors and passageways across an apartment complex — magnetic switches, PIR motion detectors, and temperature sensors feeding back through a network of nodes and repeaters. Alert outputs via piezo buzzers. No WiFi, no cloud, no subscriptions — the mesh handles its own routing within radio range. Off-grid capable by design.
mcuHeltec ESP32 LoRa V3
radioLoRa 915MHz · mesh
sensorsreed switches · PIR · temperature
alertspiezo · local, no cloud
poweroff-grid capable
ESP32
LoRa
Reed Switches
PIR
C++
◑ Prototype
electronics
Outdoor Firepit Weather Interlock Controller
A WiFi-connected relay controller built on an ESP32. Fetches live wind speed and temperature from OpenWeatherMap, enforces user-defined operating hours via NTP scheduling, and controls a relay with fail-safe logic — if WiFi drops, data goes stale, or conditions exceed limits, the relay locks out. Configured through a built-in web dashboard with auto-refresh. Settings persist across reboots via ESP32 NVS. Field deployment would require hardened relay switching and proper web authentication.
mcuESP32-WROOM-32
weather apiOpenWeatherMap · wind + temp
schedulingNTP · user-defined hours
fail-saferelay locks on WiFi loss / stale data
configbuilt-in web dashboard · NVS
ESP32
Arduino
OpenWeatherMap
Relay
◇ Concept
smartthings · iot
AC Freeze Monitor
Set Point
72°F
Current
79°F
Runtime
47min
$Monitors HVAC units via SmartThings API and personal access tokens. If a unit runs too long without the room temperature meaningfully dropping toward the set point, a fault is raised — the classic signature of a frozen evaporator coil killing airflow while the compressor keeps grinding.
// known constraints
Samsung controls the token lifecycle — personal access tokens expire on their schedule, requiring periodic manual re-auth with no programmatic renewal path. More critically, there's no true polling model: sensor data lives behind Samsung's cloud, so you're dependent on their infrastructure availability and whatever latency they introduce. A SmartThings outage is silently also your monitoring outage. You're always a guest in their ecosystem.
apiSmartThings · personal access tokens
detectionruntime vs. temp delta toward setpoint
languagePython
Python
SmartThings API
HVAC
IoT
◇ Concept
electronics · power quality
Utility Voltage Monitor
A mains voltage monitor built around the ZMPT101B sensor and an ADS1115 16-bit ADC feeding an ESP32. Samples the 60Hz waveform at 860 SPS, computes true RMS, and raises alerts on sags below 105V or overvoltage above 126V. Events publish to MQTT — timestamps, duration, and min/max voltage — and feed into Home Assistant. Designed to catch the kind of slow sags that don't trip breakers but do kill compressors.
sensorZMPT101B (isolated)
adcADS1115 · 16-bit · I²C
mcuESP32-WROOM-32
sag threshold< 105V RMS
overvoltage threshold> 126V RMS
reportingMQTT → Home Assistant
ESP32
ZMPT101B
ADS1115
MQTT
true-RMS
C++