Skip to main content

Frontend

Frontend frameworks and UI development best practices

16
Best Practices
34
Stacks
5
Benchmarks

Best Practices

Google Web Vitals

Core performance metrics (LCP, FID, CLS, INP) for measuring real-world user experience.

by Google Chrome Team

Backends for Frontends (BFF)

An architecture pattern that gives each frontend client its own tailored backend service, instead of forcing web, mobile, and other clients to share one general-purpose API.

by Sam Newman

Progressive Enhancement

A frontend strategy that builds a baseline experience with semantic HTML first, then layers CSS and JavaScript so the site works for every browser and device.

by Steven Champeon / A List Apart

WCAG 2.2 Accessibility Compliance

The W3C Web Content Accessibility Guidelines 2.2 define testable success criteria across four principles so web content is perceivable, operable, understandable, and robust.

by World Wide Web Consortium (W3C)

Performance Budgets

A performance budget sets quantitative limits on metrics like page weight, request count, and load timings, enforced in development and CI to stop regressions.

by Google (web.dev)

Mobile-First Design

An approach that designs the smallest-screen experience first, then progressively adds layout and features for larger viewports, prioritizing content and performance.

by Luke Wroblewski

Image Optimization Best Practices

Techniques to reduce image bytes and improve loading using modern formats, responsive sizing, compression, lazy loading, and CDNs without sacrificing visual quality.

by Google (web.dev)

Atomic Design

A methodology by Brad Frost for building UI from five composable levels: atoms, molecules, organisms, templates, and pages, giving design systems a consistent structure.

by Brad Frost

Component-Driven Development

A development approach that builds UIs bottom-up from isolated, reusable components, developed and tested independently before assembly into pages and apps.

by Tom Coleman / Chromatic

Design Systems

A design system is a single source of truth combining reusable components, design tokens, patterns, and guidelines that keep products consistent and faster to build.

by Nielsen Norman Group

Micro-Frontends

An architecture that splits a web app into independently developed and deployed frontend pieces owned by separate teams, then composes them into one experience.

by Cam Jackson / Thoughtworks

Progressive Web Apps (PWA)

Web apps that use service workers, a manifest, and HTTPS to deliver installable, offline-capable, app-like experiences from a single codebase across platforms.

by Google (web.dev)

Responsive Web Design

An approach by Ethan Marcotte that uses fluid grids, flexible media, and media queries so one layout adapts seamlessly across screen sizes and devices.

by Ethan Marcotte / A List Apart

Lazy Loading and Code Splitting

Techniques that defer loading of non-critical code and assets and split bundles by route or component, reducing initial payload and speeding up first load.

by Google (web.dev)

Frontend Internationalization (i18n)

Designing and building UIs so they can adapt to multiple languages, regions, and formats without code changes, separating translatable text from logic.

by World Wide Web Consortium (W3C)

Visual Regression Testing

Automated testing that captures screenshots of UI states and compares them against baselines to detect unintended visual changes.

by BackstopJS

Patterns

Container/Presentational Pattern

Separates components that fetch and manage data (containers) from components that only render UI from props (presentational), improving reuse and testability.

Higher-Order Component (HOC)

A function that takes a component and returns a new component with added behavior, enabling cross-cutting concerns to be shared without inheritance.

Render Props

A component shares logic by accepting a function prop that it calls with internal state, letting the caller control rendering while reusing behavior.

Custom Hooks

Extracts reusable stateful logic from React function components into named hook functions, sharing behavior without wrapper components or prop drilling.

Compound Components

A set of components that work together and share implicit state through context, giving consumers a flexible, declarative API for a composite widget.

Provider Pattern

Distributes shared state or services to a component subtree through context, avoiding prop drilling and centralizing access to cross-cutting data.

Model-View-Controller (MVC)

Separates an application into a model (data and rules), a view (presentation), and a controller (input handling), decoupling concerns for maintainability.

Model-View-ViewModel (MVVM)

Separates UI from logic via a view-model that exposes bindable state and commands, with two-way data binding keeping the view and view-model in sync.

Micro Frontend

Decomposes a web frontend into independently developed and deployed pieces owned by separate teams, then composes them into one application at runtime or build time.

Island Architecture

Renders a page as mostly static HTML with isolated interactive 'islands' that hydrate independently, minimizing JavaScript shipped to the browser.

Tutorials

Converting React Class Components to Hooks

Master the conversion of React class components to functional components with hooks

Migrating to Next.js App Router

Upgrade your Next.js application from Pages to App Router

Migrating to Tailwind CSS

Convert your existing CSS to Tailwind utility classes

Checklists

Frontend Modernisation Checklist

Checklist for modernizing frontend applications and UI frameworks

Frontend Framework Migration Readiness Checklist

Verify your team, codebase, and tooling are ready before migrating a frontend application from one framework or major version to another.

Micro-Frontends Rollout Checklist

Validate architecture, ownership, and runtime integration before rolling out a micro-frontends architecture across teams.

Server-Side Rendering Migration Checklist

Confirm rendering, data fetching, caching, and SEO are ready before migrating a client-rendered app to server-side rendering.

Design System Adoption Checklist

Ensure tokens, components, governance, and migration paths are in place before rolling a shared design system across product teams.

Mobile App Store Release Checklist

Confirm builds, metadata, privacy disclosures, and rollout controls are ready before submitting a mobile app to the App Store and Play Store.

Native to Cross-Platform Mobile Migration Checklist

Assess feasibility, parity, and performance before migrating native iOS and Android apps to a cross-platform framework.

Core Web Vitals Performance Review Checklist

Review a web application against Core Web Vitals to improve loading, interactivity, and visual stability for real users.

Progressive Web App Readiness Checklist

Verify installability, offline behavior, performance, and security before shipping a Progressive Web App.

Legacy Browser EOL Migration Checklist

Plan the removal of support for end-of-life browsers and modernize a web app's baseline without breaking key users.

React Class to Hooks Migration Checklist

Verify patterns, testing, and incremental rollout are ready before migrating React class components to function components with hooks.

jQuery to Modern SPA Migration Checklist

Plan a safe, incremental migration from a jQuery-based UI to a modern single-page-application framework.

Frontend Internationalization Readiness Checklist

Verify a web application is ready to support multiple languages, locales, and right-to-left layouts before internationalizing.

Android Jetpack Compose Migration Checklist

Verify interop, performance, and incremental rollout are ready before migrating an Android app from XML Views to Jetpack Compose.

Technology Stacks

JAMstack

JavaScript, APIs, Markup - Modern web architecture

Rust WASM Stack

Rust, WebAssembly, Yew - High-performance web apps

Flutter Firebase Stack

Flutter, Firebase, Cloud Functions - Cross-platform mobile

MEVN

A JavaScript fullstack combining MongoDB, Express, Vue, and Node.js for single-page web apps with one language end to end.

Next.js + Supabase

A fullstack pairing Next.js with Supabase for Postgres, auth, storage, and realtime, shipping production apps with minimal backend code.

Next.js + Prisma + Postgres

A typed fullstack of Next.js, the Prisma ORM, and PostgreSQL for SaaS apps with a hand-owned backend and end-to-end type safety.

Remix + Postgres

A web stack built on Remix's loader/action model over PostgreSQL, embracing web standards and progressive enhancement for fast, resilient apps.

SvelteKit Fullstack

A fullstack framework using SvelteKit for compiled, reactive UIs with server routes, ideal for fast, lightweight web applications.

Astro + Headless CMS

A content stack using Astro's island architecture with a headless CMS to ship fast, mostly-static sites with selective interactivity.

Nuxt + Strapi

A Vue-based stack pairing the Nuxt framework with the Strapi headless CMS for content-driven sites and apps with a customizable backend.

RedwoodJS

An opinionated fullstack JavaScript framework integrating React, GraphQL, and Prisma into one convention-driven project for startups.

Angular + NestJS

A TypeScript stack pairing the Angular front end with the NestJS backend, sharing patterns and types for structured enterprise apps.

SolidStart

A fullstack framework built on Solid's fine-grained reactivity, offering SSR, server functions, and high performance with a React-like API.

Blitz.js

A fullstack toolkit on top of Next.js that removes the API layer with typed server-side queries and mutations for rapid app building.

Vue + Nuxt + Pinia

A Vue-centric fullstack using Nuxt for SSR and server routes with Pinia for state management, for SEO-friendly interactive web apps.

JAMstack (Headless)

An architecture of pre-rendered markup, JavaScript, and APIs that decouples the front end from services for fast, secure, scalable sites.

Qwik City

A resumable fullstack framework using Qwik and Qwik City to deliver instant-loading apps with near-zero JavaScript via lazy execution.

Flutter + Firebase Stack

Cross-platform mobile stack: Flutter builds one Dart codebase for iOS, Android, and web, backed by Firebase for auth, database, storage, and serverless functions.

React Native + Expo Stack

Cross-platform mobile stack using React Native with the Expo framework for managed builds, OTA updates, and native APIs from one JavaScript/TypeScript codebase.

Native iOS (Swift + SwiftUI)

Apple-native mobile stack building iOS apps with Swift and the declarative SwiftUI framework, using Xcode and first-party Apple platform frameworks.

Native Android (Kotlin + Compose)

Google-native mobile stack building Android apps with Kotlin and the declarative Jetpack Compose UI toolkit, using Android Studio and Jetpack libraries.

Kotlin Multiplatform (KMP)

Shared-logic cross-platform stack: Kotlin Multiplatform shares business logic across iOS, Android, and more, while UIs stay native or use Compose Multiplatform.

SvelteKit + Postgres

A full-stack SvelteKit application with server routes and a PostgreSQL database, delivering fast, lightweight web apps with minimal JavaScript.

Gatsby + Headless CMS

A React-based static site generator that sources content from a headless CMS and APIs through GraphQL, producing fast, pre-built marketing and content sites.

Eleventy + Netlify

A lightweight, zero-runtime static site generator paired with Netlify hosting and functions, producing simple, fast sites with minimal JavaScript.

Hugo + CDN

A Go-powered static site generator known for extremely fast builds, paired with a global CDN to serve large content sites cheaply and quickly.

Ionic + Capacitor

A cross-platform mobile stack that builds native iOS, Android, and web apps from a single web codebase using Ionic UI components and Capacitor native runtime.

NativeScript

An open-source framework for building truly native iOS and Android apps from a single JavaScript or TypeScript codebase with direct access to native APIs.

.NET MAUI

Microsoft's cross-platform framework for building native mobile and desktop apps for iOS, Android, macOS, and Windows from a single C# and XAML codebase.

Xamarin (Legacy)

Microsoft's earlier cross-platform mobile framework using C# and Xamarin.Forms, now superseded by .NET MAUI but still present in many maintained codebases.

Expo Router + Supabase

A full-stack mobile stack pairing React Native via Expo with file-based Expo Router navigation and Supabase for auth, Postgres, storage, and realtime.

Flutter + Riverpod

A cross-platform stack pairing Google's Flutter UI toolkit with the Riverpod state-management library for type-safe, testable Dart apps across mobile, web, and desktop.

SwiftUI + Combine

Apple's modern native stack pairing the declarative SwiftUI framework with the Combine reactive framework for building iOS, macOS, watchOS, and tvOS apps.

Compose Multiplatform

JetBrains' declarative UI framework built on Kotlin Multiplatform, sharing UI and logic across Android, iOS, desktop, and web from one Kotlin codebase.

Benchmarks

Mobile App Startup Time Benchmark

Measures how quickly a mobile app becomes usable, distinguishing cold, warm, and hot starts and the time to first frame and first interaction.

Mobile Frame Rate and Jank Benchmark

Measures UI rendering smoothness on mobile, quantifying dropped frames, jank, and frame-time consistency against the display refresh budget.

Mobile Battery Usage Benchmark

Measures the energy a mobile app consumes per task and over time, attributing drain to CPU, network, GPU, location, and wakelocks.

Mobile App Bundle Size Benchmark

Measures the download and installed size of a mobile app and its components, tracking size by architecture, resources, and code to control bloat.

Geekbench Mobile Benchmark

A cross-platform CPU and compute benchmark widely used to compare mobile device processor performance via standardized single- and multi-core workloads.

Vibgrate CLI

See a real scan run

A replay of the actual CLI running against our test repositories — live progress, real findings, a genuine DriftScore. Nothing executes in your browser.

Replay
demo@vibgrate — bash
npx @vibgrate/cli scan
 
╭──────────────────────────────────────────╮
Vibgrate Drift Report
╰──────────────────────────────────────────╯
 
── node-turborepo (node) .
Runtime: >=18.0.0 (6 majors behind)
Frameworks:
Turbo: 1.13.4 → 2.10.12 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
1 current 1 1-behind 3 2+ behind 1 unknown
 
── @repo/admin (node) apps/admin
Frameworks:
TanStack Query: 5.102.5 → 5.102.5 (current)
React: 18.3.1 → 19.2.8 (1 behind)
React DOM: 18.3.1 → 19.2.8 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Vite: 5.4.21 → 8.2.2 (3 behind)
Dependencies:
3 current 9 1-behind 3 2+ behind 4 unknown
 
── @repo/api (node) apps/api
Frameworks:
Express: 4.22.2 → 5.2.1 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Vitest: 1.6.1 → 4.1.11 (3 behind)
Dependencies:
7 current 5 1-behind 3 2+ behind 4 unknown
 
── @repo/web (node) apps/web
Frameworks:
Next.js: 14.2.35 → 16.3.3 (2 behind)
React: 18.3.1 → 19.2.8 (1 behind)
React DOM: 18.3.1 → 19.2.8 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
2 current 6 1-behind 3 2+ behind 5 unknown
 
── @repo/config (node) packages/config
Frameworks:
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
2 current 2 1-behind 5 2+ behind 0 unknown
 
── @repo/database (node) packages/database
Frameworks:
Prisma: 5.22.0 → 7.10.0 (2 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
1 current 0 1-behind 3 2+ behind 1 unknown
 
── @repo/types (node) packages/types
Frameworks:
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
0 current 0 1-behind 1 2+ behind 1 unknown
 
── @repo/ui (node) packages/ui
Frameworks:
React: 18.3.1 → 19.2.8 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
React: 18.3.1 → 19.2.8 (1 behind)
Dependencies:
1 current 4 1-behind 1 2+ behind 1 unknown
 
── @repo/utils (node) packages/utils
Frameworks:
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Vitest: 1.6.1 → 4.1.11 (3 behind)
Dependencies:
0 current 1 1-behind 2 2+ behind 1 unknown
 
Tech Stack
Frontend: React, React DOM
Meta-frameworks: Next.js
Bundlers: tsx, Turbo, Vite
CSS / UI: Autoprefixer, PostCSS, Tailwind CSS
Backend: Express
ORM / Database: Prisma, Prisma Client
Testing: Vitest
Lint & Format: ESLint, ESLint Prettier, ESLint React, Prettier, typescript-eslint
 
Services & Integrations
Auth: JWT 9.0.3
Databases: Prisma 5.22.0
 
TypeScript
v5.3.3 · strict ✔ · MIXED · target: ES2022
 
Build & Deploy
Package Managers: pnpm
Monorepo: npm-workspaces, pnpm-workspaces, turbo
 
Product Purpose Signals
Frameworks: react, nextjs
Evidence: 177
Top Signals:
- [heading] Dashboard (apps/admin/src/pages/Dashboard.tsx)
- [title] Revenue Overview (apps/admin/src/pages/Dashboard.tsx)
- [copy] workspace:* (packages/ui/package.json)
- [copy] ./dist (packages/ui/tsconfig.json)
- [copy] ./src/index.ts (packages/ui/package.json)
- [copy] @repo/config/tsconfig-base.json (packages/ui/tsconfig.json)
- [copy] @repo/ui (packages/ui/package.json)
- [copy] #3b82f6 (apps/admin/src/pages/Dashboard.tsx)
Unknowns:
- No pricing or billing evidence found.
- No integrations/connectors evidence found.
- No route structure evidence found.
 
Security Posture
Lockfile ✖ · .env ✔ · node_modules ✔
 
Platform
Native modules: turbo
 
Code Quality
Files: 36 · Functions: 183 · Avg complexity: 2.62 · Avg length: 21.13 lines
Max nesting: 2 · Circular deps: 0 · Dead code: 0%
God files: apps/admin/src/pages/Products (448 lines)
 
Database Schema
postgresql · 8 models · 1 enum
Models: Address, CartItem, Category, Order, OrderItem (+3 more)
 
Findings (16 errors, 11 warnings)
Node.js runtime ">=18.0.0" reached end-of-life on 2025-04-30 (latest: 24.0.0).
vibgrate/runtime-eol in .
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in .
60% of dependencies are 2+ major versions behind in node-turborepo.
vibgrate/dependency-rot in .
@types/node is 6 major versions behind (spec: ^20.11.0, latest: 26.3.0).
vibgrate/dependency-major-lag in .
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in apps/admin
Vite is 3 major versions behind (current: 5.4.21, latest: 8.2.2).
vibgrate/framework-major-lag in apps/admin
vite is 3 major versions behind (spec: ^5.0.12, latest: 8.2.2).
vibgrate/dependency-major-lag in apps/admin
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in apps/api
Vitest is 3 major versions behind (current: 1.6.1, latest: 4.1.11).
vibgrate/framework-major-lag in apps/api
@types/node is 6 major versions behind (spec: ^20.11.0, latest: 26.3.0).
vibgrate/dependency-major-lag in apps/api
vitest is 3 major versions behind (spec: ^1.2.1, latest: 4.1.11).
vibgrate/dependency-major-lag in apps/api
Next.js is 2 major versions behind (current: 14.2.35, latest: 16.3.3).
vibgrate/framework-major-lag in apps/web
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in apps/web
@types/node is 6 major versions behind (spec: ^20.11.0, latest: 26.3.0).
vibgrate/dependency-major-lag in apps/web
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/config
56% of dependencies are 2+ major versions behind in @repo/config.
vibgrate/dependency-rot in packages/config
eslint-plugin-react-hooks is 3 major versions behind (spec: ^4.6.0, latest: 7.1.1).
vibgrate/dependency-major-lag in packages/config
Prisma is 2 major versions behind (current: 5.22.0, latest: 7.10.0).
vibgrate/framework-major-lag in packages/database
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/database
75% of dependencies are 2+ major versions behind in @repo/database.
vibgrate/dependency-rot in packages/database
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/types
100% of dependencies are 2+ major versions behind in @repo/types.
vibgrate/dependency-rot in packages/types
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/ui
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/utils
Vitest is 3 major versions behind (current: 1.6.1, latest: 4.1.11).
vibgrate/framework-major-lag in packages/utils
67% of dependencies are 2+ major versions behind in @repo/utils.
vibgrate/dependency-rot in packages/utils
vitest is 3 major versions behind (spec: ^1.2.1, latest: 4.1.11).
vibgrate/dependency-major-lag in packages/utils
 
╭──────────────────────────────────────────╮
Top Priority Actions
╰──────────────────────────────────────────╯
 
1. Upgrade EOL runtime in node-turborepo
End-of-life runtimes no longer receive security patches and block ecosystem upgrades.
./.
>=18.0.0 → 24.0.0 (6 majors behind)
Impact: −10 drift points (runtime & EOL)
 
2. Fix security posture: no lockfile found
Without a lockfile, installs are non-deterministic. Run the install command to generate one and commit it.
./
Missing: package-lock.json, pnpm-lock.yaml, or yarn.lock
 
3. Upgrade Vite 5.4.21 → 8.2.2 in @repo/admin (+2 more)
3 major versions behind. Major framework drift increases breaking change risk and blocks access to security fixes and performance improvements.
./apps/admin
Vite: 5.4.21 → 8.2.2 (3 majors behind)
./apps/api
Vitest: 1.6.1 → 4.1.11 (3 majors behind)
./packages/utils
Vitest: 1.6.1 → 4.1.11 (3 majors behind)
Impact: −5–15 drift points
 
4. Reduce dependency rot in @repo/types (100% severely outdated)
1 of 1 dependencies are 2+ majors behind. Run `npm outdated` and prioritise packages with known CVEs or breaking API changes.
./packages/types
typescript: 5.9.3 → 7.0.2 (2 majors behind)
Impact: −5–10 drift points
 
5. Reduce dependency rot in @repo/database (75% severely outdated)
3 of 4 dependencies are 2+ majors behind. Run `npm outdated` and prioritise packages with known CVEs or breaking API changes.
./packages/database
@prisma/client: 5.22.0 → 7.10.0 (2 majors behind)
prisma: 5.22.0 → 7.10.0 (2 majors behind)
typescript: 5.9.3 → 7.0.2 (2 majors behind)
Impact: −5–10 drift points
 
╭──────────────────────────────────────────╮
Architecture Layers
╰──────────────────────────────────────────╯
 
Archetype: nextjs (80% confidence)
Files classified: 24 (11 unclassified)
Folders classified: 8
apps/admin/src presentation 100% 4 files
apps/admin/src/pages presentation 100% 2 files
apps/api/src/middleware middleware 100% 2 files
apps/api/src/routes routing 100% 2 files
apps/web/src/app presentation 100% 4 files
apps/web/src/app/products presentation 100% 2 files
apps/web/src/app/products/[id] presentation 100% 1 file
packages/ui/src presentation 100% 6 files
Unclassified source (sample): 11
 
presentation 15 files drift ████████████████████ 100 risk high
routing 4 files drift ████████████████████ 100 risk high
middleware 2 files drift ███████▍░░░░░░░░░░░░ 37 risk moderate
config 2 files drift ░░░░░░░░░░░░░░░░░░░░ 0 risk none
shared 1 file drift ████████████████████ 100 risk high
 
╭──────────────────────────────────────────╮
DriftScore Summary
╰──────────────────────────────────────────╯
 
DriftScore: 66/100
Risk Level: HIGH
Projects: 9
Classified: 8 nano · 1 micro · 0 small · 0 standard
Billable: 0.42 · 9 detected → 0.42 billable projects (micro-project pricing)
0.1 micro · 0.32 nano
These fractions add up across repositories, then round down to whole billable projects.
 
Score Breakdown
Runtime: ████████████████████ 100
Frameworks: █████████▏░░░░░░░░░░ 46
Dependencies: ██████▏░░░░░░░░░░░░░ 31
EOL Risk: ████████████████████ 100
 
Scanned at 2026-08-26T09:08:28.481Z · 7.1s · 286 files scanned · 56 workspace files · 27 dirs
Press Run to start.