
SDE @perplexity_ai, TC39 - ECMA402, ex-@CloudKitchens, @Dropbox, @yahoofinance, @iHeartRadio, @Selerity react-intl/formatjs maintainer
New York, NY
Joined June 2009
- Tweets684
- Following94
- Followers204
- Likes249
React Compiler should really just be a oxc linter tbh
longho.dev/posts/react-compi…
I opensourced a thing github.com/perplexityai/code…
3 - 30x faster than Knip, powered by @OxcProject resolver and rayon
wrote about why “metaframework is dead” feels true rn.
not bc frameworks are useless, but bc @OpenAIDevs Codex + @claudeai Claude Code make explicit scaffolding cheap. i’d rather codegen real routes/contracts than hide more runtime magic.
longho.dev/posts/the-metafra…
A package is a distribution boundary.
Use package names for code that leaves the monorepo. Use root imports for internal source. Enforce architecture with visibility/lint rules, not fake package.json files everywhere.
longho.dev/posts/a-package-i…
Last part is up: a frontend build system is product infrastructure.
@bazelbuild gives you precision, but teams still need rule APIs, codegen, docs, good errors, metrics, and gradual adoption so the graph stays usable.
longho.dev/posts/part-8-oper…
Part 7 is up: @bazelbuild, @turborepo , and @NxDevTools are not one ladder.
Turbo runs package tasks. Nx models projects. Bazel models actions and artifacts. The right choice depends on where your repo’s complexity already lives.
longho.dev/posts/part-7-baze…
Part 6 is up: a successful bundle is not the same as a correct artifact.
Use @bazelbuild to verify built outputs, then make deploys consume those verified artifacts instead of rediscovering files from the working tree.
longho.dev/posts/part-6-veri…
Part 5 is up: @bazelbuild should not replace Vite.
Bazel decides what the app needs; Vite turns it into a bundle. Apps, SDKs, tests, Storybook, assets, and output checks all become explicit graph edges.
longho.dev/posts/part-5-apps…
Part 4 is up: some frontend inputs are graph questions.
Translations, icons, routes, and generated TS packages get cleaner when @bazelbuild can model them as named artifacts instead of side effects.
longho.dev/posts/part-4-tran…
Part 3 is up: typechecking is not one giant tsc --noEmit.
Split runtime, test, config, generated, and lint contracts so @bazelbuild can catch dependency leaks where they happen.
longho.dev/posts/part-3-type…
Part 2 is up: frontend packages are rarely just TypeScript folders.
This one breaks down runtime code, tests, stories, config, assets, visibility, and codegen as separate build surfaces so @bazelbuild can rebuild less and explain more.
longho.dev/posts/part-2-the-…
Part 1 of my series on @bazelbuild for large frontend monorepos.
At scale, the hard question is not “how do we build the app?” It is “what did this change affect?”
longho.dev/posts/part-1-why-…
formatjs, now supporting svelte
Formatter, linter, CLI, the whole thing
formatjs.github.io/docs/svel…
Long Ho retweeted
Introducing Perplexity Computer.
Computer unifies every current AI capability into one system.
It can research, design, code, deploy, and manage any project end-to-end.
We just add a new capability to formatjs to make sure your translations are up-to-date and structurally sound! Check it out! formatjs.github.io/docs/tool…


