
TanStack Start SSR-Friendly Theme Provider
A complete theme management system for React applications with SSR support and zero flash on first paint.
- tanstackstart
- jamstack
- react
- webdev
Full Stack TypeScript Developer
Crafting exceptional web experiences with full-stack TypeScript. Based in Nairobi, Kenya.
What I build with
React · Next.js · TanStack · Tailwind CSS · TypeScript
Ownership
From architecture through deployment and the work after launch. I stay accountable for the entire lifecycle, not just my part.
Architecture
Data modeling, stack decisions, and reviews before you commit. I help teams choose paths they can live with.
Teams
I lead, mentor, and collaborate across product, design, and engineering, translating constraints so the work actually lands.
Engagement
Full-time, contract, and freelance across remote US teams, hybrid setups, and in-person. Forward-deployed too. Embedded inside your org to build the integrations and upgrades your stack needs from the inside.
Open source
Maintainable code by default, open source contributions, and tools built on the fly: CLIs, Chrome extensions, web apps, and MCPs that remove friction and multiply what a team can ship.
Why I choose what I choose
Language
TypeScript is the discipline layer. I use it to make intent explicit before bugs get a chance to become runtime surprises.
Projects
Pinned highlights, recently pushed repos, and topic filters — pulled live from GitHub.

A complete theme management system for React applications with SSR support and zero flash on first paint.

A guide to creating Android home screen widgets using Expo modules, complete with state management.

Installing and configuring Android Studio on Linux for a smooth Expo and React Native workflow.

Automating GraphQL operation discovery in Vite — five hours well spent on a five-minute problem.
Infodiet
Podcasts and reads I keep in rotation — the shows and blogs I reach for when I want to stay current without doomscrolling.
Weekly front-end news with Jack Herrington, Paige Niedringhaus, and TJ VanToll.
Long-form interviews with the people behind well-known software.
Casual conversations about code with Richard Feldman.
Exploring React Native together, from Infinite Red.
Tasty web development treats with Wes Bos and Scott Tolinski.
Weekly TypeScript news and deep dives with Kamran Ayub and Erik Onarheim.
Frontend interviews and industry news from the LogRocket team.
Frontend engineering articles, tutorials, and industry roundups.
Today I learned
Small lessons, debugging wins, and notes — stored in Tirso so I can add new ones from the admin panel later.
Storing a user’s theme preference in localStorage is convenient—no server round-trips, no cookie consent headaches. But it creates a classic problem: on the first paint, the page always shows the default theme, then quickly swaps to the saved one once JavaScript loads. That jarring flicker is known as a flash of incorrect theme. A common alternative is to store the theme in a cookie, read it server-side, and inject the correct class or data-attribute directly into the HTML. This eliminates the flash, but it comes with painful trade-offs: Caching suffers – The server can no longer return a static, cacheable response because the HTML depends on a per-user cookie. CDN caching and stale-while-revalidate effectively break. Streaming breaks – If you’re using Next.js App Router’s streaming or Suspense, you now need to await cookies() at the very root layout, blocking the entire stream and defeating the purpose. So we’re caught between a flicker and a performance cliff.
While building a reusable shortcut hints component with TanStack Hotkeys, I hit React's "Cannot update a component while rendering a different component" error. Here's how queueMicrotask fixes it -- and when you should (and shouldn't) reach for it.
Tanstack query client setup with typed keys and meta options , The meta : {invalidates} is setup to invalidate all queries with that key prefix
Need environment variables only during development (like debug flags or local API URLs)? Here’s how to conditionally load them in Vite without leaking secrets:
Resources for optimizing your final docker build sizes
Technique for making JSON parse emit the input object type instead of any
Contact
Open to projects, collaborations, and useful conversations about TypeScript, product architecture, and web systems.