Linh Le · senior full-stack engineer. I help teams ship fast, maintainable products and keep iterating, with agentic LLM workflows doing the legwork.
It loaded fast. Here's why.
Flash-free. Zero-dependency. View-source clean.
Open to remote work, contract or full-time. linh@lelinh.dev
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.
-
Agentic workflows
I build multi-agent LLM pipelines that move a product forward on a loop: plan, build, review, verify. Deterministic orchestration around the agents, with review gates that have to pass before code merges. The payoff for you is throughput without a bigger team, and nothing skipped to get it.
→ orchestration · review gates · continuous delivery -
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, LLM agents, agent orchestration, RAG, evals. 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
What I can do for you.
Ship a product fast, keep it maintainable enough that the next change stays cheap, and wire in multi-agent LLM pipelines so it keeps moving without a bigger team. Greenfield build, a rescue of something that got away, or agents added to what you already run. Remote work, contract or full-time: linh@lelinh.dev.
Or keep reading the work.