agy-superpowers 5.0.7 → 5.0.9
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/package.json +1 -1
- package/template/agent/rules/superpowers.md +54 -0
- package/template/agent/skills/api-design/SKILL.md +193 -0
- package/template/agent/skills/app-store-optimizer/SKILL.md +127 -0
- package/template/agent/skills/auth-and-identity/SKILL.md +167 -0
- package/template/agent/skills/backend-developer/SKILL.md +148 -0
- package/template/agent/skills/community-manager/SKILL.md +115 -0
- package/template/agent/skills/content-marketer/SKILL.md +111 -0
- package/template/agent/skills/conversion-optimizer/SKILL.md +142 -0
- package/template/agent/skills/copywriter/SKILL.md +114 -0
- package/template/agent/skills/cto-architect/SKILL.md +133 -0
- package/template/agent/skills/customer-success-manager/SKILL.md +126 -0
- package/template/agent/skills/data-analyst/SKILL.md +147 -0
- package/template/agent/skills/devops-engineer/SKILL.md +117 -0
- package/template/agent/skills/email-infrastructure/SKILL.md +164 -0
- package/template/agent/skills/frontend-developer/SKILL.md +172 -0
- package/template/agent/skills/frontend-developer/references/react-nextjs.md +343 -0
- package/template/agent/skills/frontend-developer/references/react-rules/_sections.md +46 -0
- package/template/agent/skills/frontend-developer/references/react-rules/_template.md +28 -0
- package/template/agent/skills/frontend-developer/references/react-rules/advanced-event-handler-refs.md +55 -0
- package/template/agent/skills/frontend-developer/references/react-rules/advanced-init-once.md +42 -0
- package/template/agent/skills/frontend-developer/references/react-rules/advanced-use-latest.md +39 -0
- package/template/agent/skills/frontend-developer/references/react-rules/async-api-routes.md +38 -0
- package/template/agent/skills/frontend-developer/references/react-rules/async-defer-await.md +80 -0
- package/template/agent/skills/frontend-developer/references/react-rules/async-dependencies.md +51 -0
- package/template/agent/skills/frontend-developer/references/react-rules/async-parallel.md +28 -0
- package/template/agent/skills/frontend-developer/references/react-rules/async-suspense-boundaries.md +99 -0
- package/template/agent/skills/frontend-developer/references/react-rules/bundle-barrel-imports.md +59 -0
- package/template/agent/skills/frontend-developer/references/react-rules/bundle-conditional.md +31 -0
- package/template/agent/skills/frontend-developer/references/react-rules/bundle-defer-third-party.md +49 -0
- package/template/agent/skills/frontend-developer/references/react-rules/bundle-dynamic-imports.md +35 -0
- package/template/agent/skills/frontend-developer/references/react-rules/bundle-preload.md +50 -0
- package/template/agent/skills/frontend-developer/references/react-rules/client-event-listeners.md +74 -0
- package/template/agent/skills/frontend-developer/references/react-rules/client-localstorage-schema.md +71 -0
- package/template/agent/skills/frontend-developer/references/react-rules/client-passive-event-listeners.md +48 -0
- package/template/agent/skills/frontend-developer/references/react-rules/client-swr-dedup.md +56 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-batch-dom-css.md +107 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-cache-function-results.md +80 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-cache-property-access.md +28 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-cache-storage.md +70 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-combine-iterations.md +32 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-early-exit.md +50 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-flatmap-filter.md +60 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-hoist-regexp.md +45 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-index-maps.md +37 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-length-check-first.md +49 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-min-max-loop.md +82 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-set-map-lookups.md +24 -0
- package/template/agent/skills/frontend-developer/references/react-rules/js-tosorted-immutable.md +57 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-activity.md +26 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-conditional-render.md +40 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-content-visibility.md +38 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-hoist-jsx.md +46 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-hydration-no-flicker.md +82 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-hydration-suppress-warning.md +30 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-resource-hints.md +85 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-script-defer-async.md +68 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-svg-precision.md +28 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rendering-usetransition-loading.md +75 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-defer-reads.md +39 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-dependencies.md +45 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-derived-state-no-effect.md +40 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-derived-state.md +29 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-functional-setstate.md +74 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-lazy-state-init.md +58 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-memo-with-default-value.md +38 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-memo.md +44 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-move-effect-to-event.md +45 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-no-inline-components.md +82 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-simple-expression-in-memo.md +35 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-split-combined-hooks.md +64 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-transitions.md +40 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-use-deferred-value.md +59 -0
- package/template/agent/skills/frontend-developer/references/react-rules/rerender-use-ref-transient-values.md +73 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-after-nonblocking.md +73 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-auth-actions.md +96 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-cache-lru.md +41 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-cache-react.md +76 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-dedup-props.md +65 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-hoist-static-io.md +142 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-parallel-fetching.md +83 -0
- package/template/agent/skills/frontend-developer/references/react-rules/server-serialization.md +38 -0
- package/template/agent/skills/frontend-developer/references/svelte-sveltekit.md +220 -0
- package/template/agent/skills/frontend-developer/references/vanilla.md +275 -0
- package/template/agent/skills/frontend-developer/references/vue-nuxt.md +289 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/_index.md +154 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/animation-class-based-technique.md +254 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/animation-state-driven-technique.md +291 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-async.md +97 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-data-flow.md +307 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-fallthrough-attrs.md +174 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-keep-alive.md +137 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-slots.md +216 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-suspense.md +228 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-teleport.md +108 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-transition-group.md +128 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-transition.md +125 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/composables.md +290 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/directives.md +162 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/perf-avoid-component-abstraction-in-lists.md +159 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/perf-v-once-v-memo-directives.md +182 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/perf-virtualize-large-lists.md +187 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/plugins.md +166 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/reactivity.md +344 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/render-functions.md +201 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/sfc.md +310 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/state-management.md +135 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/updated-hook-performance.md +187 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/_index.md +23 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-beforeenter-no-param-trigger.md +167 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-beforerouteenter-no-this.md +176 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-guard-async-await-pattern.md +227 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-navigation-guard-infinite-loop.md +187 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-navigation-guard-next-deprecated.md +150 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-param-change-no-lifecycle.md +181 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-simple-routing-cleanup.md +209 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/router/router-use-vue-router-for-production.md +183 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/_index.md +29 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/async-component-testing.md +163 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/teleport-testing-complexity.md +158 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-async-await-flushpromises.md +175 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-browser-vs-node-runners.md +208 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-component-blackbox-approach.md +144 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-composables-helper-wrapper.md +238 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-e2e-playwright-recommended.md +242 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-no-snapshot-only.md +197 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-pinia-store-setup.md +228 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-suspense-async-components.md +229 -0
- package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-vitest-recommended-for-vue.md +204 -0
- package/template/agent/skills/game-design/SKILL.md +194 -0
- package/template/agent/skills/game-developer/SKILL.md +175 -0
- package/template/agent/skills/growth-hacker/SKILL.md +122 -0
- package/template/agent/skills/i18n-localization/SKILL.md +126 -0
- package/template/agent/skills/influencer-marketer/SKILL.md +141 -0
- package/template/agent/skills/mobile-developer/SKILL.md +194 -0
- package/template/agent/skills/mobile-developer/references/android-native.md +396 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-accessibility.md +36 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-architecture.md +52 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-coroutines.md +139 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-data-layer.md +51 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-emulator-skill.md +108 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-gradle-logic.md +126 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-retrofit.md +142 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-testing.md +102 -0
- package/template/agent/skills/mobile-developer/references/android-rules/android-viewmodel.md +43 -0
- package/template/agent/skills/mobile-developer/references/android-rules/coil-compose.md +74 -0
- package/template/agent/skills/mobile-developer/references/android-rules/compose-navigation.md +422 -0
- package/template/agent/skills/mobile-developer/references/android-rules/compose-performance-audit.md +199 -0
- package/template/agent/skills/mobile-developer/references/android-rules/compose-ui.md +49 -0
- package/template/agent/skills/mobile-developer/references/android-rules/gradle-build-performance.md +346 -0
- package/template/agent/skills/mobile-developer/references/android-rules/kotlin-concurrency-expert.md +169 -0
- package/template/agent/skills/mobile-developer/references/android-rules/rxjava-to-coroutines-migration.md +101 -0
- package/template/agent/skills/mobile-developer/references/android-rules/xml-to-compose-migration.md +338 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-best-practices.md +52 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-checks-migration.md +134 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-cli-app-best-practices.md +123 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-doc-validation.md +45 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-matcher-best-practices.md +106 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-modern-features.md +241 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-package-maintenance.md +75 -0
- package/template/agent/skills/mobile-developer/references/flutter-rules/dart-test-fundamentals.md +124 -0
- package/template/agent/skills/mobile-developer/references/flutter.md +291 -0
- package/template/agent/skills/mobile-developer/references/ios-native.md +358 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/accessibility-patterns.md +215 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/animation-advanced.md +403 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/animation-basics.md +284 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/animation-transitions.md +326 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/charts-accessibility.md +135 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/charts.md +602 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/image-optimization.md +203 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/latest-apis.md +464 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/layout-best-practices.md +266 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/liquid-glass.md +416 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/list-patterns.md +394 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/macos-scenes.md +318 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/macos-views.md +357 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/macos-window-styling.md +303 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/performance-patterns.md +403 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/scroll-patterns.md +293 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/sheet-navigation-patterns.md +363 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/state-management.md +417 -0
- package/template/agent/skills/mobile-developer/references/ios-rules/view-structure.md +389 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/_sections.md +86 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/_template.md +28 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/animation-derived-value.md +53 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/animation-gesture-detector-press.md +95 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/animation-gpu-properties.md +65 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/design-system-compound-components.md +66 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/fonts-config-plugin.md +71 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/imports-design-system-folder.md +68 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/js-hoist-intl.md +61 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-callbacks.md +44 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-function-references.md +132 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-images.md +53 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-inline-objects.md +97 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-item-expensive.md +94 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-item-memo.md +82 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-item-types.md +104 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-virtualize.md +67 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/monorepo-native-deps-in-app.md +46 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/monorepo-single-dependency-versions.md +63 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/navigation-native-navigators.md +188 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/react-compiler-destructure-functions.md +50 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/react-compiler-reanimated-shared-values.md +48 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/react-state-dispatcher.md +91 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/react-state-fallback.md +56 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/react-state-minimize.md +65 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/rendering-no-falsy-and.md +74 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/rendering-text-in-text-component.md +36 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/scroll-position-no-state.md +82 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/state-ground-truth.md +80 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-expo-image.md +66 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-image-gallery.md +104 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-measure-views.md +78 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-menus.md +174 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-native-modals.md +77 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-pressable.md +61 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-safe-area-scroll.md +65 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-scrollview-content-inset.md +45 -0
- package/template/agent/skills/mobile-developer/references/react-native-rules/ui-styling.md +87 -0
- package/template/agent/skills/mobile-developer/references/react-native.md +345 -0
- package/template/agent/skills/monetization-strategist/SKILL.md +119 -0
- package/template/agent/skills/paid-acquisition-specialist/SKILL.md +119 -0
- package/template/agent/skills/product-manager/SKILL.md +105 -0
- package/template/agent/skills/real-time-features/SKILL.md +194 -0
- package/template/agent/skills/retention-specialist/SKILL.md +123 -0
- package/template/agent/skills/saas-architect/SKILL.md +139 -0
- package/template/agent/skills/security-engineer/SKILL.md +133 -0
- package/template/agent/skills/seo-specialist/SKILL.md +130 -0
- package/template/agent/skills/subscription-billing/SKILL.md +179 -0
- package/template/agent/skills/ux-designer/SKILL.md +128 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
# React Native + Expo Reference
|
|
2
|
+
|
|
3
|
+
> **Philosophy:** JavaScript-first, native-quality. Ship fast with OTA updates, but never sacrifice 60fps.
|
|
4
|
+
> Expo is the default — eject only when you must.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Project Setup & Detection
|
|
9
|
+
|
|
10
|
+
**Stack indicators:** `package.json` with `react-native` or `expo` dependency.
|
|
11
|
+
|
|
12
|
+
**Key config files:**
|
|
13
|
+
|
|
14
|
+
| File | Purpose |
|
|
15
|
+
|------|---------|
|
|
16
|
+
| `app.json` / `app.config.js` | Expo configuration (app name, version, plugins) |
|
|
17
|
+
| `metro.config.js` | Metro bundler configuration |
|
|
18
|
+
| `babel.config.js` | Babel presets and plugins |
|
|
19
|
+
| `tsconfig.json` | TypeScript configuration |
|
|
20
|
+
| `eas.json` | EAS Build/Submit/Update configuration |
|
|
21
|
+
|
|
22
|
+
**Recommended project structure (feature-based):**
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
src/
|
|
26
|
+
features/
|
|
27
|
+
auth/
|
|
28
|
+
screens/LoginScreen.tsx
|
|
29
|
+
components/AuthForm.tsx
|
|
30
|
+
hooks/useAuth.ts
|
|
31
|
+
store/authStore.ts
|
|
32
|
+
home/
|
|
33
|
+
screens/HomeScreen.tsx
|
|
34
|
+
components/FeedList.tsx
|
|
35
|
+
shared/
|
|
36
|
+
components/ # Reusable UI components
|
|
37
|
+
hooks/ # Shared hooks
|
|
38
|
+
utils/ # Pure utility functions
|
|
39
|
+
services/ # API clients, storage wrappers
|
|
40
|
+
constants/ # Theme, config values
|
|
41
|
+
app/ # expo-router file-based routing
|
|
42
|
+
_layout.tsx
|
|
43
|
+
(tabs)/
|
|
44
|
+
_layout.tsx
|
|
45
|
+
index.tsx
|
|
46
|
+
settings.tsx
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Architecture Patterns
|
|
52
|
+
|
|
53
|
+
### State Management
|
|
54
|
+
|
|
55
|
+
| Approach | Use When |
|
|
56
|
+
|----------|----------|
|
|
57
|
+
| **Zustand** (recommended) | Most apps — simple API, selector-based subscriptions, minimal boilerplate |
|
|
58
|
+
| **Redux Toolkit** | Large teams, complex state with many reducers, need Redux DevTools |
|
|
59
|
+
| **Jotai** | Atomic state, when individual pieces of state are independent |
|
|
60
|
+
| **React Context** | Infrequently-changing values (theme, locale, auth status) |
|
|
61
|
+
|
|
62
|
+
**State design principles:**
|
|
63
|
+
- State should be the **minimal source of truth**. If a value can be derived from other state or props, derive it during render — don't store it.
|
|
64
|
+
- Use **selector functions** in Zustand to subscribe to specific slices and avoid unnecessary re-renders.
|
|
65
|
+
- Keep UI state local (`useState`), share only what multiple components need.
|
|
66
|
+
|
|
67
|
+
### Navigation
|
|
68
|
+
|
|
69
|
+
Use **native navigators** over JS-based navigators for performance:
|
|
70
|
+
|
|
71
|
+
| Navigator | Correct | Incorrect |
|
|
72
|
+
|-----------|---------|-----------|
|
|
73
|
+
| Stack | `createNativeStackNavigator` / `expo-router Stack` | `createStackNavigator` (JS-based, slow transitions) |
|
|
74
|
+
| Tabs | `createNativeBottomTabNavigator` / `expo-router NativeTabs` | `createBottomTabNavigator` (JS-based) |
|
|
75
|
+
|
|
76
|
+
Native navigators run transitions on the UI thread, provide platform-native gestures, large titles (iOS), search bars, and proper safe area handling automatically.
|
|
77
|
+
|
|
78
|
+
**Prefer native header options over custom header components.** Native headers support iOS large titles, blur effects, and search bars out of the box.
|
|
79
|
+
|
|
80
|
+
### New Architecture
|
|
81
|
+
|
|
82
|
+
React Native's New Architecture includes:
|
|
83
|
+
- **TurboModules** — lazy-loaded, synchronous native module access (replaces Bridge)
|
|
84
|
+
- **Fabric** — concurrent renderer with synchronous layout (replaces old renderer)
|
|
85
|
+
- **Bridgeless mode** — eliminates the JS-native bridge entirely
|
|
86
|
+
- **React Compiler** — automatic memoization (eliminates `React.memo`, `useCallback`, `useMemo`)
|
|
87
|
+
|
|
88
|
+
When using **React Compiler**, `memo()` and `useCallback()` are unnecessary. However, **object reference stability** still matters for list virtualization.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Performance Optimization
|
|
93
|
+
|
|
94
|
+
### Critical Thresholds
|
|
95
|
+
|
|
96
|
+
| Metric | Target | Critical |
|
|
97
|
+
|--------|--------|----------|
|
|
98
|
+
| Cold start (JS bundle ready) | < 1s | > 2s |
|
|
99
|
+
| Time to interactive | < 2s | > 4s |
|
|
100
|
+
| List scroll frame rate | 60fps | < 45fps |
|
|
101
|
+
| JS bundle size (gzipped) | < 1MB | > 3MB |
|
|
102
|
+
| IPA/APK download size | < 30MB | > 100MB |
|
|
103
|
+
|
|
104
|
+
### List Performance (CRITICAL)
|
|
105
|
+
|
|
106
|
+
**Always use a list virtualizer** — even for short lists. Virtualizers only render visible items, reducing memory and mount time.
|
|
107
|
+
|
|
108
|
+
| Library | When to Use |
|
|
109
|
+
|---------|------------|
|
|
110
|
+
| **LegendList** | Default choice — excellent recycling, great performance |
|
|
111
|
+
| **FlashList** (@shopify) | Alternative — well-tested, widely adopted |
|
|
112
|
+
| **FlatList** (built-in) | Legacy — avoid if possible, use LegendList/FlashList |
|
|
113
|
+
|
|
114
|
+
**Key rules for list performance:**
|
|
115
|
+
|
|
116
|
+
1. **Stable object references** — don't `.map()` or `.filter()` data before passing to lists. Transform data inside list items instead.
|
|
117
|
+
2. **Pass primitives to list items** — enables shallow comparison in `memo()`. Pass `id`, `name`, `email` instead of entire objects.
|
|
118
|
+
3. **Hoist callbacks to list root** — extract `renderItem` and callbacks outside the component, or use `useCallback` if not using React Compiler.
|
|
119
|
+
4. **No inline objects in renderItem** — every render creates new references, causing full re-renders of all visible items.
|
|
120
|
+
5. **Use compressed images** — large images in lists destroy scroll performance.
|
|
121
|
+
6. **Use item types** for heterogeneous lists — helps the virtualizer recycle views correctly.
|
|
122
|
+
|
|
123
|
+
```tsx
|
|
124
|
+
// ❌ Bad: creates new references on every render
|
|
125
|
+
<LegendList
|
|
126
|
+
data={items.map(i => ({ ...i, label: i.name.toUpperCase() }))}
|
|
127
|
+
renderItem={({ item }) => <ItemCard item={item} />}
|
|
128
|
+
/>
|
|
129
|
+
|
|
130
|
+
// ✅ Good: stable data, transform inside item
|
|
131
|
+
const renderItem = ({ item }) => <ItemCard item={item} />
|
|
132
|
+
|
|
133
|
+
<LegendList
|
|
134
|
+
data={items}
|
|
135
|
+
renderItem={renderItem}
|
|
136
|
+
keyExtractor={(item) => item.id}
|
|
137
|
+
estimatedItemSize={80}
|
|
138
|
+
/>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Animation (HIGH)
|
|
142
|
+
|
|
143
|
+
**Only animate GPU-accelerated properties:** `transform` (translate, scale, rotate) and `opacity`. Animating `width`, `height`, `top`, `left`, `margin`, `padding` triggers layout recalculation on every frame.
|
|
144
|
+
|
|
145
|
+
```tsx
|
|
146
|
+
// ❌ Bad: animates height (layout recalc every frame)
|
|
147
|
+
useAnimatedStyle(() => ({ height: withTiming(expanded ? 200 : 0) }))
|
|
148
|
+
|
|
149
|
+
// ✅ Good: animates transform (GPU-accelerated)
|
|
150
|
+
useAnimatedStyle(() => ({
|
|
151
|
+
transform: [{ scaleY: withTiming(expanded ? 1 : 0) }],
|
|
152
|
+
opacity: withTiming(expanded ? 1 : 0),
|
|
153
|
+
}))
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
- Use `useDerivedValue` over `useAnimatedReaction` for computed animations.
|
|
157
|
+
- Use `GestureDetector` (from `react-native-gesture-handler`) for press animations instead of `Pressable`.
|
|
158
|
+
|
|
159
|
+
### Scroll Performance
|
|
160
|
+
|
|
161
|
+
**Never track scroll position in useState** — it triggers a JS re-render on every frame. Use `useSharedValue` from Reanimated instead.
|
|
162
|
+
|
|
163
|
+
### Hermes Engine
|
|
164
|
+
|
|
165
|
+
Hermes is the default JS engine. It pre-compiles JavaScript to bytecode at build time, reducing cold start time and memory usage. Ensure Hermes is enabled in your project (`"jsEngine": "hermes"` in `app.json`).
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Common Libraries Ecosystem
|
|
170
|
+
|
|
171
|
+
| Category | Recommended | Alternative |
|
|
172
|
+
|----------|-------------|-------------|
|
|
173
|
+
| **Navigation** | `expo-router` (file-based) | `@react-navigation/native` (imperative) |
|
|
174
|
+
| **State** | `zustand` | `@reduxjs/toolkit`, `jotai` |
|
|
175
|
+
| **Server State** | `@tanstack/react-query` | `swr` |
|
|
176
|
+
| **HTTP** | `fetch` (built-in) | `axios`, `ky` |
|
|
177
|
+
| **Storage (non-sensitive)** | `react-native-mmkv` | `@react-native-async-storage/async-storage` |
|
|
178
|
+
| **Storage (sensitive)** | `expo-secure-store` | `react-native-keychain` |
|
|
179
|
+
| **Images** | `expo-image` | `react-native-fast-image` |
|
|
180
|
+
| **Animation** | `react-native-reanimated` | `react-native-animated` (built-in, limited) |
|
|
181
|
+
| **Gestures** | `react-native-gesture-handler` | — |
|
|
182
|
+
| **Lists** | `@legendapp/list` (LegendList) | `@shopify/flash-list` (FlashList) |
|
|
183
|
+
| **Forms** | `react-hook-form` | `formik` |
|
|
184
|
+
| **Modals** | Native `Modal` with `formSheet` | `react-native-bottom-sheet` |
|
|
185
|
+
| **Menus** | `zeego` (native context/dropdown) | — |
|
|
186
|
+
| **Image Gallery** | `galeria` | — |
|
|
187
|
+
| **Icons** | `expo-symbols` (SF Symbols) | `@expo/vector-icons` |
|
|
188
|
+
| **Fonts** | Config plugin (native load) | `expo-font` (runtime load) |
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Anti-Patterns & Gotchas
|
|
193
|
+
|
|
194
|
+
| ❌ Don't | Why | ✅ Do Instead |
|
|
195
|
+
|----------|-----|---------------|
|
|
196
|
+
| `ScrollView` with `.map()` for lists | Renders ALL items, memory explodes | `LegendList` / `FlashList` |
|
|
197
|
+
| `TouchableOpacity` for press | Legacy, limited API | `Pressable` — standard, more flexible |
|
|
198
|
+
| Text not wrapped in `<Text>` | Crashes on Android, undefined behavior | Always wrap strings in `<Text>` |
|
|
199
|
+
| `{condition && <Component/>}` with falsy value | `0` or `NaN` renders as text on Android | `{condition ? <Component/> : null}` |
|
|
200
|
+
| `useState` for scroll position | Re-renders on every frame, janky | `useSharedValue` from Reanimated |
|
|
201
|
+
| Inline objects in `style` prop | New reference every render | `StyleSheet.create()` or `borderCurve: 'continuous'` |
|
|
202
|
+
| `shadowColor`/`elevation` for shadows | Legacy, inconsistent cross-platform | CSS `boxShadow` string syntax |
|
|
203
|
+
| Margin between siblings | Fragile, breaks when children change | `gap` on parent container |
|
|
204
|
+
| `LinearGradient` third-party | Extra dependency | `experimental_backgroundImage: 'linear-gradient(...)'` |
|
|
205
|
+
| Custom header components | Misses native features (large titles, blur) | Native header `options` |
|
|
206
|
+
| `{ borderRadius: 12 }` alone | Sharp iOS corners | Add `borderCurve: 'continuous'` for smooth corners |
|
|
207
|
+
| Import entire lodash | Bundle bloat | `import debounce from 'lodash/debounce'` |
|
|
208
|
+
| `console.log` in production | Blocks JS thread, leaks data | Use a logger with levels, strip in release |
|
|
209
|
+
| Tokens in `AsyncStorage` | Plaintext, exposed on rooted device | `expo-secure-store` / Keychain |
|
|
210
|
+
|
|
211
|
+
### React Compiler Gotchas
|
|
212
|
+
|
|
213
|
+
When React Compiler is enabled:
|
|
214
|
+
- **Destructure functions early** — the compiler optimizes better with destructured function references.
|
|
215
|
+
- **Use `.get()`/`.set()` for Reanimated shared values** — the compiler cannot optimize `.value` property access patterns.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Testing
|
|
220
|
+
|
|
221
|
+
| Layer | Tool | Purpose |
|
|
222
|
+
|-------|------|---------|
|
|
223
|
+
| **Unit** | Jest + React Native Testing Library | Component logic, hooks, utils |
|
|
224
|
+
| **Component** | `@testing-library/react-native` | Render + interact with components |
|
|
225
|
+
| **E2E** | Maestro | Full flow testing, easy YAML syntax |
|
|
226
|
+
| **E2E (alt)** | Detox (Wix) | Full flow testing, JS-based |
|
|
227
|
+
|
|
228
|
+
**Testing principles:**
|
|
229
|
+
- Test behavior, not implementation (don't test component internals)
|
|
230
|
+
- Use `screen.getByRole()` and `getByText()` over `getByTestId()`
|
|
231
|
+
- Mock native modules at the module level (`jest.mock('expo-secure-store')`)
|
|
232
|
+
- Test loading, error, and empty states for every async component
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Deployment & Distribution
|
|
237
|
+
|
|
238
|
+
### EAS (Expo Application Services)
|
|
239
|
+
|
|
240
|
+
| Service | Purpose |
|
|
241
|
+
|---------|---------|
|
|
242
|
+
| **EAS Build** | Cloud builds for iOS and Android (no local Xcode/Android Studio needed) |
|
|
243
|
+
| **EAS Submit** | Publish to App Store / Google Play directly from CLI |
|
|
244
|
+
| **EAS Update** | OTA JavaScript updates (code push without app store review) |
|
|
245
|
+
|
|
246
|
+
**OTA update strategy:**
|
|
247
|
+
- Use `expo-updates` for JS-only changes (bug fixes, UI tweaks)
|
|
248
|
+
- Native changes (new native modules, SDK version bump) require a full build + store submission
|
|
249
|
+
- Set update channels: `production`, `staging`, `preview`
|
|
250
|
+
|
|
251
|
+
### Build commands
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# Development build (with dev client)
|
|
255
|
+
eas build --profile development --platform ios
|
|
256
|
+
|
|
257
|
+
# Production build
|
|
258
|
+
eas build --profile production --platform all
|
|
259
|
+
|
|
260
|
+
# Submit to stores
|
|
261
|
+
eas submit --platform ios
|
|
262
|
+
eas submit --platform android
|
|
263
|
+
|
|
264
|
+
# OTA update
|
|
265
|
+
eas update --branch production --message "Fix login bug"
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### App size optimization
|
|
269
|
+
- Enable Hermes (pre-compiled bytecode, smaller bundle)
|
|
270
|
+
- Use `expo-image` instead of `Image` (optimized loading)
|
|
271
|
+
- Tree-shake unused code with Metro bundler
|
|
272
|
+
- Use `expo-asset` for preloading critical assets
|
|
273
|
+
- Audit dependencies with `npx expo-doctor`
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Quick Reference — Granular Rules
|
|
278
|
+
|
|
279
|
+
Individual rule files in `react-native-rules/` with detailed incorrect/correct
|
|
280
|
+
code examples. Read the specific rule when working in that area.
|
|
281
|
+
|
|
282
|
+
> Source: [Vercel agent-skills](https://github.com/vercel-labs/agent-skills/tree/main/skills/react-native-skills)
|
|
283
|
+
|
|
284
|
+
### CRITICAL — Core Rendering
|
|
285
|
+
|
|
286
|
+
- [rendering-text-in-text-component.md](react-native-rules/rendering-text-in-text-component.md) — All text must be inside `<Text>`
|
|
287
|
+
- [rendering-no-falsy-and.md](react-native-rules/rendering-no-falsy-and.md) — Avoid falsy `&&` rendering
|
|
288
|
+
|
|
289
|
+
### HIGH — List Performance
|
|
290
|
+
|
|
291
|
+
- [list-performance-virtualize.md](react-native-rules/list-performance-virtualize.md) — Always use LegendList/FlashList
|
|
292
|
+
- [list-performance-function-references.md](react-native-rules/list-performance-function-references.md) — Stable object references
|
|
293
|
+
- [list-performance-item-memo.md](react-native-rules/list-performance-item-memo.md) — Pass primitives for memo
|
|
294
|
+
- [list-performance-callbacks.md](react-native-rules/list-performance-callbacks.md) — Hoist callbacks
|
|
295
|
+
- [list-performance-inline-objects.md](react-native-rules/list-performance-inline-objects.md) — No inline objects
|
|
296
|
+
- [list-performance-images.md](react-native-rules/list-performance-images.md) — Compressed images in lists
|
|
297
|
+
- [list-performance-item-types.md](react-native-rules/list-performance-item-types.md) — Item types for recycling
|
|
298
|
+
- [list-performance-item-expensive.md](react-native-rules/list-performance-item-expensive.md) — Defer expensive items
|
|
299
|
+
|
|
300
|
+
### HIGH — Animation
|
|
301
|
+
|
|
302
|
+
- [animation-gpu-properties.md](react-native-rules/animation-gpu-properties.md) — GPU-only properties (transform, opacity)
|
|
303
|
+
- [animation-derived-value.md](react-native-rules/animation-derived-value.md) — useDerivedValue over useAnimatedReaction
|
|
304
|
+
- [animation-gesture-detector-press.md](react-native-rules/animation-gesture-detector-press.md) — GestureDetector for press animations
|
|
305
|
+
|
|
306
|
+
### HIGH — Scroll & Navigation
|
|
307
|
+
|
|
308
|
+
- [scroll-position-no-state.md](react-native-rules/scroll-position-no-state.md) — Never track scroll in useState
|
|
309
|
+
- [navigation-native-navigators.md](react-native-rules/navigation-native-navigators.md) — Native stack/tab navigators
|
|
310
|
+
|
|
311
|
+
### MEDIUM — React State
|
|
312
|
+
|
|
313
|
+
- [react-state-minimize.md](react-native-rules/react-state-minimize.md) — Minimize state, derive values
|
|
314
|
+
- [react-state-dispatcher.md](react-native-rules/react-state-dispatcher.md) — Dispatch pattern for state
|
|
315
|
+
- [react-state-fallback.md](react-native-rules/react-state-fallback.md) — Fallback rendering pattern
|
|
316
|
+
- [state-ground-truth.md](react-native-rules/state-ground-truth.md) — State ground truth principles
|
|
317
|
+
|
|
318
|
+
### MEDIUM — React Compiler
|
|
319
|
+
|
|
320
|
+
- [react-compiler-destructure-functions.md](react-native-rules/react-compiler-destructure-functions.md) — Destructure functions early
|
|
321
|
+
- [react-compiler-reanimated-shared-values.md](react-native-rules/react-compiler-reanimated-shared-values.md) — .get()/.set() for shared values
|
|
322
|
+
|
|
323
|
+
### MEDIUM — UI Patterns
|
|
324
|
+
|
|
325
|
+
- [ui-expo-image.md](react-native-rules/ui-expo-image.md) — Use expo-image
|
|
326
|
+
- [ui-pressable.md](react-native-rules/ui-pressable.md) — Pressable over TouchableOpacity
|
|
327
|
+
- [ui-native-modals.md](react-native-rules/ui-native-modals.md) — Native modal presentations
|
|
328
|
+
- [ui-menus.md](react-native-rules/ui-menus.md) — Native context/dropdown menus (zeego)
|
|
329
|
+
- [ui-image-gallery.md](react-native-rules/ui-image-gallery.md) — Native image gallery (galeria)
|
|
330
|
+
- [ui-measure-views.md](react-native-rules/ui-measure-views.md) — Measure views correctly
|
|
331
|
+
- [ui-safe-area-scroll.md](react-native-rules/ui-safe-area-scroll.md) — Safe area with scroll
|
|
332
|
+
- [ui-scrollview-content-inset.md](react-native-rules/ui-scrollview-content-inset.md) — ScrollView content inset
|
|
333
|
+
- [ui-styling.md](react-native-rules/ui-styling.md) — Modern styling patterns (gap, boxShadow, borderCurve)
|
|
334
|
+
|
|
335
|
+
### MEDIUM — Design System
|
|
336
|
+
|
|
337
|
+
- [design-system-compound-components.md](react-native-rules/design-system-compound-components.md) — Compound component pattern
|
|
338
|
+
|
|
339
|
+
### LOW — Monorepo, Dependencies, JS, Fonts
|
|
340
|
+
|
|
341
|
+
- [monorepo-native-deps-in-app.md](react-native-rules/monorepo-native-deps-in-app.md) — Native deps in app package
|
|
342
|
+
- [monorepo-single-dependency-versions.md](react-native-rules/monorepo-single-dependency-versions.md) — Single dependency versions
|
|
343
|
+
- [imports-design-system-folder.md](react-native-rules/imports-design-system-folder.md) — Re-export third-party deps
|
|
344
|
+
- [js-hoist-intl.md](react-native-rules/js-hoist-intl.md) — Hoist Intl formatters
|
|
345
|
+
- [fonts-config-plugin.md](react-native-rules/fonts-config-plugin.md) — Config plugin for fonts
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: monetization-strategist
|
|
3
|
+
description: Use when designing pricing models, planning freemium strategy, setting up IAP, optimizing upgrade flows, or modeling unit economics
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Monetization Strategist Lens
|
|
7
|
+
|
|
8
|
+
> **Philosophy:** Pricing is product strategy. How you charge shapes who uses you and how.
|
|
9
|
+
> Charge too little = sustainability problem. Charge too late = habit without payment.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Core Instincts
|
|
14
|
+
|
|
15
|
+
- **Price is positioning** — low price signals low value; premium price signals quality
|
|
16
|
+
- **Willingness to pay > cost-plus pricing** — price based on value delivered, not cost of building
|
|
17
|
+
- **Free trial ≠ free forever** — time-limit trials; gate meaningful features behind paywall
|
|
18
|
+
- **Upgrade at the aha moment** — show the paywall after users experience value, not before
|
|
19
|
+
- **Churn is a pricing signal** — high churn often means price/value mismatch, not product failure
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Pricing Model Comparison
|
|
24
|
+
|
|
25
|
+
| Model | Best for | Risk |
|
|
26
|
+
|-------|----------|------|
|
|
27
|
+
| **One-time purchase** | Tools, utilities; no recurring infrastructure | Hard to sustain; no expansion revenue |
|
|
28
|
+
| **Subscription (monthly)** | SaaS, apps with ongoing value | High churn pressure; needs retention |
|
|
29
|
+
| **Subscription (annual)** | SaaS with sticky users | Lower churn; requires trust upfront |
|
|
30
|
+
| **Freemium** | Network effects, viral products | Conversion typically 2–5% free → paid |
|
|
31
|
+
| **Usage-based** | APIs, infrastructure, variable-value products | Revenue unpredictability |
|
|
32
|
+
| **IAP (consumable)** | Games, one-time unlocks | Requires volume; App Store cut (15–30%) |
|
|
33
|
+
|
|
34
|
+
**Indie hacker default:** Subscription (monthly + annual discount) or one-time if the product is a clear tool.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Freemium Design Rules
|
|
39
|
+
|
|
40
|
+
- **Free tier must be genuinely useful** — users who don't get value won't upgrade
|
|
41
|
+
- **Paid tier must be obviously better** — upgrade should feel like an obvious next step
|
|
42
|
+
- **Free-to-paid conversion benchmark:** 2–5% is typical; > 5% is strong
|
|
43
|
+
- **Don't give away features that should be paid** — you're training users to expect them free
|
|
44
|
+
- **Paywall trigger:** after activation event, not first open; after Nth use, not immediately
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Pricing Thresholds (Mobile Apps, 2024 benchmarks)
|
|
49
|
+
|
|
50
|
+
| Tier | Monthly | Annual | One-time |
|
|
51
|
+
|------|---------|--------|----------|
|
|
52
|
+
| Entry | $2.99–$4.99 | $19.99–$29.99 | $9.99 |
|
|
53
|
+
| Mid | $7.99–$9.99 | $49.99–$69.99 | $19.99–$29.99 |
|
|
54
|
+
| Premium | $14.99–$19.99 | $99.99–$149.99 | $49.99–$99.99 |
|
|
55
|
+
|
|
56
|
+
**Annual discount should be ~40–50% off monthly** to incentivize without undermining monthly revenue.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Key Formulas
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
LTV = ARPU / monthly_churn_rate
|
|
64
|
+
LTV:CAC ≥ 3:1 (sustainable), ≥ 5:1 (great)
|
|
65
|
+
Payback = CAC / monthly_gross_margin_per_customer (target < 12 months)
|
|
66
|
+
MRR = paying_users × ARPU
|
|
67
|
+
ARR = MRR × 12
|
|
68
|
+
Churn = churned_users_this_month / users_at_start_of_month
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## ❌ Anti-Patterns to Avoid
|
|
74
|
+
|
|
75
|
+
| ❌ NEVER DO | Why | ✅ DO INSTEAD |
|
|
76
|
+
|------------|-----|--------------|
|
|
77
|
+
| Paywall on first open | Users leave before experiencing value | Paywall after activation event |
|
|
78
|
+
| Pricing without testing | First price is almost always wrong | A/B test 2–3 price points |
|
|
79
|
+
| One price tier only | No upgrade path, no upsell | 2–3 tiers (entry, pro, enterprise/lifetime) |
|
|
80
|
+
| Free trial < 7 days | Not enough time to build habit | 14 days minimum; 30 for complex products |
|
|
81
|
+
| Grandfathering everyone on price increases | Unsustainable | Clear communication + fair grandfathering period |
|
|
82
|
+
| Hiding pricing | Kills trust, attracts wrong users | Show pricing clearly on landing page |
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Questions You Always Ask
|
|
87
|
+
|
|
88
|
+
**When designing pricing:**
|
|
89
|
+
- What's the activation event after which users clearly understand value?
|
|
90
|
+
- What's the minimum viable paid tier — what features justify the price?
|
|
91
|
+
- What's the churn rate, and does it suggest a pricing mismatch?
|
|
92
|
+
- Is there an annual plan? (Annual users churn 3–5× less than monthly)
|
|
93
|
+
|
|
94
|
+
**When reviewing monetization:**
|
|
95
|
+
- What % of users convert free → paid? What's the target?
|
|
96
|
+
- What's the most common reason users cancel? (Exit survey data)
|
|
97
|
+
- Is LTV:CAC ≥ 3:1?
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Red Flags
|
|
102
|
+
|
|
103
|
+
**Must fix:**
|
|
104
|
+
- [ ] No pricing page / pricing hidden
|
|
105
|
+
- [ ] Paywall shown before any activation event
|
|
106
|
+
- [ ] LTV:CAC < 1:1 (actively losing money per customer)
|
|
107
|
+
- [ ] No annual plan option
|
|
108
|
+
|
|
109
|
+
**Should fix:**
|
|
110
|
+
- [ ] Only one pricing tier (no upgrade path)
|
|
111
|
+
- [ ] No exit survey on cancellation
|
|
112
|
+
- [ ] Free trial < 7 days
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Who to Pair With
|
|
117
|
+
- `conversion-optimizer` — for paywall design and trial-to-paid optimization
|
|
118
|
+
- `retention-specialist` — for reducing churn after conversion
|
|
119
|
+
- `data-analyst` — for LTV modeling and cohort revenue analysis
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: paid-acquisition-specialist
|
|
3
|
+
description: Use when running Meta Ads, Google Ads, Apple Search Ads, or any paid user acquisition channel — including creative strategy, ROAS optimization, and CAC management
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Paid Acquisition Specialist Lens
|
|
7
|
+
|
|
8
|
+
> **Philosophy:** Paid acquisition amplifies what already works — it can't fix a leaky product.
|
|
9
|
+
> Never scale spend before unit economics are positive. Fast money in, faster money out.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Core Instincts
|
|
14
|
+
|
|
15
|
+
- **Validate organic before paying** — paid should scale a channel that already converts
|
|
16
|
+
- **Creative is the primary variable** — in Meta/TikTok, the ad creative drives 70%+ of performance
|
|
17
|
+
- **Kill losers fast, scale winners slowly** — most ad sets fail; iterate quickly
|
|
18
|
+
- **Attribution is broken** — last-click undervalues upper-funnel; triangulate with incrementality tests
|
|
19
|
+
- **Never scale a channel where LTV:CAC < 3:1**
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Platform Comparison
|
|
24
|
+
|
|
25
|
+
| Platform | Best for | Typical CAC | Targeting |
|
|
26
|
+
|----------|----------|-------------|-----------|
|
|
27
|
+
| **Apple Search Ads** | iOS apps, high-intent | High | Keyword-based |
|
|
28
|
+
| **Google UAC** | Android + iOS apps | Medium-high | AI-driven, broad |
|
|
29
|
+
| **Meta Ads** | B2C, consumer apps | Medium | Interest + lookalike |
|
|
30
|
+
| **TikTok Ads** | Consumer, Gen Z | Low-medium | Interest + algorithmic |
|
|
31
|
+
| **Google Search** | High-intent SaaS | High | Keyword-based |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Key Metrics & Benchmarks
|
|
36
|
+
|
|
37
|
+
| Metric | Formula | Target |
|
|
38
|
+
|--------|---------|--------|
|
|
39
|
+
| **ROAS** | Revenue / Ad Spend | ≥ 3× (sustainable) |
|
|
40
|
+
| **CAC** | Ad Spend / New Customers | < LTV / 3 |
|
|
41
|
+
| **LTV:CAC** | LTV / CAC | ≥ 3:1 |
|
|
42
|
+
| **CTR** (Meta display) | Clicks / Impressions | > 1% (good), > 3% (great) |
|
|
43
|
+
| **CTR** (Apple Search Ads) | Taps / Impressions (TTR) | > 3% |
|
|
44
|
+
| **CPM** (Meta) | Cost per 1000 impressions | $5–$15 (varies by niche) |
|
|
45
|
+
| **Install-to-trial rate** | Trials / Installs | > 30% |
|
|
46
|
+
| **Trial-to-paid rate** | Paid / Trials | > 15% |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Apple Search Ads Quick Reference
|
|
51
|
+
|
|
52
|
+
- **Campaign types:** Search Results, Today Tab, Search Tab, Product Page
|
|
53
|
+
- **Bidding:** CPT (Cost Per Tap) — start at 2× category average, adjust by TTR
|
|
54
|
+
- **TTR (Tap-Through Rate):** > 3% is healthy; < 1% = keyword mismatch
|
|
55
|
+
- **Search Match:** start on, refine with exact match after data
|
|
56
|
+
- **Negative keywords:** critical — prevents spend on competitor brand terms
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Creative Testing Framework
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
Week 1–2: Test hooks (3–5 different opening scenes/hooks)
|
|
64
|
+
Week 3–4: Test formats (UGC vs animation vs screen recording vs testimonial)
|
|
65
|
+
Week 5–6: Scale winner + test CTAs and landing pages
|
|
66
|
+
Ongoing: Refresh winning creative every 4–6 weeks (creative fatigue)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Creative fatigue signal:** Frequency > 3 AND CTR dropping week-over-week → pause and refresh.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## ❌ Anti-Patterns to Avoid
|
|
74
|
+
|
|
75
|
+
| ❌ NEVER DO | Why | ✅ DO INSTEAD |
|
|
76
|
+
|------------|-----|--------------|
|
|
77
|
+
| Scale before ROAS > 2× | Scaling losses faster | Validate at $500–$1000 budget first |
|
|
78
|
+
| Change multiple ad variables at once | Can't isolate what worked | One variable per test |
|
|
79
|
+
| Run ads with no landing page match | Message mismatch kills conversion | Dedicated landing page per ad creative |
|
|
80
|
+
| Ignore creative refresh | Creative fatigue → CPM rises, CTR falls | Replace winning creatives every 4–6 weeks |
|
|
81
|
+
| Use broad targeting from day 1 (Google) | Burn budget on irrelevant users | Start with exact/phrase match, expand |
|
|
82
|
+
| Scale too fast | Algorithm destabilizes, CPM spikes | Max 2× budget increase per week |
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Questions You Always Ask
|
|
87
|
+
|
|
88
|
+
**Before launching:**
|
|
89
|
+
- Is the organic conversion rate strong enough to justify paid amplification?
|
|
90
|
+
- What is our target CAC, based on LTV?
|
|
91
|
+
- Is the landing page / App Store listing optimized for conversion?
|
|
92
|
+
- What's the attribution setup — are we tracking installs, activations, or purchases?
|
|
93
|
+
|
|
94
|
+
**When scaling:**
|
|
95
|
+
- Is ROAS ≥ 3× at current spend level?
|
|
96
|
+
- Is creative frequency > 3 (signal of fatigue)?
|
|
97
|
+
- What's the paid CAC vs organic CAC ratio?
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Red Flags
|
|
102
|
+
|
|
103
|
+
**Must fix:**
|
|
104
|
+
- [ ] Scaling spend with ROAS < 2× (burning money)
|
|
105
|
+
- [ ] No conversion tracking set up (flying blind)
|
|
106
|
+
- [ ] Single ad creative with no testing
|
|
107
|
+
- [ ] No daily budget cap per campaign
|
|
108
|
+
|
|
109
|
+
**Should fix:**
|
|
110
|
+
- [ ] No negative keyword list (Apple Search Ads / Google)
|
|
111
|
+
- [ ] No creative refresh in > 6 weeks
|
|
112
|
+
- [ ] Attribution only from last-click (misses upper-funnel contribution)
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Who to Pair With
|
|
117
|
+
- `conversion-optimizer` — for landing page and paywall optimization
|
|
118
|
+
- `app-store-optimizer` — for Apple Search Ads + product page optimization
|
|
119
|
+
- `data-analyst` — for attribution modeling and ROAS analysis
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: product-manager
|
|
3
|
+
description: Use when defining product requirements, prioritizing features, planning a roadmap, validating user problems, or making build/buy/don't-build decisions
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Product Manager Lens
|
|
7
|
+
|
|
8
|
+
> **Philosophy:** Build outcomes, not outputs. Ship learning, not just features.
|
|
9
|
+
> The best feature is often the one you decide not to build.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## ⚠️ ASK BEFORE ASSUMING
|
|
14
|
+
|
|
15
|
+
| What | Why it matters |
|
|
16
|
+
|------|----------------|
|
|
17
|
+
| **Stage?** Pre-PMF / Post-PMF / Scaling | Changes everything about what to build |
|
|
18
|
+
| **Who is the user?** | Can't prioritize without knowing whose problem |
|
|
19
|
+
| **What outcome matters?** Revenue / retention / activation | Determines what "done" looks like |
|
|
20
|
+
| **Existing data?** | Don't hypothesize what you can measure |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Core Instincts
|
|
25
|
+
|
|
26
|
+
- **Jobs-to-be-done (JTBD)** — users don't want features; they want to make progress in their lives
|
|
27
|
+
- **Outcome over output** — "MAU +20%" beats "shipped 10 features"
|
|
28
|
+
- **Pareto ruthlessness** — 20% of features deliver 80% of value; cut the rest
|
|
29
|
+
- **Small bets, fast learning** — ship to learn, not to finish
|
|
30
|
+
- **Pre-PMF: talk to users; post-PMF: read the data**
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Prioritization Frameworks
|
|
35
|
+
|
|
36
|
+
| Framework | When to use |
|
|
37
|
+
|-----------|-------------|
|
|
38
|
+
| **ICE** (Impact × Confidence × Ease) | Quick scoring across many ideas |
|
|
39
|
+
| **RICE** (Reach × Impact × Confidence ÷ Effort) | When reach varies significantly |
|
|
40
|
+
| **MoSCoW** (Must/Should/Could/Won't) | Scoping a release |
|
|
41
|
+
| **Opportunity Scoring** | When you have survey data on importance vs satisfaction |
|
|
42
|
+
|
|
43
|
+
**Indie hacker rule:** If a feature doesn't directly help activation, retention, or revenue — it's probably a "Won't" for now.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## ❌ Anti-Patterns to Avoid
|
|
48
|
+
|
|
49
|
+
| ❌ NEVER DO | Why | ✅ DO INSTEAD |
|
|
50
|
+
|------------|-----|--------------|
|
|
51
|
+
| Build based on one user request | 1 user ≠ your market | Find the pattern across 5+ interviews |
|
|
52
|
+
| Big bang launch | Months of work, one chance to be right | Shape → Bet → Ship → Learn loop |
|
|
53
|
+
| Vanity metrics as goals | Page views don't pay rent | Retention, activation, revenue |
|
|
54
|
+
| Feature factory (output focus) | Team ships but nothing improves | Set outcome targets, measure impact |
|
|
55
|
+
| Build before validating | Wasted dev weeks | Fake door test, landing page, prototype first |
|
|
56
|
+
| Roadmap spans > 3 months | World changes faster than plans | 6-week cycles max for indie hackers |
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Questions You Always Ask
|
|
61
|
+
|
|
62
|
+
**When defining a feature:**
|
|
63
|
+
- What job is the user trying to get done? What's the progress they want to make?
|
|
64
|
+
- What's the smallest thing we can ship to learn whether this matters?
|
|
65
|
+
- How will we know if this worked? What metric moves?
|
|
66
|
+
- What do we NOT build as a result of building this?
|
|
67
|
+
|
|
68
|
+
**When reviewing a backlog:**
|
|
69
|
+
- Is this tied to a measurable outcome?
|
|
70
|
+
- Have we talked to users about this problem recently?
|
|
71
|
+
- What happens if we don't build this?
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Red Flags
|
|
76
|
+
|
|
77
|
+
**Must address:**
|
|
78
|
+
- [ ] No acceptance criteria on tickets ("done" is undefined)
|
|
79
|
+
- [ ] Features queued without a linked success metric
|
|
80
|
+
- [ ] No user research backing a major feature bet
|
|
81
|
+
- [ ] Roadmap has no "don't build" list
|
|
82
|
+
|
|
83
|
+
**Should address:**
|
|
84
|
+
- [ ] Sprint reviews with no outcome data (only feature demos)
|
|
85
|
+
- [ ] No documented JTBD for core user segments
|
|
86
|
+
- [ ] Team can't articulate current North Star Metric
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Who to Pair With
|
|
91
|
+
- `copywriter` — to translate features into user-facing language
|
|
92
|
+
- `growth-hacker` — for activation and acquisition loop design
|
|
93
|
+
- `data-analyst` — for outcome measurement and funnel analysis
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Key Formulas
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
North Star Metric = 1 metric that best represents delivered value to users
|
|
101
|
+
|
|
102
|
+
Activation rate = users who hit "aha moment" / total signups
|
|
103
|
+
Retention = users still active at day N / users who signed up N days ago
|
|
104
|
+
PMF signal = >40% of users would be "very disappointed" if product disappeared (Sean Ellis test)
|
|
105
|
+
```
|