Hi, I am Terence (Xu Xu). Here is a look back at 2024.
Ten days left until 2025. I just finished the 2024 OKR review and sorted the year's work, so I am writing a light summary here—not only about work. I hope to do this every year from now on.
Roughly three blocks:

The figure above is my sketch of client work this year.
Early on the product chased capability and KPIs under time pressure, so tech debt piled up—performance and UX pain included. This year a large share of time went into performance and experience.
OKR metrics were fixed: how much performance gain, how much lower energy use, how much fewer tickets. Going from "passable" to "good" is hard. Our product manager was on maternity leave, so the business side and I wrote PRDs ourselves and then delivered.

High-level only—details would take another essay. Desktop performance work starts with reconnaissance: method timings and memory across machines. Without data you cannot tune.
Step one: instrument timings and memory. That shows which methods are slow and when memory spikes—often from concurrent background policy.
Step two: speed up slow paths and cut CPU spikes.
Most slowness came from system info collection. Early on we shelled out a lot—lots of PowerShell. We rewrote those calls in Rust against Windows APIs: processes, installed software, hardware, and so on. Stats also showed CPU spikes on whole-minute boundaries from many concurrent policies (some every few minutes, some per second). I designed a task queue; after ship, spikes dropped sharply.
I also got much better with Chrome DevTools: Task Manager for JS memory, Performance for leaks, heap snapshots and comparisons, allocation timelines. Same toolkit helps debug Electron's main process—harder than the renderer, with limits when native modules blur stacks. Often the loop is debugger + local logs + intuition + repeated snapshots, then diff the heaps.
Step three: gray and measure. Optimization without numbers is incomplete; do not ship everything at once. Device variety is huge—if gray disagrees with local results, adjust. I kept hardening fallbacks for stability.

UX is subjective—one person likes a feature, another does not. Ticket volume still roughly reflects satisfaction and ease, even if it is a blunt metric. Other axes: usefulness, learnability, aesthetics, interaction fluidity. Our work leaned that way—onboarding, UI refresh, animation, practical toolboxes.
Internal products rarely get dedicated UI designers (lowest priority), and we had no PM—but some UX still had to ship. Shifting from engineer mind to product mind is hard; pure-tech features often miss love. Being frontend helps with taste; I drafted PRDs, reviewed with the team, iterated, and landed something decent.
A new "red team" style group needed a platform. I built an admin from scratch with Umi + React + Ant Design. Not much to say—move on.

I had barely touched this before; I only knew native fingerprints. Web and mini programs have scenarios too. Some of our policies needed it, so I dug in. Little investment in H1; H2 more. On the client you can do surprisingly little: collect signals, feed algorithms, get a hash.
I explored navigator APIs and combined audio, canvas, font, WebGL fingerprints plus basic hardware info, encrypted to the server, then light analysis of collision/growth rates for a pure-frontend scheme.
Honestly the payoff is limited—auxiliary for risk at best. Without a true stable ID (you can store a local UUID), model upside is small. Hard signals still dominate: multi-instance apps, root, emulators. Most activity lives inside app shells; bare H5 is rarer.
Mini-program fingerprints are even narrower—few fields, or fields needing authorization. An SDK must not break core flows; more collection is not always better—privacy rules can get an entire mini program banned. So stick to basics, with fallbacks for varying base library versions and API availability. Compatibility hell.
The real core is the algorithm side. The client only needs truthful collection; leave the rest to models.
Not a heavy OSS year. A few items:
Kept maintaining electron-prokit (https://github.com/Xutaotaotao/electron-prokit)—mostly bugs. ~2.8K downloads, 242 stars.

Kept maintaining get-installed-apps (https://github.com/Xutaotaotao/get-installed-apps)—docs refresh. ~5.4K downloads, 106 stars.

Built wukong-wallpaper (https://github.com/Xutaotaotao/wukong-wallpaper)—Black Myth Wukong wallpaper app, for fun. 58 downloads, 6 stars.

With colleagues, FindAll (https://github.com/FindAllTeam/FindAll)—network security emergency-response tooling for red-team ops. Source closed; installers only. ~11K downloads, 600+ stars.


Colleagues and I attended a cybersecurity operations conference in Beijing—eye-opening. AI is everywhere in security talks; agents are already in real scenarios. My learning stayed shallow (API calling). I need depth toward being an "AI frontend" practitioner.
I also read parts of Electron and its ecosystem—careful engineering, and a gulf versus the ceiling. Chromium source is vast and hard (mostly C++); painful for a frontend engineer, but the work demanded it.
New hobby this year: hiking. Not that many trips—summers too hot, winters too cold—so mostly spring and autumn. Hiking clears work noise. Alone on a trail you hear wind and water and feel the mountain belongs to you for a while.
Lushan—the only mountain I visited twice—still beautiful.

Fuzhi Mountain—stone waves and canola terraces; spring suits it.

Hangzhou Jiuxi—great spring/summer; classic Shanghai day trip.

Xingmeijian—intimidating; beginners beware, or finish the descent in the dark.

Yushan—normal difficulty, nice views, lots of up-and-down.

Qixiakeng—fall colors; easy route, maple leaves at their best.

Longwang Mountain—Jiangzhehu snow prize; winters worth it.


Strongest trip: western Sichuan road trip with friends. Every stop drew a chorus of "wow"—eyes cleaned. One day can hold four seasons. Driving G318 feels great: rivers, grassland, mountains, cloud seas, snow peaks. "Drive 318 once in a lifetime" earns it.
Also Jingdezhen, Fuzhou, Pingtan, Jinyun—each with its own flavor, food, and views.

Jingdezhen is porcelain everywhere—like a ceramic nest. Handcraft lovers can stay days. Some night stalls are fierce; even for someone from Chongqing the spice stung. Spice-shy travelers: skip or cry.

Fuzhou feels lived-in, not over-touristy—cultured and a bit petit bourgeois. Hit the famous spots, wander with a camera; that is enough.

Pingtan is worth it—rent an e-bike, loop the island under blue sky and green water, stop for photos, find a bay with friends, sip something slightly salty, wait for sunset.

Jinyun underwhelmed: crowded, small, fewer views. Go on a quiet weekend, not holidays. Popular mainly because of TV filming locations. Fine for a nearby Jiangzhehu weekend if you want easy photo spots.

I have shot since college with the same kit—prosumer camera, no new lenses—and that is fine for portraits or landscape. Photos used to go to Weibo; on WeChat I opened a photography column and posted backlog when mood allowed. Weekends I wander for street scenes; travel means the camera comes too. Good frames cheer me up because each one is unique and returns the moment—that is why I keep shooting.

Cycling returned this year. College was mountain bike; after National Day I tried road. When weather allowed I rode weekly—~600 km in two months, ~300 of that around Taihu. First century-plus day since college; finishing Taihu made me feel unstoppable. Dopamine is real—and if you do not overdo it, the body likes it.

Still a beginner. I took private lessons and quit halfway through footwork. For desk workers it is healthy; I played most weeks—casual with the team, sharper with company players and stronger partners. Rules → better reactions and movement; teammates say I am clearly better than when I started.
Fewer books than last year. Finished: Four Springs, Educated, Shall We Go for a Walk on Saturday Night, The Litchi Road, The Alchemist. Half of Original Commentary on the Great Learning; ~25% into The Courage to Be Disliked and a Trump biography. Mix of everything—idle pages. The Alchemist was especially healing; recommended.
Real writing year: WeChat first, then Juejin, then CSDN. Energy caps further platforms. Rough numbers follow.
On WeChat, Turning 30: Six Years as a Frontend Engineer took off—many notes from peers who felt the same. Two paid columns, though most pieces stay free—contribution, not hustle. When people ask questions I may point to a column; buy or not is their choice. ~1,184 followers; read counts unknown.

On Juejin, Two Years Building Electron Apps ranked among strong frontend posts; lots of Electron questions and peer chats. 400+ followers; traffic is high—many developers there.



CSDN feels mixed quality and maybe bot-heavy—hard to prove—but many people still use it, so distribution still helps. 400+ followers.

Year one of personal brand experiments: people who find me usually share a similar path—mostly frontend, some founders seeking consulting or jobs/interviews. The network amplifies you; my niche is specialized, so inbound is mostly Electron/desktop. Other formats (advice lists, tool roundups) stay undecided—they may not serve my own practice. I prefer writing from day-job depth: summarize and sharpen.
Time flew. On paper the year looks rich. Writing clarifies and forces reflection—worth it.
Compressing a year into ~6,000 Chinese characters is like bottling the year and dating the cork—open it later and maybe taste the age.
Everyone has a private trajectory. This is only mine. Disagree freely. Thanks to everyone who walked along—may the new year hold something excellent for each of us.