performance-budget-enforcer
Performance Budget Enforcer
Implement automated performance monitoring and budget enforcement to prevent performance regressions in worldbuilding applications.
Overview
To enforce performance budgets:
- Define performance budgets for key metrics (bundle size, Lighthouse scores, Web Vitals)
- Set up automated monitoring in CI/CD pipeline
- Configure alerts for threshold violations
- Generate performance reports and trends
- Block deployments that exceed budgets
Performance Metrics
JavaScript Bundle Size
To monitor bundle sizes:
- Initial Bundle: First-load JS (target: <200KB)
- Route Bundles: Per-page JS (target: <50KB per route)
- Total Bundle: All JS combined (target: <500KB)
- Vendor Bundle: Third-party libraries (target: <150KB)
Lighthouse Scores
To track Lighthouse metrics:
- Performance: Overall performance score (target: >90)
- Accessibility: A11y compliance (target: >90)
- Best Practices: Web standards compliance (target: >90)
- SEO: Search engine optimization (target: >90)
Core Web Vitals
To measure user experience:
- LCP (Largest Contentful Paint): <2.5s
- FID (First Input Delay): <100ms
- CLS (Cumulative Layout Shift): <0.1
- TTFB (Time to First Byte): <600ms
- FCP (First Contentful Paint): <1.8s
Consult references/performance-targets.md for detailed target definitions and industry benchmarks.
Budget Configuration
Define Budgets
Create performance-budget.json:
{
"bundles": {
"maxInitialBundle": 204800,
"maxRouteBundle": 51200,
"maxTotalBundle": 512000,
"maxVendorBundle": 153600
},
"lighthouse": {
"performance": 90,
"accessibility": 90,
"bestPractices": 90,
"seo": 90
},
"webVitals": {
"lcp": 2500,
"fid": 100,
"cls": 0.1,
"ttfb": 600,
"fcp": 1800
},
"assets": {
"maxImageSize": 102400,
"maxFontSize": 51200,
"maxCssSize": 51200
}
}
Use scripts/generate_budget.py to create initial budget configuration based on current metrics.
Budget Levels
Define severity levels:
- Error: Block deployment (>20% over budget)
- Warning: Alert but allow (10-20% over budget)
- Info: Track but continue (<10% over budget)
CI/CD Integration
GitHub Actions Setup
To add performance checks to CI:
name: Performance Budget
on:
pull_request:
branches: [main, master]
jobs:
performance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Build application
run: npm run build
- name: Analyze bundle size
run: npx @next/bundle-analyzer
- name: Run Lighthouse CI
run: |
npm install -g @lhci/cli
lhci autorun
- name: Check performance budgets
run: python scripts/check_budgets.py
- name: Comment results on PR
uses: actions/github-script@v7
with:
script: |
const results = require('./performance-results.json');
// Comment logic here
Use assets/github-workflow.yml for complete workflow template.
Lighthouse CI Configuration
Create lighthouserc.json:
{
"ci": {
"collect": {
"startServerCommand": "npm run start",
"url": ["http://localhost:3000", "http://localhost:3000/entities"],
"numberOfRuns": 3
},
"assert": {
"preset": "lighthouse:recommended",
"assertions": {
"categories:performance": ["error", { "minScore": 0.9 }],
"categories:accessibility": ["error", { "minScore": 0.9 }],
"first-contentful-paint": ["error", { "maxNumericValue": 1800 }],
"largest-contentful-paint": ["error", { "maxNumericValue": 2500 }],
"cumulative-layout-shift": ["error", { "maxNumericValue": 0.1 }]
}
},
"upload": {
"target": "temporary-public-storage"
}
}
}
Reference assets/lighthouserc.json for complete configuration.
Bundle Analysis
Next.js Bundle Analyzer
To analyze bundle composition:
# Install analyzer
npm install --save-dev @next/bundle-analyzer
# Add to next.config.js
const withBundleAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
});
module.exports = withBundleAnalyzer({
// Next.js config
});
# Run analysis
ANALYZE=true npm run build
Size Tracking
Use scripts/track_bundle_size.py to track bundle size over time:
python scripts/track_bundle_size.py --record
Store results in performance-history/bundle-sizes.json for trend analysis.
Automated Alerts
Threshold Violations
To configure alerts:
// scripts/check_budgets.ts
interface BudgetCheck {
metric: string;
current: number;
budget: number;
status: 'pass' | 'warning' | 'error';
percentOver: number;
}
function checkBudget(current: number, budget: number): BudgetCheck['status'] {
const percentOver = ((current - budget) / budget) * 100;
if (percentOver > 20) return 'error';
if (percentOver > 10) return 'warning';
return 'pass';
}
Notification Channels
To send alerts:
- GitHub PR Comments: Automated comments with performance report
- Slack: Webhook notifications for violations
- Email: Digest of performance trends
- Build Status: Fail builds on error-level violations
Use scripts/send_alerts.py to integrate notification channels.
Performance Monitoring
Real User Monitoring (RUM)
To track real user metrics:
// lib/web-vitals.ts
import { onCLS, onFID, onLCP, onFCP, onTTFB } from 'web-vitals';
export function reportWebVitals() {
onCLS((metric) => sendToAnalytics(metric));
onFID((metric) => sendToAnalytics(metric));
onLCP((metric) => sendToAnalytics(metric));
onFCP((metric) => sendToAnalytics(metric));
onTTFB((metric) => sendToAnalytics(metric));
}
function sendToAnalytics(metric: Metric) {
// Send to analytics service
fetch('/api/analytics', {
method: 'POST',
body: JSON.stringify(metric),
});
}
Enable in app/layout.tsx:
import { reportWebVitals } from '@/lib/web-vitals';
export default function RootLayout({ children }: { children: ReactNode }) {
useEffect(() => {
reportWebVitals();
}, []);
return <html>{children}</html>;
}
Synthetic Monitoring
To run scheduled Lighthouse audits:
# .github/workflows/scheduled-performance.yml
name: Scheduled Performance Audit
on:
schedule:
- cron: '0 0 * * *' # Daily at midnight
jobs:
audit:
runs-on: ubuntu-latest
steps:
- name: Run Lighthouse
run: lhci autorun --config=lighthouserc.json
- name: Store results
run: python scripts/store_performance_data.py
Performance Reports
PR Comments
To generate PR comments with results:
## Performance Report
### Bundle Size
- Initial Bundle: 185KB ([OK] under 200KB budget)
- Total Bundle: 480KB ([OK] under 500KB budget)
### Lighthouse Scores
- Performance: 92/100 ([OK] meets 90 target)
- Accessibility: 95/100 ([OK] meets 90 target)
- Best Practices: 88/100 ([WARN] below 90 target)
### Core Web Vitals
- LCP: 2.1s ([OK] under 2.5s)
- FID: 85ms ([OK] under 100ms)
- CLS: 0.05 ([OK] under 0.1)
### Bundle Comparison
| Route | Current | Previous | Change |
| ---------------- | ------- | -------- | ------- |
| / | 185KB | 180KB | +5KB |
| /entities | 45KB | 45KB | No change |
| /entities/[id] | 38KB | 40KB | -2KB [OK] |
[View detailed report](https://lighthouse-report-url)
Use scripts/generate_pr_comment.py to create formatted reports.
Trend Analysis
To visualize performance trends:
python scripts/generate_trends.py --days 30 --output performance-trends.html
Generate charts showing:
- Bundle size over time
- Lighthouse scores history
- Web Vitals percentiles
- Performance budget compliance rate
Reference assets/trend-visualization.html for dashboard template.
Optimization Strategies
Bundle Size Reduction
To reduce bundle sizes:
- Code Splitting: Split large components into separate chunks
- Tree Shaking: Remove unused code with proper imports
- Dynamic Imports: Load components on demand
- Lazy Loading: Defer non-critical resources
- Compression: Enable gzip/brotli compression
- Minification: Ensure production builds are minified
Image Optimization
To optimize images:
import Image from 'next/image';
<Image
src="/entity-map.png"
alt="World Map"
width={800}
height={600}
quality={75}
loading="lazy"
placeholder="blur"
/>
Font Optimization
To optimize fonts:
// app/layout.tsx
import { Inter } from 'next/font/google';
const inter = Inter({
subsets: ['latin'],
display: 'swap',
variable: '--font-inter',
});
export default function Layout({ children }: { children: ReactNode }) {
return (
<html className={inter.variable}>
<body>{children}</body>
</html>
);
}
Third-Party Scripts
To optimize third-party scripts:
import Script from 'next/script';
<Script
src="https://analytics.example.com/script.js"
strategy="lazyOnload"
/>
Consult references/optimization-techniques.md for comprehensive optimization guide.
Best Practices
- Set Realistic Budgets: Base on current metrics, improve gradually
- Monitor Continuously: Track metrics on every deployment
- Act on Violations: Investigate and fix budget overages promptly
- Educate Team: Share performance impact of code changes
- Review Regularly: Adjust budgets as app evolves
- Prioritize UX: Focus on metrics that impact user experience
- Test Real Devices: Verify performance on target devices
Troubleshooting
Common issues:
- Fluctuating Scores: Run multiple Lighthouse audits, use median scores
- CI vs Local: Ensure CI environment matches production setup
- False Positives: Adjust budgets for legitimate growth
- Missing Metrics: Verify analytics integration and data collection
- Slow CI: Cache dependencies and optimize build process
- Bundle Size Spikes: Use bundle analyzer to identify culprits
More from hopeoverture/worldbuilding-app-skills
eslint-prettier-husky-config
This skill should be used when setting up code quality tooling with ESLint v9 flat config, Prettier formatting, Husky git hooks, lint-staged pre-commit checks, and GitHub Actions CI lint workflow. Apply when initializing linting, adding code formatting, configuring pre-commit hooks, setting up quality gates, or establishing lint CI checks for Next.js or React projects.
51testing-next-stack
Scaffolds comprehensive testing setup for Next.js applications including Vitest unit tests, React Testing Library component tests, and Playwright E2E flows with accessibility testing via axe-core. This skill should be used when setting up test infrastructure, generating test files, creating test utilities, adding accessibility checks, or configuring testing frameworks for Next.js projects. Trigger terms include setup testing, scaffold tests, vitest, RTL, playwright, e2e tests, component tests, unit tests, accessibility testing, a11y tests, axe-core, test configuration.
38markdown-editor-integrator
This skill should be used when installing and configuring markdown editor functionality using @uiw/react-md-editor. Applies when adding rich text editing, markdown support, WYSIWYG editors, content editing with preview, or text formatting features. Trigger terms include markdown editor, rich text editor, text editor, add markdown, install markdown editor, markdown component, WYSIWYG, content editor, text formatting, editor preview.
27form-generator-rhf-zod
This skill should be used when generating React forms with React Hook Form, Zod validation, and shadcn/ui components. Applies when creating entity forms, character editors, location forms, data entry forms, or any form requiring client and server validation. Trigger terms include create form, generate form, build form, React Hook Form, RHF, Zod validation, form component, entity form, character form, data entry, form schema.
23supabase-auth-ssr-setup
This skill should be used when configuring Supabase Auth for server-side rendering with Next.js App Router, including secure cookie handling, middleware protection, route guards, authentication utilities, and logout flow. Apply when setting up SSR auth, adding protected routes, implementing middleware authentication, configuring secure sessions, or building login/logout flows with Supabase.
18tailwind-shadcn-ui-setup
This skill should be used when setting up, configuring, or initializing Tailwind CSS (v3 or v4) and shadcn/ui for Next.js 16 App Router projects. Configure dark mode, design tokens, base layout with header/sidebar, accessibility defaults, and generate example components. Includes comprehensive setup automation, theme customization, and production-ready patterns. Use when the user requests "setup Tailwind", "configure shadcn/ui", "add dark mode", "initialize design system", or "setup UI framework" for Next.js projects.
17