plugins/lisa-expo-copilot/skills/ops-performance/SKILL.md
Performance analysis for Expo + serverless backend projects. Runs Lighthouse audits, bundle size analysis, and k6 load tests.
npx skillsauth add codyswanngt/lisa ops-performanceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Analyze application performance.
Argument: $ARGUMENTS — analysis type (lighthouse, bundle, k6, all; default: all) and optional target environment
.)${BACKEND_DIR:-../backend-v2} — set BACKEND_DIR in .claude/settings.local.json if your backend is elsewherepackage.json for lighthouse:check, export:web, analyze:bundle scriptspackage.json for k6:* scriptse2e/constants.ts or .env.* files for environment URLsnpx lighthouse http://localhost:8081 \
--output=json \
--output-path=./lighthouse-local.json \
--chrome-flags='--headless --no-sandbox'
Discover frontend URLs from e2e/constants.ts or .env.* files:
npx lighthouse https://{env_url} \
--output=json \
--output-path=./lighthouse-{env}.json \
--chrome-flags='--headless --no-sandbox'
bun run lighthouse:check
cat lighthouse-{env}.json | jq '{
performance: .categories.performance.score,
accessibility: .categories.accessibility.score,
bestPractices: .categories["best-practices"].score,
seo: .categories.seo.score,
fcp: .audits["first-contentful-paint"].displayValue,
lcp: .audits["largest-contentful-paint"].displayValue,
tbt: .audits["total-blocking-time"].displayValue,
cls: .audits["cumulative-layout-shift"].displayValue,
si: .audits["speed-index"].displayValue
}'
bun run export:web && bun run analyze:bundle
bun run export:web
echo "=== Total Bundle Size ==="
du -sh dist/
echo ""
echo "=== Largest JS Files ==="
find dist -name "*.js" -exec ls -lhS {} + 2>/dev/null | head -20
Discover available k6 scripts from the backend package.json (matching k6:*).
cd "${BACKEND_DIR:-../backend-v2}"
bun run k6:smoke
cd "${BACKEND_DIR:-../backend-v2}"
bun run k6:load
cd "${BACKEND_DIR:-../backend-v2}"
bun run k6:stress
cd "${BACKEND_DIR:-../backend-v2}"
bun run k6:spike
cd "${BACKEND_DIR:-../backend-v2}"
bun run k6:docker:smoke
bun run k6:docker:load
| Metric | Score | Rating | |--------|-------|--------| | Performance | 0.85 | GOOD | | Accessibility | 0.92 | GOOD | | Best Practices | 0.88 | GOOD | | SEO | 0.95 | GOOD |
| Metric | Value | Threshold | Status | |--------|-------|-----------|--------| | FCP (First Contentful Paint) | 1.2s | < 1.8s | PASS | | LCP (Largest Contentful Paint) | 2.1s | < 2.5s | PASS | | TBT (Total Blocking Time) | 150ms | < 200ms | PASS | | CLS (Cumulative Layout Shift) | 0.05 | < 0.1 | PASS |
| Category | Size | Notes | |----------|------|-------| | Total dist/ | 4.2 MB | | | Largest chunk | 1.1 MB | vendor.js |
| Metric | Value | |--------|-------| | Requests/sec | 450 | | Avg response time | 120ms | | p95 response time | 350ms | | Error rate | 0.1% |
Include recommendations for any metrics that fall below thresholds.
development
Use Expo DOM components to run web code in a webview on native and as-is on web. Migrate web code to native incrementally.
development
Guidelines for upgrading Expo SDK versions and fixing dependency issues
development
Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, and Expo Router data loaders (`useLoaderData`).
tools
`@expo/ui/swift-ui` package lets you use SwiftUI Views and modifiers in your app.