41554 blogs · [ { "id": "01a08219-d472-71ee-85dc-d7f0e32e4ccc", "title": "Reliable Query Prefetching with TanStack Router", "url": "https://tkdodo.eu/blog/reliable-query-prefetching-with-tanstack-router", "published_at": "2026-08-18T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e382acfc", "title": "TanStack Router and Query", "url": "https://tkdodo.eu/blog/tan-stack-router-and-query", "published_at": "2026-05-26T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e3d44a34", "title": "The Vertical Codebase", "url": "https://tkdodo.eu/blog/the-vertical-codebase", "published_at": "2026-04-13T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e4b9036a", "title": "Test IDs are an a11y smell", "url": "https://tkdodo.eu/blog/test-ids-are-an-a11y-smell", "published_at": "2026-03-23T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e4f95f1c", "title": "Creating Query Abstractions", "url": "https://tkdodo.eu/blog/creating-query-abstractions", "published_at": "2026-02-23T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e5bb3121", "title": "Building Type-Safe Compound Components", "url": "https://tkdodo.eu/blog/building-type-safe-compound-components", "published_at": "2026-01-02T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e61335eb", "title": "2025 in Review", "url": "https://tkdodo.eu/blog/2025-in-review", "published_at": "2025-12-26T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e638467a", "title": "Designing Design Systems", "url": "https://tkdodo.eu/blog/designing-design-systems", "published_at": "2025-12-01T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e66bb7fe", "title": "Omit for Discriminated Unions in TypeScript", "url": "https://tkdodo.eu/blog/omit-for-discriminated-unions-in-type-script", "published_at": "2025-11-24T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e710367e", "title": "Tooltip Components Should Not Exist", "url": "https://tkdodo.eu/blog/tooltip-components-should-not-exist", "published_at": "2025-11-17T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e8073d79", "title": "Context Inheritance in TanStack Router", "url": "https://tkdodo.eu/blog/context-inheritance-in-tan-stack-router", "published_at": "2025-10-12T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e8a842d2", "title": "Deriving Client State from Server State", "url": "https://tkdodo.eu/blog/deriving-client-state-from-server-state", "published_at": "2025-09-01T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e9083ece", "title": "React Query Selectors, Supercharged", "url": "https://tkdodo.eu/blog/react-query-selectors-supercharged", "published_at": "2025-08-04T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e91ef811", "title": "The Useless useCallback", "url": "https://tkdodo.eu/blog/the-useless-use-callback", "published_at": "2025-07-28T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0e9b56e09", "title": "The Beauty of TanStack Router", "url": "https://tkdodo.eu/blog/the-beauty-of-tan-stack-router", "published_at": "2025-05-25T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0ea5f8a02", "title": "Concurrent Optimistic Updates in React Query", "url": "https://tkdodo.eu/blog/concurrent-optimistic-updates-in-react-query", "published_at": "2025-04-28T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0eae8dc9e", "title": "My Open Source Origin Story", "url": "https://tkdodo.eu/blog/my-open-source-origin-story", "published_at": "2025-03-31T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0eb3a90e3", "title": "2024 in Review", "url": "https://tkdodo.eu/blog/2024-in-review", "published_at": "2024-12-29T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0ebb94910", "title": "React Query - The Bad Parts", "url": "https://tkdodo.eu/blog/react-query-the-bad-parts", "published_at": "2024-12-28T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0ec671b39", "title": "Ref Callbacks, React 19 and the Compiler", "url": "https://tkdodo.eu/blog/ref-callbacks-react-19-and-the-compiler", "published_at": "2024-12-08T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0ed1a7a4b", "title": "My Slow Retreat from Twitter", "url": "https://tkdodo.eu/blog/my-slow-retreat-from-twitter", "published_at": "2024-12-03T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0ed521b36", "title": "React Query API Design - Lessons Learned", "url": "https://tkdodo.eu/blog/react-query-api-design-lessons-learned", "published_at": "2024-10-25T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0edce8bd5", "title": "Component Composition is great btw", "url": "https://tkdodo.eu/blog/component-composition-is-great-btw", "published_at": "2024-09-21T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0ee5077eb", "title": "How Infinite Queries work", "url": "https://tkdodo.eu/blog/how-infinite-queries-work", "published_at": "2024-09-14T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0eeba94f3", "title": "Introducing XState Store", "url": "https://tkdodo.eu/blog/introducing-x-state-store", "published_at": "2024-08-01T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0eee5e034", "title": "Please Stop Using Barrel Files", "url": "https://tkdodo.eu/blog/please-stop-using-barrel-files", "published_at": "2024-07-26T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0eefce2c6", "title": "React 19 and Suspense - A Drama in 3 Acts", "url": "https://tkdodo.eu/blog/react-19-and-suspense-a-drama-in-3-acts", "published_at": "2024-06-16T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0ef11387b", "title": "Automatic Query Invalidation after Mutations", "url": "https://tkdodo.eu/blog/automatic-query-invalidation-after-mutations", "published_at": "2024-05-25T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0ef6e749e", "title": "Zustand and React Context", "url": "https://tkdodo.eu/blog/zustand-and-react-context", "published_at": "2024-04-14T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0eff6d42c", "title": "Avoiding Hydration Mismatches with useSyncExternalStore", "url": "https://tkdodo.eu/blog/avoiding-hydration-mismatches-with-use-sync-external-store", "published_at": "2024-02-21T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f0c0d054", "title": "The Query Options API", "url": "https://tkdodo.eu/blog/the-query-options-api", "published_at": "2024-01-17T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f19e9ae5", "title": "2023 in Review", "url": "https://tkdodo.eu/blog/2023-in-review", "published_at": "2023-12-30T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f28906e8", "title": "Why You Want React Query", "url": "https://tkdodo.eu/blog/why-you-want-react-query", "published_at": "2023-11-07T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f2ed3e28", "title": "The Uphill Battle of Memoization", "url": "https://tkdodo.eu/blog/the-uphill-battle-of-memoization", "published_at": "2023-09-30T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f2f12450", "title": "Array Types in TypeScript", "url": "https://tkdodo.eu/blog/array-types-in-type-script", "published_at": "2023-08-19T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f35176f4", "title": "React Query and React Context", "url": "https://tkdodo.eu/blog/react-query-and-react-context", "published_at": "2023-07-22T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f3cdda49", "title": "Thinking in React Query", "url": "https://tkdodo.eu/blog/thinking-in-react-query", "published_at": "2023-06-07T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f420c6f5", "title": "You Might Not Need React Query", "url": "https://tkdodo.eu/blog/you-might-not-need-react-query", "published_at": "2023-05-20T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f47380dc", "title": "Breaking React Query's API on purpose", "url": "https://tkdodo.eu/blog/breaking-react-querys-api-on-purpose", "published_at": "2023-04-16T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f508ed51", "title": "OSS Feature Decision Tree", "url": "https://tkdodo.eu/blog/oss-feature-decision-tree", "published_at": "2023-02-18T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f5a1e36f", "title": "Why React isn't dying", "url": "https://tkdodo.eu/blog/why-react-isnt-dying", "published_at": "2023-01-29T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f678060f", "title": "Type-safe React Query", "url": "https://tkdodo.eu/blog/type-safe-react-query", "published_at": "2023-01-07T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f77355fc", "title": "2022 in Review", "url": "https://tkdodo.eu/blog/2022-in-review", "published_at": "2022-12-31T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f8572627", "title": "Inside React Query", "url": "https://tkdodo.eu/blog/inside-react-query", "published_at": "2022-12-03T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f91fa124", "title": "Working with Zustand", "url": "https://tkdodo.eu/blog/working-with-zustand", "published_at": "2022-11-20T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f9b2184a", "title": "Refactor impactfully", "url": "https://tkdodo.eu/blog/refactor-impactfully", "published_at": "2022-11-13T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0f9e08b29", "title": "Seeding the Query Cache", "url": "https://tkdodo.eu/blog/seeding-the-query-cache", "published_at": "2022-10-22T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0fab61f74", "title": "Refs, Events and Escape Hatches", "url": "https://tkdodo.eu/blog/refs-events-and-escape-hatches", "published_at": "2022-09-17T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0fabe9263", "title": "React Query meets React Router", "url": "https://tkdodo.eu/blog/react-query-meets-react-router", "published_at": "2022-08-28T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0faed20d9", "title": "Avoiding useEffect with callback refs", "url": "https://tkdodo.eu/blog/avoiding-use-effect-with-callback-refs", "published_at": "2022-08-14T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0fb7eae1f", "title": "React Query FAQs", "url": "https://tkdodo.eu/blog/react-query-fa-qs", "published_at": "2022-06-24T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0fbcb9478", "title": "Hooks, Dependencies and Stale Closures", "url": "https://tkdodo.eu/blog/hooks-dependencies-and-stale-closures", "published_at": "2022-04-24T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0fcb413d5", "title": "React Query and Forms", "url": "https://tkdodo.eu/blog/react-query-and-forms", "published_at": "2022-04-10T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0fd9ce03a", "title": "Use Urgency", "url": "https://tkdodo.eu/blog/use-urgency", "published_at": "2022-03-25T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0fde53334", "title": "optional vs. undefined", "url": "https://tkdodo.eu/blog/optional-vs-undefined", "published_at": "2022-02-19T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0fe70187c", "title": "Offline React Query", "url": "https://tkdodo.eu/blog/offline-react-query", "published_at": "2022-02-05T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0ff35056b", "title": "Always provide customer value", "url": "https://tkdodo.eu/blog/always-provide-customer-value", "published_at": "2022-01-29T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0ff97fc7c", "title": "Road to Refactoring", "url": "https://tkdodo.eu/blog/road-to-refactoring", "published_at": "2022-01-22T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f0ffcf582e", "title": "2021 in Review", "url": "https://tkdodo.eu/blog/2021-in-review", "published_at": "2021-12-21T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f100583c48", "title": "Beware the leaking any", "url": "https://tkdodo.eu/blog/beware-the-leaking-any", "published_at": "2021-12-04T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f1013f1125", "title": "Leveraging the Query Function Context", "url": "https://tkdodo.eu/blog/leveraging-the-query-function-context", "published_at": "2021-10-26T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f1019712cd", "title": "Mastering Mutations in React Query", "url": "https://tkdodo.eu/blog/mastering-mutations-in-react-query", "published_at": "2021-10-09T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10265f4b6", "title": "useState vs useReducer", "url": "https://tkdodo.eu/blog/use-state-vs-use-reducer", "published_at": "2021-09-26T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f1030887f1", "title": "React Query Error Handling", "url": "https://tkdodo.eu/blog/react-query-error-handling", "published_at": "2021-09-10T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f1038f6395", "title": "React Query as a State Manager", "url": "https://tkdodo.eu/blog/react-query-as-a-state-manager", "published_at": "2021-08-20T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f103e274da", "title": "Placeholder and Initial Data in React Query", "url": "https://tkdodo.eu/blog/placeholder-and-initial-data-in-react-query", "published_at": "2021-08-09T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f104b427bd", "title": "About async functions", "url": "https://tkdodo.eu/blog/about-async-functions", "published_at": "2021-07-23T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10557b3fe", "title": "Effective React Query Keys", "url": "https://tkdodo.eu/blog/effective-react-query-keys", "published_at": "2021-06-13T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f105b2eac4", "title": "Using WebSockets with React Query", "url": "https://tkdodo.eu/blog/using-web-sockets-with-react-query", "published_at": "2021-06-06T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f105d117f5", "title": "React Query and TypeScript", "url": "https://tkdodo.eu/blog/react-query-and-type-script", "published_at": "2021-05-16T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f106586352", "title": "How can I ... ?", "url": "https://tkdodo.eu/blog/how-can-i", "published_at": "2021-04-24T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10672eb07", "title": "Testing React Query", "url": "https://tkdodo.eu/blog/testing-react-query", "published_at": "2021-04-04T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f107312e09", "title": "Status Checks in React Query", "url": "https://tkdodo.eu/blog/status-checks-in-react-query", "published_at": "2021-03-27T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f108060619", "title": "React Query Render Optimizations", "url": "https://tkdodo.eu/blog/react-query-render-optimizations", "published_at": "2021-03-20T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10885d317", "title": "useState for one-time initializations", "url": "https://tkdodo.eu/blog/use-state-for-one-time-initializations", "published_at": "2021-03-12T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10924d7af", "title": "React Query Data Transformations", "url": "https://tkdodo.eu/blog/react-query-data-transformations", "published_at": "2021-03-10T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f109859a9c", "title": "No love for boolean parameters", "url": "https://tkdodo.eu/blog/no-love-for-boolean-parameters", "published_at": "2021-02-28T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f109a7cbe8", "title": "Things to know about useState", "url": "https://tkdodo.eu/blog/things-to-know-about-use-state", "published_at": "2021-02-13T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10a08118e", "title": "Simplifying useEffect", "url": "https://tkdodo.eu/blog/simplifying-use-effect", "published_at": "2021-01-23T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10adcc092", "title": "Flow to TypeScript migration journey", "url": "https://tkdodo.eu/blog/flow-to-type-script-migration-journey", "published_at": "2021-01-04T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10b0267c9", "title": "On naming things", "url": "https://tkdodo.eu/blog/on-naming-things", "published_at": "2020-12-08T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10b8402d1", "title": "Practical React Query", "url": "https://tkdodo.eu/blog/practical-react-query", "published_at": "2020-11-16T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10c20036b", "title": "Avoiding legacy systems", "url": "https://tkdodo.eu/blog/avoiding-legacy-systems", "published_at": "2020-11-01T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10c979f43", "title": "Putting props to useState", "url": "https://tkdodo.eu/blog/putting-props-to-use-state", "published_at": "2020-10-25T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10cadd5a0", "title": "The power of const assertions", "url": "https://tkdodo.eu/blog/the-power-of-const-assertions", "published_at": "2020-10-08T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10d8ae180", "title": "Pedantic index signatures in TypeScript 4.1", "url": "https://tkdodo.eu/blog/pedantic-index-signatures-in-type-script-4-1", "published_at": "2020-09-20T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10e43b23c", "title": "Why I don't like reduce", "url": "https://tkdodo.eu/blog/why-i-dont-like-reduce", "published_at": "2020-09-09T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10e954926", "title": "Calling JavaScript from TypeScript", "url": "https://tkdodo.eu/blog/calling-java-script-from-type-script", "published_at": "2020-09-04T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10f07f21c", "title": "Solving conflicts in package-lock.json", "url": "https://tkdodo.eu/blog/solving-conflicts-in-package-lock-json", "published_at": "2020-09-02T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f10fb47378", "title": "Don't over useState", "url": "https://tkdodo.eu/blog/dont-over-use-state", "published_at": "2020-08-29T00:00:00+00:00" }, { "id": "01a08219-d472-71ee-85dc-d7f11052b3de", "title": "Exhaustive matching in TypeScript", "url": "https://tkdodo.eu/blog/exhaustive-matching-in-type-script", "published_at": "2020-08-09T00:00:00+00:00" } ] posts Claim your blog
Back to Dominik Dorfmeister
Blog · corpus.blog/blogs/tkdodo.eu/posts

Dominik Dorfmeister

tkdodo.eu

2026

2025

2024

2023

2022

2021

2020