You launch a sales analytics dashboard, and every filter triggers a full page reload. Users lose context, and you lose time. Instead of SSR with its server costs, we use Client-Side Rendering (CSR): the browser builds the UI itself, the server only delivers a shell and scripts. In 10+ years we've shipped over 50 such projects for logistics, fintech, and e-commerce. For example, for a transport company we reduced Time to Interactive (TTI) from 8 to 2.5 seconds by migrating their CRM to CSR with React and TanStack Router. This is the architecture of SPA, ideal for closed applications: dashboards, cabinets, tools. We guarantee a responsive interface with local state, even on weak hardware.
Contact us for a consultation on architecture choice — starting from $5,000 for an initial audit.
When CSR works better than SSR
| Criterion | CSR | SSR |
|---|---|---|
| SEO for public content | Poor | Good |
| First load | Slower (TTFB ~200 ms, then hydration) | Faster (ready HTML) |
| Subsequent navigations | Instant | Each request to server |
| Complex client state | Natural (Zustand, Redux) | Complicated (react-query, server state) |
| Server resources | Minimal | Server needed for rendering |
| Offline mode (PWA) | Possible (Service Worker) | Hard |
Why CSR suits SPA
SPA is an architecture where the entire UI runs in the browser, and the server acts only as an API. CSR fits this model perfectly: no server rendering, each route is a component loaded on demand. The user gets smooth transitions without page flickering. For closed applications like dashboards or personal accounts, where SEO is unnecessary (NoSEO), CSR is the most efficient choice. Compare with SSR: on each navigation SSR generates new HTML, causing delays. CSR caches routes on the client and updates only data. Rich interfaces benefit from CSR's instant interactivity.
How to choose tools for CSR
We use a modern stack proven in production. A typical setup includes:
- Vite for bundling (10x faster hot reload than Webpack)
- React 18 or Vue 3 for UI
- TanStack Router for type-safe routing
- TanStack Query for server state
- Vite PWA plugin for offline mode
Example Vite configuration with router and manual chunking:
import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import { TanStackRouterVite } from '@tanstack/router-plugin/vite'; export default defineConfig({ plugins: [TanStackRouterVite(), react()], resolve: { alias: { '@': '/src' }, }, build: { rollupOptions: { output: { manualChunks: { vendor: ['react', 'react-dom'], router: ['@tanstack/react-router'], query: ['@tanstack/react-query'], }, }, }, }, }); How to optimize CSR performance
Strategy: route-based code splitting, bundle analysis, dynamic import of heavy libraries. For example, the xlsx library (200+ KB) loads only when the user clicks "Export". We use TanStack Router with lazy-loaded pages and Suspense. In addition, we enable tree-shaking — Vite removes unused code. Set sideEffects: false in package.json for maximum effectiveness.
// Dynamic import async function exportToExcel(data: Row[]) { const { utils, writeFile } = await import('xlsx'); const ws = utils.json_to_sheet(data); const wb = utils.book_new(); utils.book_append_sheet(wb, ws, 'Data'); writeFile(wb, 'export.xlsx'); } Route-based code splitting:
const DashboardPage = lazy(() => import('@/pages/Dashboard')); const ReportsPage = lazy(() => import('@/pages/Reports')); What performance metrics we achieve
| Metric | Target | Achieved |
|---|---|---|
| LCP | <2.5 s | 1.8 s |
| INP | <200 ms | 150 ms |
| First load JS | <150 KB | 120 KB |
| TTFB | <800 ms | 400 ms (CDN) |
How we measure these metrics
We use Lighthouse CI in the pipeline and lab tests on real devices. All metrics are logged in Grafana.How to implement PWA and offline in CSR
We add the Vite PWA plugin. Workbox caches API requests (Stale-While-Revalidate, 24h expiry). The application works offline.
VitePWA({ registerType: 'autoUpdate', workbox: { globPatterns: ['**/*.{js,css,html,ico,png,svg,woff2}'], runtimeCaching: [ { urlPattern: /^\/api\/products/, handler: 'StaleWhileRevalidate', options: { cacheName: 'api-products', expiration: { maxAgeSeconds: 24 * 60 * 60 }, }, }, ], }, }) What stages does CSR development include
- Analysis: study requirements, load, usage scenarios.
- Design: module architecture, data schema, routes.
- Implementation: iterative development with code review and tests.
- Testing: unit, e2e (Playwright), performance (Lighthouse).
- Deploy: CDN setup, CI/CD (GitHub Actions), monitoring.
What you get in the end
- Technical documentation: architecture, API spec, deployment guide
- Source code with CI/CD (GitHub Actions, Docker)
- Access to hosting, domain, SSL
- Team training: how to run, configure, and extend
- Support: 2 weeks post-release, bug fixes
How long does development take and how is cost calculated?
Estimated timelines: from 4 to 12 weeks depending on complexity. Cost is calculated individually after project audit. If you want a consultation on architecture choice, write to us — we'll help determine if CSR suits. With over 5 years in the SPA market, we deliver fast, responsive interfaces. Order a turnkey CSR application — get a responsive interface without compromises.







