Notes · Self
About Me
I’m Ethan, based in Hangzhou. The longer I build software, the more I trust one thing: the products worth making are systems that keep evolving under real use — not one-off demos.
My work spans SaaS platforms, native macOS / iOS apps, and turning AI capabilities into workflows that actually ship. I work full-stack — Next.js / Astro / SwiftUI on the front, Node.js + Cloudflare + self-hosted workers on the back — and when I go cross-platform I try to preserve each platform’s native feel rather than wrap a webview.
I tend to define the problem before writing code: what the invariants are, where the soft edges live, what the minimum runnable system looks like. Get it running first, then iterate on structure, experience, and performance. I spend disproportionate time on tooling, docs, and constraints — because that’s the actual infrastructure that lets a project live for years.
On yizhe.me you’ll find some of the projects I’ve built (App Store Price, Pinlist, AI Token Usage…), and notes on AI-native products and what it means to make software worth polishing.
Outside view
Me, in Claude’s Eyes
Written by Anthropic’s Claude, based on the projects we’ve built together under ~/Projects.
- 01
You design systems; you don’t just iterate fast.
You take time to figure out what’s invariant and what isn’t before you write code. The CLAUDE.md in appstoreprice asks for “three invariants before any large refactor” — that constraint feels written for future-you and your collaborators, not for a single shipping cycle.
- 02
You keep things small on purpose.
claude-bar is ~250 lines of jq + awk shell — no npm, no bundler, no runtime. When you build a tool, you reach for whatever will still run untouched in five years, not whatever looks most modern this quarter.
- 03
On iOS, you go native — never a wrapper.
Pinlist is SwiftUI + SwiftData + CryptoKit + CloudKit; PowerFlow targets iOS 26’s Liquid Glass. You absorb the platform’s learning cost so the product feels like it belongs there.
- 04
Detail-obsessed, but always for a reason.
We spent eight rounds polishing a single navigation squiggle — not because the difference was huge, but because you could articulate exactly which pixel-level inconsistency was bothering you. Your eye for detail always points at a specific visual or interaction signal; it’s never detail-for-detail’s-sake.
- 05
Tooling consumer and tooling creator.
You use pnpm / Drizzle / Astro, sure — and you also write Claude Code plugins, launchd-managed Chrome instances, and your own token-usage worker. When workflow friction crosses a threshold, you fix the friction instead of routing around it.
- 06
Docs density well above average.
appstoreprice splits its architecture into overview / databases / data-flow / domain-routing. Multiple CLAUDE.md files specify commit emoji, naming style, even how country flags render. You don’t write docs to look professional — you write them so you can return to a project six months later and pick up.
- 07
Bilingual codebase, global perspective.
Comments and identifiers in English, product copy mostly Chinese, commit messages in Chinese with emoji. Your products — App Store Price, Pinlist — were multi-region from day one. You build tools that start in China and serve the world, not single-market apps.
- 08
You notice friction, and friction is where you build.
claude-chrome exists because chrome-devtools-mcp kept showing an Allow dialog — a minor annoyance most would ignore. You stopped and solved it. That same sensitivity shows up across projects; it’s the root of your product instinct.
— Claude (after reading everything Ethan keeps under ~/Projects)