# TkDodo 🔮 (@tkdodo.eu)

Profile: https://sifa.id/p/tkdodo.eu
Headline: Software Engineer, Open Source Maintainer
Location: Vienna, Vienna, Austria
Website: https://tkdodo.eu/blog

## About

​

## Career

- **Software Engineer at Sentry** (Jan 2025 - Present)
  Vienna, AT
- **Open Source Developer at TanStack** (Oct 2020 - Present)
- **Frontend Engineer at myCTS** (Jan 2014 - Present)
  Vienna, AT
- **Software Developer at Self Employed** (Jan 2008 - Present)
- **Frontend Tech Lead at Adverity** (Jan 2020 - Dec 2024)
  Vienna, AT
- **Frontend Engineer at MyExpatTaxes** (Apr 2018 - Dec 2021)
  Vienna, AT
- **Full Stack Engineer at Adverity** (Mar 2013 - Dec 2019)
  Vienna, AT
- **Senior Software Engineer at Cisco** (May 2013 - Aug 2016)
  Vienna, AT
- **Full Stack Engineer at SolveDirect** (Jul 2009 - Apr 2013)
  Vienna, AT

## Skills

### Other
- JavaScript
- React.js
- TypeScript

## Publications

- TanStack Router and Query — tkdodo.eu (May 2026) https://tkdodo.eu/blog/tan-stack-router-and-query
- The Vertical Codebase — tkdodo.eu (Apr 2026) https://tkdodo.eu/blog/the-vertical-codebase
- Test IDs are an a11y smell — tkdodo.eu (Mar 2026) https://tkdodo.eu/blog/test-ids-are-an-a11y-smell
- Creating Query Abstractions — tkdodo.eu (Feb 2026) https://tkdodo.eu/blog/creating-query-abstractions
- Building Type-Safe Compound Components — tkdodo.eu (Jan 2026) https://tkdodo.eu/blog/building-type-safe-compound-components
- 2025 in Review — tkdodo.eu (Dec 2025) https://tkdodo.eu/blog/2025-in-review
- Designing Design Systems — tkdodo.eu (Dec 2025) https://tkdodo.eu/blog/designing-design-systems
- Omit for Discriminated Unions in TypeScript — tkdodo.eu (Nov 2025) https://tkdodo.eu/blog/omit-for-discriminated-unions-in-type-script
- Tooltip Components Should Not Exist — tkdodo.eu (Nov 2025) https://tkdodo.eu/blog/tooltip-components-should-not-exist
- Context Inheritance in TanStack Router — tkdodo.eu (Oct 2025) https://tkdodo.eu/blog/context-inheritance-in-tan-stack-router
- Deriving Client State from Server State — tkdodo.eu (Sep 2025) https://tkdodo.eu/blog/deriving-client-state-from-server-state
- React Query Selectors, Supercharged — tkdodo.eu (Aug 2025) https://tkdodo.eu/blog/react-query-selectors-supercharged
- The Useless useCallback — tkdodo.eu (Jul 2025) https://tkdodo.eu/blog/the-useless-use-callback
- The Beauty of TanStack Router — tkdodo.eu (May 2025) https://tkdodo.eu/blog/the-beauty-of-tan-stack-router
- Concurrent Optimistic Updates in React Query — tkdodo.eu (Apr 2025) https://tkdodo.eu/blog/concurrent-optimistic-updates-in-react-query
- My Open Source Origin Story — tkdodo.eu (Mar 2025) https://tkdodo.eu/blog/my-open-source-origin-story
- 2024 in Review — tkdodo.eu (Dec 2024) https://tkdodo.eu/blog/2024-in-review
- React Query - The Bad Parts — tkdodo.eu (Dec 2024) https://tkdodo.eu/blog/react-query-the-bad-parts
- Ref Callbacks, React 19 and the Compiler — tkdodo.eu (Dec 2024) https://tkdodo.eu/blog/ref-callbacks-react-19-and-the-compiler
- My Slow Retreat from Twitter — tkdodo.eu (Dec 2024) https://tkdodo.eu/blog/my-slow-retreat-from-twitter
- React Query API Design - Lessons Learned — tkdodo.eu (Oct 2024) https://tkdodo.eu/blog/react-query-api-design-lessons-learned
- Component Composition is great btw — tkdodo.eu (Sep 2024) https://tkdodo.eu/blog/component-composition-is-great-btw
- How Infinite Queries work — tkdodo.eu (Sep 2024) https://tkdodo.eu/blog/how-infinite-queries-work
- Introducing XState Store — tkdodo.eu (Aug 2024) https://tkdodo.eu/blog/introducing-x-state-store
- Please Stop Using Barrel Files — tkdodo.eu (Jul 2024) https://tkdodo.eu/blog/please-stop-using-barrel-files
- React 19 and Suspense - A Drama in 3 Acts — tkdodo.eu (Jun 2024) https://tkdodo.eu/blog/react-19-and-suspense-a-drama-in-3-acts
- Automatic Query Invalidation after Mutations — tkdodo.eu (May 2024) https://tkdodo.eu/blog/automatic-query-invalidation-after-mutations
- Zustand and React Context — tkdodo.eu (Apr 2024) https://tkdodo.eu/blog/zustand-and-react-context
- Avoiding Hydration Mismatches with useSyncExternalStore — tkdodo.eu (Feb 2024) https://tkdodo.eu/blog/avoiding-hydration-mismatches-with-use-sync-external-store
- The Query Options API — tkdodo.eu (Jan 2024) https://tkdodo.eu/blog/the-query-options-api
- 2023 in Review — tkdodo.eu (Dec 2023) https://tkdodo.eu/blog/2023-in-review
- Why You Want React Query — tkdodo.eu (Nov 2023) https://tkdodo.eu/blog/why-you-want-react-query
- The Uphill Battle of Memoization — tkdodo.eu (Sep 2023) https://tkdodo.eu/blog/the-uphill-battle-of-memoization
- Array Types in TypeScript — tkdodo.eu (Aug 2023) https://tkdodo.eu/blog/array-types-in-type-script
- React Query and React Context — tkdodo.eu (Jul 2023) https://tkdodo.eu/blog/react-query-and-react-context
- Thinking in React Query — tkdodo.eu (Jun 2023) https://tkdodo.eu/blog/thinking-in-react-query
- You Might Not Need React Query — tkdodo.eu (May 2023) https://tkdodo.eu/blog/you-might-not-need-react-query
- Breaking React Query's API on purpose — tkdodo.eu (Apr 2023) https://tkdodo.eu/blog/breaking-react-querys-api-on-purpose
- OSS Feature Decision Tree — tkdodo.eu (Feb 2023) https://tkdodo.eu/blog/oss-feature-decision-tree
- Why React isn't dying — tkdodo.eu (Jan 2023) https://tkdodo.eu/blog/why-react-isnt-dying
- Type-safe React Query — tkdodo.eu (Jan 2023) https://tkdodo.eu/blog/type-safe-react-query
- 2022 in Review — tkdodo.eu (Dec 2022) https://tkdodo.eu/blog/2022-in-review
- Inside React Query — tkdodo.eu (Dec 2022) https://tkdodo.eu/blog/inside-react-query
- Working with Zustand — tkdodo.eu (Nov 2022) https://tkdodo.eu/blog/working-with-zustand
- Refactor impactfully — tkdodo.eu (Nov 2022) https://tkdodo.eu/blog/refactor-impactfully
- Seeding the Query Cache — tkdodo.eu (Oct 2022) https://tkdodo.eu/blog/seeding-the-query-cache
- Refs, Events and Escape Hatches — tkdodo.eu (Sep 2022) https://tkdodo.eu/blog/refs-events-and-escape-hatches
- React Query meets React Router — tkdodo.eu (Aug 2022) https://tkdodo.eu/blog/react-query-meets-react-router
- Avoiding useEffect with callback refs — tkdodo.eu (Aug 2022) https://tkdodo.eu/blog/avoiding-use-effect-with-callback-refs
- React Query FAQs — tkdodo.eu (Jun 2022) https://tkdodo.eu/blog/react-query-fa-qs
- Hooks, Dependencies and Stale Closures — tkdodo.eu (Apr 2022) https://tkdodo.eu/blog/hooks-dependencies-and-stale-closures
- React Query and Forms — tkdodo.eu (Apr 2022) https://tkdodo.eu/blog/react-query-and-forms
- Use Urgency — tkdodo.eu (Mar 2022) https://tkdodo.eu/blog/use-urgency
- optional vs. undefined — tkdodo.eu (Feb 2022) https://tkdodo.eu/blog/optional-vs-undefined
- Offline React Query — tkdodo.eu (Feb 2022) https://tkdodo.eu/blog/offline-react-query
- Always provide customer value — tkdodo.eu (Jan 2022) https://tkdodo.eu/blog/always-provide-customer-value
- Road to Refactoring — tkdodo.eu (Jan 2022) https://tkdodo.eu/blog/road-to-refactoring
- 2021 in Review — tkdodo.eu (Dec 2021) https://tkdodo.eu/blog/2021-in-review
- Beware the leaking any — tkdodo.eu (Dec 2021) https://tkdodo.eu/blog/beware-the-leaking-any
- Leveraging the Query Function Context — tkdodo.eu (Oct 2021) https://tkdodo.eu/blog/leveraging-the-query-function-context
- Mastering Mutations in React Query — tkdodo.eu (Oct 2021) https://tkdodo.eu/blog/mastering-mutations-in-react-query
- useState vs useReducer — tkdodo.eu (Sep 2021) https://tkdodo.eu/blog/use-state-vs-use-reducer
- React Query Error Handling — tkdodo.eu (Sep 2021) https://tkdodo.eu/blog/react-query-error-handling
- React Query as a State Manager — tkdodo.eu (Aug 2021) https://tkdodo.eu/blog/react-query-as-a-state-manager
- Placeholder and Initial Data in React Query — tkdodo.eu (Aug 2021) https://tkdodo.eu/blog/placeholder-and-initial-data-in-react-query
- About async functions — tkdodo.eu (Jul 2021) https://tkdodo.eu/blog/about-async-functions
- Effective React Query Keys — tkdodo.eu (Jun 2021) https://tkdodo.eu/blog/effective-react-query-keys
- Using WebSockets with React Query — tkdodo.eu (Jun 2021) https://tkdodo.eu/blog/using-web-sockets-with-react-query
- React Query and TypeScript — tkdodo.eu (May 2021) https://tkdodo.eu/blog/react-query-and-type-script
- How can I ... ? — tkdodo.eu (Apr 2021) https://tkdodo.eu/blog/how-can-i
- Testing React Query — tkdodo.eu (Apr 2021) https://tkdodo.eu/blog/testing-react-query
- Status Checks in React Query — tkdodo.eu (Mar 2021) https://tkdodo.eu/blog/status-checks-in-react-query
- React Query Render Optimizations — tkdodo.eu (Mar 2021) https://tkdodo.eu/blog/react-query-render-optimizations
- useState for one-time initializations — tkdodo.eu (Mar 2021) https://tkdodo.eu/blog/use-state-for-one-time-initializations
- React Query Data Transformations — tkdodo.eu (Mar 2021) https://tkdodo.eu/blog/react-query-data-transformations
- No love for boolean parameters — tkdodo.eu (Feb 2021) https://tkdodo.eu/blog/no-love-for-boolean-parameters
- Things to know about useState — tkdodo.eu (Feb 2021) https://tkdodo.eu/blog/things-to-know-about-use-state
- Simplifying useEffect — tkdodo.eu (Jan 2021) https://tkdodo.eu/blog/simplifying-use-effect
- Flow to TypeScript migration journey — tkdodo.eu (Jan 2021) https://tkdodo.eu/blog/flow-to-type-script-migration-journey
- On naming things — tkdodo.eu (Dec 2020) https://tkdodo.eu/blog/on-naming-things
- Practical React Query — tkdodo.eu (Nov 2020) https://tkdodo.eu/blog/practical-react-query
- Avoiding legacy systems — tkdodo.eu (Nov 2020) https://tkdodo.eu/blog/avoiding-legacy-systems
- Putting props to useState — tkdodo.eu (Oct 2020) https://tkdodo.eu/blog/putting-props-to-use-state
- The power of const assertions — tkdodo.eu (Oct 2020) https://tkdodo.eu/blog/the-power-of-const-assertions
- Pedantic index signatures in TypeScript 4.1 — tkdodo.eu (Sep 2020) https://tkdodo.eu/blog/pedantic-index-signatures-in-type-script-4-1
- Why I don't like reduce — tkdodo.eu (Sep 2020) https://tkdodo.eu/blog/why-i-dont-like-reduce
- Calling JavaScript from TypeScript — tkdodo.eu (Sep 2020) https://tkdodo.eu/blog/calling-java-script-from-type-script
- Solving conflicts in package-lock.json — tkdodo.eu (Sep 2020) https://tkdodo.eu/blog/solving-conflicts-in-package-lock-json
- Don't over useState — tkdodo.eu (Aug 2020) https://tkdodo.eu/blog/dont-over-use-state
- Exhaustive matching in TypeScript — tkdodo.eu (Aug 2020) https://tkdodo.eu/blog/exhaustive-matching-in-type-script

## Education

- **University of Central Lancashire** — Bachelor of Science - BS (Oct 2006 - Jun 2007)
- **HTL Spengergasse** — Matura (Sep 2000 - Jun 2005)

## Languages

- German (native)
- English (full professional)

## Links

- GitHub: https://github.com/tkdodo (verified)
- Blog: https://tkdodo.eu/blog (verified)
- RSS: https://tkdodo.eu/blog/rss.xml
- X (Twitter): https://x.com/TkDodo
- YouTube: https://youtube.com/@tkdodo
- LinkedIn: https://at.linkedin.com/in/dominik-dorfmeister-8a71051b9
