{"id":36975077,"url":"https://github.com/mkaczkowski/react-performance-tracking","last_synced_at":"2026-01-13T22:03:13.418Z","repository":{"id":328867364,"uuid":"1117120558","full_name":"mkaczkowski/react-performance-tracking","owner":"mkaczkowski","description":"Automate React performance regression testing","archived":false,"fork":false,"pushed_at":"2025-12-27T21:56:13.000Z","size":677,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-29T08:45:47.907Z","etag":null,"topics":["performance-optimization","performance-testing","playwright","react","regression-testing"],"latest_commit_sha":null,"homepage":"https://react-performance-tracking.netlify.app/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mkaczkowski.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-15T21:31:50.000Z","updated_at":"2025-12-27T21:55:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mkaczkowski/react-performance-tracking","commit_stats":null,"previous_names":["mkaczkowski/react-performance-tracking"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/mkaczkowski/react-performance-tracking","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkaczkowski%2Freact-performance-tracking","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkaczkowski%2Freact-performance-tracking/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkaczkowski%2Freact-performance-tracking/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkaczkowski%2Freact-performance-tracking/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mkaczkowski","download_url":"https://codeload.github.com/mkaczkowski/react-performance-tracking/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkaczkowski%2Freact-performance-tracking/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28399102,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T14:36:09.778Z","status":"ssl_error","status_checked_at":"2026-01-13T14:35:19.697Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["performance-optimization","performance-testing","playwright","react","regression-testing"],"created_at":"2026-01-13T22:03:12.657Z","updated_at":"2026-01-13T22:03:13.411Z","avatar_url":"https://github.com/mkaczkowski.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# react-performance-tracking\n\n[![npm version](https://img.shields.io/npm/v/react-performance-tracking.svg)](https://www.npmjs.com/package/react-performance-tracking)\n[![CI](https://github.com/mkaczkowski/react-performance-tracking/actions/workflows/ci.yml/badge.svg)](https://github.com/mkaczkowski/react-performance-tracking/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/github/mkaczkowski/react-performance-tracking/graph/badge.svg?token=WKKW8999JK)](https://codecov.io/github/mkaczkowski/react-performance-tracking)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)\n\nAutomate React render performance checks in Playwright. Capture React Profiler metrics, apply CPU throttling, run warmups, enforce budgets (duration + rerenders, optional FPS), and ship JSON artifacts for debugging.\n\n## Why Use This?\n\n- **Catch performance regressions early** – Detect slow renders before they reach production\n- **Real-world conditions** – Test with CPU throttling, network throttling, and device simulation\n- **CI/CD integration** – Fail builds automatically when performance budgets are exceeded\n- **Comprehensive metrics** – Track React renders, FPS, memory usage, and Core Web Vitals\n- **Zero boilerplate** – Drop-in Playwright integration with minimal configuration\n\n## Quick Links\n\n- 📦 [Installation](#installation)\n- 🚀 [Quick Start](#quick-start)\n- 📖 [Documentation](site/pages/docs)\n- 💡 [Examples](examples/)\n- 📝 [Changelog](CHANGELOG.md)\n- 🐛 [Troubleshooting](#troubleshooting)\n- 🤝 [Contributing](CONTRIBUTING.md)\n\n## Features\n\n- 📊 **React Profiler wiring** – Collect real render metrics via React's Profiler API\n- 🎭 **Playwright integration** – `test.performance()` helper and `performance` fixture\n- 🧩 **Component-level profiling** – Track per-component metrics with multiple profilers\n- 🎞️ **FPS tracking (Chromium/CDP)** – Measure avg FPS via tracing; asserts and logs when enabled\n- 🧠 **Memory tracking (Chromium/CDP)** – Track heap growth to detect memory leaks\n- 📈 **Web Vitals tracking** – Capture LCP, INP, CLS via PerformanceObserver (all browsers)\n- 🔦 **Lighthouse audits (Chromium/CDP)** – Run Lighthouse for performance, accessibility, SEO scores\n- 🐢 **CPU throttling (Chromium/CDP)** – Simulate slower devices when supported\n- 🌐 **Network throttling (Chromium/CDP)** – Simulate slow networks (3G/4G presets or custom)\n- ⏱️ **Custom metrics** – Track custom performance marks and measures for fine-grained timing\n- 🔥 **Warmup runs** – Default on CI to reduce cold-start noise\n- 🔄 **Multiple iterations** – Run tests multiple times and aggregate results for statistical reliability\n- 📊 **Percentile metrics** – P50/P95/P99 thresholds for tests with multiple iterations\n- 🔥 **Trace export (Chromium/CDP)** – Export Chrome DevTools traces for flamegraph visualization\n- ⚙️ **Configurable thresholds** – Separate local/CI budgets with optional buffers\n- 📝 **Detailed logging** – Clear console output with thresholds, FPS, memory, component breakdown, and phase breakdown\n- 📎 **Artifacts** – Attach performance JSON (metrics + config) to test reports\n\n## Installation\n\n```bash\nnpm install react-performance-tracking\n```\n\n### Alternative: Install from GitHub Release\n\nIf the npm package is not yet published, you can install directly from a GitHub release tarball:\n\n```bash\n# Download and install a specific version\nnpm install https://github.com/mkaczkowski/react-performance-tracking/releases/download/v1.1.0/react-performance-tracking-1.1.0.tgz\n```\n\nOr build from source:\n\n```bash\ngit clone https://github.com/mkaczkowski/react-performance-tracking.git\ncd react-performance-tracking\nnpm install \u0026\u0026 npm run build \u0026\u0026 npm pack\nnpm install ./react-performance-tracking-*.tgz\n```\n\n### Peer Dependencies (optional)\n\n```json\n{\n  \"react\": \"^18.0.0 || ^19.0.0\",\n  \"@playwright/test\": \"^1.40.0\",\n  \"lighthouse\": \"\u003e=11.0.0\"\n}\n```\n\nInstall only what you use:\n\n- `react` for the provider/hooks\n- `@playwright/test` for the Playwright integration\n- `lighthouse` for Lighthouse audits (install with `npm install -D lighthouse`)\n\n\u003e **Note:** You may see peer dependency warnings during install (e.g., `npm warn peer react@...`). These are expected and can be safely ignored - all peer dependencies are marked as optional, so you only need to install the ones you actually use.\n\n## Quick Start\n\n### 1) Wrap your app\n\n```tsx\nimport { Profiler } from 'react';\nimport { PerformanceProvider, usePerformanceRequired } from 'react-performance-tracking/react';\n\nfunction App() {\n  return (\n    \u003cPerformanceProvider\u003e\n      \u003cHeader /\u003e\n      \u003cMainContent /\u003e\n    \u003c/PerformanceProvider\u003e\n  );\n}\n\n// Each component wrapped with Profiler gets its own metrics\nfunction Header() {\n  const { onProfilerRender } = usePerformanceRequired();\n  return (\n    \u003cProfiler id=\"header\" onRender={onProfilerRender}\u003e\n      \u003cheader\u003eNavigation here\u003c/header\u003e\n    \u003c/Profiler\u003e\n  );\n}\n\nfunction MainContent() {\n  const { onProfilerRender } = usePerformanceRequired();\n  return (\n    \u003cProfiler id=\"main-content\" onRender={onProfilerRender}\u003e\n      \u003cmain\u003eYour component content\u003c/main\u003e\n    \u003c/Profiler\u003e\n  );\n}\n\n// Test output shows per-component tables when multiple components are profiled\n```\n\n### 2) Extend Playwright\n\n```ts\n// test/performance.setup.ts\nimport { test as base } from '@playwright/test';\nimport { createPerformanceTest } from 'react-performance-tracking/playwright';\n\nexport const test = createPerformanceTest(base);\nexport { expect } from '@playwright/test';\n```\n\n### 3) Write a performance test\n\n```ts\n// test/my-page.perf.spec.ts\nimport { test } from './performance.setup';\n\ntest.describe('My Page Performance', () =\u003e {\n  // Simple test with basic thresholds\n  test.performance({\n    thresholds: {\n      base: {\n        profiler: {\n          '*': { duration: 500, rerenders: 20 },\n        },\n      },\n    },\n  })('page load performance', async ({ page, performance }) =\u003e {\n    await page.goto('/my-page');\n    await performance.init();\n    // Assertions run automatically\n  });\n\n  // Test user interactions\n  test.performance({\n    thresholds: { base: { profiler: { '*': { duration: 100, rerenders: 5 } } } },\n  })('button click interaction', async ({ page, performance }) =\u003e {\n    await page.goto('/my-page');\n    await performance.init();\n\n    await performance.reset(); // Isolate the interaction\n    await page.click('button[data-testid=\"submit\"]');\n    await performance.waitUntilStable();\n  });\n});\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAdvanced: Full configuration example\u003c/strong\u003e\u003c/summary\u003e\n\n```ts\ntest.performance({\n  warmup: true, // Run warmup iteration (default: true on CI)\n  throttleRate: 4, // Simulate 4x slower CPU\n  iterations: 3, // Run 3 times for statistical reliability\n  networkThrottling: 'fast-3g', // Simulate 3G network\n  thresholds: {\n    base: {\n      profiler: {\n        '*': { duration: 500, rerenders: 20 },\n      },\n      fps: 55, // Min 55 FPS (auto-enables FPS tracking)\n      memory: { heapGrowth: 10 * 1024 * 1024 }, // Max 10MB heap growth (auto-enables memory tracking)\n      webVitals: { lcp: 2500, inp: 200, cls: 0.1 }, // Auto-enables Web Vitals tracking\n    },\n    ci: {\n      profiler: { '*': { duration: 600 } }, // More lenient in CI\n    },\n  },\n})('comprehensive performance test', async ({ page, performance }) =\u003e {\n  await page.goto('/my-page');\n  await performance.init();\n});\n```\n\n\u003c/details\u003e\n\n### More Examples\n\n```ts\ntest.describe('Advanced Usage', () =\u003e {\n  // Track custom timing metrics\n  test.performance({\n    thresholds: { base: { profiler: { '*': { duration: 500, rerenders: 20 } } } },\n  })('data loading with custom metrics', async ({ page, performance }) =\u003e {\n    await page.goto('/my-page');\n    await performance.init();\n\n    performance.mark('fetch-start');\n    await page.click('button[data-testid=\"load-data\"]');\n    await page.waitForSelector('.data-loaded');\n    performance.mark('fetch-end');\n\n    performance.mark('render-start');\n    await performance.waitUntilStable();\n    performance.mark('render-end');\n\n    // Create measures for each operation\n    const fetchTime = performance.measure('data-fetch', 'fetch-start', 'fetch-end');\n    const renderTime = performance.measure('data-render', 'render-start', 'render-end');\n\n    console.log(`Fetch: ${fetchTime}ms, Render: ${renderTime}ms`);\n    // Custom metrics are automatically included in test output and artifacts\n  });\n});\n```\n\n## Advanced Usage: Custom Fixtures\n\nWhen using `createPerformanceTest()`, only `page` and `performance` fixtures are passed to your test function. If you need custom fixtures (like page objects, mocks, etc.), see the [Custom Fixtures Guide](site/pages/docs/advanced/custom-fixtures.mdx).\n\n## API Overview\n\nYou can import from the root (`react-performance-tracking`) or subpaths (`/react`, `/playwright`).\n\n### React Exports\n\n```ts\nimport {\n  PerformanceProvider,\n  usePerformance,\n  usePerformanceRequired,\n  usePerformanceStore,\n} from 'react-performance-tracking/react';\n```\n\n### Playwright Exports\n\n**Essential** - what most users need:\n\n```ts\nimport {\n  createPerformanceTest,\n  PERFORMANCE_CONFIG,\n  NETWORK_PRESETS,\n  setLogLevel,\n} from 'react-performance-tracking/playwright';\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAdvanced exports\u003c/strong\u003e - for custom wrappers and low-level control\u003c/summary\u003e\n\n```ts\nimport {\n  // Building blocks for custom wrappers\n  createPerformanceInstance,\n  createConfiguredTestInfo,\n  addConfigurationAnnotation,\n  PerformanceTestRunner,\n\n  // Assertions\n  assertPerformanceThresholds,\n  assertDurationThreshold,\n  assertSampleCountThreshold,\n  assertFPSThreshold,\n  assertHeapGrowthThreshold,\n\n  // CDP Feature system\n  featureRegistry,\n  cpuThrottlingFeature,\n  networkThrottlingFeature,\n  fpsTrackingFeature,\n  memoryTrackingFeature,\n  createFeatureCoordination,\n\n  // Feature utilities\n  createCDPSession,\n  createFeatureHandle,\n  createResettableFeatureHandle,\n\n  // Network utilities\n  resolveNetworkConditions,\n  formatNetworkConditions,\n  isNetworkPreset,\n\n  // Profiler utilities\n  captureProfilerState,\n  logger,\n} from 'react-performance-tracking/playwright';\n```\n\n\u003c/details\u003e\n\n## Configuration Options\n\n### `test.performance()` config\n\n```ts\ntest.performance({\n  warmup?: boolean;        // default: true on CI, false locally\n  throttleRate?: number;   // default: 1 (no throttling)\n  iterations?: number;     // default: 1 (single run)\n  networkThrottling?: NetworkThrottlingConfig; // preset or custom (Chromium only)\n  exportTrace?: boolean | string; // export trace for flamegraph (Chromium only)\n  thresholds: {\n    base: {\n      profiler: {\n        '*': {           // Default for all components\n          duration: number | { avg?: number; p50?: number; p95?: number; p99?: number };\n          rerenders: number;\n        };\n        // Additional component IDs can be specified\n        // 'header'?: { duration: 100, rerenders: 5 };\n      };\n      fps?: number | { avg?: number; p50?: number; p95?: number; p99?: number }; // Min FPS (auto-enables FPS tracking, Chromium only)\n      memory?: {\n        heapGrowth?: number; // max heap growth in bytes (auto-enables memory tracking, Chromium only)\n      };\n      webVitals?: {        // Web Vitals thresholds (auto-enables tracking, all browsers)\n        lcp?: number;      // max LCP in ms (Google recommends ≤2500)\n        inp?: number;      // max INP in ms (Google recommends ≤200)\n        cls?: number;      // max CLS score (Google recommends ≤0.1)\n      };\n    };\n    ci?: {               // Overrides for CI environment\n      profiler?: {\n        [componentId: string]: Partial\u003cComponentThresholds\u003e;\n      };\n      fps?: number | { avg?: number; p50?: number; p95?: number; p99?: number };\n      memory?: { heapGrowth?: number };\n      webVitals?: { lcp?: number; inp?: number; cls?: number };\n    };\n  };\n  buffers?: {\n    duration?: number;     // % buffer (default: 20) - also used for duration percentiles (p50, p95, p99)\n    rerenders?: number;    // % buffer (default: 20)\n    fps?: number;          // % buffer (default: 20) - also used for fps percentiles (p50, p95, p99)\n    heapGrowth?: number;   // % buffer (default: 20)\n    webVitals?: { lcp?: number; inp?: number; cls?: number }; // % buffers (default: 20 each)\n  };\n  name?: string;           // artifact name\n})('test title', async ({ page, performance }) =\u003e { ... });\n\n// NetworkThrottlingConfig can be:\n// - Preset: 'slow-3g' | 'fast-3g' | 'slow-4g' | 'fast-4g' | 'offline'\n// - Custom: { latency: number, downloadThroughput: number, uploadThroughput: number, offline?: boolean }\n```\n\n### Performance fixture methods\n\n- `init()` – Wait for profiler initialization and stability\n- `reset()` – Clear collected samples and custom metrics (isolate measurements)\n- `waitForInitialization(timeout?)` – Wait for profiler to be ready\n- `waitUntilStable(options?)` – Wait for React to settle\n- `mark(name)` – Record a custom performance mark (timestamp)\n- `measure(name, startMark, endMark)` – Create a measure between two marks (returns duration in ms)\n- `getCustomMetrics()` – Get all recorded marks and measures\n\n### Default Configuration\n\n```ts\nconst PERFORMANCE_CONFIG = {\n  profiler: {\n    stabilityPeriodMs: 1000,\n    checkIntervalMs: 100,\n    maxWaitMs: 5000,\n    initializationTimeoutMs: 10000,\n  },\n  buffers: {\n    duration: 20,\n    rerenders: 20,\n    avg: 20,\n    heapGrowth: 20,\n    webVitals: { lcp: 20, inp: 20, cls: 20 },\n  },\n  throttling: {\n    defaultRate: 1,\n  },\n  fps: {\n    defaultThreshold: 60,\n  },\n  memory: {\n    defaultThreshold: 0, // 0 = no threshold, just track\n  },\n  webVitals: {\n    enabled: false, // off by default to avoid overhead\n  },\n  iterations: {\n    defaultCount: 1,\n  },\n  get isCI() {\n    return Boolean(process.env.CI);\n  },\n};\n```\n\n### Controlling Log Output\n\n```ts\nimport { setLogLevel } from 'react-performance-tracking/playwright';\n\n// Available levels: 'silent' | 'error' | 'warn' | 'info' | 'debug'\nsetLogLevel('silent'); // Disable all console output\nsetLogLevel('error'); // Only show errors\nsetLogLevel('info'); // Default - show info, warnings, errors\n```\n\n### Environment Behavior\n\n| Environment | Thresholds Used         | Warmup Default |\n| ----------- | ----------------------- | -------------- |\n| CI          | `base` merged with `ci` | `true`         |\n| Local       | `base` only             | `false`        |\n\n## Console Output\n\n```\n════════════════════════════════════════════════════════════════════════════════\n [Performance] PERFORMANCE TEST: page-load-performance\n════════════════════════════════════════════════════════════════════════════════\n Environment: local | CPU: 4x | Iterations: 3\n────────────────────────────────────────────────────────────────────────────────\n\n ITERATIONS\n┌─────┬─────────────┬─────────┬───────┐\n│ #   │ Duration    │ Renders │ FPS   │\n├─────┼─────────────┼─────────┼───────┤\n│ 1 ○ │     35.20ms │      26 │  29.6 │\n│ 2   │     22.50ms │      26 │  47.4 │\n│ 3   │     21.60ms │      26 │  50.5 │\n├─────┼─────────────┼─────────┼───────┤\n│ AVG │ 22.05ms ±0.5│  26 ±0.0│  49.0 │\n└─────┴─────────────┴─────────┴───────┘\n ○ = warmup (excluded from average)\n\n RESULTS\n┌──────────┬──────────┬───────────┬────────┐\n│ Metric   │ Actual   │ Threshold │ Status │\n├──────────┼──────────┼───────────┼────────┤\n│ Duration │ 22.05ms  │  \u003c 600ms  │ ✓ PASS │\n│ Renders  │       26 │      ≤ 24 │ ✓ PASS │\n│ FPS      │     49.0 │    ≥ 44.0 │ ✓ PASS │\n│ LCP      │  1523ms  │  ≤ 3000ms │ ✓ PASS │\n│ INP      │    85ms  │   ≤ 240ms │ ✓ PASS │\n│ CLS      │    0.050 │    ≤ 0.12 │ ✓ PASS │\n└──────────┴──────────┴───────────┴────────┘\n\n════════════════════════════════════════════════════════════════════════════════\n ✓ ALL CHECKS PASSED\n════════════════════════════════════════════════════════════════════════════════\n```\n\n## Troubleshooting\n\n### Tests timing out?\n\n- **Increase initialization timeout**: Adjust `initializationTimeoutMs` in your config\n- **Check PerformanceProvider**: Ensure it wraps your app root component\n- **Verify profiler IDs**: Make sure `\u003cProfiler id=\"...\"\u003e` IDs match your test expectations\n\n```ts\n// Extend timeout if needed\nawait performance.waitForInitialization(15000); // 15 seconds instead of default 10s\n```\n\n### FPS tracking not working?\n\n- **Browser requirement**: FPS tracking requires Chromium (Chrome/Edge)\n- **Enable in config**: Add `fps` thresholds to automatically enable FPS tracking\n- **Check CDP availability**: Non-Chromium browsers will silently skip FPS tracking\n\n### Thresholds failing unexpectedly?\n\n- **Environment differences**: Check if you're running in CI vs local (different thresholds apply)\n- **Review buffers**: Default buffer is 20% - adjust in config if needed\n- **Component-specific thresholds**: Use per-component thresholds for fine-grained control\n\n```ts\nthresholds: {\n  base: {\n    profiler: {\n      '*': { duration: 500, rerenders: 20 },\n    },\n  },\n  ci: {\n    profiler: {\n      '*': { duration: 600 }, // More lenient in CI\n    },\n  },\n},\nbuffers: {\n  duration: 10, // Reduce buffer to 10%\n},\n```\n\n### Memory or network throttling not applying?\n\n- **Chromium only**: These features require Chromium browser\n- **Check config**: Verify `memory.heapGrowth` threshold or `networkThrottling` config is set\n- **Session conflicts**: Ensure no other tools are using CDP on the same page\n\n### Need more help?\n\n- 📖 Read the [Documentation](site/pages/docs)\n- 💬 Open a [GitHub Discussion](https://github.com/mkaczkowski/react-performance-tracking/discussions)\n- 🐛 Report a bug via [GitHub Issues](https://github.com/mkaczkowski/react-performance-tracking/issues)\n\n## Limitations\n\n- CPU throttling, FPS tracking, memory tracking, and network throttling require Chromium/CDP; other browsers skip them quietly.\n- React Profiler must be enabled in production builds if you test prod bundles.\n- When using `createPerformanceTest()`, only `page` and `performance` fixtures are exposed. Use the building blocks directly if you need custom fixtures (see Advanced Usage above).\n\n## Requirements\n\n- React 18+ or 19+\n- Playwright 1.40+\n- Node.js 18+\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmkaczkowski%2Freact-performance-tracking","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmkaczkowski%2Freact-performance-tracking","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmkaczkowski%2Freact-performance-tracking/lists"}