Founder of Moe AI LLC and OwO Network, with a Master's in Computer Science from the University of Pittsburgh. Around 30k stars sit across the projects I write and maintain on GitHub. This site is where the notes go: networking, AI, infrastructure, visas, and a lot of flights.
I moved my home router off iKuai and onto RouterOS CHR running inside PVE β partly because iKuai 4.0's UI is a rough UniFi knock-off, and more worryingly because packet captures have shown it quietly phoning home in the background; and partly because I wanted the router itself to be just another VM. This post covers the RouterOS setup (dual-WAN PPPoE with PCC, a caching DNS resolver, free IP Cloud DDNS, port forwarding with hairpin and NAT loopback), the trick that finally solved a long-standing annoyance β one DDNS name that reaches the public IP from outside but gets looped back to the right internal host by port when I'm home, since a single domain sitting in front of many different internal IPs can't be split by DNS alone β and the conclusion I kept coming back to: the real domestic/overseas traffic splitting belongs on the Surge VM Gateway, not the router. The router does the plumbing; Surge does the brains. Plus a small door-buzzer automation running on the same PVE box.
The great circle is the provably shortest path between two airports β and airlines almost never fly it. I checked 107 of my own flights against their actual ADS-B tracks: on average they flew 12.9% farther than the great circle, and one hop came in 44% over. Here's why the shortest route is mostly a fiction.
After four or five years on Hugo, I rewrote this blog on AstroPaper β by typing /goal in Claude Code before bed and reviewing a working site the next morning. Three weeks and ~50 small commits later, every pixel is customized, down to a comment system that is entirely my own implementation.
Most cameras still ship without a GPS module, so photos come out of the card with no location data in their EXIF. The official phone apps are supposed to sync coordinates over Bluetooth, but for shoot-as-you-walk travel they fall apart: the BLE link drops when the camera sleeps, it rarely reconnects in time, and the background app gets killed by the OS. This post walks through everything I tried β Garmin GPX backfilling, low-power tracking apps, and my own Koko app built on the reverse-engineered furble protocols β and why none of them fully solved the phone-to-camera flakiness. The real fix turned out to be a tiny piece of hardware: an M5StickS3 plus a GPS unit, flashed with furble, that pairs straight to the camera, needs no internet, and feeds live coordinates into the EXIF. Includes a shopping list with USD/CNY prices and a realistic battery-life estimate for the 250mAh build.
WebArena Indigo is a cheap, good-value Japanese VPS that makes a great landing node. But if you front it with a relay and push traffic over a GRE tunnel like I did, GRE over IPv4 gets rate-limited the moment you run a speed test β the connection collapses right after the first burst. This post walks through what I tried (realm public forwarding, IPv4 GRE, IPv6 GRE) and how I ruled out snell, MTU, DNS and the qdisc one by one, landing on the conclusion that only GRE over IPv6 (ip6gre) reliably escapes the rate limiting. Plus a note on picking between the 500M/4-core and 1000M/6-core shared plans.
Notes on building a home network around an N100 mini PC running PVE 9.0 with iKuai as the main router and Debian 13 as a sing-box side gateway. Covers port assignment tricks for PVE management access, choosing sing-box over dae due to Shadowsocks 2022 support, bringing IPv6 to the LAN via ULA + radvd when the ISP has no v6 uplink, and fixing the Happy Eyeballs stall on domestic apps by forcing the direct outbound to ipv4_only.