Frontend architecture
Grafana’s frontend is built with TypeScript, React, and Redux Toolkit, following modern React patterns and a feature-based architecture.Directory structure
The frontend code lives inpublic/app/:
| Directory | Purpose |
|---|---|
public/app/core/ | Shared services, components, utilities |
public/app/features/ | Feature code by domain (dashboard, alerting, explore) |
public/app/plugins/ | Built-in plugins (many are Yarn workspaces) |
public/app/types/ | TypeScript type definitions |
public/app/store/ | Redux store configuration |
public/app/routes/ | Application routing |
public/app/api/ | API client definitions |
Application initialization
The app bootstraps inpublic/app/app.ts:
State management with Redux Toolkit
Grafana uses Redux Toolkit (RTK) for state management, moving away from legacy Redux patterns.Store configuration
The store is configured inpublic/app/store/configureStore.ts:
Redux Toolkit patterns
Modern slices (preferred)
Use RTK’screateSlice for new features:
RTK Query for data fetching
Use RTK Query for API calls:Global store access
The global store is available viapublic/app/store/store.ts:
React patterns
Function components with hooks (preferred)
Styling with Emotion
UseuseStyles2 for CSS-in-JS with Emotion:
- Use theme values, not hardcoded colors
- Responsive to theme changes (light/dark mode)
- Type-safe style definitions
Feature-based architecture
Features are organized inpublic/app/features/:
Feature module example
Core services
Shared services live inpublic/app/core/services/:
Backend service
Data source service
Location service
Plugin system
Frontend plugins are loaded dynamically using SystemJS.Plugin loading
Plugin hooks
Extend functionality with plugin hooks:Routing
Routing uses React Router inpublic/app/routes/:
Testing patterns
Component tests with React Testing Library
Shared packages
Reusable libraries inpackages/:
@grafana/data- Data structures, transformations, utilities@grafana/ui- React component library@grafana/runtime- Runtime services and APIs@grafana/schema- CUE-generated TypeScript types@grafana/scenes- Dashboard scene framework
Performance patterns
Code splitting
Memoization
Key patterns summary
- Redux Toolkit - Modern Redux with slices and RTK Query
- Function components - Hooks over class components
- Emotion styling - Theme-aware CSS-in-JS
- Feature modules - Organized by domain, not by type
- TypeScript - Type safety throughout
- SystemJS plugins - Dynamic plugin loading
- React Testing Library - User-centric component tests