Kiranjoss echo
Indie Developer · Writer · Sanskrit for "light" — clean, simple, unconventional
Indie Developer · Writer · Sanskrit for "light" — clean, simple, unconventional
Tech Stack
Full-stack development, love tinkering with new tools. Rust, Python, TypeScript.
Documenting the thinking process, sharing lessons learned. Writing is the best way to learn.
Coffee enthusiast, indie developer, occasional runner. In Yangzhou, building my own world with code and words.
Little toys on this site. Click a line to run it.
The background particles first dressed by season, then followed the real-time weather, and finally geolocation moved onto my own server. The crashes taught more than the feature: a TypeError swallowed by requestIdleCallback, a static import that let one 404 kill every effect on the site, and a 502 that was not a bug.
A zero word count in prerendered HTML led me to a 640KB mega chunk — every post compiled into JS just to read a few KB of frontmatter. Moving metadata to build time cut the main JS bundle to 48KB and shaved half a megabyte off dist.
I had AI rebuild my archive page. Even after I pinpointed the bug to the horizontal line above 2026, it still fixed the wrong one. A full retrospective of two days of human-AI collaboration: five weaknesses, four countermeasures.
The free stats service on my blog footer was half-dead, leaving a dead dash. I replaced it with a self-hosted counter built on the Python standard library and SQLite — zero dependencies, five pitfalls, each worth more than the feature.
A subtraction pass over three years of accumulated effects: film-grain noise, spotlight borders, native View Transitions, tighter display type, and a Bento home page. The traps were worth more than the effects — SPA navigation eating CSS transitions, :has specificity, and vp-doc global style pollution.