The person behind the work
About Me
I work at the intersection of engineering rigor and visual craft. For eight years I’ve built web products, data tools and AI systems for teams of every size — and spent two of those years shipping an indie game entirely on my own.
That combination is my edge: I can take a product from a vague idea to a shipped, polished thing without the meaning getting lost in handoffs. When you work with me, you get the person who sketches the interface and the person who renders it — one brain, no telephone game.
I care about typography, load times, empty states, and the difference between something that merely works and something that feels right.
Experience
Independent Developer & Designer
Self-employed · 2022 — present
Solo development of the indie game "Ember & Vow" (Steam, 92% positive), plus contract work on analytics platforms and AI copilots for clients in China and abroad.
Senior Full-Stack Engineer
A listed SaaS company · 2019 — 2022
Led frontend architecture for a data analytics suite; built the WebGL rendering layer that took chart performance from 100k to 2M rows.
Software Engineer
A top-tier internet company · 2017 — 2019
Worked on the web platform team: build tooling, component libraries and performance governance for a product with tens of millions of DAU.
Skills
Engineering
- TypeScript / JavaScript
- React / Astro / Vue
- Node.js / Python / Go
- PostgreSQL / ClickHouse
- Docker / CI / Edge Deploy
Data & AI
- DuckDB / DuckDB-WASM
- D3.js / WebGL / Canvas
- RAG & LLM Pipelines
- Evaluation Harness Design
- A/B Testing & Analytics
Design & Games
- UI / Interaction Design
- Art Direction
- Godot / GDScript
- Pixel Art (Aseprite)
- Narrative Design (Ink)
Philosophy
01
Performance is a design material
Speed is not the absence of slowness — it’s a texture. I design with latency budgets the way a designer picks a typeface.
02
Deletion is the cheapest feature
The best design decisions are removals. I keep a GRAVEYARD.md in every project so cuts stay cut.
03
Ship the worst acceptable version
Polish after launch has feedback; polish before launch has only anxiety. Done is a contract with a date.