@wazir-dev/cli 1.0.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.
- package/AGENTS.md +111 -0
- package/CHANGELOG.md +14 -0
- package/CONTRIBUTING.md +101 -0
- package/LICENSE +21 -0
- package/README.md +314 -0
- package/assets/composition-engine.mmd +34 -0
- package/assets/demo-script.sh +17 -0
- package/assets/logo-dark.svg +14 -0
- package/assets/logo.svg +14 -0
- package/assets/pipeline.mmd +39 -0
- package/assets/record-demo.sh +51 -0
- package/docs/README.md +51 -0
- package/docs/adapters/context-mode.md +60 -0
- package/docs/concepts/architecture.md +87 -0
- package/docs/concepts/artifact-model.md +60 -0
- package/docs/concepts/composition-engine.md +36 -0
- package/docs/concepts/indexing-and-recall.md +160 -0
- package/docs/concepts/observability.md +41 -0
- package/docs/concepts/roles-and-workflows.md +59 -0
- package/docs/concepts/terminology-policy.md +27 -0
- package/docs/getting-started/01-installation.md +78 -0
- package/docs/getting-started/02-first-run.md +102 -0
- package/docs/getting-started/03-adding-to-project.md +15 -0
- package/docs/getting-started/04-host-setup.md +15 -0
- package/docs/guides/ci-integration.md +15 -0
- package/docs/guides/creating-skills.md +15 -0
- package/docs/guides/expertise-module-authoring.md +15 -0
- package/docs/guides/hook-development.md +15 -0
- package/docs/guides/memory-and-learnings.md +34 -0
- package/docs/guides/multi-host-export.md +15 -0
- package/docs/guides/troubleshooting.md +101 -0
- package/docs/guides/writing-custom-roles.md +15 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
- package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
- package/docs/readmes/INDEX.md +99 -0
- package/docs/readmes/features/expertise/README.md +171 -0
- package/docs/readmes/features/exports/README.md +222 -0
- package/docs/readmes/features/hooks/README.md +103 -0
- package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
- package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
- package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
- package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
- package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
- package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
- package/docs/readmes/features/hooks/session-start.md +119 -0
- package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
- package/docs/readmes/features/roles/README.md +157 -0
- package/docs/readmes/features/roles/clarifier.md +152 -0
- package/docs/readmes/features/roles/content-author.md +190 -0
- package/docs/readmes/features/roles/designer.md +193 -0
- package/docs/readmes/features/roles/executor.md +184 -0
- package/docs/readmes/features/roles/learner.md +210 -0
- package/docs/readmes/features/roles/planner.md +182 -0
- package/docs/readmes/features/roles/researcher.md +164 -0
- package/docs/readmes/features/roles/reviewer.md +184 -0
- package/docs/readmes/features/roles/specifier.md +162 -0
- package/docs/readmes/features/roles/verifier.md +215 -0
- package/docs/readmes/features/schemas/README.md +178 -0
- package/docs/readmes/features/skills/README.md +63 -0
- package/docs/readmes/features/skills/brainstorming.md +96 -0
- package/docs/readmes/features/skills/debugging.md +148 -0
- package/docs/readmes/features/skills/design.md +120 -0
- package/docs/readmes/features/skills/prepare-next.md +109 -0
- package/docs/readmes/features/skills/run-audit.md +159 -0
- package/docs/readmes/features/skills/scan-project.md +109 -0
- package/docs/readmes/features/skills/self-audit.md +176 -0
- package/docs/readmes/features/skills/tdd.md +137 -0
- package/docs/readmes/features/skills/using-skills.md +92 -0
- package/docs/readmes/features/skills/verification.md +120 -0
- package/docs/readmes/features/skills/writing-plans.md +104 -0
- package/docs/readmes/features/tooling/README.md +320 -0
- package/docs/readmes/features/workflows/README.md +186 -0
- package/docs/readmes/features/workflows/author.md +181 -0
- package/docs/readmes/features/workflows/clarify.md +154 -0
- package/docs/readmes/features/workflows/design-review.md +171 -0
- package/docs/readmes/features/workflows/design.md +169 -0
- package/docs/readmes/features/workflows/discover.md +162 -0
- package/docs/readmes/features/workflows/execute.md +173 -0
- package/docs/readmes/features/workflows/learn.md +167 -0
- package/docs/readmes/features/workflows/plan-review.md +165 -0
- package/docs/readmes/features/workflows/plan.md +170 -0
- package/docs/readmes/features/workflows/prepare-next.md +167 -0
- package/docs/readmes/features/workflows/review.md +169 -0
- package/docs/readmes/features/workflows/run-audit.md +191 -0
- package/docs/readmes/features/workflows/spec-challenge.md +159 -0
- package/docs/readmes/features/workflows/specify.md +160 -0
- package/docs/readmes/features/workflows/verify.md +177 -0
- package/docs/readmes/packages/README.md +50 -0
- package/docs/readmes/packages/ajv.md +117 -0
- package/docs/readmes/packages/context-mode.md +118 -0
- package/docs/readmes/packages/gray-matter.md +116 -0
- package/docs/readmes/packages/node-test.md +137 -0
- package/docs/readmes/packages/yaml.md +112 -0
- package/docs/reference/configuration-reference.md +159 -0
- package/docs/reference/expertise-index.md +52 -0
- package/docs/reference/git-flow.md +43 -0
- package/docs/reference/hooks.md +87 -0
- package/docs/reference/host-exports.md +50 -0
- package/docs/reference/launch-checklist.md +172 -0
- package/docs/reference/marketplace-listings.md +76 -0
- package/docs/reference/release-process.md +34 -0
- package/docs/reference/roles-reference.md +77 -0
- package/docs/reference/skills.md +33 -0
- package/docs/reference/templates.md +29 -0
- package/docs/reference/tooling-cli.md +94 -0
- package/docs/truth-claims.yaml +222 -0
- package/expertise/PROGRESS.md +63 -0
- package/expertise/README.md +18 -0
- package/expertise/antipatterns/PROGRESS.md +56 -0
- package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
- package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
- package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
- package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
- package/expertise/antipatterns/backend/index.md +24 -0
- package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
- package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
- package/expertise/antipatterns/code/async-antipatterns.md +622 -0
- package/expertise/antipatterns/code/code-smells.md +1186 -0
- package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
- package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
- package/expertise/antipatterns/code/index.md +27 -0
- package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
- package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
- package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
- package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
- package/expertise/antipatterns/design/dark-patterns.md +1121 -0
- package/expertise/antipatterns/design/index.md +22 -0
- package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
- package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
- package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
- package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
- package/expertise/antipatterns/frontend/index.md +23 -0
- package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
- package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
- package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
- package/expertise/antipatterns/index.md +31 -0
- package/expertise/antipatterns/performance/index.md +20 -0
- package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
- package/expertise/antipatterns/performance/premature-optimization.md +623 -0
- package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
- package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
- package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
- package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
- package/expertise/antipatterns/process/index.md +23 -0
- package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
- package/expertise/antipatterns/security/index.md +20 -0
- package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
- package/expertise/antipatterns/security/security-theater.md +843 -0
- package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
- package/expertise/architecture/PROGRESS.md +70 -0
- package/expertise/architecture/data/caching-architecture.md +671 -0
- package/expertise/architecture/data/data-consistency.md +574 -0
- package/expertise/architecture/data/data-modeling.md +536 -0
- package/expertise/architecture/data/event-streams-and-queues.md +634 -0
- package/expertise/architecture/data/index.md +25 -0
- package/expertise/architecture/data/search-architecture.md +663 -0
- package/expertise/architecture/data/sql-vs-nosql.md +708 -0
- package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
- package/expertise/architecture/decisions/build-vs-buy.md +616 -0
- package/expertise/architecture/decisions/index.md +23 -0
- package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
- package/expertise/architecture/decisions/technology-selection.md +616 -0
- package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
- package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
- package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
- package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
- package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
- package/expertise/architecture/distributed/index.md +25 -0
- package/expertise/architecture/distributed/saga-pattern.md +797 -0
- package/expertise/architecture/foundations/architectural-thinking.md +460 -0
- package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
- package/expertise/architecture/foundations/design-principles-solid.md +649 -0
- package/expertise/architecture/foundations/domain-driven-design.md +719 -0
- package/expertise/architecture/foundations/index.md +25 -0
- package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
- package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
- package/expertise/architecture/index.md +34 -0
- package/expertise/architecture/integration/api-design-graphql.md +638 -0
- package/expertise/architecture/integration/api-design-grpc.md +804 -0
- package/expertise/architecture/integration/api-design-rest.md +892 -0
- package/expertise/architecture/integration/index.md +25 -0
- package/expertise/architecture/integration/third-party-integration.md +795 -0
- package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
- package/expertise/architecture/integration/websockets-realtime.md +791 -0
- package/expertise/architecture/mobile-architecture/index.md +22 -0
- package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
- package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
- package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
- package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
- package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
- package/expertise/architecture/patterns/event-driven.md +797 -0
- package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
- package/expertise/architecture/patterns/index.md +27 -0
- package/expertise/architecture/patterns/layered-architecture.md +736 -0
- package/expertise/architecture/patterns/microservices.md +753 -0
- package/expertise/architecture/patterns/modular-monolith.md +692 -0
- package/expertise/architecture/patterns/monolith.md +626 -0
- package/expertise/architecture/patterns/plugin-architecture.md +735 -0
- package/expertise/architecture/patterns/serverless.md +780 -0
- package/expertise/architecture/scaling/database-scaling.md +615 -0
- package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
- package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
- package/expertise/architecture/scaling/index.md +24 -0
- package/expertise/architecture/scaling/multi-tenancy.md +800 -0
- package/expertise/architecture/scaling/stateless-design.md +787 -0
- package/expertise/backend/embedded-firmware.md +625 -0
- package/expertise/backend/go.md +853 -0
- package/expertise/backend/index.md +24 -0
- package/expertise/backend/java-spring.md +448 -0
- package/expertise/backend/node-typescript.md +625 -0
- package/expertise/backend/python-fastapi.md +724 -0
- package/expertise/backend/rust.md +458 -0
- package/expertise/backend/solidity.md +711 -0
- package/expertise/composition-map.yaml +443 -0
- package/expertise/content/foundations/content-modeling.md +395 -0
- package/expertise/content/foundations/editorial-standards.md +449 -0
- package/expertise/content/foundations/index.md +24 -0
- package/expertise/content/foundations/microcopy.md +455 -0
- package/expertise/content/foundations/terminology-governance.md +509 -0
- package/expertise/content/index.md +34 -0
- package/expertise/content/patterns/accessibility-copy.md +518 -0
- package/expertise/content/patterns/index.md +24 -0
- package/expertise/content/patterns/notification-content.md +433 -0
- package/expertise/content/patterns/sample-content.md +486 -0
- package/expertise/content/patterns/state-copy.md +439 -0
- package/expertise/design/PROGRESS.md +58 -0
- package/expertise/design/disciplines/dark-mode-theming.md +577 -0
- package/expertise/design/disciplines/design-systems.md +595 -0
- package/expertise/design/disciplines/index.md +25 -0
- package/expertise/design/disciplines/information-architecture.md +800 -0
- package/expertise/design/disciplines/interaction-design.md +788 -0
- package/expertise/design/disciplines/responsive-design.md +552 -0
- package/expertise/design/disciplines/usability-testing.md +516 -0
- package/expertise/design/disciplines/user-research.md +792 -0
- package/expertise/design/foundations/accessibility-design.md +796 -0
- package/expertise/design/foundations/color-theory.md +797 -0
- package/expertise/design/foundations/iconography.md +795 -0
- package/expertise/design/foundations/index.md +26 -0
- package/expertise/design/foundations/motion-and-animation.md +653 -0
- package/expertise/design/foundations/rtl-design.md +585 -0
- package/expertise/design/foundations/spacing-and-layout.md +607 -0
- package/expertise/design/foundations/typography.md +800 -0
- package/expertise/design/foundations/visual-hierarchy.md +761 -0
- package/expertise/design/index.md +32 -0
- package/expertise/design/patterns/authentication-flows.md +474 -0
- package/expertise/design/patterns/content-consumption.md +789 -0
- package/expertise/design/patterns/data-display.md +618 -0
- package/expertise/design/patterns/e-commerce.md +1494 -0
- package/expertise/design/patterns/feedback-and-states.md +642 -0
- package/expertise/design/patterns/forms-and-input.md +819 -0
- package/expertise/design/patterns/gamification.md +801 -0
- package/expertise/design/patterns/index.md +31 -0
- package/expertise/design/patterns/microinteractions.md +449 -0
- package/expertise/design/patterns/navigation.md +800 -0
- package/expertise/design/patterns/notifications.md +705 -0
- package/expertise/design/patterns/onboarding.md +700 -0
- package/expertise/design/patterns/search-and-filter.md +601 -0
- package/expertise/design/patterns/settings-and-preferences.md +768 -0
- package/expertise/design/patterns/social-and-community.md +748 -0
- package/expertise/design/platforms/desktop-native.md +612 -0
- package/expertise/design/platforms/index.md +25 -0
- package/expertise/design/platforms/mobile-android.md +825 -0
- package/expertise/design/platforms/mobile-cross-platform.md +983 -0
- package/expertise/design/platforms/mobile-ios.md +699 -0
- package/expertise/design/platforms/tablet.md +794 -0
- package/expertise/design/platforms/web-dashboard.md +790 -0
- package/expertise/design/platforms/web-responsive.md +550 -0
- package/expertise/design/psychology/behavioral-nudges.md +449 -0
- package/expertise/design/psychology/cognitive-load.md +1191 -0
- package/expertise/design/psychology/error-psychology.md +778 -0
- package/expertise/design/psychology/index.md +22 -0
- package/expertise/design/psychology/persuasive-design.md +736 -0
- package/expertise/design/psychology/user-mental-models.md +623 -0
- package/expertise/design/tooling/open-pencil.md +266 -0
- package/expertise/frontend/angular.md +1073 -0
- package/expertise/frontend/desktop-electron.md +546 -0
- package/expertise/frontend/flutter.md +782 -0
- package/expertise/frontend/index.md +27 -0
- package/expertise/frontend/native-android.md +409 -0
- package/expertise/frontend/native-ios.md +490 -0
- package/expertise/frontend/react-native.md +1160 -0
- package/expertise/frontend/react.md +808 -0
- package/expertise/frontend/vue.md +1089 -0
- package/expertise/humanize/domain-rules-code.md +79 -0
- package/expertise/humanize/domain-rules-content.md +67 -0
- package/expertise/humanize/domain-rules-technical-docs.md +56 -0
- package/expertise/humanize/index.md +35 -0
- package/expertise/humanize/self-audit-checklist.md +87 -0
- package/expertise/humanize/sentence-patterns.md +218 -0
- package/expertise/humanize/vocabulary-blacklist.md +105 -0
- package/expertise/i18n/PROGRESS.md +65 -0
- package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
- package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
- package/expertise/i18n/advanced/complex-scripts.md +30 -0
- package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
- package/expertise/i18n/advanced/testing-i18n.md +28 -0
- package/expertise/i18n/content/content-adaptation.md +23 -0
- package/expertise/i18n/content/locale-specific-formatting.md +23 -0
- package/expertise/i18n/content/machine-translation-integration.md +28 -0
- package/expertise/i18n/content/translation-management.md +29 -0
- package/expertise/i18n/foundations/date-time-calendars.md +67 -0
- package/expertise/i18n/foundations/i18n-architecture.md +272 -0
- package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
- package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
- package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
- package/expertise/i18n/foundations/string-externalization.md +236 -0
- package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
- package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
- package/expertise/i18n/index.md +38 -0
- package/expertise/i18n/platform/backend-i18n.md +31 -0
- package/expertise/i18n/platform/flutter-i18n.md +148 -0
- package/expertise/i18n/platform/native-android-i18n.md +36 -0
- package/expertise/i18n/platform/native-ios-i18n.md +36 -0
- package/expertise/i18n/platform/react-i18n.md +103 -0
- package/expertise/i18n/platform/web-css-i18n.md +81 -0
- package/expertise/i18n/rtl/arabic-specific.md +175 -0
- package/expertise/i18n/rtl/hebrew-specific.md +149 -0
- package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
- package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
- package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
- package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
- package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
- package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
- package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
- package/expertise/i18n/rtl/rtl-typography.md +160 -0
- package/expertise/index.md +113 -0
- package/expertise/index.yaml +216 -0
- package/expertise/infrastructure/cloud-aws.md +597 -0
- package/expertise/infrastructure/cloud-gcp.md +599 -0
- package/expertise/infrastructure/cybersecurity.md +816 -0
- package/expertise/infrastructure/database-mongodb.md +447 -0
- package/expertise/infrastructure/database-postgres.md +400 -0
- package/expertise/infrastructure/devops-cicd.md +787 -0
- package/expertise/infrastructure/index.md +27 -0
- package/expertise/performance/PROGRESS.md +50 -0
- package/expertise/performance/backend/api-latency.md +1204 -0
- package/expertise/performance/backend/background-jobs.md +506 -0
- package/expertise/performance/backend/connection-pooling.md +1209 -0
- package/expertise/performance/backend/database-query-optimization.md +515 -0
- package/expertise/performance/backend/index.md +23 -0
- package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
- package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
- package/expertise/performance/foundations/caching-strategies.md +489 -0
- package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
- package/expertise/performance/foundations/index.md +24 -0
- package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
- package/expertise/performance/foundations/memory-management.md +964 -0
- package/expertise/performance/foundations/performance-budgets.md +1314 -0
- package/expertise/performance/index.md +31 -0
- package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
- package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
- package/expertise/performance/infrastructure/index.md +22 -0
- package/expertise/performance/infrastructure/load-balancing.md +1081 -0
- package/expertise/performance/infrastructure/observability.md +1079 -0
- package/expertise/performance/mobile/index.md +23 -0
- package/expertise/performance/mobile/mobile-animations.md +544 -0
- package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
- package/expertise/performance/mobile/mobile-network.md +452 -0
- package/expertise/performance/mobile/mobile-rendering.md +599 -0
- package/expertise/performance/mobile/mobile-startup-time.md +505 -0
- package/expertise/performance/platform-specific/flutter-performance.md +647 -0
- package/expertise/performance/platform-specific/index.md +22 -0
- package/expertise/performance/platform-specific/node-performance.md +1307 -0
- package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
- package/expertise/performance/platform-specific/react-performance.md +1403 -0
- package/expertise/performance/web/bundle-optimization.md +1239 -0
- package/expertise/performance/web/image-and-media.md +636 -0
- package/expertise/performance/web/index.md +24 -0
- package/expertise/performance/web/network-optimization.md +1133 -0
- package/expertise/performance/web/rendering-performance.md +1098 -0
- package/expertise/performance/web/ssr-and-hydration.md +918 -0
- package/expertise/performance/web/web-vitals.md +1374 -0
- package/expertise/quality/accessibility.md +985 -0
- package/expertise/quality/evidence-based-verification.md +499 -0
- package/expertise/quality/index.md +24 -0
- package/expertise/quality/ml-model-audit.md +614 -0
- package/expertise/quality/performance.md +600 -0
- package/expertise/quality/testing-api.md +891 -0
- package/expertise/quality/testing-mobile.md +496 -0
- package/expertise/quality/testing-web.md +849 -0
- package/expertise/security/PROGRESS.md +54 -0
- package/expertise/security/agentic-identity.md +540 -0
- package/expertise/security/compliance-frameworks.md +601 -0
- package/expertise/security/data/data-encryption.md +364 -0
- package/expertise/security/data/data-privacy-gdpr.md +692 -0
- package/expertise/security/data/database-security.md +1171 -0
- package/expertise/security/data/index.md +22 -0
- package/expertise/security/data/pii-handling.md +531 -0
- package/expertise/security/foundations/authentication.md +1041 -0
- package/expertise/security/foundations/authorization.md +603 -0
- package/expertise/security/foundations/cryptography.md +1001 -0
- package/expertise/security/foundations/index.md +25 -0
- package/expertise/security/foundations/owasp-top-10.md +1354 -0
- package/expertise/security/foundations/secrets-management.md +1217 -0
- package/expertise/security/foundations/secure-sdlc.md +700 -0
- package/expertise/security/foundations/supply-chain-security.md +698 -0
- package/expertise/security/index.md +31 -0
- package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
- package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
- package/expertise/security/infrastructure/container-security.md +721 -0
- package/expertise/security/infrastructure/incident-response.md +1295 -0
- package/expertise/security/infrastructure/index.md +24 -0
- package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
- package/expertise/security/infrastructure/network-security.md +1337 -0
- package/expertise/security/mobile/index.md +23 -0
- package/expertise/security/mobile/mobile-android-security.md +1218 -0
- package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
- package/expertise/security/mobile/mobile-data-storage.md +1265 -0
- package/expertise/security/mobile/mobile-ios-security.md +1401 -0
- package/expertise/security/mobile/mobile-network-security.md +1520 -0
- package/expertise/security/smart-contract-security.md +594 -0
- package/expertise/security/testing/index.md +22 -0
- package/expertise/security/testing/penetration-testing.md +1258 -0
- package/expertise/security/testing/security-code-review.md +1765 -0
- package/expertise/security/testing/threat-modeling.md +1074 -0
- package/expertise/security/testing/vulnerability-scanning.md +1062 -0
- package/expertise/security/web/api-security.md +586 -0
- package/expertise/security/web/cors-and-headers.md +433 -0
- package/expertise/security/web/csrf.md +562 -0
- package/expertise/security/web/file-upload.md +1477 -0
- package/expertise/security/web/index.md +25 -0
- package/expertise/security/web/injection.md +1375 -0
- package/expertise/security/web/session-management.md +1101 -0
- package/expertise/security/web/xss.md +1158 -0
- package/exports/README.md +17 -0
- package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
- package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
- package/exports/hosts/claude/.claude/agents/designer.md +55 -0
- package/exports/hosts/claude/.claude/agents/executor.md +55 -0
- package/exports/hosts/claude/.claude/agents/learner.md +51 -0
- package/exports/hosts/claude/.claude/agents/planner.md +53 -0
- package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
- package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
- package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
- package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
- package/exports/hosts/claude/.claude/commands/author.md +42 -0
- package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
- package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
- package/exports/hosts/claude/.claude/commands/design.md +44 -0
- package/exports/hosts/claude/.claude/commands/discover.md +37 -0
- package/exports/hosts/claude/.claude/commands/execute.md +48 -0
- package/exports/hosts/claude/.claude/commands/learn.md +38 -0
- package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
- package/exports/hosts/claude/.claude/commands/plan.md +39 -0
- package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
- package/exports/hosts/claude/.claude/commands/review.md +40 -0
- package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
- package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
- package/exports/hosts/claude/.claude/commands/specify.md +38 -0
- package/exports/hosts/claude/.claude/commands/verify.md +37 -0
- package/exports/hosts/claude/.claude/settings.json +34 -0
- package/exports/hosts/claude/CLAUDE.md +19 -0
- package/exports/hosts/claude/export.manifest.json +38 -0
- package/exports/hosts/claude/host-package.json +67 -0
- package/exports/hosts/codex/AGENTS.md +19 -0
- package/exports/hosts/codex/export.manifest.json +38 -0
- package/exports/hosts/codex/host-package.json +41 -0
- package/exports/hosts/cursor/.cursor/hooks.json +16 -0
- package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
- package/exports/hosts/cursor/export.manifest.json +38 -0
- package/exports/hosts/cursor/host-package.json +42 -0
- package/exports/hosts/gemini/GEMINI.md +19 -0
- package/exports/hosts/gemini/export.manifest.json +38 -0
- package/exports/hosts/gemini/host-package.json +41 -0
- package/hooks/README.md +18 -0
- package/hooks/definitions/loop_cap_guard.yaml +21 -0
- package/hooks/definitions/post_tool_capture.yaml +24 -0
- package/hooks/definitions/pre_compact_summary.yaml +19 -0
- package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
- package/hooks/definitions/protected_path_write_guard.yaml +19 -0
- package/hooks/definitions/session_start.yaml +19 -0
- package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
- package/hooks/loop-cap-guard +17 -0
- package/hooks/post-tool-lint +36 -0
- package/hooks/protected-path-write-guard +17 -0
- package/hooks/session-start +41 -0
- package/llms-full.txt +2355 -0
- package/llms.txt +43 -0
- package/package.json +79 -0
- package/roles/README.md +20 -0
- package/roles/clarifier.md +42 -0
- package/roles/content-author.md +63 -0
- package/roles/designer.md +55 -0
- package/roles/executor.md +55 -0
- package/roles/learner.md +51 -0
- package/roles/planner.md +53 -0
- package/roles/researcher.md +43 -0
- package/roles/reviewer.md +54 -0
- package/roles/specifier.md +47 -0
- package/roles/verifier.md +71 -0
- package/schemas/README.md +24 -0
- package/schemas/accepted-learning.schema.json +20 -0
- package/schemas/author-artifact.schema.json +156 -0
- package/schemas/clarification.schema.json +19 -0
- package/schemas/design-artifact.schema.json +80 -0
- package/schemas/docs-claim.schema.json +18 -0
- package/schemas/export-manifest.schema.json +20 -0
- package/schemas/hook.schema.json +67 -0
- package/schemas/host-export-package.schema.json +18 -0
- package/schemas/implementation-plan.schema.json +19 -0
- package/schemas/proposed-learning.schema.json +19 -0
- package/schemas/research.schema.json +18 -0
- package/schemas/review.schema.json +29 -0
- package/schemas/run-manifest.schema.json +18 -0
- package/schemas/spec-challenge.schema.json +18 -0
- package/schemas/spec.schema.json +20 -0
- package/schemas/usage.schema.json +102 -0
- package/schemas/verification-proof.schema.json +29 -0
- package/schemas/wazir-manifest.schema.json +173 -0
- package/skills/README.md +40 -0
- package/skills/brainstorming/SKILL.md +77 -0
- package/skills/debugging/SKILL.md +50 -0
- package/skills/design/SKILL.md +61 -0
- package/skills/dispatching-parallel-agents/SKILL.md +128 -0
- package/skills/executing-plans/SKILL.md +70 -0
- package/skills/finishing-a-development-branch/SKILL.md +169 -0
- package/skills/humanize/SKILL.md +123 -0
- package/skills/init-pipeline/SKILL.md +124 -0
- package/skills/prepare-next/SKILL.md +20 -0
- package/skills/receiving-code-review/SKILL.md +123 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +108 -0
- package/skills/run-audit/SKILL.md +197 -0
- package/skills/scan-project/SKILL.md +41 -0
- package/skills/self-audit/SKILL.md +153 -0
- package/skills/subagent-driven-development/SKILL.md +154 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +102 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/tdd/SKILL.md +23 -0
- package/skills/using-git-worktrees/SKILL.md +163 -0
- package/skills/using-skills/SKILL.md +95 -0
- package/skills/verification/SKILL.md +22 -0
- package/skills/wazir/SKILL.md +463 -0
- package/skills/writing-plans/SKILL.md +30 -0
- package/skills/writing-skills/SKILL.md +157 -0
- package/skills/writing-skills/anthropic-best-practices.md +122 -0
- package/skills/writing-skills/persuasion-principles.md +50 -0
- package/templates/README.md +20 -0
- package/templates/artifacts/README.md +10 -0
- package/templates/artifacts/accepted-learning.md +19 -0
- package/templates/artifacts/accepted-learning.template.json +12 -0
- package/templates/artifacts/author.md +74 -0
- package/templates/artifacts/author.template.json +19 -0
- package/templates/artifacts/clarification.md +21 -0
- package/templates/artifacts/clarification.template.json +12 -0
- package/templates/artifacts/execute-notes.md +19 -0
- package/templates/artifacts/implementation-plan.md +21 -0
- package/templates/artifacts/implementation-plan.template.json +11 -0
- package/templates/artifacts/learning-proposal.md +19 -0
- package/templates/artifacts/next-run-handoff.md +21 -0
- package/templates/artifacts/plan-review.md +19 -0
- package/templates/artifacts/proposed-learning.template.json +12 -0
- package/templates/artifacts/research.md +21 -0
- package/templates/artifacts/research.template.json +12 -0
- package/templates/artifacts/review-findings.md +19 -0
- package/templates/artifacts/review.template.json +11 -0
- package/templates/artifacts/run-manifest.template.json +8 -0
- package/templates/artifacts/spec-challenge.md +19 -0
- package/templates/artifacts/spec-challenge.template.json +11 -0
- package/templates/artifacts/spec.md +21 -0
- package/templates/artifacts/spec.template.json +12 -0
- package/templates/artifacts/verification-proof.md +19 -0
- package/templates/artifacts/verification-proof.template.json +11 -0
- package/templates/examples/accepted-learning.example.json +14 -0
- package/templates/examples/author.example.json +152 -0
- package/templates/examples/clarification.example.json +15 -0
- package/templates/examples/docs-claim.example.json +8 -0
- package/templates/examples/export-manifest.example.json +7 -0
- package/templates/examples/host-export-package.example.json +11 -0
- package/templates/examples/implementation-plan.example.json +17 -0
- package/templates/examples/proposed-learning.example.json +13 -0
- package/templates/examples/research.example.json +15 -0
- package/templates/examples/research.example.md +6 -0
- package/templates/examples/review.example.json +17 -0
- package/templates/examples/run-manifest.example.json +9 -0
- package/templates/examples/spec-challenge.example.json +14 -0
- package/templates/examples/spec.example.json +21 -0
- package/templates/examples/verification-proof.example.json +21 -0
- package/templates/examples/wazir-manifest.example.yaml +65 -0
- package/templates/task-definition-schema.md +99 -0
- package/tooling/README.md +20 -0
- package/tooling/src/adapters/context-mode.js +50 -0
- package/tooling/src/capture/command.js +376 -0
- package/tooling/src/capture/store.js +99 -0
- package/tooling/src/capture/usage.js +270 -0
- package/tooling/src/checks/branches.js +50 -0
- package/tooling/src/checks/brand-truth.js +110 -0
- package/tooling/src/checks/changelog.js +231 -0
- package/tooling/src/checks/command-registry.js +36 -0
- package/tooling/src/checks/commits.js +102 -0
- package/tooling/src/checks/docs-drift.js +103 -0
- package/tooling/src/checks/docs-truth.js +201 -0
- package/tooling/src/checks/runtime-surface.js +156 -0
- package/tooling/src/cli.js +116 -0
- package/tooling/src/command-options.js +56 -0
- package/tooling/src/commands/validate.js +320 -0
- package/tooling/src/doctor/command.js +91 -0
- package/tooling/src/export/command.js +77 -0
- package/tooling/src/export/compiler.js +498 -0
- package/tooling/src/guards/loop-cap-guard.js +52 -0
- package/tooling/src/guards/protected-path-write-guard.js +67 -0
- package/tooling/src/index/command.js +152 -0
- package/tooling/src/index/storage.js +1061 -0
- package/tooling/src/index/summarizers.js +261 -0
- package/tooling/src/loaders.js +18 -0
- package/tooling/src/project-root.js +22 -0
- package/tooling/src/recall/command.js +225 -0
- package/tooling/src/schema-validator.js +30 -0
- package/tooling/src/state-root.js +40 -0
- package/tooling/src/status/command.js +71 -0
- package/wazir.manifest.yaml +135 -0
- package/workflows/README.md +19 -0
- package/workflows/author.md +42 -0
- package/workflows/clarify.md +38 -0
- package/workflows/design-review.md +46 -0
- package/workflows/design.md +44 -0
- package/workflows/discover.md +37 -0
- package/workflows/execute.md +48 -0
- package/workflows/learn.md +38 -0
- package/workflows/plan-review.md +42 -0
- package/workflows/plan.md +39 -0
- package/workflows/prepare-next.md +37 -0
- package/workflows/review.md +40 -0
- package/workflows/run-audit.md +41 -0
- package/workflows/spec-challenge.md +41 -0
- package/workflows/specify.md +38 -0
- package/workflows/verify.md +37 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Directory Purpose
|
|
2
|
+
|
|
3
|
+
The `mobile` performance directory focuses on optimizing apps for constrained environments (limited battery, CPU, and network).
|
|
4
|
+
|
|
5
|
+
# Key Concepts
|
|
6
|
+
|
|
7
|
+
- Ensuring smooth 60fps/120fps UI
|
|
8
|
+
- Minimizing battery drain
|
|
9
|
+
- Handling poor connectivity
|
|
10
|
+
|
|
11
|
+
# File Map
|
|
12
|
+
|
|
13
|
+
- `mobile-animations.md` — offloading animations to the GPU, avoiding layout passes
|
|
14
|
+
- `mobile-memory-battery.md` — wake locks, background limits, and memory warnings
|
|
15
|
+
- `mobile-network.md` — batching requests, exponential backoff, and compression
|
|
16
|
+
- `mobile-rendering.md` — view recycling, overdraw, and layout flattening
|
|
17
|
+
- `mobile-startup-time.md` — reducing TTI (Time to Interactive), lazy loading
|
|
18
|
+
|
|
19
|
+
# Reading Guide
|
|
20
|
+
|
|
21
|
+
If the app feels sluggish → read `mobile-rendering.md` and `mobile-animations.md`
|
|
22
|
+
If the app takes too long to open → read `mobile-startup-time.md`
|
|
23
|
+
If users complain about battery → read `mobile-memory-battery.md`
|
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
# Mobile Animations -- Performance Expertise Module
|
|
2
|
+
|
|
3
|
+
> Smooth animations at 60/120fps are essential for perceived app quality. Animation jank is the most noticeable performance problem -- users can perceive a single dropped frame during animation. The key is keeping all animation work off the main thread and within the frame budget of 16.67ms (60fps) or 8.33ms (120fps).
|
|
4
|
+
|
|
5
|
+
> **Impact:** High
|
|
6
|
+
> **Applies to:** Mobile (iOS, Android, Flutter, React Native), Mobile Web
|
|
7
|
+
> **Key metrics:** Frame time during animation, Animation start latency, Dropped frame percentage during animation
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Why This Matters
|
|
12
|
+
|
|
13
|
+
### Human Perception Thresholds
|
|
14
|
+
|
|
15
|
+
- **16ms frame budget (60fps):** The minimum for perceived smooth motion. Any frame exceeding 16.67ms causes a visible hitch. Source: [MDN](https://developer.mozilla.org/en-US/docs/Web/Performance/Guides/Animation_performance_and_frame_rate)
|
|
16
|
+
- **8.33ms frame budget (120fps):** ProMotion (iPhone 13 Pro+, iPad Pro) and high-refresh Android devices demand half the frame time. Source: [Apple WWDC 2021](https://developer.apple.com/videos/play/wwdc2021/10147/)
|
|
17
|
+
- **Single-frame drops are noticeable:** Users detect a single dropped frame during smooth animation. Source: [web.dev Smoothness](https://web.dev/articles/smoothness)
|
|
18
|
+
- **27% retention impact:** Drops below 60fps reduce user retention by 27%. Source: [Algolia](https://www.algolia.com/blog/engineering/60-fps-performant-web-animations-for-optimal-ux)
|
|
19
|
+
|
|
20
|
+
### Business Impact
|
|
21
|
+
|
|
22
|
+
- **Booking.com A/B test:** Cutting elaborate entry animations reduced time-to-interaction by 22% with no loss of delight.
|
|
23
|
+
- **Material Design studies:** 85% higher task completion with minimal, purposeful motion vs. decorative animation.
|
|
24
|
+
- **Perceived latency:** 23% reduction using minimal progress cues vs. full-screen spinners (Smashing Magazine).
|
|
25
|
+
|
|
26
|
+
Source: [MoldStud](https://moldstud.com/articles/p-exploring-the-impact-of-animation-on-performance-essential-insights-for-developers)
|
|
27
|
+
|
|
28
|
+
When an animation drops frames, users experience a **violation of expectation** -- the brain predicts the next frame position based on the easing curve. A missed frame creates a perceptual "jump" that feels broken, not just slow.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Performance Budgets and Targets
|
|
33
|
+
|
|
34
|
+
### Frame Time Budgets
|
|
35
|
+
|
|
36
|
+
| Refresh Rate | Frame Budget | Effective (after OS overhead) | Devices |
|
|
37
|
+
|---|---|---|---|
|
|
38
|
+
| 60Hz | 16.67ms | ~10-12ms | Standard mobile |
|
|
39
|
+
| 90Hz | 11.11ms | ~7-8ms | Some Android flagships |
|
|
40
|
+
| 120Hz | 8.33ms | ~5-6ms | iPhone Pro, iPad Pro, Android flagships |
|
|
41
|
+
|
|
42
|
+
The OS compositor, GPU driver, and display pipeline consume 4-6ms per frame, leaving 10-12ms of effective budget at 60Hz.
|
|
43
|
+
|
|
44
|
+
### Animation Duration Guidelines (Material Design 3 / NN/G)
|
|
45
|
+
|
|
46
|
+
| Animation Type | Duration | Notes |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| Micro-interactions (button, toggle) | 100-200ms | Must feel instant |
|
|
49
|
+
| Small transitions (fade, scale) | 150-250ms | Keep snappy |
|
|
50
|
+
| Screen transitions | 250-350ms | 300ms standard on mobile |
|
|
51
|
+
| Large/complex transitions | 300-400ms | Full-screen, shared element |
|
|
52
|
+
| Maximum reasonable | 500ms | Longer feels sluggish |
|
|
53
|
+
| Minimum perceptible | 100ms | Below this, invisible |
|
|
54
|
+
|
|
55
|
+
Source: [Material Design 3](https://m3.material.io/styles/motion/easing-and-duration), [NN/G](https://www.nngroup.com/articles/animation-duration/)
|
|
56
|
+
|
|
57
|
+
### Target Thresholds
|
|
58
|
+
|
|
59
|
+
| Metric | Good | Needs Work | Poor |
|
|
60
|
+
|---|---|---|---|
|
|
61
|
+
| P95 frame time (60fps) | < 16ms | 16-20ms | > 20ms |
|
|
62
|
+
| Dropped frame % during animation | < 1% | 1-5% | > 5% |
|
|
63
|
+
| Animation start latency | < 100ms | 100-200ms | > 200ms |
|
|
64
|
+
| Jank count per session | 0-2 | 3-10 | > 10 |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Measurement and Profiling
|
|
69
|
+
|
|
70
|
+
### iOS
|
|
71
|
+
|
|
72
|
+
- **Instruments > Core Animation:** FPS, GPU utilization, offscreen rendering, blending
|
|
73
|
+
- **Time Profiler:** CPU time per frame -- identify main thread work during animation
|
|
74
|
+
- **CADisplayLink timing:** Exact frame delivery intervals; on ProMotion, system adjusts between 10-120Hz. Source: [Apple](https://developer.apple.com/documentation/quartzcore/cadisplaylink)
|
|
75
|
+
- **MetricKit:** Production frame drop metrics
|
|
76
|
+
|
|
77
|
+
### Android
|
|
78
|
+
|
|
79
|
+
- **`adb shell dumpsys gfxinfo <pkg> framestats`:** Per-frame timestamps for last 120 frames
|
|
80
|
+
- **Systrace / Perfetto:** System-wide rendering pipeline trace
|
|
81
|
+
- **GPU Rendering Profile (on-device):** Per-frame bar chart overlay
|
|
82
|
+
- **FrameMetrics API:** Per-frame timing in production
|
|
83
|
+
- **Macrobenchmark:** Frame timing during automated UI tests for CI/CD
|
|
84
|
+
|
|
85
|
+
### Flutter
|
|
86
|
+
|
|
87
|
+
- **DevTools > Performance:** Frame build time vs. raster time (both must fit budget)
|
|
88
|
+
- **`flutter run --profile`:** Required for accurate profiling (debug mode is misleading)
|
|
89
|
+
- **Timeline events:** Widget rebuild count, paint operations
|
|
90
|
+
- **Impeller diagnostics:** Shader compilation, rasterization time
|
|
91
|
+
|
|
92
|
+
Source: [Flutter Rendering Performance](https://docs.flutter.dev/perf/rendering-performance)
|
|
93
|
+
|
|
94
|
+
### React Native
|
|
95
|
+
|
|
96
|
+
- **Performance Monitor:** JS thread FPS + UI thread FPS simultaneously
|
|
97
|
+
- **Flipper Performance Plugin:** Bridge traffic, frame times
|
|
98
|
+
- Monitor **both** threads: with `useNativeDriver` or Reanimated, UI stays at 60fps even when JS is blocked.
|
|
99
|
+
|
|
100
|
+
Source: [React Native Blog](https://reactnative.dev/blog/2017/02/14/using-native-driver-for-animated)
|
|
101
|
+
|
|
102
|
+
### Mobile Web
|
|
103
|
+
|
|
104
|
+
- **Chrome DevTools > Performance:** Frame timeline with paint/layout/composite breakdown
|
|
105
|
+
- **Layers panel:** Compositor layer count, GPU memory per layer
|
|
106
|
+
- **`PerformanceObserver` (long-animation-frames):** Field monitoring
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Common Bottlenecks
|
|
111
|
+
|
|
112
|
+
### 1. Layout Recalculation During Animation
|
|
113
|
+
**Impact: Very High.** Animating `width`, `height`, `margin`, `top`, `left` forces layout recalc that can push frame times from 2-3ms to 30ms+. Source: [Smashing Magazine](https://www.smashingmagazine.com/2016/12/gpu-animation-doing-it-right/)
|
|
114
|
+
|
|
115
|
+
### 2. Main Thread Blocking
|
|
116
|
+
**Impact: Very High.** Any synchronous work (JSON parsing, large state updates) during animation steals frame budget. On React Native without native driver, JS thread blocking freezes animations entirely.
|
|
117
|
+
|
|
118
|
+
### 3. Garbage Collection Pauses
|
|
119
|
+
**Impact: High.** GC pauses of 5-15ms cause frame drops. Android minor GC: 2-5ms; major: 50ms+. Excessive short-lived allocations in animation loops are the primary trigger.
|
|
120
|
+
|
|
121
|
+
### 4. Shader Compilation Jank (Flutter/GPU)
|
|
122
|
+
**Impact: High.** Skia compiled shaders JIT, causing first-run jank of 50-200ms. Impeller (Flutter 3.27+) precompiles AOT, reducing frame drops from ~12% to ~1.5%. Source: [Impeller](https://dev.to/eira-wexford/how-impeller-is-transforming-flutter-ui-rendering-in-2026-3dpd)
|
|
123
|
+
|
|
124
|
+
### 5. Excessive Widget Rebuilds (Flutter)
|
|
125
|
+
**Impact: High.** `setState()` in animation listener rebuilds entire subtree 60x/second. `AnimatedBuilder` with `child` limits rebuilds to the animated portion only.
|
|
126
|
+
|
|
127
|
+
### 6. Bridge Overhead (React Native)
|
|
128
|
+
**Impact: High.** Without native driver, 60 bridge crossings/second, each adding 1-5ms serialization overhead.
|
|
129
|
+
|
|
130
|
+
### 7. Offscreen Rendering (iOS)
|
|
131
|
+
**Impact: High.** `cornerRadius` + `masksToBounds`, shadow without `shadowPath`, group opacity -- each triggers offscreen render passes, doubling GPU work. Source: [Apple](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreAnimation_guide/ImprovingAnimationPerformance/ImprovingAnimationPerformance.html)
|
|
132
|
+
|
|
133
|
+
### 8. Overdraw
|
|
134
|
+
**Impact: Medium-High.** Multiple overlapping transparent layers force GPU to blend pixels repeatedly. On mid-range Android, 4x overdraw consumes the entire GPU frame budget.
|
|
135
|
+
|
|
136
|
+
### 9. Complex Bezier Paths
|
|
137
|
+
**Impact: Medium.** `CAShapeLayer` with hundreds of control points renders on CPU. Breaking into simpler layered shapes leverages GPU compositing instead. Source: [Realm Academy](https://academy.realm.io/posts/tryswift-tim-oliver-advanced-graphics-with-core-animation/)
|
|
138
|
+
|
|
139
|
+
### 10. Shadow Without shadowPath (iOS)
|
|
140
|
+
**Impact: Medium-High.** Without explicit `shadowPath`, Core Animation ray-traces the layer alpha channel every frame. Setting `shadowPath` improves shadow rendering by 10x+.
|
|
141
|
+
|
|
142
|
+
### 11. Unnecessary Recomposition (Compose)
|
|
143
|
+
**Impact: Medium-High.** Reading animated values during composition triggers recomposition every frame. Lambda modifiers (`Modifier.graphicsLayer { }`) defer to draw phase, skipping recomposition. Source: [Android Developers](https://developer.android.com/develop/ui/compose/performance/bestpractices)
|
|
144
|
+
|
|
145
|
+
### 12. Layer Explosion (Web/Hybrid)
|
|
146
|
+
**Impact: Medium.** Each compositor layer consumes ~900KB GPU memory (at 360x640). On mobile with limited GPU RAM, hundreds of layers can crash the browser. Source: [Smashing Magazine](https://www.smashingmagazine.com/2016/12/gpu-animation-doing-it-right/)
|
|
147
|
+
|
|
148
|
+
### 13. Image Decoding During Animation
|
|
149
|
+
**Impact: Medium.** Loading/decoding images on main thread during animation steals frame budget. Predecode before animation starts.
|
|
150
|
+
|
|
151
|
+
### 14. Auto Layout Constraint Churn (iOS)
|
|
152
|
+
**Impact: Medium.** Complex constraint graphs (50+ constraints) can take 5-15ms per frame when constraints are animated directly.
|
|
153
|
+
|
|
154
|
+
### 15. JavaScript Long Tasks (Mobile Web)
|
|
155
|
+
**Impact: Medium.** Tasks >50ms block the main thread, preventing `requestAnimationFrame` callbacks from firing on time.
|
|
156
|
+
|
|
157
|
+
### 16. Font Loading During Text Animation
|
|
158
|
+
**Impact: Low-Medium.** Animating text while a web font loads causes layout shift when the font swaps in mid-animation.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Optimization Patterns
|
|
163
|
+
|
|
164
|
+
### GPU-Accelerated Properties (Web/Hybrid)
|
|
165
|
+
Only these run on the GPU compositor without layout or paint:
|
|
166
|
+
1. **`transform`** (translate, scale, rotate)
|
|
167
|
+
2. **`opacity`**
|
|
168
|
+
3. **`filter`** (modern browsers)
|
|
169
|
+
4. **`backdrop-filter`** (modern browsers)
|
|
170
|
+
|
|
171
|
+
Everything else (`width`, `height`, `top`, `left`, `margin`, `background-color`) triggers layout or paint. Source: [Chrome Developers](https://developer.chrome.com/blog/hardware-accelerated-animations)
|
|
172
|
+
|
|
173
|
+
### Layer Promotion with will-change (Web)
|
|
174
|
+
Use `will-change: transform` before animation starts to pre-promote to compositor layer. Remove after animation completes. Never apply to >10-15 elements simultaneously -- each layer costs ~900KB GPU memory. Source: [Lexo](https://www.lexo.ch/blog/2025/01/boost-css-performance-with-will-change-and-transform-translate3d-why-gpu-acceleration-matters/)
|
|
175
|
+
|
|
176
|
+
### Native Driver (React Native)
|
|
177
|
+
`useNativeDriver: true` serializes the animation graph to native once, then runs on UI thread with zero bridge calls. Supports only `transform` and `opacity`. For layout properties, use Reanimated worklets. Source: [React Native Blog](https://reactnative.dev/blog/2017/02/14/using-native-driver-for-animated)
|
|
178
|
+
|
|
179
|
+
### Reanimated Worklets (React Native)
|
|
180
|
+
Reanimated 4 runs animation logic on UI thread via worklets, supporting all properties. Benchmarks: 37fps with 1500 elements (2023) improved to 60fps with 3000 elements (2024). Source: [Medium](https://medium.com/@islamrustamov/how-react-native-improved-from-2023-to-2025-animation-stress-testing-and-a-little-bit-of-flutter-edd44297b815)
|
|
181
|
+
|
|
182
|
+
### Impeller (Flutter)
|
|
183
|
+
Default renderer since Flutter 3.27 (2025). AOT shader compilation eliminates first-run jank. 50% faster rasterization vs. Skia. Real-world: e-commerce apps dropped from 12% to 1.5% frame drops. Source: [ITNEXT](https://itnext.io/flutter-performance-optimization-10-techniques-that-actually-work-in-2025-4def9e5bbd2d)
|
|
184
|
+
|
|
185
|
+
### AnimatedBuilder with Child (Flutter)
|
|
186
|
+
Pass static subtrees as `child` to avoid rebuilding 60x/second. Builder function runs per frame but `child` is built once and reused.
|
|
187
|
+
|
|
188
|
+
### Core Animation Layer Properties (iOS)
|
|
189
|
+
Animate `transform`, `opacity`, `shadowOpacity` (with explicit `shadowPath`) on CALayer. CALayer for heavy graphical tasks boosts performance by up to 30% vs. UIView. Source: [MoldStud](https://moldstud.com/articles/p-leveraging-core-animation-for-interactive-app-experiences)
|
|
190
|
+
|
|
191
|
+
### Compose graphicsLayer (Android)
|
|
192
|
+
`Modifier.graphicsLayer { }` lambda defers animated value reads to draw phase, skipping recomposition entirely. Source: [Android Developers](https://developer.android.com/develop/ui/compose/performance/bestpractices)
|
|
193
|
+
|
|
194
|
+
### RepaintBoundary (Flutter)
|
|
195
|
+
Wrapping animated widgets isolates them into a separate render layer, preventing unrelated subtree repaints. Source: [Medium](https://ms3byoussef.medium.com/optimizing-flutter-ui-with-repaintboundary-2402052224c7)
|
|
196
|
+
|
|
197
|
+
### requestAnimationFrame (Web)
|
|
198
|
+
Always use instead of `setTimeout`/`setInterval`. Syncs with vsync, pauses in background tabs. Source: [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Window/requestAnimationFrame)
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Anti-Patterns
|
|
203
|
+
|
|
204
|
+
1. **Animating width/height instead of transform: scale** -- triggers layout recalc every frame (2ms -> 15-30ms).
|
|
205
|
+
2. **Animating top/left instead of transform: translate** -- layout properties force reflow of all siblings.
|
|
206
|
+
3. **setTimeout/setInterval for animations (Web)** -- not synced with display refresh, runs in background tabs.
|
|
207
|
+
4. **Missing useNativeDriver (React Native)** -- every frame crosses bridge (~1-5ms). JS blocking drops animation to 0fps.
|
|
208
|
+
5. **setState() in animation listeners (Flutter)** -- rebuilds entire subtree 60x/sec (5-20ms each).
|
|
209
|
+
6. **will-change on every element (Web)** -- layer explosion. 100+ layers at ~900KB each can crash browser.
|
|
210
|
+
7. **Shadow without shadowPath (iOS)** -- ray-traces alpha channel every frame (10-50ms).
|
|
211
|
+
8. **Reading animated state during composition (Compose)** -- triggers recomposition cascade every frame.
|
|
212
|
+
9. **Animating constraints directly (iOS)** -- Auto Layout solver runs per frame; 50+ constraints = 5-15ms per solve.
|
|
213
|
+
10. **Blocking JS thread during animation (React Native)** -- use `InteractionManager.runAfterInteractions()`.
|
|
214
|
+
11. **Missing vsync in AnimationController (Flutter)** -- fires ticks even when widget is invisible, wastes CPU.
|
|
215
|
+
12. **Animating during data loads** -- concurrent fetch + animation = guaranteed frame drops. Prefetch first.
|
|
216
|
+
13. **Ignoring accessibilityReduceMotion** -- check platform APIs: `UIAccessibility.isReduceMotionEnabled` (iOS), `ANIMATOR_DURATION_SCALE` (Android), `MediaQuery.disableAnimations` (Flutter), `prefers-reduced-motion` (Web).
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## Architecture-Level Decisions
|
|
221
|
+
|
|
222
|
+
### Declarative vs. Imperative Animation
|
|
223
|
+
|
|
224
|
+
| Approach | Platforms | When to Use |
|
|
225
|
+
|---|---|---|
|
|
226
|
+
| **Declarative** | SwiftUI, Compose, Flutter implicit, CSS | Simple state-driven (fade, scale on toggle) |
|
|
227
|
+
| **Imperative** | UIKit, Android Views, Flutter explicit, JS | Gesture-driven, physics, choreographed sequences |
|
|
228
|
+
|
|
229
|
+
### Gesture-Driven Animations
|
|
230
|
+
Require < 16ms latency tracking, velocity-based completion on release, and interruptibility (grab in-flight animation):
|
|
231
|
+
- **iOS:** `UIViewPropertyAnimator` (interruptible, reversible, scrubbable)
|
|
232
|
+
- **Android:** `SpringAnimation` from AndroidX DynamicAnimation
|
|
233
|
+
- **Flutter:** `GestureDetector` + `AnimationController` + `SpringSimulation`
|
|
234
|
+
- **React Native:** Reanimated `useAnimatedGestureHandler` + `withSpring`
|
|
235
|
+
- **Web:** Pointer events + `requestAnimationFrame` + spring physics
|
|
236
|
+
|
|
237
|
+
### Physics-Based Animations
|
|
238
|
+
Springs provide natural motion and are inherently interruptible -- changing target mid-flight adjusts naturally without jarring restart. Key parameters: damping ratio 0.7-0.9 (lower = bouncier), stiffness 100-300 (higher = snappier), mass 1.0.
|
|
239
|
+
|
|
240
|
+
### Shared Element Transitions
|
|
241
|
+
Both source and destination screens render simultaneously during animation. Budget for 2x normal rendering cost.
|
|
242
|
+
- **iOS:** `matchedGeometryEffect` (SwiftUI) / `UIViewControllerAnimatedTransitioning`
|
|
243
|
+
- **Android:** Compose `AnimatedContent` with `Modifier.sharedElement`
|
|
244
|
+
- **Flutter:** `Hero` widget
|
|
245
|
+
- **React Native:** Reanimated shared transitions
|
|
246
|
+
|
|
247
|
+
### Animation Orchestration
|
|
248
|
+
Stagger list item entrances by 30-50ms per element. Total choreographed duration should not exceed 600-800ms -- users tap through longer sequences.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Testing and Regression Prevention
|
|
253
|
+
|
|
254
|
+
### Automated Benchmarks
|
|
255
|
+
|
|
256
|
+
**iOS (XCTest):**
|
|
257
|
+
```swift
|
|
258
|
+
func testScrollPerformance() {
|
|
259
|
+
measure(metrics: [XCTOSSignpostMetric.scrollDecelerationMetric]) {
|
|
260
|
+
XCUIApplication().swipeUp()
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**Android (Macrobenchmark):**
|
|
266
|
+
```kotlin
|
|
267
|
+
@Test
|
|
268
|
+
fun transitionAnimation() = benchmarkRule.measureRepeated(
|
|
269
|
+
packageName = "com.example.app",
|
|
270
|
+
metrics = listOf(FrameTimingMetric()),
|
|
271
|
+
iterations = 5,
|
|
272
|
+
) {
|
|
273
|
+
device.findObject(By.res("nav_button")).click()
|
|
274
|
+
device.waitForIdle()
|
|
275
|
+
}
|
|
276
|
+
// Assert: P99 frameDurationCpuMs < 16
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**Flutter (integration_test):**
|
|
280
|
+
```dart
|
|
281
|
+
final timeline = await tester.traceAction(() async {
|
|
282
|
+
await tester.tap(find.byKey(const Key('navigate')));
|
|
283
|
+
await tester.pumpAndSettle();
|
|
284
|
+
});
|
|
285
|
+
final summary = TimelineSummary.summarize(timeline);
|
|
286
|
+
summary.writeSummaryToFile('transition_perf', pretty: true);
|
|
287
|
+
// Assert: average build time < 8ms, missed frames == 0
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### CI/CD Guidelines
|
|
291
|
+
|
|
292
|
+
1. Run benchmarks on **physical devices** -- emulators misrepresent GPU performance
|
|
293
|
+
2. Set absolute thresholds -- fail build if P95 frame time > 16ms
|
|
294
|
+
3. Track trends -- plot over time to catch gradual regressions
|
|
295
|
+
4. Test on **low-end devices** (Samsung Galaxy A14, iPhone SE 2nd gen)
|
|
296
|
+
5. Test under **thermal throttling** -- run after warm-up period
|
|
297
|
+
6. Monitor production via MetricKit (iOS), FrameMetrics API (Android), Firebase Performance
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Decision Trees
|
|
302
|
+
|
|
303
|
+
### "My Animation Is Janky"
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
Animation dropping frames
|
|
307
|
+
|
|
|
308
|
+
+-- Main thread busy?
|
|
309
|
+
| +-- Layout/reflow? -> Switch to transform/opacity
|
|
310
|
+
| +-- JS execution? (RN/Web) -> Native driver / worklet / break tasks < 50ms
|
|
311
|
+
| +-- Widget rebuilds? (Flutter) -> AnimatedBuilder + RepaintBoundary
|
|
312
|
+
| +-- Recomposition? (Compose) -> graphicsLayer {} lambda + derivedStateOf
|
|
313
|
+
| +-- GC pauses? -> Reduce allocation in animation loop, preallocate
|
|
314
|
+
|
|
|
315
|
+
+-- GPU/render thread busy?
|
|
316
|
+
| +-- Offscreen render? (iOS) -> Set shadowPath, avoid cornerRadius+mask
|
|
317
|
+
| +-- Overdraw? -> Reduce transparent layers, use opaque backgrounds
|
|
318
|
+
| +-- Shader compilation? (Flutter) -> Enable Impeller (3.27+)
|
|
319
|
+
| +-- Complex paths? -> Simplify, break into layers, pre-rasterize
|
|
320
|
+
| +-- Layer explosion? (Web) -> Audit will-change, check Layers panel
|
|
321
|
+
|
|
|
322
|
+
+-- First-run only?
|
|
323
|
+
+-- YES -> Shader warmup / preload assets / pre-render layers
|
|
324
|
+
+-- NO -> Profile with platform tools, check all categories above
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### "Which Animation API?"
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
Need to animate something
|
|
331
|
+
|
|
|
332
|
+
+-- Simple state toggle? -> SwiftUI .animation / Compose animateAsState
|
|
333
|
+
| Flutter AnimatedOpacity / CSS transition
|
|
334
|
+
+-- Gesture-driven? ------> UIViewPropertyAnimator / SpringAnimation
|
|
335
|
+
| Flutter AnimationController / Reanimated gesture
|
|
336
|
+
+-- Choreographed? -------> CAAnimationGroup / Compose updateTransition
|
|
337
|
+
| Flutter staggered Interval / Reanimated withSequence
|
|
338
|
+
+-- Shared element? ------> matchedGeometryEffect / Compose sharedElement
|
|
339
|
+
Flutter Hero / Reanimated shared transitions
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Code Examples
|
|
345
|
+
|
|
346
|
+
### 1. Transform vs. Layout (Web) -- frame time 18-25ms -> 1-2ms
|
|
347
|
+
|
|
348
|
+
```css
|
|
349
|
+
/* BAD: 'left' triggers layout recalc every frame */
|
|
350
|
+
.panel { position: absolute; left: 0; transition: left 300ms ease-out; }
|
|
351
|
+
.panel.open { left: 250px; }
|
|
352
|
+
|
|
353
|
+
/* GOOD: 'transform' runs on GPU compositor */
|
|
354
|
+
.panel { position: absolute; transition: transform 300ms ease-out;
|
|
355
|
+
will-change: transform; }
|
|
356
|
+
.panel.open { transform: translateX(250px); }
|
|
357
|
+
```
|
|
358
|
+
Source: [Viget](https://www.viget.com/articles/animation-performance-101-browser-under-the-hood)
|
|
359
|
+
|
|
360
|
+
### 2. Native Driver (React Native) -- 15-30fps -> 60fps under JS load
|
|
361
|
+
|
|
362
|
+
```javascript
|
|
363
|
+
// BAD: useNativeDriver: false -- every frame crosses bridge
|
|
364
|
+
Animated.timing(fadeAnim, { toValue: 1, duration: 300, useNativeDriver: false }).start();
|
|
365
|
+
|
|
366
|
+
// GOOD: serialized to native, runs on UI thread
|
|
367
|
+
Animated.timing(fadeAnim, { toValue: 1, duration: 300, useNativeDriver: true }).start();
|
|
368
|
+
```
|
|
369
|
+
Source: [React Native Blog](https://reactnative.dev/blog/2017/02/14/using-native-driver-for-animated)
|
|
370
|
+
|
|
371
|
+
### 3. AnimatedBuilder vs. setState (Flutter) -- 12-18ms -> 0.3-0.5ms per frame
|
|
372
|
+
|
|
373
|
+
```dart
|
|
374
|
+
// BAD: setState rebuilds entire tree 60x/sec
|
|
375
|
+
_controller.addListener(() { setState(() {}); });
|
|
376
|
+
// In build(): Transform.rotate(angle: _controller.value, child: ExpensiveWidget())
|
|
377
|
+
|
|
378
|
+
// GOOD: only Transform rebuilds; child built once
|
|
379
|
+
AnimatedBuilder(
|
|
380
|
+
animation: _controller,
|
|
381
|
+
child: const ExpensiveWidget(), // built once, reused
|
|
382
|
+
builder: (context, child) => Transform.rotate(
|
|
383
|
+
angle: _controller.value * 2 * pi, child: child,
|
|
384
|
+
),
|
|
385
|
+
)
|
|
386
|
+
```
|
|
387
|
+
Source: [Plugfox](https://plugfox.dev/effective-animations-in-flutter/), [Digia](https://www.digia.tech/post/flutter-animation-performance-guide)
|
|
388
|
+
|
|
389
|
+
### 4. Compose graphicsLayer vs. Recomposition -- 8-15ms overhead -> ~0.5ms
|
|
390
|
+
|
|
391
|
+
```kotlin
|
|
392
|
+
// BAD: alpha read during composition triggers recomposition every frame
|
|
393
|
+
val alpha by animateFloatAsState(if (visible) 1f else 0f)
|
|
394
|
+
Card(modifier = Modifier.alpha(alpha)) { ExpensiveContent() }
|
|
395
|
+
|
|
396
|
+
// GOOD: lambda defers read to draw phase, no recomposition
|
|
397
|
+
Card(modifier = Modifier.graphicsLayer { this.alpha = alpha }) { ExpensiveContent() }
|
|
398
|
+
```
|
|
399
|
+
Source: [Android Developers](https://developer.android.com/develop/ui/compose/performance/bestpractices)
|
|
400
|
+
|
|
401
|
+
### 5. iOS Shadow Path -- 5-15ms -> ~0.1ms per frame
|
|
402
|
+
|
|
403
|
+
```swift
|
|
404
|
+
// BAD: no shadowPath, ray-traces alpha channel each frame
|
|
405
|
+
card.layer.shadowOpacity = 0.3; card.layer.shadowRadius = 8
|
|
406
|
+
UIView.animate(withDuration: 0.3) { card.frame.origin.y += 200 } // layout + shadow
|
|
407
|
+
|
|
408
|
+
// GOOD: precomputed path + transform animation
|
|
409
|
+
card.layer.shadowPath = UIBezierPath(roundedRect: card.bounds, cornerRadius: 12).cgPath
|
|
410
|
+
UIView.animate(withDuration: 0.3) {
|
|
411
|
+
card.transform = CGAffineTransform(translationX: 0, y: 200) // GPU only
|
|
412
|
+
}
|
|
413
|
+
```
|
|
414
|
+
Source: [Apple](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreAnimation_guide/ImprovingAnimationPerformance/ImprovingAnimationPerformance.html)
|
|
415
|
+
|
|
416
|
+
### 6. Reanimated Gesture (React Native) -- 30-45fps -> 60fps
|
|
417
|
+
|
|
418
|
+
```javascript
|
|
419
|
+
// BAD: PanResponder + Animated, every touch crosses bridge
|
|
420
|
+
onPanResponderMove: (e, g) => { pan.setValue({ x: g.dx, y: g.dy }); }
|
|
421
|
+
|
|
422
|
+
// GOOD: Reanimated worklets on UI thread
|
|
423
|
+
const gesture = Gesture.Pan()
|
|
424
|
+
.onUpdate((e) => {
|
|
425
|
+
translateX.value = e.translationX; // no bridge
|
|
426
|
+
translateY.value = e.translationY;
|
|
427
|
+
})
|
|
428
|
+
.onEnd(() => {
|
|
429
|
+
translateX.value = withSpring(0);
|
|
430
|
+
translateY.value = withSpring(0);
|
|
431
|
+
});
|
|
432
|
+
const style = useAnimatedStyle(() => ({
|
|
433
|
+
transform: [{ translateX: translateX.value }, { translateY: translateY.value }],
|
|
434
|
+
}));
|
|
435
|
+
```
|
|
436
|
+
Source: [Reanimated](https://docs.swmansion.com/react-native-reanimated/docs/guides/performance/), [Callstack](https://www.callstack.com/blog/60fps-animations-in-react-native)
|
|
437
|
+
|
|
438
|
+
### 7. Reduce Motion Compliance (SwiftUI)
|
|
439
|
+
|
|
440
|
+
```swift
|
|
441
|
+
// BAD: always animates
|
|
442
|
+
.animation(.spring(response: 0.4, dampingFraction: 0.7), value: isExpanded)
|
|
443
|
+
|
|
444
|
+
// GOOD: respects user preference
|
|
445
|
+
@Environment(\.accessibilityReduceMotion) var reduceMotion
|
|
446
|
+
.animation(reduceMotion ? .none : .spring(response: 0.4, dampingFraction: 0.7), value: isExpanded)
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
### 8. Flutter CustomPainter with Impeller -- first-run 200ms -> 0ms, steady 8-12ms -> 3-5ms
|
|
450
|
+
|
|
451
|
+
```dart
|
|
452
|
+
// BAD: new Paint per particle per frame (GC pressure + Skia shader jank)
|
|
453
|
+
void paint(Canvas canvas, Size size) {
|
|
454
|
+
for (int i = 0; i < 500; i++) {
|
|
455
|
+
final paint = Paint()..color = Colors.blue..maskFilter = blur;
|
|
456
|
+
canvas.drawCircle(offset, 4.0, paint);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// GOOD: static Paint, Impeller AOT shaders, zero GC pressure
|
|
461
|
+
static final _paint = Paint()..color = Colors.blue..maskFilter = blur;
|
|
462
|
+
void paint(Canvas canvas, Size size) {
|
|
463
|
+
for (int i = 0; i < 500; i++) {
|
|
464
|
+
canvas.drawCircle(offset, 4.0, _paint); // reused, no allocation
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
```
|
|
468
|
+
Source: [Flutter Best Practices](https://docs.flutter.dev/perf/best-practices), [Impeller](https://differ.blog/p/advanced-performance-optimization-with-the-impeller-rendering-engine-d3b2c5)
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
## Quick Reference
|
|
473
|
+
|
|
474
|
+
### GPU-Accelerated Properties by Platform
|
|
475
|
+
|
|
476
|
+
| Platform | GPU-Only (Animate These) | Layout-Triggering (Avoid) |
|
|
477
|
+
|---|---|---|
|
|
478
|
+
| **Web** | `transform`, `opacity`, `filter` | `width`, `height`, `top`, `left`, `margin` |
|
|
479
|
+
| **iOS** | `transform`, `opacity`, `shadowOpacity` | `frame`, `bounds`, `center` (w/ Auto Layout) |
|
|
480
|
+
| **Compose** | `graphicsLayer { alpha, translationX/Y, scaleX/Y }` | `size`, `offset`, `padding` |
|
|
481
|
+
| **Flutter** | `Transform`, `Opacity`, `CustomPainter` | `Container` size, `Padding` changes |
|
|
482
|
+
| **React Native** | `transform`, `opacity` (useNativeDriver) | `width`, `height`, `margin` (bridge) |
|
|
483
|
+
|
|
484
|
+
### Animation Duration Cheat Sheet
|
|
485
|
+
|
|
486
|
+
| Type | Duration | Easing |
|
|
487
|
+
|---|---|---|
|
|
488
|
+
| Button feedback | 100-150ms | ease-out |
|
|
489
|
+
| Fade in/out | 200-250ms | ease-out / ease-in |
|
|
490
|
+
| Screen transition | 300-375ms | ease-in-out or spring |
|
|
491
|
+
| Shared element | 300-400ms | spring (damping 0.8-0.9) |
|
|
492
|
+
|
|
493
|
+
### Platform Profiling Tools
|
|
494
|
+
|
|
495
|
+
| Task | iOS | Android | Flutter | React Native | Web |
|
|
496
|
+
|---|---|---|---|---|---|
|
|
497
|
+
| FPS | Instruments | `dumpsys gfxinfo` | DevTools | Perf Monitor | DevTools |
|
|
498
|
+
| Jank source | Time Profiler | Perfetto | Timeline | Flipper | Flame chart |
|
|
499
|
+
| CI benchmark | XCTest metrics | Macrobenchmark | integration_test | Detox | Lighthouse CI |
|
|
500
|
+
| Production | MetricKit | FrameMetrics | timingsCallback | Custom | PerfObserver |
|
|
501
|
+
|
|
502
|
+
### Key Thresholds
|
|
503
|
+
|
|
504
|
+
| Metric | Target |
|
|
505
|
+
|---|---|
|
|
506
|
+
| Frame time P95 | < 16ms (60Hz) / < 8ms (120Hz) |
|
|
507
|
+
| Dropped frames during animation | < 1% |
|
|
508
|
+
| Animation start latency | < 100ms |
|
|
509
|
+
| Total animation duration | 200-500ms |
|
|
510
|
+
| Max compositor layers (web) | 10-15 |
|
|
511
|
+
|
|
512
|
+
---
|
|
513
|
+
|
|
514
|
+
## Sources
|
|
515
|
+
|
|
516
|
+
- [MDN Animation Performance](https://developer.mozilla.org/en-US/docs/Web/Performance/Guides/Animation_performance_and_frame_rate)
|
|
517
|
+
- [Algolia: 60 FPS Web Animations](https://www.algolia.com/blog/engineering/60-fps-performant-web-animations-for-optimal-ux)
|
|
518
|
+
- [web.dev: Smoothness Metric](https://web.dev/articles/smoothness)
|
|
519
|
+
- [Smashing Magazine: CSS GPU Animation](https://www.smashingmagazine.com/2016/12/gpu-animation-doing-it-right/)
|
|
520
|
+
- [Chrome: Hardware-Accelerated Animations](https://developer.chrome.com/blog/hardware-accelerated-animations)
|
|
521
|
+
- [Material Design 3: Easing and Duration](https://m3.material.io/styles/motion/easing-and-duration)
|
|
522
|
+
- [NN/G: Animation Duration](https://www.nngroup.com/articles/animation-duration/)
|
|
523
|
+
- [Apple: Core Animation Performance](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreAnimation_guide/ImprovingAnimationPerformance/ImprovingAnimationPerformance.html)
|
|
524
|
+
- [Apple: CADisplayLink](https://developer.apple.com/documentation/quartzcore/cadisplaylink)
|
|
525
|
+
- [Apple WWDC 2021: Variable Refresh Rate](https://developer.apple.com/videos/play/wwdc2021/10147/)
|
|
526
|
+
- [Android: Compose Performance](https://developer.android.com/develop/ui/compose/performance/bestpractices)
|
|
527
|
+
- [Flutter: Rendering Performance](https://docs.flutter.dev/perf/rendering-performance)
|
|
528
|
+
- [Flutter: Performance Best Practices](https://docs.flutter.dev/perf/best-practices)
|
|
529
|
+
- [ITNEXT: Flutter Performance 2025](https://itnext.io/flutter-performance-optimization-10-techniques-that-actually-work-in-2025-4def9e5bbd2d)
|
|
530
|
+
- [Impeller Rendering 2026](https://dev.to/eira-wexford/how-impeller-is-transforming-flutter-ui-rendering-in-2026-3dpd)
|
|
531
|
+
- [Plugfox: Effective Flutter Animations](https://plugfox.dev/effective-animations-in-flutter/)
|
|
532
|
+
- [Digia: Flutter Animation Guide](https://www.digia.tech/post/flutter-animation-performance-guide)
|
|
533
|
+
- [Impeller Optimization (Differ)](https://differ.blog/p/advanced-performance-optimization-with-the-impeller-rendering-engine-d3b2c5)
|
|
534
|
+
- [React Native: Native Driver](https://reactnative.dev/blog/2017/02/14/using-native-driver-for-animated)
|
|
535
|
+
- [Reanimated Performance](https://docs.swmansion.com/react-native-reanimated/docs/guides/performance/)
|
|
536
|
+
- [Reanimated 3 Guide](https://dev.to/erenelagz/react-native-reanimated-3-the-ultimate-guide-to-high-performance-animations-in-2025-4ae4)
|
|
537
|
+
- [Callstack: 60fps in React Native](https://www.callstack.com/blog/60fps-animations-in-react-native)
|
|
538
|
+
- [RN Stress Testing 2023-2025](https://medium.com/@islamrustamov/how-react-native-improved-from-2023-to-2025-animation-stress-testing-and-a-little-bit-of-flutter-edd44297b815)
|
|
539
|
+
- [Viget: Animation Performance 101](https://www.viget.com/articles/animation-performance-101-browser-under-the-hood)
|
|
540
|
+
- [Lexo: CSS GPU Acceleration](https://www.lexo.ch/blog/2025/01/boost-css-performance-with-will-change-and-transform-translate3d-why-gpu-acceleration-matters/)
|
|
541
|
+
- [MoldStud: Animation Impact](https://moldstud.com/articles/p-exploring-the-impact-of-animation-on-performance-essential-insights-for-developers)
|
|
542
|
+
- [Compose Animation Performance](https://10x-programming.com/jetpack-compose-animation-performance)
|
|
543
|
+
- [RepaintBoundary (Medium)](https://ms3byoussef.medium.com/optimizing-flutter-ui-with-repaintboundary-2402052224c7)
|
|
544
|
+
- [Realm Academy: Core Animation](https://academy.realm.io/posts/tryswift-tim-oliver-advanced-graphics-with-core-animation/)
|