Notes from the bench
Notes
Write-ups on ESP32 projects, PCB and enclosure design, mesh networking, AI-assisted engineering, automation and building products from scratch.
50 posts
A marketing audit scored my SaaS a D — and the fixes were sitting in git
AffRank.ai's audit found weak trust signals, a contradiction on the pricing page and a site Googlebot saw as a single empty page. Half the fixes were already committed. None were live.
A market newsroom on autopilot: macro charts, AI commentary and the guardrails
How the GammaJuice pipeline turns a nightly scan into charts, posts and articles — FRED macro data, an AI that writes in my voice under strict rules, and P&L tracking that shows the losers too.
AffRank V4: deciding what the product is not
AffRank started life as an AI-powered SEO platform. Version 4 cut it down to one job — inject affiliate links and prove which page, placement and offer made the money. Here's the pivot and the attribution engine behind it.
Inside SolveBlock Core Rev C: a custom ESP32-S3 board, and the checkmarks we had to take back
From a dev board on a breadboard to a custom ESP32-S3 PCB — the layout, the manufacturer checks, the firmware architecture that runs on more than one board, and an honest milestone list.
568×: the phone call, the batching rule and the bug that would have dialled
Adding a dial-up telephone carrier to a LoRa mesh exposed a routing bug that no test caught — it would have been discovered as a phone bill.
First packet across real air: Reticulum over a dictyon carrier
Two Heltec V3 radios, one evening, and a round-trip time predicted before it was measured. What the first real-RF runs of Dictyon-net taught me about honest arithmetic.
Take the theorem, test the claim: 3-6-9, vortex maths and a sphere
I gave 3-6-9 numerology, vortex mathematics and the Rodin coil one honest test each. Most claims didn't survive — but the mathematics hiding inside them produced the biggest engineering gain in the project.
The maker loop: requirements, build, measure, repeat
Hardware, firmware, software and customers all respond to the same loop. A look at how I take an idea from first sketch to working prototype — and why the loop matters more than any tool.
NULL is a deliverable: auditing 113 research findings
A burst of AI-assisted research produced 88 findings in two days. Auditing them against their own rules found that the filter never ran — and that the audit was the most useful finding of all.
Playwright: screenshots, end-to-end tests and proof that the page works
Microsoft's Playwright drives Chromium, Firefox and WebKit from one API. I use it for SaaS end-to-end tests, dashboard screenshots for social posts, and checking every page of this site at desktop and phone widths.
Cline: an open-source coding agent that asks before it acts
Cline is an Apache-licensed coding agent for the IDE and the terminal, with plan and act modes, approvals, MCP tools and any model you like. How I use AI coding agents without losing control of the codebase.
Four enclosures, one script: choosing SolveBlock's shape
Block, flat, wedge or stand? Generating every candidate enclosure from one parametric source turned an argument about taste into a quick, fair comparison.
n8n: fair-code workflow automation, and how I structure flows with it
n8n is a visual workflow automation platform you can self-host, with code where you need it. Its licence, what it's best at, and the n8n-plus-API pattern most of my automations use.
Reticulum: the open networking stack I stopped competing with
Reticulum is an encrypted, self-configuring network stack that runs over LoRa, packet radio, serial and IP with no central operator. Why Dictyon-net became a carrier layer for it instead of a rival.
Every screen from the firmware: designing SolveBlock's interface
A normal solve costs zero input, the coach stays quiet most of the time, and there's no scramble generator on purpose. The interface decisions behind SolveBlock, shown in the device's own screens.
gbrain: a memory you control, for agents that forget
gbrain is a self-hosted memory layer for AI agents — facts with sources, hybrid search and a knowledge graph on PGLite or Postgres. How I feed it my agent's sessions, and the one-line wrapper that saved me from a bad database mix-up.
The starter stack: launching a product without overbuilding
The tools and sequence I use to take an idea from zero to something real customers can touch — and the things I deliberately postpone.
Kronos: an open foundation model for candlesticks, used as a second opinion
Kronos tokenises OHLCV price bars and forecasts the next candles. How my squeeze pipeline uses it to adjust confidence, how its forecast shows up on every chart, and why it never gets the final say.
OpenRouter and LiteLLM: one interface for every model
My automations call many models for different jobs. OpenRouter (a hosted router) and LiteLLM (an open-source gateway) both give them one OpenAI-style interface. When I'd use each.
From scanner to product: building GammaJuice
Turning a Python squeeze scanner into a signals product — a dashboard, a content site on a headless CMS, automated social posts and the engagement data that changed what we publish.
Open SaaS: the free boilerplate behind AffRank.ai
Wasp's Open SaaS template gives you auth, payments, an admin dashboard, email, a docs site and end-to-end tests on day one. What it saved building AffRank, and what you still have to build yourself.
Affiliate links rot. Here's how to manage them at scale.
Programs change, products disappear and redirects break quietly. A practical system for keeping hundreds of affiliate links healthy without checking them by hand.
LangChain and LangGraph: where I actually meet them
I rarely start a project with LangChain — but I keep meeting it inside the tools I use. What LangChain and LangGraph each do, and when the abstraction helps versus when plain code is clearer.
The 80% win rate that wasn't
A backtest dashboard showed squeeze signals winning 80% of the time. Two lines of code explained why — an outcome-defined label and exits at the peak price.
CrewAI: when a crew of agents beats one big prompt (and when it doesn't)
CrewAI organises role-playing agents into crews and flows. What it's good for in automation work, how it compares with TradingAgents for a trading-research job, and the overhead to budget for.
Backtesting a squeeze scanner without fooling myself
A thin edge, two filters that sounded smart and didn't help, and a liquidity effect hiding in plain sight. What 2,633 historical signals from the 3WT scanner actually said.
TradingAgents: a research desk of LLM analysts, and why mine only paper-trades
TauricResearch's TradingAgents simulates a trading firm — analysts, bull and bear researchers, a trader and a risk team — on LangGraph. How I ran it against my scanner's signals, and the guardrails around it.
Power budgets: making a battery ESP32 project last
Duty cycles, deep sleep, regulators that leak and the multimeter habit that saves you from surprises. A practical guide to battery life on ESP32 boards.
Hermes Agent: the open-source agent that runs my scanner on a schedule
Nous Research's Hermes Agent is a self-improving AI agent with memory, skills, cron and a Telegram gateway. Here's how it became the operator behind my 3WT squeeze-scanner pipeline.
Treat wild ideas as testable hypotheses
Ternary-Six9 is an experimental communications concept. Here's how I keep unusual ideas honest — models, fixtures, baselines and logged measurements before any conclusions.
Keyword research for a maker blog: how I picked what to write about
Engineering blogs rarely do keyword research, and it shows. A lightweight process for finding topics people actually search for — without turning notes into SEO filler.
SEO is a data problem: lessons from building AffRank.ai
Rankings, keywords, metadata, structured FAQs and affiliate links all change constantly. AffRank.ai treats site management like data engineering — with reviewable changes.
ESP32 vs RP2350: how I pick the brain of a project
A practical comparison of two microcontrollers I use constantly — radios, real-time I/O, power, tooling and the questions that settle the choice in five minutes.
What a CRM has to do for a sales team: lessons from 400+ consultants
A CRM isn't a database of contacts. For a distributed sales team it's the memory, the to-do list and the training wheels. What mattered — and what didn't — supporting hundreds of consultants.
Anatomy of a welcome sequence: the email automation that did the heavy lifting
One big pitch loses to five small, useful emails. A breakdown of the follow-up sequence structure I relied on for years — and how to build it in any email automation tool.
Growing a mesh: early lessons from Dictyon-net and Hypha Nodes
What I'm learning while building a decentralized, low-power communications mesh on ESP32 and RP2350-class hardware — identity, addressing, multipath and measuring everything.
Why FastAPI and PostgreSQL are my default backend
For small products, dashboards and device back-ends, I keep reaching for the same boring, reliable stack. Here's the setup and why it holds up.
Building an email list for a hardware product that doesn't exist yet
SolveBlock's waitlist promises two emails and a chance at a free unit — nothing else. Why a tiny, honest list beats a big noisy one for a product still on the bench.
AI can review your PCB. The datasheet still decides.
How I use Python, MCP-connected tools and AI assistants to speed up schematic reviews, routing checks and firmware tests — and the verification rules I never skip.
ClickFunnels, Systeme.io or HighLevel? How I'd choose a funnel builder today
After twelve years of running sales funnels for a direct-sales business, here's the checklist I'd use to pick a funnel builder in 2026 — and why the tool matters less than the follow-up.
Enclosures as code: why I design 3D-printed parts in OpenSCAD
Parametric enclosures, tolerance variables and fit-check prints — how treating plastic like source code made my hardware iterations faster.
First power-on: my board bring-up checklist for custom ESP32 boards
The step-by-step routine I follow when a fresh PCB arrives — from a current-limited first power-up to a known-good firmware baseline.
The timer is the source of truth — designing deterministic solve statistics
Why SolveBlock never re-times a solve, how we compute averages with integer math, and what "deterministic" really means for a tiny embedded device.
From napkin to PCB: designing SolveBlock in KiCad
How a speedcubing idea became a custom ESP32 board — the requirements, the schematic decisions, the layout tradeoffs and the mistakes I'd happily make again.
Structured outputs: prompt engineering for answers your code can trust
How I design LLM prompts and schemas that return reliable JSON for analytics, reporting and automation — plus the validation layer that catches everything else.
Why the ESP32 became my favorite blank page
Wi-Fi, Bluetooth, two cores and a pile of peripherals for the price of lunch. Here's why nearly every idea I have starts on an ESP32 — and when it shouldn't.
Automation people actually adopt
Lessons from building onboarding, CRM and AI workflows — including an LLM-assisted onboarding flow that cut onboarding time by 35%. Adoption is the real metric.
What 20 years of enterprise infrastructure taught me about building hardware
Citrix farms, hospital uptime and change control don't sound like PCB design. They turned out to be the best training I could have had.
n8n or code? How I decide when to automate visually
Visual workflow tools and plain Python both have a place. A practical guide to choosing between them — and to the hybrid approach most of my automation uses.
What 17,000 customers taught me about funnels, follow-up and trust
Twelve years of building the systems behind a direct-sales business — e-commerce, CRM, email/SMS and training — and the product lessons that carried over into engineering.