home / skills / ratacat / claude-skills / modern-web-app-architecture

modern-web-app-architecture skill

/skills/modern-web-app-architecture

This skill guides designing modern web apps with per-route rendering choices, clear boundaries, and performance-focused trade-offs for scalable teams.

npx playbooks add skill ratacat/claude-skills --skill modern-web-app-architecture

Review the files below or copy the command above to add this skill to your agents.

Files (13)
SKILL.md
8.0 KB
---
name: modern-web-app-architecture
description: "Use when designing or building modern web applications in JavaScript/TypeScript (SPA/SSR/SSG/ISR/RSC): architecture trade-offs, state/data patterns, performance, testing, delivery, and team scaling."
---

# Modern Web App Architecture (SPA/SSR/SSG/RSC)

## Overview

Comprehensive guidance for designing and building modern web applications (including SPAs and hybrid rendering apps). This skill emphasizes trade-offs, explicit boundaries, and production-ready practices (performance, accessibility, security, testing, delivery).

**Core principle:** Everything in architecture is a trade-off. There are no "right" answers, only least-worst combinations for your specific context.

## Operating Mode (How to Use This Skill)

When activated, work in this order:

1. **Clarify context (5–10 questions max)** → users, routes, SEO, interactivity, data, auth, team, constraints.
2. **Choose a rendering strategy per route** (not “one strategy for the whole app”).
3. **Define boundaries** → feature/domain modules, shared libraries, ownership, and stable interfaces.
4. **Plan state + data** → local/shared/global/server/URL state, cache strategy, invalidation, optimistic updates.
5. **Plan non-functionals** → performance budgets + measurement, accessibility plan, security posture, observability.
6. **Produce artifacts** → short recommendations with explicit trade-offs, plus concrete next steps (folder structure, ADRs, checklists).

If the user can’t answer a question, state reasonable assumptions and continue (don’t block).

## When to Use

- Starting a new SPA or web application
- Choosing rendering strategies (CSR, SSR, SSG, ISR, RSC)
- Implementing state management
- Optimizing Core Web Vitals (LCP/INP/CLS)
- Scaling for multiple frontend teams
- Making architecture trade-off decisions
- Migrating from legacy to modern frontend

## Quick Discovery Questions (Ask First)

- What are the top 3 user journeys and their target latency (e.g., “search → product → checkout”)?
- Is **SEO** required for any routes? Which are public vs behind auth?
- What’s the **data shape**: mostly CRUD, real-time, offline-first, heavy forms, large tables/charts?
- What are the constraints: **browser support**, bundle limits, time-to-market, compliance (SOC2/HIPAA/PCI)?
- What’s the **team topology**: how many devs/teams, release cadence, ownership boundaries?
- What’s your preferred stack (React/Vue/Angular/vanilla), and are you open to TypeScript?

## Reference Files

| Topic | When to Load |
|-------|--------------|
| @references/design-patterns.md | Implementing JS patterns (Module, Observer, Factory, etc.) |
| @references/react-patterns.md | React components, hooks, state, composition |
| @references/spa-fundamentals.md | SPA architecture, routing, module organization |
| @references/micro-frontends.md | Scaling teams, independent deployments |
| @references/performance.md | Bundle size, loading, Core Web Vitals |
| @references/architecture-decisions.md | Trade-offs, coupling, fitness functions |
| @references/rendering-strategies.md | CSR vs SSR vs SSG vs ISR vs RSC |
| @references/state-management.md | Local, global, server state patterns |
| @references/security-and-auth.md | Auth choices, token storage, XSS/CSRF, CSP, API boundaries |
| @references/accessibility-and-i18n.md | WCAG basics, SPA focus mgmt, inclusive components, i18n pitfalls |
| @references/testing-and-quality.md | Testing strategy, CI quality gates, a11y checks, contract tests |
| @references/tooling-and-delivery.md | Bundling, environments, deployment, observability, feature flags |

## Quick Architecture Decision Tree

```
Project Requirements?
├─ SEO critical + dynamic content → SSR (or SSR+streaming)
├─ SEO critical + mostly static → SSG/ISR (or hybrid)
├─ Mostly behind auth + app-like UX → CSR SPA (or hybrid with pre-rendered shell)
├─ Mixed (marketing + app) → Hybrid/Islands (route-level strategy)
│
Team Size?
├─ <5 developers → Modular monolith SPA
├─ 5-15 developers → Well-structured SPA or Service-based
├─ >15 developers, multiple teams → Consider micro-frontends
│
Domain Complexity?
├─ Simple CRUD → Layered architecture
├─ Complex workflows → Domain-partitioned (DDD)
├─ Multiple bounded contexts → Micro-frontends
```

## Default Outputs (What You Should Produce)

Depending on the user request, aim to output:
- **Route strategy map**: a small table of routes → CSR/SSR/SSG/ISR/RSC + why
- **Module boundary sketch**: feature folders, shared libs, interface contracts
- **State map**: local/shared/global/server/URL, plus the chosen tooling pattern
- **Data plan**: caching/invalidation, error states, optimistic updates, pagination
- **Quality plan**: testing layers + CI gates + accessibility checks
- **Performance plan**: budgets + measurement + concrete loading strategy (split points)
- **Risk register**: top 5 risks + mitigations (e.g., hydration cost, auth posture, team coupling)

## Essential Patterns Quick Reference

### Component Patterns
| Pattern | Use When |
|---------|----------|
| Container/Presentational | Separating data from UI |
| Compound Components | Building composable APIs (Select, Menu) |
| Hooks | Sharing stateful logic without HOCs |
| Provider | Avoiding prop drilling for global data |

### State Management
| Approach | Use When |
|----------|----------|
| useState/useReducer | Local component state |
| Context | Theme, auth, low-frequency global state |
| Zustand/Jotai | Simple global state, minimal boilerplate |
| Redux Toolkit | Complex state, time-travel debugging |
| React Query/SWR | Server state, caching, background refresh |
| XState | Complex flows with explicit state machines |

### Performance Essentials
| Technique | Impact |
|-----------|--------|
| Code splitting | Reduce initial bundle |
| Lazy loading | Defer non-critical |
| React.memo | Prevent unnecessary re-renders |
| useMemo/useCallback | Stable references |
| Virtual lists | Handle large datasets |

## Architecture Characteristics (Pick 3-7)

| Characteristic | Questions to Ask |
|----------------|------------------|
| **Scalability** | How many concurrent users? Growth rate? |
| **Performance** | What's acceptable TTI? LCP target? |
| **Deployability** | How often do you ship? Independent deploys? |
| **Testability** | How easy to verify changes? |
| **Maintainability** | What's the expected lifespan? |
| **Modularity** | How often do requirements change? |

## Anti-patterns to Avoid

| Anti-pattern | Problem | Fix |
|--------------|---------|-----|
| Prop drilling | Tight coupling | Context or state management |
| God components | Too many responsibilities | Split by concern |
| Premature optimization | Complexity without evidence | Profile first |
| Shared mutable state | Race conditions, bugs | Immutable patterns |
| Monolithic bundle | Slow initial load | Code splitting |
| Over-fetching | Wasted bandwidth | GraphQL or BFF |
| LocalStorage tokens by default | XSS turns into account takeover | Prefer httpOnly cookies + CSP (see security refs) |
| Global store for server data | Cache invalidation pain | Use React Query/SWR for server state |

## Performance Budgets

Budgets must be **calibrated to your users/devices**, but these are good starting points for a “fast by default” app:

| Metric | Target | Needs Work |
|--------|--------|------------|
| LCP | <2.5s | 2.5–4s |
| INP | <200ms | 200–500ms |
| CLS | <0.1 | 0.1–0.25 |
| TTFB | <800ms | 800ms–1.8s |
| Route JS (initial) | <170KB gzip | <300KB gzip |

## Sources

Synthesized from:
- Learning JavaScript Design Patterns (Osmani, 2023)
- React in Depth (Barklund, 2024)
- SPA Design and Architecture (Scott)
- Single Page Web Applications (Mikowski & Powell)
- Building Micro-Frontends (Mezzalira)
- Micro Frontends in Action (Geers)
- Responsible JavaScript (Wagner)
- High Performance Browser Networking (Grigorik)
- Web Performance in Action (Wagner)
- Frontend Architecture for Design Systems (Godbolt)
- Fundamentals of Software Architecture (Richards & Ford)
- Software Architecture: The Hard Parts (Ford et al.)
- Patterns.dev

Overview

This skill provides practical guidance for designing and building modern JavaScript/TypeScript web applications (SPA, SSR, SSG, ISR, RSC). It focuses on trade-offs, clear boundaries, production readiness, and deliverable artifacts to move from decisions to implementation. Use it to create route-level rendering strategies, state/data plans, performance and quality budgets, and team-scaling recommendations.

How this skill works

I start by asking a short set of clarifying questions about users, key routes, SEO needs, data shape, auth, constraints, and team topology. Then I map each route to an appropriate rendering strategy and define module boundaries, ownership, and interfaces. Next I produce a state and data plan (local/global/server/URL state, caching, invalidation) and a non-functional plan (performance budgets, accessibility, security, observability). Finally I output concrete artifacts: route strategy map, folder sketches, ADRs, checklists, and next steps with explicit trade-offs.

When to use it

  • Starting a new single-page or hybrid web application
  • Choosing per-route rendering strategies (CSR/SSR/SSG/ISR/RSC)
  • Designing state and server-data patterns and caching
  • Optimizing Core Web Vitals and load budgets
  • Scaling frontend teams or moving to micro-frontends
  • Planning testing, delivery, and observability for production apps

Best practices

  • Ask concise discovery questions and document assumptions when answers are missing
  • Choose rendering per route; mix CSR and SSR/SSG instead of one-size-fits-all
  • Define clear module boundaries, shared libraries, and ownership contracts
  • Use React Query/SWR for server state and lightweight stores (Zustand/Jotai) for simple global state
  • Set measurable performance budgets (LCP/INP/CLS/TTFB) and profile before optimizing
  • Embed accessibility and security checks into CI with automated gates

Example use cases

  • Map a marketing site + logged-in app: SSG for marketing, SPA shell + CSR for app routes
  • Migrate legacy monolith: define domain modules, incrementally adopt SSR for SEO pages
  • Scale to multiple teams: design micro-frontend boundaries and independent deploy patterns
  • Improve performance: identify initial-route bundle split points and add caching/invalidation plan
  • Design data flow for a realtime dashboard: server state caching, optimistic updates, and pagination

FAQ

What if the team can’t answer discovery questions?

I state reasonable default assumptions (e.g., modern browsers, TypeScript allowed) and proceed, marking decisions that need validation later.

How do I choose between Redux and React Query?

Use React Query/SWR for server-sourced data and caching. Choose Redux Toolkit when you need complex client-side state, time-travel debugging, or cross-cutting UI state that isn’t server-driven.