Linh Le · senior full-stack engineer. End to end means end to end, from server to screen.
It loaded fast. Here's why.
Flash-free. Zero-dependency. View-source clean.
The page is the work sample.
Five things on this site that are fast because I read what the browser already does well. On this one you can check: Ctrl+U anytime. Where the right column shows code, it's pulled live from disk; the raw ↗ link opens the file.
Two letters and you've redecorated.
Hover ahead. The next page is already on its way.
Move your cursor onto a nav link and the site fetches the next page in the background. By the time you actually click, it's already on disk. Open the network tab and watch the prefetch fire. (The router injects a <link rel="prefetch"> into <head>, deduped per URL.)
The easy version walked every in-page link on load and injected <link rel="prefetch"> for each. It works, but it spends the visitor's bandwidth on pages they'll never open, on a site whose whole pitch is that every byte is deliberate. An IntersectionObserver that prefetched links as they scrolled into view was better but still speculative. Hover won: once the cursor lands on a link the intent is real. One <link>, deduped per pathname, almost always on disk by the click.
Late subscribers still get the last value.
Init order stops mattering: each topic caches its last value and replays it to new subscribers in a microtask.
Nothing flickered.
The site picks a theme before the browser draws a single pixel, so a hard-refresh never gives you that "whoops, we meant the dark version" flash. (Inside: an inline <head> script sets data-mode before any stylesheet starts loading.)
Those drifting spots are a system, not a texture.
Two chemicals on a grid: A gets fed in, B eats A and decays; the patterns are emergent. State lives in an RGBA texture, a shader runs the Gray-Scott update on every cell in parallel, ping-pong framebuffers step time forward. (The interesting call was what to put on the GPU and what to leave in JS.)
First version stepped Gray-Scott in plain JS over a Canvas2D buffer: two float arrays, a double loop every frame. Correct, and far too slow: a few hundred cells in, the frame budget was gone and the pattern crawled. Moved the update onto the GPU: state in an RGBA texture, the step as a fragment shader, ping-pong framebuffers to advance time. Now the CPU does nothing per frame except ask for the next draw.
~13 years, every layer.
-
Full-stack web · 11 yrs
Frontend through API through data layer. Production apps owned end to end, not handed across a fence.
→ browser · server · data -
IoT & large data · 9 yrs
Alongside the web work, inside the same 11 years. ~100 networks, hundreds of thousands of devices reporting every 10 min: ingested, aggregated, and queryable in under 250 ms. LoRaWAN radio→DB; AWS compute/storage/queues; Vue 3 operator dashboards on top of an Elasticsearch read layer.
→ 100+ networks · <250ms aggregated read -
Data analysis
Sensor-signal analysis on the fleet telemetry above, document and word-frequency analysis on text corpora, and sentiment analysis on social-media streams.
→ sensor · text · social sentiment -
Networking & bare metal
CCNA1-level networking fundamentals and end-to-end physical machine setup: rack, OS, network, runtime.
→ CCNA1 · bare-metal → runtime -
Game dev · 2 yrs
Custom C++ engine and Unity C#. Shipped FPS and MMORPG titles. The frame budget is the best "fast enough" forcing function I've worked under.
→ C++ engine · Unity C# -
Mid-size to startup: wins and write-offs
Shipped across mid-size companies and small startups: one that made it, several that folded. I learned more from the ones that failed: what you cut when runway is the real constraint, and which calls you don't make twice.
→ mid-size + startup · through the win and the write-offs -
If you want to build something using these buzzwords:
Node, Python, TypeScript, Zig, Go, C++, Rust, SQL, Elasticsearch, DynamoDB, Vue, React, AWS, Azure, Android, iOS, Linux, networking. Shoot me an email.
→ for the keyword scanners -
Remote-first, with a team
Remote by default. Shipping with a team doesn't mean sharing a room with it. Distributed and written-first; the strongest work came from someone pushing back in a thread.
→ remote · distributed · written-first
Looking for:
Interesting things to build, with a team that'll argue about how. If that's where you're hiring, send me an email: linh@lelinh.dev.
Or keep reading the work.