Skip to main content

Command Palette

Search for a command to run...

Building Clock OS v3.0: Mastering TanStack Query for Real-Time Server State in React

Updated
3 min read
Building Clock OS v3.0: Mastering TanStack Query for Real-Time Server State in React

Modern productivity apps live and die by real-time accuracy. Whether it’s calendars, clocks, dashboards, or analytics, users expect data to stay fresh without sacrificing performance.

While building Clock OS v3.0, a system-level time interface built with React 19, Vite, and TypeScript, I ran into a familiar problem:

How do you keep server data accurate, synchronized, and performant—without turning your app into a useEffect nightmare?

This post walks through how TanStack Query v5 became the backbone of Clock OS, why it matters for real-world SaaS apps, and how you can apply the same patterns in your own projects.


Why Server State Is Hard in Real-Time Apps

Clock OS depends on multiple external APIs:

  • IP-based geolocation

  • Timezone synchronization

  • Location search with timezone metadata

Early versions used useEffect + fetch, which quickly led to problems:

  • ❌ Race conditions when switching locations

  • ❌ Stale data after tab switching

  • ❌ Duplicate API calls across components

  • ❌ Complex loading and error states

This pattern doesn’t scale—especially in real-time or system-driven UIs.

That’s where TanStack Query changed everything.


Clock OS at a Glance

Clock OS is designed as a system, not just a UI.

Key Features

  • Real-time timezone intelligence

  • Multi-language support (EN / FR / AR) with full RTL

  • GPU-accelerated motion (Framer Motion)

  • Responsive day/night theming

  • Voice-assisted feedback

Tech Stack

  • React 19

  • Vite 7

  • TypeScript 5.9

  • TanStack Query v5

  • Framer Motion 12

  • Tailwind CSS 4

TanStack Query specifically powers what I call the “systemUplink” — the layer responsible for fetching and synchronizing time, location, and timezone data.


TanStack Query Setup

The setup is minimal and clean. In main.tsx:

import { QueryClient, QueryClientProvider } from '@tanstack/react-query';

const queryClient = new QueryClient();

root.render(
  <QueryClientProvider client={queryClient}>
    <App />
  </QueryClientProvider>
);

This single provider unlocked caching, background refetching, and deduplication across the entire app.


Core Query: Time & Location Sync

Here’s the core query used in Clock OS:

const { data, isPending, error } = useQuery({
  queryKey: ['systemUplink'],
  queryFn: fetchSystemUplink,
  staleTime: 1000 * 60 * 60, // 1 hour
  refetchOnWindowFocus: true,
});

Why this works so well

  • queryKey ensures all components share the same data

  • staleTime (1 hour) prevents unnecessary refetches

  • refetchOnWindowFocus keeps the clock accurate when users return to the tab

  • Built-in loading and error states remove boilerplate

For a clock or dashboard, this pattern is ideal: fresh when needed, cached when not.


Before vs After: useEffect vs useQuery

❌ Before (useEffect)

  • Manual loading state

  • Manual error handling

  • Duplicate fetch logic

  • Easy to break during refactors

✅ After (TanStack Query)

  • Automatic caching & deduplication

  • Background refetching

  • Graceful error fallbacks

  • Predictable data flow

This shift alone simplified Clock OS more than any UI refactor.


Real-World Benefits in Clock OS

1. Multi-Timezone UI Without Duplicate Requests

Switching locations reuses cached data instantly, then updates silently in the background.

2. Resilient to Unstable Networks

With cached responses and fallbacks, the app stays usable even on slow or unreliable connections.

3. Performance-Friendly by Default

API calls never block animations. All motion runs smoothly at 60–120fps, even during refetches.


Performance Wins

In testing, TanStack Query reduced API calls by 80%+ compared to naive fetch patterns.

More importantly:

  • Animations stayed smooth

  • UI never blocked

  • Data stayed accurate

This paired perfectly with Framer Motion’s GPU-accelerated motion values, reinforcing the idea that performance is a system-level concern, not just an animation problem.


Final Thoughts

Clock OS taught me that server state deserves first-class treatment in frontend architecture—especially for SaaS and productivity tools.

TanStack Query isn’t just a data-fetching library. It’s a state synchronization layer that lets you think in systems instead of side effects.


More from this blog

A

Aakib'z Studio

121 posts

I share practical insights on powerful development frameworks, focusing on Next.js for modern web apps and Flutter for efficient cross-platform mobile app development.