# Dominik 🔮 (@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

​

## Experience

- **Software Engineer at Sentry** (2025 – present)
- **Open Source Developer at TanStack** (2020 – present)
- **Frontend Engineer at myCTS** (2014 – present)
- **Software Developer at Self Employed** (2008 – present)
- **Frontend Tech Lead at Adverity** (2020 – 2024)
- **Frontend Engineer at MyExpatTaxes** (2018 – 2021)
- **Full Stack Engineer at Adverity** (2013 – 2019)
- **Senior Software Engineer at Cisco** (2013 – 2016)
- **Full Stack Engineer at SolveDirect** (2009 – 2013)

## Education

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

## Skills

- TypeScript
- React.js
- JavaScript

## Publications

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

## Languages

- German (native)
- English (full_professional)

## Other profiles

- github: https://github.com/tkdodo
- website: https://tkdodo.eu/blog
- rss: https://tkdodo.eu/blog/rss.xml
- twitter: https://x.com/TkDodo
- youtube: https://youtube.com/@tkdodo
- linkedin: https://at.linkedin.com/in/dominik-dorfmeister-8a71051b9
