# Yash Thakur > Senior React.js Developer and Technology Manager based in Gujarat, India, with 8+ years of experience building scalable web applications across SaaS, fintech, and mobility domains, and leading engineering teams of 12+. Specializes in React, TypeScript, Next.js, Node.js, and micro-frontend architecture. ## About - Role: Senior React Developer & Technology Manager - Experience: 8+ years (Atyantik, CryptoForecast, Maxxton, ROOSH) - Core skills: React, TypeScript, Next.js, Redux, Node.js, PHP, performance optimization, design systems, engineering leadership - Location: Gujarat, India - Site: https://www.yashthakur.com ## Pages - [Home](https://www.yashthakur.com/): Overview, featured work, and skills. - [About](https://www.yashthakur.com/about): Background, education, and interests. Markdown: https://www.yashthakur.com/about.md - [Projects](https://www.yashthakur.com/projects): Professional and freelance case studies. - [Services](https://www.yashthakur.com/services): Freelance services — PHP sites, custom web apps, performance, design systems, technical leadership, SEO. Markdown: https://www.yashthakur.com/services.md - [Resume](https://www.yashthakur.com/resume): Work history and education. Markdown: https://www.yashthakur.com/resume.md - [Contact](https://www.yashthakur.com/contact): Get in touch. Markdown: https://www.yashthakur.com/contact.md ## Articles by topic ### Vibe Coding series — building safely with AI agents - [Vibe Coding, Safely: The Precautions Nobody Mentions](https://www.yashthakur.com/blog/vibe-coding-precautions): Vibe coding with AI agents is fast, but it hides real risks — architecture debt, insecure defaults, leaked secrets, fragile frontends. Here's the checklist I run so speed doesn't cost you later. - [Vibe Coding Architecture: Matching Your App to Its User Count](https://www.yashthakur.com/blog/architecture-by-user-scale): When you vibe code, the agent picks your architecture for you — usually wrong. How to match structure to your real user count, keep the app stateless, and scale by measured bottleneck. - [Vibe Coding a Backend: How to Choose One You Won't Regret](https://www.yashthakur.com/blog/how-to-choose-a-backend): When you vibe code, the agent picks your backend by default — and runtime, database, and hosting are one-way doors. How to choose one that fits your data, your team, and your scale instead. - [Security and Networking Precautions for Vibe-Coded Apps](https://www.yashthakur.com/blog/security-networking-precautions): AI agents generate code that works and quietly isn't safe — leaked secrets, trusting the client, open CORS, no rate limits. The security and networking checklist to run before you ship. - [Vibe Coding the Frontend: What to Keep in Mind for the UI](https://www.yashthakur.com/blog/frontend-development-precautions): AI agents ship frontends that leak secrets, bloat the bundle, skip accessibility, and trust user input. The things to keep in mind while vibe coding a UI that's fast, safe, and usable by everyone. - [Vibe Coding Starts With the Spec: Prompt Discipline That Prevents Rework](https://www.yashthakur.com/blog/vibe-coding-spec-discipline): Half of vibe-coding waste is the agent building the wrong thing fast because the prompt was vague. Here's the spec discipline that turns an AI agent into leverage. - [Vibe Coding: How to Review AI-Generated Code You Didn't Write](https://www.yashthakur.com/blog/vibe-coding-reviewing-ai-output): Vibe coding makes 'it compiles' feel like a finished review. Here's how to actually read, trace, and verify AI-generated code before you accept responsibility for every line. - [Testing and Verification While Vibe Coding](https://www.yashthakur.com/blog/vibe-coding-testing-verification): When the AI agent writes both the code and the tests, the tests rubber-stamp whatever the code already does. How to verify vibe-coded software for real. - [Dependency Safety for Vibe-Coded Apps](https://www.yashthakur.com/blog/vibe-coding-dependency-safety): AI agents casually npm install whatever makes the error go away — typosquats, dead packages, CVEs, bundle bloat. How to vet dependencies before you accept them. - [Vibe Coding Without Losing Your Data: Database Precautions](https://www.yashthakur.com/blog/vibe-coding-data-precautions): When you vibe code, the agent runs migrations, UPDATEs, and DELETEs with no backup and no WHERE guard. How to keep an AI agent from quietly destroying the data it's supposed to protect. - [Error Handling and Observability for Vibe-Coded Apps](https://www.yashthakur.com/blog/vibe-coding-error-handling-observability): AI agents write the happy path and skip errors, logging, and monitoring — so in production you can't see what's breaking. The observability checklist for vibe coding. - [Vibe Coding and the Surprise Cloud Bill: How to Keep Cost Under Control](https://www.yashthakur.com/blog/vibe-coding-cost-control): Vibe coding agents call paid APIs in loops, provision oversized infra, and skip caching — quietly running up your bill. How to cap spend before it hurts. - [Vibe Coding a Codebase You Can Still Change in Three Months](https://www.yashthakur.com/blog/vibe-coding-maintainable-codebase): Vibe coding makes every generation a fresh one-off, so the codebase drifts into inconsistent patterns, dead code, and no structure. How to keep it maintainable. - [Vibe Coding a Deploy: How to Choose a Hosting Platform](https://www.yashthakur.com/blog/vibe-coding-deployment-platform): When you vibe code, the agent picks a deploy target by default and ships straight to prod. How to choose a hosting platform deliberately — and the precautions that keep the deploy safe. ### Other articles - ['use client' vs Server Components: When to Use Which](https://www.yashthakur.com/blog/use-client-vs-server-components): A clear decision rule for Server vs Client Components in the Next.js App Router — what each can do, where the boundary goes, and the mistakes that push 'use client' too high up the component tree. - [How to Fix Hydration Errors in Next.js](https://www.yashthakur.com/blog/fix-hydration-errors-nextjs): Why 'Hydration failed because the server rendered HTML didn't match the client' happens, the five causes behind almost every case, and how to fix each one the right way. - [Debounce vs Throttle: Which One, and How to Do It in React](https://www.yashthakur.com/blog/debounce-vs-throttle-react): The difference between debounce and throttle in one sentence, when to reach for each, and clean React implementations with hooks — plus the cleanup mistake that leaks timers. - [Why Is My useEffect Running Twice? (And What to Do About It)](https://www.yashthakur.com/blog/why-useeffect-runs-twice): React Strict Mode intentionally double-invokes effects in development to surface missing cleanup. Why it happens, why it's a feature, and how to write effects that are correct either way. - [How to Undo Your Last Git Commit (Safely)](https://www.yashthakur.com/blog/undo-last-git-commit): Undo a Git commit without losing work — the difference between reset --soft, --mixed, and --hard, when to use revert instead, and how to recover a commit you thought was gone. - [REST vs GraphQL: How to Actually Choose](https://www.yashthakur.com/blog/rest-vs-graphql-how-to-choose): A practical framework for choosing between REST and GraphQL — the problems each actually solves, where GraphQL earns its complexity, and the questions that make the decision for you. - [Flexbox vs Grid: When to Use Which (With a Simple Rule)](https://www.yashthakur.com/blog/flexbox-vs-grid-when-to-use): A one-line rule for choosing CSS Flexbox or Grid, the cases where each wins, and why the real answer is usually 'both' — Grid for the page, Flexbox for the components. - [The TypeScript Utility Types You'll Actually Use](https://www.yashthakur.com/blog/typescript-utility-types): Partial, Required, Pick, Omit, Record, Readonly, and the Return/Parameters helpers — what each one does, when to reach for it, and the real-world patterns where they save you from duplicate type definitions. - [useState vs useReducer: A Simple Rule That Ends the Debate](https://www.yashthakur.com/blog/usestate-vs-usereducer): Use useState for independent values; reach for useReducer when multiple pieces of state change together or the next state depends on the last. Here's the reasoning, with real examples. - [The State of Frontend Performance in 2026](https://www.yashthakur.com/blog/frontend-performance-2026): Edge rendering, partial prerendering, INP as the metric that bites, and shipping less JavaScript — where I'm actually spending my performance budget this year, and what I've stopped worrying about. - [A Design System Is a Product, Not a Folder of Components](https://www.yashthakur.com/blog/design-system-is-a-product): The hard-won lessons from building a component library five product teams actually used — why adoption, versioning, and docs matter more than how pretty your Button looks. - [Turning a Red Lighthouse Score Green: A React Playbook](https://www.yashthakur.com/blog/react-lighthouse-playbook): The concrete, highest-ROI changes that move React Lighthouse and Core Web Vitals scores — image handling, code splitting, main-thread work, and font loading — in the order I actually do them. - [TypeScript Patterns That Carry Their Weight in 2026](https://www.yashthakur.com/blog/typescript-patterns-2026): Discriminated unions, satisfies, branded types, and template literals — the handful of TypeScript features that catch real bugs, and the clever ones I've learned to leave alone. - [Finding the Root Cause of React Performance Problems](https://www.yashthakur.com/blog/react-performance-root-cause): A tool-by-tool walkthrough — React DevTools Profiler, the Performance panel, and why-did-you-render — for finding what's actually making a React app slow, instead of guessing at useMemo. - [The Year Coding Agents Stopped Being a Novelty](https://www.yashthakur.com/blog/coding-agents-2026): AI went from autocomplete to agents that open PRs, run tests, and fix their own failures. Here's how I actually fit them into a real workflow without losing the plot — or the quality. - [How to Debug Anything: A Method That Beats Guessing](https://www.yashthakur.com/blog/how-to-debug-anything): A repeatable debugging method — reproduce, isolate, form a hypothesis, change one thing, verify — that finds root causes fast instead of poking at symptoms until something works. - [React 19 in Production: The Features I Actually Use](https://www.yashthakur.com/blog/react-19-in-production): A year of React 19 on a real codebase — which of the headline features (Actions, use(), the compiler, Suspense upgrades) earned their place and which I still haven't touched. - [The Senior Engineer Skills Nobody Teaches You](https://www.yashthakur.com/blog/career-growth-senior-engineer): The jump to senior isn't about knowing more frameworks. It's about scope, influence, writing, and the surprisingly hard skill of saying no — the non-coding abilities that actually define the title. - [Six Months of AI Coding Tools: What Actually Stuck](https://www.yashthakur.com/blog/ai-coding-tools-honest): An honest, hype-free account of living with AI coding assistants as a senior developer — the tasks where they genuinely saved me hours, the ones where they quietly cost me more, and how my workflow actually changed. - [Core Web Vitals: The Numbers That Actually Move the Needle](https://www.yashthakur.com/blog/web-performance-core-vitals): LCP, INP, and CLS without the hand-waving — the concrete fixes I reach for first, why most 'performance audits' chase the wrong metric, and the techniques that actually turn a red score green. - [Writing Clean, Maintainable React in 2024](https://www.yashthakur.com/blog/clean-code): The patterns I reach for again and again to keep React codebases readable as a team grows — colocation, custom hooks, early returns, and knowing when to stop abstracting. - [Running a Remote Engineering Team Without the Burnout](https://www.yashthakur.com/blog/remote-work-engineering-team): What I learned managing a fully distributed engineering team — why async communication is a discipline not a tool, how to kill meetings without killing clarity, and the trust math that makes remote actually work. - [A Flicker-Free Dark Mode in Next.js App Router](https://www.yashthakur.com/blog/dark-mode-with-nextjs): How to build a theme toggle that respects system preference, persists the user's choice, and — crucially — never flashes the wrong theme on first paint. - [What Frontend Devs Wish Backend APIs Did Differently](https://www.yashthakur.com/blog/api-design-frontend-dev): An opinionated wishlist from the consuming end — consistent response shapes, errors you can actually act on, pagination that works, and versioning that doesn't break me on a Tuesday. The small decisions that make an API a joy or a tax. - [Tailwind CSS Patterns I Use on Every Project](https://www.yashthakur.com/blog/tailwindcss-tips-and-tricks): CSS variables for theming, cn() for conditional classes, group and peer for state-driven styling, and arbitrary values for the one-off cases — the Tailwind I actually ship. - [What Changed When I Started Leading Engineers](https://www.yashthakur.com/blog/leading-engineering-teams): Going from senior developer to managing 12+ engineers rewired how I think about code reviews, estimates, and the quiet work of unblocking people. Lessons from the transition. - [Why Your Estimates Are Always Wrong (And How to Make Them Useful Anyway)](https://www.yashthakur.com/blog/the-art-of-the-estimate): Estimates aren't predictions, they're a way to communicate uncertainty. What I've learned from managing delivery: give ranges, name your assumptions, re-estimate out loud, and never let a guess calcify into a promise. - [Shaving 35% Off a React Bundle: A Field Guide](https://www.yashthakur.com/blog/react-performance): The practical, measured steps that took a bloated production React app from sluggish to snappy — code splitting, lazy loading, dependency audits, and the profiler habits behind a 25% faster load. - [React Server Components, Explained Like You're Busy](https://www.yashthakur.com/blog/react-server-components-explained): A plain-English mental model for React Server Components — what runs where, why 'use client' exists, and a concrete example of composing server and client components without shipping your database to the browser. - [Micro-Frontends: When They Help and When They Hurt](https://www.yashthakur.com/blog/micro-frontends): I shipped a micro-frontend platform that cut deployment time by 40% across five product modules. Here's the honest view of what you gain, what it costs, and when a monolith is the smarter call. - [Accessibility Is Not a Nice-to-Have, It's the Job](https://www.yashthakur.com/blog/accessibility-is-not-optional): Practical accessibility wins I reach for on every project — semantic HTML, visible focus, honest ARIA, and real keyboard support — and why each one quietly makes the product better for everyone. - [The Production Bug That Took Three Days and One Line to Fix](https://www.yashthakur.com/blog/debugging-production-mystery): A race condition that only appeared under load, only in production, and only sometimes. The fix was a single line. Getting to that line taught me more about debugging than any one-line fix has a right to. - [An Honest Take on the Next.js App Router After a Year](https://www.yashthakur.com/blog/nextjs-app-router-honest): I've shipped real apps on the App Router since the beta. Server Components changed how I think about data fetching, the caching defaults bit me more than once, and 'use client' is both the best and most misunderstood part. Here's the unvarnished version. - [Code Review Is Culture, Not a Checklist](https://www.yashthakur.com/blog/code-review-culture): The best teams I've led didn't review code to catch bugs — they reviewed to teach, to share context, and to raise the floor. Here's how to run reviews that make people better instead of making them defensive. - [How We Ship Fast Without Breaking Everything](https://www.yashthakur.com/blog/shipping-fast-without-breaking): Leading a 12-engineer team taught me that speed and stability aren't a trade-off — they're a system. Feature flags, trunk-based development, CI gates, and canary releases are the four pieces that let us deploy daily and sleep at night. - [The CSS I Stopped Writing Once I Learned Flexbox and Grid](https://www.yashthakur.com/blog/css-i-stopped-fighting): Float clearfixes, negative margins, absolute-positioned centering, JavaScript measuring heights — a before/after of the layout hacks I retired the moment Flexbox and Grid clicked. - [You Probably Don't Need Redux (And I Say That As Someone Who Loved It)](https://www.yashthakur.com/blog/state-management-overkill): I spent years reaching for Redux by reflex. Then I realized most of what I'd put in a global store was either local state, a bit of context, or server state that didn't belong in a store at all. - [The Day TypeScript Generics Finally Clicked](https://www.yashthakur.com/blog/typescript-generics-click): For two years I copy-pasted angle brackets without understanding them. Then one refactor made the whole mental model snap into place — generics are functions, but for types. - [The useEffect Mistakes I Made So You Don't Have To](https://www.yashthakur.com/blog/use-effect-mistakes): An honest tour of the useEffect footguns I walked straight into — missing dependencies, effects that should've been event handlers, deriving state in effects, and forgetting to clean up. ## AI-readable content - Every article has a clean Markdown version at https://www.yashthakur.com/blog/.md - Full inlined content of all articles: https://www.yashthakur.com/llms-full.txt ## Contact - Website: https://www.yashthakur.com - GitHub: https://github.com/yash-thakur - LinkedIn: https://linkedin.com/in/thakur-yash - Stack Overflow: https://stackoverflow.com/users/4553797/yash-thakur