WRITING · JOURNAL
Tianli Zeng · Writing
74 POSTSEngineering notes, water resources, and scattered thoughts. Also the hub for everything I write.

跑赢大盘的那天,我破了自己的地板
昨天的复盘写「QQQ 再跌 0.17% 就贴地板」,今天它跌了 1.69%。结果是两张方向相反的成绩单:P&L 那本账,短 call 墙吐回 $76,226 盖过股票全部下跌,我只亏 0.79%,跑赢大盘 0.91 个百分点;margin 那本账,券商公式对对冲一分不认,股票每跌 $1 垫子烧 $0.75,安全垫从 40.34% 跌到 36.98%,破了我自划的 40% 地板。两张都是真的:一张答「亏了多少」,一张答「还能不能动」。今天的答案是——亏得少,但不能动了。

上周五换来的额度,一天花掉了 97%
上周五我卖了 700 股换回 $140,318 的动作空间,还在文章里写「一张票据都没开」。今天给出了答案:买 500 股、行权再进 300 股、开 5 张新票据——一天花掉额度的 97%,margin 安全垫从 50.47% 掉回 40.34%,QQQ 再跌 0.17% 就贴地板。方向是对的(修满仓缺口),速度是问题:「垫子厚了就激进」被我执行成了「厚了就一次花光」。另外,0DTE 那条线第九次出手,累计首次转负。

Why They Have to Be Right
You lost ten pounds; she says it's the camera angle. She isn't judging you — she's doing bookkeeping. Read the ledger and you'll waste a lot less anger.

垫子一天涨了 8 个点,是我卖了 700 股换来的
margin 安全垫从 42.27% 跳到 50.47%,单日 +8.20pp,是有记录以来最大的一次改善。但白天市场只给了 −0.58pp,那 +8.78pp 全部来自今晚交割——两笔备兑到期,700 股底仓按 715/720 被指派卖掉。这不是赚来的,是卖来的。账单是:让出 $5,799 的涨幅,换回 $109,961 的动作额度;而今天这笔额度我一张票据都没开。

我挑了一个对自己有利的起算点
今天日内交易赚了 $6,896,是这条线开做以来最大的一天。我在台账里写「近五次 4 胜 1 负,累计 +$12,649」——数字一个没错,窗口挑过。从第一笔算起是七次 5 胜 2 负,累计只有 +$2,615;今天之前,这条线是亏 $4,281 的。同一天里,结构创下最差的一次跑输,我创下最好的一次日内,这两件事没有因果。

涨了 0.73%,我只拿到 0.46%:涨得越多,我参与得越少
今天指数涨 0.725%,我涨 0.458%,输了 0.27 个点——而我亲手做的那两笔交易是赚的。昨天正好反过来:亏钱,却赢了指数。两天合起来说的是同一件事:超额的符号由结构决定,不由我当天的判断决定。今天还出了一个第一次:短 call 在涨市里吐回了正股涨幅的 113.9%,比正股赚的还多。

I Built My Son an 'Asset Dashboard': 83 House Rules Turned into a Ledger That Goes Up and Down
The problem with stickers and gold stars isn't that they don't work — it's that they don't accumulate. I turned our family's 83-rule points chart into a stock-market-style ledger: a trend line, an all-time-high badge, a rewards shop, and an auditable transaction log. This post shows what it looks like, which loopholes it closes, plus half a century of token-economy research and what I borrowed from Duolingo and ClassDojo.

The Same Move Cost Me 1.28 Points Yesterday and Nothing Today
The index fell 0.34% today and my account rose 0.14% — a 0.48-point win, while the three trades I made by hand lost money. But the thing worth writing down is different: yesterday one move cost me 128 basis points of cushion; today I made an almost identical move for nothing. The difference is one leg.

Saving $52 Cost Me 1.28 Points of Survival Room
The index fell 0.30% today and my account rose 0.026% — a 0.33-point win, and this time the core strategy earned it rather than one directional trade. But on the same day I made a decision that spent 128 basis points of cushion to capture 0.39. That's 1 to 326. Here's why both happened at once.

我给三年级的孩子做了个练习站:题目无限,但每一套都有头有尾
一份期末卷长出来的练习站。一套 12 题、题号条、错题本记题型不记题目、经验值和勋章墙、每道题都能「再造一道类似的」。这篇把它有什么功能、长什么样、怎么用,一次讲清楚,配图全是真页面截的。

I Built My Kid His Own Market Dashboard, and He Checks It Every Day to See How Much He's Up
The problem with stickers and gold stars isn't that they don't work, it's that they don't add up — by the seventeenth one, nobody remembers what the first one was for. So I turned it into a ledger: every point earned or docked has a reason, a timestamp, and the balance at that moment, with the running total sitting up top, like watching a ticker.

I Can Generate Fifty Thousand Questions. My Kid Asked How Many There Are.
One third-grade final exam, and a practice site I built for my kid. Four teardowns in five days: infinite stream, replaying wrong answers, mistaking generators for a question bank, and a combinatorial explosion. Every teardown had the same root cause—I kept treating 'technically possible' as 'this is what the product should be.' Here's the whole build, and how to use it.

I Invented Six Numbers, and Every Gate Was Green
Turning a paper rule sheet into a config file, the most dangerous move isn't getting the math wrong. It's filling in a plausible-looking number where the original gave none. Bad math gets caught by tests; invented numbers don't — they look exactly like the real ones.

On the Day It Rallied, I Sold Off Tomorrow's Upside
The index rose 1.17% today, I rose 1.32%, beating it by 0.15 points. But break it apart: all 0.15 came from one trade my own rule said I shouldn't take, and the core strategy underperformed by 0.115. Two more things happened that the P&L barely shows — 200 shares were called away from me before the open, and the upside I can still capture fell from 15.9% to 6.55%.

The Name That Fell the Most Didn't Cost Me a Cent
All three of my names fell today: INTC −1.24%, GOOG −0.97%, QQQ only −0.37%. 100.3% of the day's loss came from the one that fell the least — more than 100, because the other two together netted positive. The ranking is completely inverted — because what decides who takes the hit was never the size of the drop, it's the coverage ratio.

I Beat QQQ Today, and Broke Through My Own Floor for the First Time
The market fell today and I fell less — my first outperformance in four days. But after the close my margin cushion dropped from 49.43% to 37.56%, below the 40% survival line I drew for myself. Working through the ledger: three of my own actions account for 87% of it. The market accounts for 13%.

Moving the AI Into Excel: A Workflow Migration Forced by 'Regenerate'
After a script-generated workbook flattened my hand-tuned charts twice, I moved the AI from generating files outside to working in place inside Excel's sidebar — and the hard part wasn't the tool, it was repackaging two years of hard-earned rules for an assistant with no memory.

The Seven Calls I Thought I Sold 'Naked' — Their Caps Were the 700 Shares Bought in the Same Minute
The same batch of twenty-seven contracts: booked separately, −900; booked together, +4,908. Two cross-confirming checks turned out to share the same wrong cut.

I Said "The Cushion Got a Lot Thicker" — Then I Opened the Books and Found I Was Half Wrong
My first reaction after the close was that the safety cushion had gotten thicker. The thick one I got right — every note really is further from losing principal. The thin one I missed — the room left to add positions fell 88% in a single day, from 42 contracts down to 1. One word, two sets of books, and today they moved in opposite directions.

My Checker Gave 102 Green Ticks. You Opened the File to a Screen Full of Errors
I shipped the file with a note: machine-checked, 102 values verified. They opened it and every cell was broken. My checker was not lying — it was answering a different question than I thought.

I Spent More Than Half of Last Night's Free Safety Cushion the Same Day
An expiration last night pushed my margin buffer from 37% to 68%, and I didn't lift a finger for it. In the first three hours of today's session I spent 21 of those points — buying 1,900 shares and selling 20 deep in-the-money calls. The name that rose the most that same day earned me not one extra cent.

Every Button I Pressed That Day Lost Money. The Account Was Up 5.67%.
What made the money wasn't my judgment. It was the 2x leverage the market had added for me the day before. It carried me into an up day — it will just as happily carry me into a down one.

I Drew a Map of My Own AI Setup — The TL Harness Manual
228 parts, 677 notes, and I couldn't tell you which ones were still turning. An inventory tells you what you have; it can't answer "what breaks if I delete this?" So I drew the relationships — and found that 419 of my notes were mislabeled while every single count added up perfectly.

Three Down Days, Three Lower Strikes: A Week of Laddering Covered Notes
Last post I priced the note structure: why a 21.6% headline yield carries only ~3% expected return. This one is the live week: QQQ fell three days straight, and I added 400 shares in four tranches, each immediately locked into a note by selling an in-the-money call — strikes 630, then 610, then 600. The cushion widened from 8.4% to 10.8% while the real coupon shrank from 7.72 to 4.51 per share: the more fear, the more ceiling you trade for floor. Over the same two days I tore down the worthless far-dated short calls and rebuilt them at next-day expiry near the money, lifting rent per contract from ~0.25 to ~4.6 a day. Finally I open both ledgers: coupons collected, net value down — both true at once.

I Keep 35 Alarms Watching Me. I Silenced the Most Important One Myself.
To make one alarm less noisy, I added a line that skipped repeats. From that moment it went permanently silent — for every conversation on this machine — and it still looked like it was running fine.

It Printed Output Every Single Run — That's Why Nobody Noticed It Was Missing 86%
A script ran for two months. Every run produced output. Every output looked fine. It was missing 86% of my text messages — and I had been using that output to make decisions.

Below the Line I Drew Myself: 83% Was the Market, 17% Was Me
I set myself a hard line: survival buffer never below 40% of net liquidation value. Today it closed at 38.75% — the first time under. But when I opened up the formula behind that line, four terms that add up exactly, the answer was: the market pushed 83.2%, I walked 16.8%. On the same day I rolled four positions, moving a ceiling three weeks out to tomorrow — and laid out the ladder of six FCN-style notes underneath all of it.

Sold-Off Volatility Is the Seller's Harvest
In nineteen seconds I did two things: bought 100 shares of QQQ, then sold away everything above 630. It looks like giving up return. It's actually harvesting the one thing this selloff has been handing out — implied volatility. On the same chain, the 630 strike prices 11.7 vol points above the 725. I gave up 25.6 points of coupon for that edge and got a 7.6% cushion back. Net exposure: 15.9 shares.

Fix the Shape First, Then Bet the Direction
Eight of nine Wall Street banks have year-end targets above spot. In a tape like that, the thing I trust least isn't the market — it's me. Read research alone and you only ever find the half that supports the position you already hold. So I put the bull case and the bear case in separate soundproof rooms, verified the load-bearing facts myself, wrote the conflict list myself, and repriced every prescription against the live chain myself. The sharpest finding wasn't direction. It was the shape of my own book.

A Big Earnings Beat, a 7.9% Drop: I Pushed My Strike Down Ten Dollars, and Gave My Formula's Residual a Name
Intel posted revenue up 25%, its fastest growth in 15 years, an EPS beat, and spiked toward 110 after hours. The next day it closed at 92.32, down 7.89%. Confirming good news earns no second reward. I placed exactly one order: rolled a 0DTE 110 strike down to 100 for an extra 5.25 a share. On the same day, the formula I'd fitted over three sessions failed for the first time. The gap was 0.62 percentage points, and its name is vega.

Biggest Red Day of the Run — I Went Shopping for Two Notes (Plus: Intel Earnings Land)
QQQ fell 1.90% — the worst day of this stretch — and I fell 2.26%. Alphabet's $200B capex bill hit the whole market. I did three things: bought two deep-ITM notes in the panic, left one roll unfilled, and watched Intel's blowout quarter land just below my cap.

过度乐观,就是悲观
你感受到的从来不是现实本身,是现实减去预期。现实好过预期才有多巴胺,不如预期就只有失望。所以过度乐观就是悲观——预期抬到天上,现实天天让你失望。教条式的乐观和自信,本质是把预期拉满,在批量给自己制造失望。而两千年前的斯多葛给出了另一种乐观:预期压到最坏,接受一切并从中学习——高预期容易 miss,低预期容易 beat。

A Quiet Red Day Runs the Formula Backward — Plus: Intel Reports Tomorrow, Here's How My 1,200 Shares Are Positioned
The index fell 0.51%, I fell 0.69%. Yesterday's straight line — 'the more it rallies, the more the cushion bleeds' — got run in reverse on a small down day: sold calls flipped from drag back to cushion, and the leverage I melted off yesterday grew back. Plus one chart of my Intel earnings exposure.

情绪价值是个强化信号
情绪价值不是有用没用的问题,它是个强化信号——本身没有方向。绑在真实能力上,它是燃料;和能力脱钩,它是高能耗、不稳定、还会把你锁在错误的行为上。而当前这个内卷、下行、上升通道变窄的环境,正在系统性地让它脱钩——所以它的负作用在放大。

靠结构,不靠记性
重复的错误不该靠记性解决,该靠结构解决。教训记在笔记里是愿望,写进拦截钩子里才是制度。三个亲身的坑——一个看不见的字体、一次并发提交、一份报错的台账——机制是同一个:只要'做对'还依赖某个人当场不出错,错误就永远有复发的地方。把这个依赖拆掉。

CRITIC Objective Weighting: What It Rewards, and When It Quietly Breaks
CRITIC claims to let the data set the weights — but what does it actually reward? A full worked example, plus two failure modes almost nobody mentions: with only 2 indicators it degenerates exactly to std-ratio weighting, and with too few samples the weights are decorative.

The Index Jumped 1.85%, I Rose 2.82%: The Formula I Published Yesterday Got Audited Today
One day after I wrote "this leg is structurally incapable of making money in a big rally," the index rallied 1.85%. The 49 short calls lost 2.41% right on script (the model said 2.28%), yet the whole book rose 2.82% — the series' biggest daily gain. Add a deposit five days late, and all three risk flags healed in a day. None of them healed by me.

The Index Rose Just 0.11%, I Rose 0.41%: The First Day the Cushion Did the Earning, and a Covered Call Whose Ceiling Is Negative
Monday was the first quiet session in seven, and the first time the short-call leg was the main engine — 49 short calls out-earned the stock itself. I write the leg out as a straight line and solve for the "worked-for-nothing line" at 0.29%. The same day, I sold a covered call whose ceiling is negative: fully capped means a 3.06% loss. That premium isn't a coupon — it's loss reduction.

The Benchmark Bill for Three Subscriptions: K3 for Volume, Claude for Quality, GPT for Spikes
Kimi K3 shipped with 14 head-to-head benchmarks. I transcribed both charts line by line and mapped them against my own usage: K3's five wins are all high-frequency grunt work (long-horizon agentic, web research, automation), Fable 5's six wins are all desk-quality work, GPT-5.6's two wins are peak-brain work. Route by task personality: K3 for volume, Claude for quality, GPT for spikes — full routing table inside.

Three Open-Source Contributions, In Retrospect: Raycast · WeChatTweak · Cardinal
Three PRs I sent upstream in 2026 — a Raycast extension, a WeChat 4.x binary patch, and persistent search history for a Rust+Tauri app. Three ecosystems, three different bars for 'getting merged,' and in every case the code itself was the easy part.

My Note Yields 21.6% Annualized. Why Is Its Long-Run Expectancy Still Below QQQ?
I've been building cushioned buy-write notes: buy QQQ, sell an in-the-money call, and as long as the index doesn't drop more than ~4.8% in 35 days I collect the full coupon — 21.6% annualized. Yet the pricing model puts the structure's expected return at barely 3%, about the same as T-bills — a 7x gap between the face rate and the expectancy. This post takes that gap apart layer by layer: the no-free-insurance identity, a three-bucket decomposition of 27 years of history, a 25-year cash-vs-margin showdown against QQQ, and the realization that this payoff is the self-run version of a ten-trillion-dollar industry.

Unpack the Coupon and There Are Only Two Kinds of Money: Treasury Interest, and Insurance Premium
The previous post explained why a cushioned buy-write note's long-run expectancy sits below naked stock. This one digs a layer deeper: using put-call parity to unpack the 21% coupon into its only two components — treasury interest and insurance premium — which is why the note's fair expectancy is pinned near T-bills at every strike and on every underlying. Then the tail gets computed properly: the probability of breaching break-even, the average loss when you do, where the lognormal model lies to you (crash odds understated ~5x), and why the real tail usually lives not in the note but in the account's leverage.

Another Knife at 693, Floored at 646: On Expiry Day Not a Single Share Was Called Away, and Debt Climbed to 88%
The monthly expiry handed down its verdict: all 22 short calls closed below their strikes — every dollar of premium banked, but not one share called away, and not one dollar of debt repaid. So I welded the same structured trade one rung lower (buy 693, cap 660, floor 646.58), and debt went 19% → 69% → 88% in three days. The bill arrived same-day: the cushion absorbed only 44% of the long-side loss (68% the day before), net −2.44% vs the index −1.51%, and one session knocked a week's +1.36pp of excess back down to +0.41pp. Plus a crack in the discipline: last night I published 'take delivery as contracted,' and this afternoon I put in an order trying to run. It didn't fill. Luck saved me, not discipline.

Catching the Knife at 708 with a Floor Welded at 666: Buying the Dip as a Structured Trade
The deepest down day since the scoreboard opened. I caught the knife at 708 in the morning — but in the same minute welded a breakeven floor at 666 under it, turning the dip-buy into a structured trade: a 76% chance of ~21% annualized, priced fairly, with the upside capped and the tail still mine below −6%. The index kept falling after I bought; the position's net change on the day was 0.00%. Then the streaming giant's earnings blew through the put I sold a month ago. Verdict: take delivery. The full sentence behind selling a put has always been 'I am willing to buy this company at that price.'

Say It Clearly: A Full Postmortem of Working with AI
I co-wrote a technical proposal with AI — dozens of rounds from first draft to final. The potholes weren't the valuable part; the postmortem was: almost every one traced back to the same thing — when, and how clearly, the initial conditions and boundary conditions were stated. One sentence before kickoff beats ten rounds of corrections. Ends with a 30-second briefing checklist that works for AI and human collaborators alike.

Open-Sourcing Two Native macOS Apps: Ask Claude and HydroMac
Two native macOS apps from my personal fleet, now open source: Ask Claude (chat on your Claude subscription, zero API key) and HydroMac (SwiftUI shell + Rust compute core for water engineering). Plus the hardest lesson before going public — data sanitization is far more than find-and-replace.

A Guided Tour of This Site
tianli.cyou just went through a 'paper manual' redesign and a serious spring cleaning: dead navigation cut, zombie services removed, private entry collapsed into a single bookmark — a guided tour, plus how one person maintains a fleet of sites.

A One-Cent Roll That Paid Off Half My Debt: Assigning Myself on Purpose
Two days before expiry, I rolled 21 covered calls into same-day expiration for a net credit of one cent per share. Why? So the clearinghouse would sell the shares for me tonight, neatly, at the strike — no sell order, no spread, no commission. A nearly profitless trade that cut my margin debt almost in half. This is how to turn assignment from an accident you dodge into a deleveraging tool you aim.

The Meat Grinder Reversed — and My Leverage Breathed on Its Own
One cool CPI print and yesterday's bleeding chip stocks rallied hard: the same stock went −6% Monday, +4.5% Tuesday. I did one small thing each day and beat the index on both — not because I called the reversal, but because a short-call book's negative gamma breathes for you: exposure grows into declines and shrinks into rallies. Here's how the breathing machine works, and what it charges.

How Many Pressure Gauges Does It Take to Pin a Leak to One Pipe? A Full Walk-Through of the Pressure-Fingerprint Method
On a 6-node teaching network, worked from the Hazen-Williams equation all the way to the sensor-count decision: how a handful of pressure readings become a ranked list of suspect pipes, and how a marginal-benefit curve answers how many gauges and where.

Buy Behavioral Stubbornness with Structural Reversibility
Reversibility isn't "can you take it back" — it's "how much does taking it back cost." Ego isn't better the lower it goes — it should be calibrated to the facts. Persistence versus stubbornness: the word is issued afterward, based on the result — the one thing you can control beforehand is structure. Buy behavioral stubbornness with structural reversibility.

A Meat-Grinder Week for Chips — and My First Time in the Audience
SK Hynix rang the bell while Intel bled out, all in the same week: 28 of my short calls expired, margin debt shrank 44% in one day, my second-largest holding fell 2.4% while the portfolio gained 0.8%. The calm wasn't mindset — it was structure.

Strategic Retreat: I Deleted Every Alpha Component From My Options Strategy
Tested with real money: the single-name VRP signal is noise, automated trading went 0-for-5 at −4.5%, and even covered calls show risk-adjusted edge ≈ 0. What survived the retreat: a beta core, a leverage cap computed from stress tests, and a few mechanical rules that keep emotion out of the room.

Two Minutes From the Bottom: My Hands Moved, My Principal Didn't
Two panic days where every signal screamed sell. The ledger: not a single share of the core position sold — I even added near the low. But my hands still moved on the options overlay: the last two rolls straddled the intraday low by two minutes each side, the V-reversal ran them over, and four whipsaw pairs netted −$355. A trade-by-trade forensic of what held, what broke, and the procedure that deletes the 'should I act intraday?' decision itself.

陵阳公样智能辅助设计研究
目的 针对唐代陵阳公样装饰纹样在现代传承中面临的创新性不足与公众参与度低等问题,探索一种基于人工智能的智能辅助设计方法,以实现传统纹样的活态传承与创造性转化。 方法 首先,基于皮尔斯符号学三元理论,从表征、客体和诠释三个维度对陵阳公样进行系统解析,并运用分裂语法对纹样结构进行层级化解构,构建了包含6...

Prompt Caching 架构:为什么 CLAUDE.md 越稳定越省钱
--- Prompt Caching 是 Claude API 层面的优化机制,核心原理简单直接:缓存按前缀匹配工作。 每次请求发给 Claude 的完整输入大致是这样的结构: 如果两次请求的"前缀"相同——即从第一个 token 开始到某个位置完全一致——第二次请求可以复用缓存,跳过对这段前缀的重...

浙东引水工程受水区降雨趋势与多尺度变率分析
ZENG Tian-li$^1$, ZUO Xiao-xia$^1$, YANG Yu$^1$, DH$^1$, WU Mu-hong$^2$, ZHONG Lü-bin$^2$, CHEN Shu-yang$^3$ (1. Zhejiang Design Institute of Water Co...

You Think You Understand? You Might Be the Patsy
Your circle of competence isn't measured by what you know—it's measured by what the person on the other side of the trade knows. A 'patsy test,' plus five questions to run silently before you place an order.

Your Returns: Skill, or Just the Rising Tide?
In a bull market everyone's a genius—and that's exactly the problem. Sort every gain and loss into four buckets (beta, risk premium, alpha, luck) and you'll see how much of your 'edge' is really just borrowed.

The Steadiest Profit Curve Should Scare You Most
A curve that earns a little almost every day with barely any drawdown is usually not proof of safety—it's the textbook shape of a concave payoff. You're selling insurance; the claim just hasn't come due. Here's a test to spot it.

Every Bet in Your Favor, Yet Still Bankrupt: Position Sizing Is Destiny
A game that favors you every single round can still wipe you out with probability 1—because long-run fate is decided not by the odds but by how much you bet. The math behind 'Rule No. 1: don't lose money.'

The Risk You Fear Most Is the One Your Metrics Don't Measure
What you truly fear is the permanent loss of capital—but the industry's favorite 'risk' number, volatility (σ), measures something else entirely, and the two often move in opposite directions.

Same Blade: Surgery in US Stocks, Bare-Handed in A-Shares
A strategy that makes money reliably in US equities can bleed just as reliably in A-shares—with zero change in your skill. Market microstructure holds veto power over any strategy.

The Strategy That Earns a Little Every Day Is the One to Fear
When a strategy earns a little almost every day and rarely draws down, your first reaction shouldn't be delight—it should be caution. That smooth curve is the signature of selling insurance before the claim comes due.

Claude Code 架构 · Layer 1:长期上下文层(CLAUDE.md / Memory)
长期上下文=每次对话自动加载的背景:CLAUDE.md 全局/项目规则 + Memory 跨会话记忆。它是 Claude Code 的地基,写好了 Agent 在任何会话都知道技术栈、规矩、偏好。

A Methodology for Water Resources Carrying Capacity Evaluation: AHP-CRITIC-TOPSIS in Practice
From indicator system design to combined weighting and final ranking — a reproducible technical pipeline for water resources carrying capacity evaluation, with Python implementation notes.

Building an Enterprise-Grade Claude Code Harness
From 43 commands to 14 skills, from hook automation to MCP integration — a complete engineering methodology for LLM toolchains.

MCP in Practice: An Agent Ecosystem from Code Search to Gmail
Three MCP servers, 512+ session records, semantic search — how to build an AI Agent toolchain that actually gets used daily.

Cost Engineering: Running 28 Production Services for $31/Month
One $30/month VPS plus a $1/year domain, hosting 24 systemd services and 4 Docker containers — a cost-control playbook for indie developers.

From Streamlit to Tauri: Bringing Water Engineering Tools to the Desktop
Lessons from migrating 12 Streamlit web apps to Tauri desktop apps — separating the compute engine, rewriting the React frontend, cross-platform packaging.

Wiring 44 Scripts into Raycast
Wrapping CLI tools into one-click GUI actions — design notes, gotchas, and efficiency data from building 58 Raycast wrappers.

One-Person Full-Stack Infrastructure
24 systemd services, 4 Docker containers, 29 GitHub repos — how an indie developer builds a reliable production stack on a minimal budget.

The Zhedong Water Diversion Digital Twin: From Physical Water Network to Intelligent Scheduling
An in-depth look at Zhejiang's Zhedong Water Diversion digital twin — how digital twin technology enables precise scheduling and intelligent management of a trans-basin water network.

Welcome to My Technical Blog
My first blog post. I'll share technical experience and project insights across water conservancy, data analysis, and machine learning.