Building a Surveillance Camera with ESP32-S3 — WiFi, TF Card, Video Output Pitfalls

14 min read
Why We have a few parrots at home, and during the workday nobody’s around. I wanted to check in on them anytime. The requirement sounds simple: real-time video streaming, recording to storage, and ideally automatic backup to NAS. Off-the-shelf cameras are either expensive or require installing apps, registering accounts, and binding phone numbers — privacy concerns. I just want to watch my birds, not stream video to someone else’s server.
ESP32-S3 ESP-IDF Camera Embedded
Continue reading →

Replacing VMs with ESP32 for Network Probing — esp32-blackbox Project in Action

6 min read
Why I have several LANs in different locations around the city, roughly 10 km apart. To make these networks talk to each other, I used tools like NetBird, ZeroTier, and Cloudflare Tunnel to set up a cross-region virtual LAN. The network was set up, but how to ensure stability? After all, these tunnels traverse the public internet with varying link quality. The most direct approach is to use Prometheus’s blackbox_exporter for probing — periodic HTTP requests, Pings, DNS queries — feeding results into a time-series database with alert rules, so problems are detected immediately.
ESP32 Network Probing Prometheus NetBird
Continue reading →

Basic Syntax: Variables, Types, and Pattern Matching

11 min read
In the previous post, we discussed why Rust is worth learning and how to run your first Hello World. This post dives directly into syntax—variables, types, control flow, functions, and pattern matching. The core goal is simple: enable you to read and write Rust code. If you have a Go background, none of these concepts will be unfamiliar. I’ll provide comparisons at key points to help map your existing knowledge to Rust.
Rust Basic Syntax Variables Pattern Matching Go Learning Notes
Continue reading →

Switched My Blog Theme: From Hugo NexT to Self-Written Zhi

8 min read
Why Switch This blog previously used Hugo NexT, forked for custom modifications. NexT itself is a feature-rich theme, but when it comes to “customizing things yourself,” the experience wasn’t great. The issues boiled down to a few things: SCSS nesting hell. 101 SCSS files, three levels of directory nesting. _common/components/post, _common/components/third-party, _common/outline/sidebar… To change a style, you first had to figure out which file it was in, where variables were defined, and which scheme was overriding it. Not that it couldn’t be done, but each change meant half an hour of hunting.
Hugo Theme Development Zhi AI Programming
Continue reading →

Why Rust: A Language Pursuing Zero-Cost Abstractions from a Go Perspective

8 min read
This article is based on Rust 1.82 (released on 2026-01-23, current latest stable version). Rust is a modern systems programming language proven in production. Official documentation is at doc.rust-lang.org, and installation guide is at rust-lang.org/tools/install/. Why Rust? If you’ve already mastered Go, you might ask: why learn Rust? Rust exists to fill the performance and control gap that Go leaves open. Go has conquered cloud-native and microservices domains with its extremely low learning curve, excellent concurrency model, and fast compilation speed. But its garbage collector (GC) and fixed runtime make it constrained in systems programming, embedded, and high-performance scenarios. When you need more precise memory control, lower latency, or work in embedded environments without OS kernel support, Go’s GC becomes a burden.
Rust Systems Programming Go Language Comparison Learning Notes
Continue reading →

Zhipu Coding Plan × Oh My OpenCode: Multi-Model Orchestration Setup Guide

6 min read
Why Bother When it comes to writing code with AI, the gap between single-model and multi-model approaches keeps widening. No matter how strong a single model is, it can’t compete with a team of specialized models working in parallel. Oh My OpenCode (OmO for short) is a multi-model orchestration plugin in the OpenCode ecosystem, with 11 Agents each having distinct responsibilities and 48 Hooks spanning the entire lifecycle. Zhipu’s Coding Plan provides access to the full GLM model series. Combining the two allows you to assign different models by role — strong coders for coding, strong reasoners for reasoning, free models for busywork.
AI Programming Multi-Model Orchestration
Continue reading →

Standard Library, Testing, and Toolchain: A Panoramic View of Go Engineering Practices

9 min read
After three articles of our journey—why choose Go, basic syntax and concurrency, interfaces and generics—we’ve reached the finale of the Go chapter, time to connect the engineering practices. Go’s engineering capacity also shows up in its standard library, testing framework, and toolchain. They make up the daily working environment for Go developers and underpin rapid construction of reliable, maintainable software.
Go Standard Library Testing Toolchain Go Test Learning Notes
Continue reading →

Domestic LLM Resource and Cost Comparison: GLM-5 / Kimi K2.5 / MiniMax M2.7

3 min read
Overview This article compares the resource requirements and usage costs of three major domestic LLMs, helping developers choose the right solution for their scenarios. Model Vendor Architecture Minimum Deployable VRAM API Available GLM-5 Zhipu AI Dense (multiple versions) 24GB (8B) ✅ Kimi K2.5 Moonshot AI MoE (undisclosed) 24GB (lightweight) ✅ MiniMax M2.7 MiniMax MoE 230B Not yet open-sourced ✅ GLM-5 (Zhipu AI) Versions & Hardware Requirements GLM-5 offers 4 parameter versions, making it the widest-coverage domestic LLM currently available.
GLM Kimi MiniMax LLMs
Continue reading →

Concurrency: The Art of Goroutines, Channels, and Context

31 min read
Concurrency is the core feature that distinguishes Go from other languages. Unlike C++/Java’s thread model, and unlike JavaScript’s single-threaded event loop, Go provides a set of concurrency primitives — goroutines, channels, and context — that let you write high-performance concurrent programs with relatively straightforward code. This article covers the technical details of Go’s concurrency model: the underlying scheduling mechanism, the implementation of channels and context, common concurrency patterns, and performance optimization and best practices.
Go Concurrency Goroutine Channel Context Learning Notes
Continue reading →

Error Handling: Go's Multi-Return Value Approach

7 min read
Go’s error handling philosophy is “simple, explicit, controllable.” Every function that can fail can return an error value, and the caller must explicitly handle it. No exceptions, no implicit propagation—everything is in plain sight. The error Interface: One Value, One Method Go’s error interface is minimal: just one Error() string method. go 1 2 3 type error interface { Error() string } This means any type that implements Error() string is an error. The Go standard library provides many built-in error types, most commonly errors.New and fmt.Errorf.
Go Error Handling Error Panic Learning Notes
Continue reading →