vibes-plug 1.0.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/.github/workflows/publish.yml +20 -0
  2. package/AGENTS.md +66 -0
  3. package/BLUEPRINT.md +152 -60
  4. package/CHANGELOG.md +50 -0
  5. package/README.md +346 -194
  6. package/package.json +25 -25
  7. package/plugin.json +1 -1
  8. package/skills/ai-cost-token-optimizer/SKILL.md +52 -0
  9. package/skills/ai-llm-integration-expert/SKILL.md +180 -162
  10. package/skills/api-design-expert/SKILL.md +314 -310
  11. package/skills/app-analyzer-optimizer/SKILL.md +193 -189
  12. package/skills/apple-ecosystem-expert/SKILL.md +142 -0
  13. package/skills/async-queue-temporal-expert/SKILL.md +54 -0
  14. package/skills/authentication-identity-expert/SKILL.md +251 -20
  15. package/skills/auto-doc-updater/SKILL.md +214 -204
  16. package/skills/autonomous-chaos-monkey/SKILL.md +63 -0
  17. package/skills/autonomous-red-teamer/SKILL.md +59 -0
  18. package/skills/autonomous-swarm-director/SKILL.md +69 -0
  19. package/skills/autonomous-tdd-debugger/SKILL.md +65 -0
  20. package/skills/bootstrap-to-modern/SKILL.md +90 -86
  21. package/skills/brainstorming/SKILL.md +373 -353
  22. package/skills/browser-automation-expert/SKILL.md +46 -0
  23. package/skills/ci-cd-devops-architect/SKILL.md +72 -45
  24. package/skills/cloud-hosting-expert/SKILL.md +244 -244
  25. package/skills/coderabbit/SKILL.md +192 -192
  26. package/skills/cron-scheduler-expert/SKILL.md +298 -0
  27. package/skills/data-telemetry-expert/SKILL.md +213 -213
  28. package/skills/database-orm-expert/SKILL.md +294 -294
  29. package/skills/dependency-upgrade-migrator/SKILL.md +295 -0
  30. package/skills/design-system-architect/SKILL.md +27 -10
  31. package/skills/doku-mcp-server/SKILL.md +251 -0
  32. package/skills/doku-payment-gateway/SKILL.md +227 -0
  33. package/skills/e2e-testing-expert/SKILL.md +315 -315
  34. package/skills/edge-serverless-db-expert/SKILL.md +43 -0
  35. package/skills/email-notification-expert/SKILL.md +362 -0
  36. package/skills/error-resilience-expert/SKILL.md +480 -0
  37. package/skills/event-driven-architect/SKILL.md +81 -81
  38. package/skills/feature-flag-analytics-expert/SKILL.md +46 -0
  39. package/skills/file-upload-media-expert/SKILL.md +431 -0
  40. package/skills/form-validation-expert/SKILL.md +401 -0
  41. package/skills/fullstack-expert/SKILL.md +202 -202
  42. package/skills/fullstack-expert/references/api_design_guide.md +466 -466
  43. package/skills/fullstack-expert/references/multi_language_backend.md +528 -528
  44. package/skills/fullstack-expert/scripts/api_contract_validator.py +253 -253
  45. package/skills/fullstack-expert/scripts/architecture_analyzer.py +326 -326
  46. package/skills/gemini-agent-booster/SKILL.md +135 -135
  47. package/skills/global-a11y-i18n-expert/SKILL.md +81 -81
  48. package/skills/glsl-shader-expert/SKILL.md +101 -0
  49. package/skills/go-programming-expert/SKILL.md +295 -295
  50. package/skills/graphql-apollo-expert/SKILL.md +108 -0
  51. package/skills/hig/SKILL.md +188 -188
  52. package/skills/hyper-context-synthesizer/SKILL.md +55 -0
  53. package/skills/js-backend-expert/SKILL.md +34 -9
  54. package/skills/legacy-code-translator/SKILL.md +65 -0
  55. package/skills/llm-cost-arbitrage-router/SKILL.md +59 -0
  56. package/skills/logging-error-tracking-expert/SKILL.md +338 -0
  57. package/skills/mcp-client-orchestrator/SKILL.md +70 -0
  58. package/skills/mcp-server-architect/SKILL.md +194 -194
  59. package/skills/micro-frontend-architect/SKILL.md +106 -0
  60. package/skills/mobile-expo-expert/SKILL.md +186 -186
  61. package/skills/mobile-push-notification-expert/SKILL.md +51 -0
  62. package/skills/monday-design-aesthetic/SKILL.md +67 -67
  63. package/skills/monorepo-architect/SKILL.md +227 -227
  64. package/skills/mpa-orchestrator/SKILL.md +101 -101
  65. package/skills/multi-agent-orchestration/SKILL.md +234 -234
  66. package/skills/multiple-entry-points/SKILL.md +55 -55
  67. package/skills/mvc-expert/SKILL.md +231 -231
  68. package/skills/payment-gateway-expert/SKILL.md +45 -45
  69. package/skills/performance-web-vitals/SKILL.md +332 -332
  70. package/skills/post-quantum-crypto-migrator/SKILL.md +57 -0
  71. package/skills/prd-architect/SKILL.md +201 -191
  72. package/skills/proactive-background-watcher/SKILL.md +62 -0
  73. package/skills/production-ready-hardener/PRODUCTION_READINESS_REPORT.md +67 -0
  74. package/skills/production-ready-hardener/SKILL.md +173 -186
  75. package/skills/production-ready-hardener/references/production_checklist.md +161 -161
  76. package/skills/production-ready-hardener/scripts/production_readiness_scanner.py +881 -875
  77. package/skills/project-context-mapper/SKILL.md +79 -0
  78. package/skills/python-programming-expert/SKILL.md +263 -132
  79. package/skills/rate-limit-abuse-prevention/SKILL.md +371 -0
  80. package/skills/realtime-collaboration-expert/SKILL.md +45 -45
  81. package/skills/rust-programming-expert/SKILL.md +235 -235
  82. package/skills/saas-billing/SKILL.md +377 -377
  83. package/skills/saas-multi-tenant/SKILL.md +251 -237
  84. package/skills/saas-mvp-launcher/SKILL.md +10 -0
  85. package/skills/saas-transformer/SKILL.md +187 -144
  86. package/skills/saas-transformer/references/billing_integration_guide.md +401 -401
  87. package/skills/saas-transformer/references/feature_gating_patterns.md +137 -137
  88. package/skills/saas-transformer/references/saas_transformation_checklist.md +121 -121
  89. package/skills/saas-transformer/scripts/saas_transformation_scanner.py +39 -29
  90. package/skills/scalability-clean-code/SKILL.md +229 -229
  91. package/skills/self-evolving-memory-graph/SKILL.md +75 -0
  92. package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -0
  93. package/skills/senior-frontend/SKILL.md +161 -161
  94. package/skills/senior-fullstack/SKILL.md +167 -167
  95. package/skills/seo/SKILL.md +235 -225
  96. package/skills/seo-geo/SKILL.md +188 -188
  97. package/skills/session-context-loader/SKILL.md +77 -0
  98. package/skills/session-handoff-resume/SKILL.md +158 -158
  99. package/skills/skill_baru/SKILL.md +172 -147
  100. package/skills/spa-orchestrator/SKILL.md +288 -288
  101. package/skills/state-management-expert/SKILL.md +272 -272
  102. package/skills/supabase-security-expert/SKILL.md +243 -243
  103. package/skills/tailwind-expert/SKILL.md +188 -188
  104. package/skills/tanstack-query-expert/SKILL.md +199 -199
  105. package/skills/token-saver/SKILL.md +119 -111
  106. package/skills/typescript-expert/SKILL.md +324 -279
  107. package/skills/ui-components-expert/SKILL.md +263 -46
  108. package/skills/ui-ux-pro-max/SKILL.md +202 -201
  109. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
  110. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
  111. package/skills/ui_ux_expert/SKILL.md +17 -6
  112. package/skills/vector-db-rag-expert/SKILL.md +52 -0
  113. package/skills/vibe-code-gardener/SKILL.md +181 -173
  114. package/skills/visual-qa-vision-agent/SKILL.md +65 -0
  115. package/skills/vue-frontend-expert/SKILL.md +126 -0
  116. package/skills/web-3d-graphics-expert/SKILL.md +131 -0
  117. package/skills/web-game-engine-expert/SKILL.md +96 -0
  118. package/skills/web-scraper/SKILL.md +207 -205
  119. package/skills/website-design-cloner/SKILL.md +174 -0
  120. package/skills/webxr-ar-vr-expert/SKILL.md +117 -0
  121. package/skills/zero-to-prod-orchestrator/SKILL.md +206 -180
  122. package/skills/zero-trust-secret-vault/SKILL.md +40 -0
  123. package/vibes-swarm-demo.gif +0 -0
@@ -1,332 +1,332 @@
1
- ---
2
- name: performance-web-vitals
3
- description: "Expert guide for Web Performance optimization: Core Web Vitals (LCP, INP, CLS), bundle analysis, image optimization, rendering strategies, and Lighthouse score improvement / Panduan ahli untuk optimasi performa web: Core Web Vitals (LCP, INP, CLS), analisis bundle, optimasi gambar, strategi rendering, dan peningkatan skor Lighthouse."
4
- author: "Roedy Rustam"
5
- ---
6
-
7
- # Web Performance & Core Web Vitals Expert
8
-
9
- [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
10
-
11
- ---
12
-
13
- <a name="english"></a>
14
- ## English
15
-
16
- ### Description
17
- Expert guide for measuring, diagnosing, and optimizing web application performance with a focus on **Core Web Vitals** (LCP, INP, CLS), JavaScript bundle optimization, image and font loading strategies, rendering performance, and achieving high Lighthouse scores. Covers Next.js 15, React 19, and modern browser APIs.
18
-
19
- ### Trigger Conditions
20
- - Improving Lighthouse performance score below 90.
21
- - Diagnosing poor LCP, INP, or CLS metrics.
22
- - Reducing JavaScript bundle size or eliminating render-blocking resources.
23
- - Optimizing image loading, lazy loading, or font delivery.
24
- - Implementing React performance patterns (memo, useDeferredValue, Suspense).
25
- - Setting up Real User Monitoring (RUM) for Core Web Vitals.
26
- - Optimizing server response times (TTFB).
27
-
28
- ---
29
-
30
- ### Core Web Vitals Targets (2024+)
31
-
32
- | Metric | Good | Needs Improvement | Poor | Measures |
33
- |---|---|---|---|---|
34
- | **LCP** (Largest Contentful Paint) | ≤ 2.5s | 2.5–4.0s | > 4.0s | Loading performance |
35
- | **INP** (Interaction to Next Paint) | ≤ 200ms | 200–500ms | > 500ms | Interactivity (replaced FID) |
36
- | **CLS** (Cumulative Layout Shift) | ≤ 0.1 | 0.1–0.25 | > 0.25 | Visual stability |
37
- | **FCP** (First Contentful Paint) | ≤ 1.8s | 1.8–3.0s | > 3.0s | Perceived loading |
38
- | **TTFB** (Time to First Byte) | ≤ 800ms | 800–1800ms | > 1800ms | Server responsiveness |
39
-
40
- ---
41
-
42
- ### LCP Optimization Strategies
43
-
44
- #### 1. Identify and Optimize the LCP Element
45
- ```typescript
46
- // Measure LCP with web-vitals library
47
- import { onLCP, onINP, onCLS } from 'web-vitals';
48
-
49
- onLCP((metric) => {
50
- console.log('LCP:', metric.value, 'element:', metric.attribution.lcpEntry?.element);
51
- // Send to analytics
52
- sendToAnalytics({ name: metric.name, value: metric.value });
53
- });
54
- ```
55
-
56
- #### 2. Preload LCP Image (Hero Image)
57
- ```html
58
- <!-- In <head> — preload the hero image before CSS blocks it -->
59
- <link rel="preload" as="image" href="/hero.webp"
60
- imagesrcset="/hero-480.webp 480w, /hero-800.webp 800w"
61
- imagesizes="(max-width: 600px) 480px, 800px"
62
- fetchpriority="high">
63
- ```
64
-
65
- #### 3. Next.js Image Component (LCP Hero)
66
- ```tsx
67
- import Image from 'next/image';
68
-
69
- // LCP image: priority=true + fill or explicit size
70
- <Image
71
- src="/hero.webp"
72
- alt="Hero banner"
73
- width={1200}
74
- height={600}
75
- priority // disables lazy loading, adds preload link
76
- fetchPriority="high"
77
- quality={85}
78
- sizes="(max-width: 768px) 100vw, 1200px"
79
- />
80
-
81
- // Below-the-fold images: lazy load (default)
82
- <Image
83
- src="/product.webp"
84
- alt="Product"
85
- width={400}
86
- height={300}
87
- // loading="lazy" is the default — no need to specify
88
- />
89
- ```
90
-
91
- ---
92
-
93
- ### INP Optimization Strategies
94
-
95
- #### 1. Break Up Long Tasks
96
- ```typescript
97
- // BAD: Long synchronous task blocks the main thread
98
- function processLargeList(items: Item[]) {
99
- return items.map(expensiveTransform); // blocks for 500ms
100
- }
101
-
102
- // GOOD: Yield control back to browser between chunks
103
- async function processLargeListAsync(items: Item[]) {
104
- const results: Result[] = [];
105
- for (let i = 0; i < items.length; i++) {
106
- results.push(expensiveTransform(items[i]));
107
- if (i % 50 === 0) await scheduler.yield(); // yield every 50 items
108
- }
109
- return results;
110
- }
111
- ```
112
-
113
- #### 2. React 19 — Concurrent Features for INP
114
- ```tsx
115
- import { useTransition, useDeferredValue, startTransition } from 'react';
116
-
117
- // Non-urgent state updates — mark as transitions
118
- function SearchResults() {
119
- const [query, setQuery] = useState('');
120
- const [isPending, startTransition] = useTransition();
121
- const deferredQuery = useDeferredValue(query);
122
-
123
- return (
124
- <>
125
- <input
126
- value={query}
127
- onChange={(e) => {
128
- setQuery(e.target.value); // urgent: update input immediately
129
- startTransition(() => {
130
- // non-urgent: defer expensive filtering
131
- });
132
- }}
133
- />
134
- {isPending && <Spinner />}
135
- {/* deferredQuery triggers re-render without blocking input */}
136
- <ResultsList query={deferredQuery} />
137
- </>
138
- );
139
- }
140
- ```
141
-
142
- #### 3. Virtualize Long Lists
143
- ```tsx
144
- // Use TanStack Virtual for large lists (1000+ items)
145
- import { useVirtualizer } from '@tanstack/react-virtual';
146
-
147
- function VirtualList({ items }: { items: Item[] }) {
148
- const parentRef = useRef<HTMLDivElement>(null);
149
- const virtualizer = useVirtualizer({
150
- count: items.length,
151
- getScrollElement: () => parentRef.current,
152
- estimateSize: () => 60, // estimated row height in px
153
- overscan: 5,
154
- });
155
-
156
- return (
157
- <div ref={parentRef} style={{ height: '600px', overflow: 'auto' }}>
158
- <div style={{ height: virtualizer.getTotalSize() }}>
159
- {virtualizer.getVirtualItems().map((vItem) => (
160
- <div
161
- key={vItem.key}
162
- style={{ position: 'absolute', top: vItem.start, height: vItem.size }}
163
- >
164
- <ItemRow item={items[vItem.index]} />
165
- </div>
166
- ))}
167
- </div>
168
- </div>
169
- );
170
- }
171
- ```
172
-
173
- ---
174
-
175
- ### CLS Optimization Strategies
176
-
177
- ```css
178
- /* 1. Reserve space for images with aspect-ratio */
179
- img, video {
180
- width: 100%;
181
- height: auto;
182
- aspect-ratio: 16 / 9; /* prevents layout shift before load */
183
- }
184
-
185
- /* 2. Reserve space for dynamic content */
186
- .ad-container {
187
- min-height: 250px; /* reserve ad slot height */
188
- }
189
-
190
- /* 3. Use font-display: optional or swap */
191
- @font-face {
192
- font-family: 'Inter';
193
- src: url('/fonts/inter.woff2') format('woff2');
194
- font-display: optional; /* no invisible text, no layout shift */
195
- }
196
- ```
197
-
198
- ```tsx
199
- // 4. Avoid inserting content above existing content
200
- // BAD: inserting notification banner at top pushes content down
201
- setShowBanner(true); // causes CLS
202
-
203
- // GOOD: use position:fixed or reserve space at the top
204
- <div className="h-12">{showBanner && <Banner />}</div>
205
- ```
206
-
207
- ---
208
-
209
- ### Bundle Optimization
210
-
211
- #### Next.js Bundle Analysis
212
- ```bash
213
- # Analyze bundle composition
214
- ANALYZE=true npm run build
215
- # Or use @next/bundle-analyzer
216
- ```
217
-
218
- #### Code Splitting Patterns
219
- ```tsx
220
- import dynamic from 'next/dynamic';
221
-
222
- // Dynamic import — code splits automatically
223
- const HeavyChart = dynamic(() => import('@/components/HeavyChart'), {
224
- loading: () => <ChartSkeleton />,
225
- ssr: false, // disable SSR for client-only components
226
- });
227
-
228
- // Lazy load with React.lazy (non-Next.js)
229
- const Modal = React.lazy(() => import('./Modal'));
230
- ```
231
-
232
- #### Tree-shaking Checklist
233
- - Use named imports: `import { debounce } from 'lodash-es'` (not `import _ from 'lodash'`)
234
- - Set `"sideEffects": false` in `package.json` for libraries.
235
- - Avoid `import *` from large libraries.
236
- - Replace `moment.js` with `date-fns` or `dayjs`.
237
- - Use `sharp` for server-side image processing.
238
-
239
- ---
240
-
241
- ### React Performance Patterns
242
-
243
- ```tsx
244
- // memo — skip re-render if props didn't change
245
- const ExpensiveList = memo(({ items }: { items: Item[] }) => (
246
- <ul>{items.map((i) => <li key={i.id}>{i.name}</li>)}</ul>
247
- ));
248
-
249
- // useCallback — stable function reference for memo children
250
- const handleDelete = useCallback((id: string) => {
251
- setItems((prev) => prev.filter((i) => i.id !== id));
252
- }, []); // empty deps = stable reference
253
-
254
- // useMemo — memoize expensive calculations
255
- const sortedItems = useMemo(
256
- () => [...items].sort((a, b) => a.name.localeCompare(b.name)),
257
- [items]
258
- );
259
- ```
260
-
261
- ---
262
-
263
- ### Performance Monitoring Setup
264
-
265
- ```typescript
266
- // report-vitals.ts — send Core Web Vitals to analytics
267
- import { onCLS, onINP, onLCP, onFCP, onTTFB } from 'web-vitals';
268
-
269
- function sendToAnalytics({ name, value, id, navigationType }: Metric) {
270
- // Send to PostHog, Google Analytics, or your own endpoint
271
- fetch('/api/analytics/vitals', {
272
- method: 'POST',
273
- body: JSON.stringify({ name, value: Math.round(value), id, navigationType }),
274
- keepalive: true, // ensures request completes even if page unloads
275
- });
276
- }
277
-
278
- onCLS(sendToAnalytics);
279
- onINP(sendToAnalytics);
280
- onLCP(sendToAnalytics);
281
- onFCP(sendToAnalytics);
282
- onTTFB(sendToAnalytics);
283
- ```
284
-
285
- ---
286
-
287
- ### Lighthouse Score Improvement Checklist
288
-
289
- - [ ] LCP image has `priority` or `fetchpriority="high"` + preload link.
290
- - [ ] All non-LCP images use `loading="lazy"`.
291
- - [ ] Fonts loaded with `font-display: optional` or preloaded with `rel="preload"`.
292
- - [ ] No render-blocking `<script>` tags without `defer` or `async`.
293
- - [ ] Bundle size < 200KB gzipped for initial JS.
294
- - [ ] Images served in WebP/AVIF format with `srcset`.
295
- - [ ] Server response time (TTFB) < 600ms — use CDN edge caching.
296
- - [ ] Long tasks (> 50ms) are broken up or deferred.
297
- - [ ] Virtual lists used for > 100 items.
298
- - [ ] Unused CSS removed (PurgeCSS / Tailwind purge).
299
- - [ ] HTTP/2 or HTTP/3 enabled on server.
300
- - [ ] Resource hints: `dns-prefetch`, `preconnect` for third-party origins.
301
-
302
- ---
303
-
304
- <a name="bahasa-indonesia"></a>
305
- ## Bahasa Indonesia
306
-
307
- ### Deskripsi
308
- Panduan ahli untuk mengukur, mendiagnosis, dan mengoptimalkan performa aplikasi web dengan fokus pada **Core Web Vitals** (LCP, INP, CLS), optimasi JavaScript bundle, strategi loading gambar dan font, performa rendering, dan mencapai skor Lighthouse yang tinggi.
309
-
310
- ### Kondisi Pemicu
311
- - Meningkatkan skor Lighthouse di bawah 90.
312
- - Mendiagnosis metrik LCP, INP, atau CLS yang buruk.
313
- - Mengurangi ukuran JavaScript bundle atau menghilangkan resource yang memblokir render.
314
- - Mengoptimalkan loading gambar, lazy loading, atau pengiriman font.
315
- - Mengimplementasikan pola performa React (memo, useDeferredValue, Suspense).
316
- - Menyiapkan Real User Monitoring (RUM) untuk Core Web Vitals.
317
-
318
- ### Target Core Web Vitals
319
-
320
- | Metrik | Baik | Perlu Perbaikan | Buruk |
321
- |---|---|---|---|
322
- | **LCP** | ≤ 2,5 detik | 2,5–4,0 detik | > 4,0 detik |
323
- | **INP** | ≤ 200ms | 200–500ms | > 500ms |
324
- | **CLS** | ≤ 0,1 | 0,1–0,25 | > 0,25 |
325
-
326
- ### Ringkasan Strategi Optimasi
327
-
328
- - **LCP**: Preload hero image, gunakan `priority` di Next.js Image, optimalkan TTFB dengan CDN.
329
- - **INP**: Pecah long task dengan `scheduler.yield()`, gunakan `useTransition` React 19, virtualisasi list panjang.
330
- - **CLS**: Reservasi ruang untuk gambar dengan `aspect-ratio`, hindari penyisipan konten di atas konten yang sudah ada.
331
- - **Bundle**: Analisis bundle, gunakan dynamic import, tree-shaking, dan named imports.
332
- - **Monitoring**: Implementasikan `web-vitals` library untuk melaporkan metrik ke analytics secara real-time.
1
+ ---
2
+ name: performance-web-vitals
3
+ description: "Expert guide for Web Performance optimization: Core Web Vitals (LCP, INP, CLS), bundle analysis, image optimization, rendering strategies, and Lighthouse score improvement / Panduan ahli untuk optimasi performa web: Core Web Vitals (LCP, INP, CLS), analisis bundle, optimasi gambar, strategi rendering, dan peningkatan skor Lighthouse."
4
+ author: "Roedy Rustam"
5
+ ---
6
+
7
+ # Web Performance & Core Web Vitals Expert
8
+
9
+ [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
10
+
11
+ ---
12
+
13
+ <a name="english"></a>
14
+ ## English
15
+
16
+ ### Description
17
+ Expert guide for measuring, diagnosing, and optimizing web application performance with a focus on **Core Web Vitals** (LCP, INP, CLS), JavaScript bundle optimization, image and font loading strategies, rendering performance, and achieving high Lighthouse scores. Covers Next.js 15, React 19, and modern browser APIs.
18
+
19
+ ### Trigger Conditions
20
+ - Improving Lighthouse performance score below 90.
21
+ - Diagnosing poor LCP, INP, or CLS metrics.
22
+ - Reducing JavaScript bundle size or eliminating render-blocking resources.
23
+ - Optimizing image loading, lazy loading, or font delivery.
24
+ - Implementing React performance patterns (memo, useDeferredValue, Suspense).
25
+ - Setting up Real User Monitoring (RUM) for Core Web Vitals.
26
+ - Optimizing server response times (TTFB).
27
+
28
+ ---
29
+
30
+ ### Core Web Vitals Targets (2024+)
31
+
32
+ | Metric | Good | Needs Improvement | Poor | Measures |
33
+ |---|---|---|---|---|
34
+ | **LCP** (Largest Contentful Paint) | ≤ 2.5s | 2.5–4.0s | > 4.0s | Loading performance |
35
+ | **INP** (Interaction to Next Paint) | ≤ 200ms | 200–500ms | > 500ms | Interactivity (replaced FID) |
36
+ | **CLS** (Cumulative Layout Shift) | ≤ 0.1 | 0.1–0.25 | > 0.25 | Visual stability |
37
+ | **FCP** (First Contentful Paint) | ≤ 1.8s | 1.8–3.0s | > 3.0s | Perceived loading |
38
+ | **TTFB** (Time to First Byte) | ≤ 800ms | 800–1800ms | > 1800ms | Server responsiveness |
39
+
40
+ ---
41
+
42
+ ### LCP Optimization Strategies
43
+
44
+ #### 1. Identify and Optimize the LCP Element
45
+ ```typescript
46
+ // Measure LCP with web-vitals library
47
+ import { onLCP, onINP, onCLS } from 'web-vitals';
48
+
49
+ onLCP((metric) => {
50
+ console.log('LCP:', metric.value, 'element:', metric.attribution.lcpEntry?.element);
51
+ // Send to analytics
52
+ sendToAnalytics({ name: metric.name, value: metric.value });
53
+ });
54
+ ```
55
+
56
+ #### 2. Preload LCP Image (Hero Image)
57
+ ```html
58
+ <!-- In <head> — preload the hero image before CSS blocks it -->
59
+ <link rel="preload" as="image" href="/hero.webp"
60
+ imagesrcset="/hero-480.webp 480w, /hero-800.webp 800w"
61
+ imagesizes="(max-width: 600px) 480px, 800px"
62
+ fetchpriority="high">
63
+ ```
64
+
65
+ #### 3. Next.js Image Component (LCP Hero)
66
+ ```tsx
67
+ import Image from 'next/image';
68
+
69
+ // LCP image: priority=true + fill or explicit size
70
+ <Image
71
+ src="/hero.webp"
72
+ alt="Hero banner"
73
+ width={1200}
74
+ height={600}
75
+ priority // disables lazy loading, adds preload link
76
+ fetchPriority="high"
77
+ quality={85}
78
+ sizes="(max-width: 768px) 100vw, 1200px"
79
+ />
80
+
81
+ // Below-the-fold images: lazy load (default)
82
+ <Image
83
+ src="/product.webp"
84
+ alt="Product"
85
+ width={400}
86
+ height={300}
87
+ // loading="lazy" is the default — no need to specify
88
+ />
89
+ ```
90
+
91
+ ---
92
+
93
+ ### INP Optimization Strategies
94
+
95
+ #### 1. Break Up Long Tasks
96
+ ```typescript
97
+ // BAD: Long synchronous task blocks the main thread
98
+ function processLargeList(items: Item[]) {
99
+ return items.map(expensiveTransform); // blocks for 500ms
100
+ }
101
+
102
+ // GOOD: Yield control back to browser between chunks
103
+ async function processLargeListAsync(items: Item[]) {
104
+ const results: Result[] = [];
105
+ for (let i = 0; i < items.length; i++) {
106
+ results.push(expensiveTransform(items[i]));
107
+ if (i % 50 === 0) await scheduler.yield(); // yield every 50 items
108
+ }
109
+ return results;
110
+ }
111
+ ```
112
+
113
+ #### 2. React 19 — Concurrent Features for INP
114
+ ```tsx
115
+ import { useTransition, useDeferredValue, startTransition } from 'react';
116
+
117
+ // Non-urgent state updates — mark as transitions
118
+ function SearchResults() {
119
+ const [query, setQuery] = useState('');
120
+ const [isPending, startTransition] = useTransition();
121
+ const deferredQuery = useDeferredValue(query);
122
+
123
+ return (
124
+ <>
125
+ <input
126
+ value={query}
127
+ onChange={(e) => {
128
+ setQuery(e.target.value); // urgent: update input immediately
129
+ startTransition(() => {
130
+ // non-urgent: defer expensive filtering
131
+ });
132
+ }}
133
+ />
134
+ {isPending && <Spinner />}
135
+ {/* deferredQuery triggers re-render without blocking input */}
136
+ <ResultsList query={deferredQuery} />
137
+ </>
138
+ );
139
+ }
140
+ ```
141
+
142
+ #### 3. Virtualize Long Lists
143
+ ```tsx
144
+ // Use TanStack Virtual for large lists (1000+ items)
145
+ import { useVirtualizer } from '@tanstack/react-virtual';
146
+
147
+ function VirtualList({ items }: { items: Item[] }) {
148
+ const parentRef = useRef<HTMLDivElement>(null);
149
+ const virtualizer = useVirtualizer({
150
+ count: items.length,
151
+ getScrollElement: () => parentRef.current,
152
+ estimateSize: () => 60, // estimated row height in px
153
+ overscan: 5,
154
+ });
155
+
156
+ return (
157
+ <div ref={parentRef} style={{ height: '600px', overflow: 'auto' }}>
158
+ <div style={{ height: virtualizer.getTotalSize() }}>
159
+ {virtualizer.getVirtualItems().map((vItem) => (
160
+ <div
161
+ key={vItem.key}
162
+ style={{ position: 'absolute', top: vItem.start, height: vItem.size }}
163
+ >
164
+ <ItemRow item={items[vItem.index]} />
165
+ </div>
166
+ ))}
167
+ </div>
168
+ </div>
169
+ );
170
+ }
171
+ ```
172
+
173
+ ---
174
+
175
+ ### CLS Optimization Strategies
176
+
177
+ ```css
178
+ /* 1. Reserve space for images with aspect-ratio */
179
+ img, video {
180
+ width: 100%;
181
+ height: auto;
182
+ aspect-ratio: 16 / 9; /* prevents layout shift before load */
183
+ }
184
+
185
+ /* 2. Reserve space for dynamic content */
186
+ .ad-container {
187
+ min-height: 250px; /* reserve ad slot height */
188
+ }
189
+
190
+ /* 3. Use font-display: optional or swap */
191
+ @font-face {
192
+ font-family: 'Inter';
193
+ src: url('/fonts/inter.woff2') format('woff2');
194
+ font-display: optional; /* no invisible text, no layout shift */
195
+ }
196
+ ```
197
+
198
+ ```tsx
199
+ // 4. Avoid inserting content above existing content
200
+ // BAD: inserting notification banner at top pushes content down
201
+ setShowBanner(true); // causes CLS
202
+
203
+ // GOOD: use position:fixed or reserve space at the top
204
+ <div className="h-12">{showBanner && <Banner />}</div>
205
+ ```
206
+
207
+ ---
208
+
209
+ ### Bundle Optimization
210
+
211
+ #### Next.js Bundle Analysis
212
+ ```bash
213
+ # Analyze bundle composition
214
+ ANALYZE=true npm run build
215
+ # Or use @next/bundle-analyzer
216
+ ```
217
+
218
+ #### Code Splitting Patterns
219
+ ```tsx
220
+ import dynamic from 'next/dynamic';
221
+
222
+ // Dynamic import — code splits automatically
223
+ const HeavyChart = dynamic(() => import('@/components/HeavyChart'), {
224
+ loading: () => <ChartSkeleton />,
225
+ ssr: false, // disable SSR for client-only components
226
+ });
227
+
228
+ // Lazy load with React.lazy (non-Next.js)
229
+ const Modal = React.lazy(() => import('./Modal'));
230
+ ```
231
+
232
+ #### Tree-shaking Checklist
233
+ - Use named imports: `import { debounce } from 'lodash-es'` (not `import _ from 'lodash'`)
234
+ - Set `"sideEffects": false` in `package.json` for libraries.
235
+ - Avoid `import *` from large libraries.
236
+ - Replace `moment.js` with `date-fns` or `dayjs`.
237
+ - Use `sharp` for server-side image processing.
238
+
239
+ ---
240
+
241
+ ### React Performance Patterns
242
+
243
+ ```tsx
244
+ // memo — skip re-render if props didn't change
245
+ const ExpensiveList = memo(({ items }: { items: Item[] }) => (
246
+ <ul>{items.map((i) => <li key={i.id}>{i.name}</li>)}</ul>
247
+ ));
248
+
249
+ // useCallback — stable function reference for memo children
250
+ const handleDelete = useCallback((id: string) => {
251
+ setItems((prev) => prev.filter((i) => i.id !== id));
252
+ }, []); // empty deps = stable reference
253
+
254
+ // useMemo — memoize expensive calculations
255
+ const sortedItems = useMemo(
256
+ () => [...items].sort((a, b) => a.name.localeCompare(b.name)),
257
+ [items]
258
+ );
259
+ ```
260
+
261
+ ---
262
+
263
+ ### Performance Monitoring Setup
264
+
265
+ ```typescript
266
+ // report-vitals.ts — send Core Web Vitals to analytics
267
+ import { onCLS, onINP, onLCP, onFCP, onTTFB } from 'web-vitals';
268
+
269
+ function sendToAnalytics({ name, value, id, navigationType }: Metric) {
270
+ // Send to PostHog, Google Analytics, or your own endpoint
271
+ fetch('/api/analytics/vitals', {
272
+ method: 'POST',
273
+ body: JSON.stringify({ name, value: Math.round(value), id, navigationType }),
274
+ keepalive: true, // ensures request completes even if page unloads
275
+ });
276
+ }
277
+
278
+ onCLS(sendToAnalytics);
279
+ onINP(sendToAnalytics);
280
+ onLCP(sendToAnalytics);
281
+ onFCP(sendToAnalytics);
282
+ onTTFB(sendToAnalytics);
283
+ ```
284
+
285
+ ---
286
+
287
+ ### Lighthouse Score Improvement Checklist
288
+
289
+ - [ ] LCP image has `priority` or `fetchpriority="high"` + preload link.
290
+ - [ ] All non-LCP images use `loading="lazy"`.
291
+ - [ ] Fonts loaded with `font-display: optional` or preloaded with `rel="preload"`.
292
+ - [ ] No render-blocking `<script>` tags without `defer` or `async`.
293
+ - [ ] Bundle size < 200KB gzipped for initial JS.
294
+ - [ ] Images served in WebP/AVIF format with `srcset`.
295
+ - [ ] Server response time (TTFB) < 600ms — use CDN edge caching.
296
+ - [ ] Long tasks (> 50ms) are broken up or deferred.
297
+ - [ ] Virtual lists used for > 100 items.
298
+ - [ ] Unused CSS removed (PurgeCSS / Tailwind purge).
299
+ - [ ] HTTP/2 or HTTP/3 enabled on server.
300
+ - [ ] Resource hints: `dns-prefetch`, `preconnect` for third-party origins.
301
+
302
+ ---
303
+
304
+ <a name="bahasa-indonesia"></a>
305
+ ## Bahasa Indonesia
306
+
307
+ ### Deskripsi
308
+ Panduan ahli untuk mengukur, mendiagnosis, dan mengoptimalkan performa aplikasi web dengan fokus pada **Core Web Vitals** (LCP, INP, CLS), optimasi JavaScript bundle, strategi loading gambar dan font, performa rendering, dan mencapai skor Lighthouse yang tinggi.
309
+
310
+ ### Kondisi Pemicu
311
+ - Meningkatkan skor Lighthouse di bawah 90.
312
+ - Mendiagnosis metrik LCP, INP, atau CLS yang buruk.
313
+ - Mengurangi ukuran JavaScript bundle atau menghilangkan resource yang memblokir render.
314
+ - Mengoptimalkan loading gambar, lazy loading, atau pengiriman font.
315
+ - Mengimplementasikan pola performa React (memo, useDeferredValue, Suspense).
316
+ - Menyiapkan Real User Monitoring (RUM) untuk Core Web Vitals.
317
+
318
+ ### Target Core Web Vitals
319
+
320
+ | Metrik | Baik | Perlu Perbaikan | Buruk |
321
+ |---|---|---|---|
322
+ | **LCP** | ≤ 2,5 detik | 2,5–4,0 detik | > 4,0 detik |
323
+ | **INP** | ≤ 200ms | 200–500ms | > 500ms |
324
+ | **CLS** | ≤ 0,1 | 0,1–0,25 | > 0,25 |
325
+
326
+ ### Ringkasan Strategi Optimasi
327
+
328
+ - **LCP**: Preload hero image, gunakan `priority` di Next.js Image, optimalkan TTFB dengan CDN.
329
+ - **INP**: Pecah long task dengan `scheduler.yield()`, gunakan `useTransition` React 19, virtualisasi list panjang.
330
+ - **CLS**: Reservasi ruang untuk gambar dengan `aspect-ratio`, hindari penyisipan konten di atas konten yang sudah ada.
331
+ - **Bundle**: Analisis bundle, gunakan dynamic import, tree-shaking, dan named imports.
332
+ - **Monitoring**: Implementasikan `web-vitals` library untuk melaporkan metrik ke analytics secara real-time.