Skip to content

add v1 of freighter mobile best practices skill#810

Open
leofelix077 wants to merge 4 commits intomainfrom
lf-add-freighter-mobile-best-practices-skill
Open

add v1 of freighter mobile best practices skill#810
leofelix077 wants to merge 4 commits intomainfrom
lf-add-freighter-mobile-best-practices-skill

Conversation

@leofelix077
Copy link
Copy Markdown
Collaborator

@leofelix077 leofelix077 commented Apr 9, 2026

Skill Eval: freighter-mobile-best-practices — Benchmark Report

Date: 2026-04-09
Iterations: 1
Repo: stellar/freighter-mobile
Model: Claude Opus 4.6

Summary

on further passes both get close to 100%, as Claude picks up automatically on the rules and the entry points

Metric With Skill Without Skill Delta
Pass rate 87.1% 67.2% +19.9pp

Assertion Results (aggregated across 3 iterations)

architecture-screen

# Assertion With Skill Without Skill
1 All components use arrow function expressions (not function declarations) 1/1 (100%) 1/1 (100%)
2 All user-facing text uses t() via useAppTranslation hook 1/1 (100%) 1/1 (100%)
3 Creates proper screen directory: screens/ with index.tsx, components/, hooks/ su... 0/1 (0%) 0/1 (0%)
4 Creates typed route param list for the staking navigator 1/1 (100%) 1/1 (100%)
5 Provides both en and pt translations 0/1 (0%) 0/1 (0%)
6 Screen files use default export; hooks/helpers use named exports 1/1 (100%) 1/1 (100%)
7 Uses absolute imports from src/ root (no relative paths) 1/1 (100%) 0/1 (0%)
8 Uses route enum constants, not raw strings 1/1 (100%) 1/1 (100%)

architecture-zustand

# Assertion With Skill Without Skill
1 Does not show generic error without context about what operation failed 1/1 (100%) 1/1 (100%)
2 Error handling uses normalizeError() from config/logger 1/1 (100%) 0/1 (0%)
3 Follows Zustand async pattern: set({ isLoading: true, error: null }) -> try/catc... 1/1 (100%) 1/1 (100%)
4 No direct store mutations (uses set() to create new state) 1/1 (100%) 1/1 (100%)
5 No empty catch blocks 1/1 (100%) 1/1 (100%)
6 Reports unexpected errors to Sentry (not expected validation errors) 1/1 (100%) 1/1 (100%)
7 Shows user-facing errors via Toast, NOT Alert.alert() 0/1 (0%) 0/1 (0%)
8 Uses absolute imports 1/1 (100%) 1/1 (100%)
9 Uses validateTransactionParams() before building transaction 1/1 (100%) 1/1 (100%)

code-style-hook

# Assertion With Skill Without Skill
1 Error handling uses normalizeError() 1/1 (100%) 0/1 (0%)
2 Hook file uses named export (not default) 1/1 (100%) 1/1 (100%)
3 Hook name starts with use prefix: useTokenPrices 1/1 (100%) 1/1 (100%)
4 JSDoc comment present on the hook function 1/1 (100%) 1/1 (100%)
5 Return value is memoized (wrapped in useMemo) 1/1 (100%) 0/1 (0%)
6 Uses ?? (nullish coalescing) instead of for fallback values
7 Uses absolute imports (not relative paths) 1/1 (100%) 1/1 (100%)
8 Uses arrow function expression (not function declaration) 1/1 (100%) 1/1 (100%)

code-style-naming

# Assertion With Skill Without Skill
1 Changes to arrow function expression (not function declaration) 1/1 (100%) 1/1 (100%)
2 Changes to default export (it's a screen) 1/1 (100%) 1/1 (100%)
3 Fixes imports to absolute paths (not relative ../../) 1/1 (100%) 1/1 (100%)
4 List item wrapped in React.memo() 1/1 (100%) 0/1 (0%)
5 No hardcoded colors 1/1 (100%) 0/1 (0%)
6 Replaces Alert.alert with Toast for error display 1/1 (100%) 0/1 (0%)
7 Replaces Image with FastImage for remote URLs 1/1 (100%) 0/1 (0%)
8 Replaces ScrollView+map with FlatList for virtualization 1/1 (100%) 1/1 (100%)
9 Replaces StyleSheet.create with NativeWind className 1/1 (100%) 0/1 (0%)
10 Replaces hardcoded strings with t() calls 1/1 (100%) 1/1 (100%)
11 Uses stable key (not array index) 1/1 (100%) 1/1 (100%)
12 Uses useAppTranslation() instead of raw useTranslation() 1/1 (100%) 1/1 (100%)
13 Uses useShallow for multi-field Zustand selectors 1/1 (100%) 0/1 (0%)
14 Zustand stores accessed via selectors, not full destructuring 1/1 (100%) 0/1 (0%)
15 totalValue computed in useMemo 1/1 (100%) 1/1 (100%)

err-handling-retry

# Assertion With Skill Without Skill
1 Does not show generic 'Something went wrong' without context 1/1 (100%) 1/1 (100%)
2 Implements retry with exponential backoff (1s, 2s, 4s, 8s, 16s) for HTTP 504 0/1 (0%) 1/1 (100%)
3 Maps Horizon error codes to translated user-facing messages using t() 1/1 (100%) 1/1 (100%)
4 Maximum 5 retry attempts 1/1 (100%) 1/1 (100%)
5 Reports unexpected errors to Sentry 1/1 (100%) 1/1 (100%)
6 Shows user-facing errors via Toast, NOT Alert.alert() 1/1 (100%) 1/1 (100%)
7 Uses absolute imports (not relative paths) 1/1 (100%) 0/1 (0%)
8 Uses normalizeError() for error normalization 1/1 (100%) 0/1 (0%)

err-handling-zustand

# Assertion With Skill Without Skill
1 Async actions follow set({ isLoading: true, error: null }) -> try/catch -> set r... 1/1 (100%) 0/1 (0%)
2 Clears state on account switch (not just on unmount) 1/1 (100%) 1/1 (100%)
3 Does NOT use console.error for error reporting - uses Sentry 1/1 (100%) 1/1 (100%)
4 Error handling uses normalizeError() from config/logger 1/1 (100%) 0/1 (0%)
5 No direct store mutations (no get().array.push()) 1/1 (100%) 1/1 (100%)
6 Store interface defines both state fields and action functions 1/1 (100%) 1/1 (100%)
7 Uses create() from Zustand with typed interface 1/1 (100%) 1/1 (100%)
8 Uses named export for the store hook (useTransactionHistoryStore) 1/1 (100%) 1/1 (100%)

i18n-settings

# Assertion With Skill Without Skill
1 All user-facing strings come from t() calls 1/1 (100%) 0/1 (0%)
2 Component name has Screen suffix 1/1 (100%) 1/1 (100%)
3 Component uses arrow function expression 1/1 (100%) 1/1 (100%)
4 Provides both English (en) and Portuguese (pt) translation entries 1/1 (100%) 1/1 (100%)
5 Screen component uses default export 1/1 (100%) 1/1 (100%)
6 Translation keys use nested dot notation 1/1 (100%) 1/1 (100%)
7 Uses NativeWind className for styling (not StyleSheet.create) 1/1 (100%) 1/1 (100%)
8 Uses absolute imports 1/1 (100%) 1/1 (100%)
9 Uses useAppTranslation() hook (not raw useTranslation) 1/1 (100%) 1/1 (100%)

nav-typed-routes

# Assertion With Skill Without Skill
1 All user-facing text uses t() via useAppTranslation 1/1 (100%) 1/1 (100%)
2 Creates route enum with named constants for each screen 1/1 (100%) 1/1 (100%)
3 Creates typed param list type for the navigator 1/1 (100%) 1/1 (100%)
4 Deep link config uses correct scheme (freighterdev:// for dev) 1/1 (100%) 1/1 (100%)
5 Navigation uses enum constants, never raw strings 1/1 (100%) 1/1 (100%)
6 Optional params marked with ? in param list type 1/1 (100%) 1/1 (100%)
7 Screen components use arrow functions and default exports 1/1 (100%) 1/1 (100%)
8 navigation.navigate() calls are fully typed 1/1 (100%) 0/1 (0%)

performance-flatlist

# Assertion With Skill Without Skill
1 FlatList has keyExtractor with stable ID (not array index) 1/1 (100%) 1/1 (100%)
2 FlatList has maxToRenderPerBatch prop 1/1 (100%) 1/1 (100%)
3 FlatList has removeClippedSubviews prop 1/1 (100%) 1/1 (100%)
4 FlatList has windowSize prop 1/1 (100%) 1/1 (100%)
5 List item component wrapped in React.memo() 1/1 (100%) 1/1 (100%)
6 No inline arrow functions in JSX (onPress, etc.) 1/1 (100%) 1/1 (100%)
7 Uses FastImage (not React Native Image) for remote token icons 1/1 (100%) 0/1 (0%)
8 Uses NativeWind className for styling (not StyleSheet.create) 0/1 (0%) 0/1 (0%)
9 Uses useShallow for multi-field Zustand selectors 1/1 (100%) 0/1 (0%)
10 Zustand store accessed via selectors, not full store destructuring 1/1 (100%) 1/1 (100%)
11 renderItem callback wrapped in useCallback 1/1 (100%) 1/1 (100%)

performance-selectors

# Assertion With Skill Without Skill
1 All user-facing text uses t() via useAppTranslation 1/1 (100%) 0/1 (0%)
2 Derived values computed in useMemo 1/1 (100%) 1/1 (100%)
3 Does NOT create inline objects/arrays as props to child components 0/1 (0%) 1/1 (100%)
4 Uses NativeWind className for styling 1/1 (100%) 0/1 (0%)
5 Uses absolute imports 1/1 (100%) 1/1 (100%)
6 Uses arrow function expression for component 1/1 (100%) 1/1 (100%)
7 Uses useShallow from Zustand for selecting multiple fields 1/1 (100%) 0/1 (0%)
8 Zustand stores accessed via specific selectors, NOT destructuring entire store 1/1 (100%) 1/1 (100%)

security-storage

# Assertion With Skill Without Skill
1 Does NOT use AsyncStorage directly for keys, seeds, or passwords 1/1 (100%) 1/1 (100%)
2 Does not use hardcoded test keys - references environment variables for test dat... 1/1 (100%) 0/1 (0%)
3 Error handling uses normalizeError() + Sentry 1/1 (100%) 0/1 (0%)
4 Never logs key material even in DEV mode 1/1 (100%) 1/1 (100%)
5 Uses absolute imports throughout 1/1 (100%) 0/1 (0%)
6 Uses dataStorage (AsyncStorage) ONLY for non-sensitive metadata (e.g., lastBacku... 1/1 (100%) 1/1 (100%)
7 Uses secureDataStorage (keychain/keystore) for storing encrypted seed data 1/1 (100%) 1/1 (100%)

security-walletconnect

# Assertion With Skill Without Skill
1 Checks and sets hasRespondedRef before responding 0/1 (0%) 0/0 (0%)
2 Error responses use JSON-RPC format { code: 5000, message: '...' } 0/1 (0%) 0/0 (0%)
3 Implements Blockaid scanning: malicious=auto-reject, suspicious/scan-failed=warn... 0/1 (0%) 0/0 (0%)
4 Never trusts dApp display names/icons for security decisions 1/1 (100%) 0/0 (0%)
5 User-facing strings wrapped in t() via useAppTranslation 1/1 (100%) 0/0 (0%)
6 Uses hasRespondedRef (React ref) to prevent duplicate responses 1/1 (100%) 0/0 (0%)
7 Uses validation functions from walletKitValidation.ts 1/1 (100%) 0/0 (0%)
8 Validates chain matches active Stellar network (stellar:pubnet or stellar:testne... 1/1 (100%) 0/0 (0%)

styling-card

# Assertion With Skill Without Skill
1 All user-facing text uses t() 1/1 (100%) 0/1 (0%)
2 Checks/uses SDS components from src/components/sds/ where applicable 1/1 (100%) 1/1 (100%)
3 Component wrapped in React.memo() 0/1 (0%) 0/1 (0%)
4 Does NOT use StyleSheet.create 1/1 (100%) 1/1 (100%)
5 Uses FastImage for the remote token icon, with resizeMode specified 0/1 (0%) 0/1 (0%)
6 Uses NativeWind className as primary styling approach 0/1 (0%) 0/1 (0%)
7 Uses absolute imports 1/1 (100%) 1/1 (100%)
8 Uses arrow function expression 1/1 (100%) 1/1 (100%)
9 Uses named export (component, not screen) 1/1 (100%) 0/1 (0%)

testing-zustand

# Assertion With Skill Without Skill
1 Mocks use absolute paths matching import convention 1/1 (100%) 1/1 (100%)
2 Test file in tests/ directory mirroring src/ structure 0/1 (0%) 0/1 (0%)
3 Test file uses .test.ts extension 1/1 (100%) 1/1 (100%)
4 Tests network failure path (reports unexpected errors to Sentry) 0/1 (0%) 0/1 (0%)
5 Tests success path with proper state assertions 1/1 (100%) 1/1 (100%)
6 Tests validation error path (does NOT report expected validation errors to Sentr... 1/1 (100%) 1/1 (100%)
7 Uses renderHook and act from testing utilities 0/1 (0%) 0/1 (0%)
8 Uses useMyStore.setState() for setting up store state 1/1 (100%) 1/1 (100%)

Copilot AI review requested due to automatic review settings April 9, 2026 16:15
@leofelix077 leofelix077 self-assigned this Apr 9, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a “freighter mobile best practices” documentation skill and supporting context files to help AI agents and contributors navigate Freighter Mobile’s architecture, tooling, and development conventions.

Changes:

  • Introduces llms.txt and CLAUDE.md as entry-point context/reference docs for the repo.
  • Adds docs/skills/freighter-mobile-best-practices/ with a skill definition and focused reference guides (architecture, code style, security, WalletConnect, testing, etc.).

Reviewed changes

Copilot reviewed 17 out of 17 changed files in this pull request and generated 16 comments.

Show a summary per file
File Description
llms.txt High-level repo index for docs, dev, testing, and key concepts
CLAUDE.md Consolidated AI agent / contributor context (tooling, structure, conventions)
docs/skills/freighter-mobile-best-practices/SKILL.md Skill definition + reference index for best-practices topics
docs/skills/freighter-mobile-best-practices/references/architecture.md Architecture + layering + duck/store patterns reference
docs/skills/freighter-mobile-best-practices/references/anti-patterns.md Common mistakes/anti-pattern guidance
docs/skills/freighter-mobile-best-practices/references/code-style.md Formatting, ESLint/Prettier rules, naming conventions
docs/skills/freighter-mobile-best-practices/references/dependencies.md Dependency management + native dependency workflow
docs/skills/freighter-mobile-best-practices/references/error-handling.md Error normalization + store async patterns + WC error responses
docs/skills/freighter-mobile-best-practices/references/git-workflow.md Branching/commit/PR/release process guidance
docs/skills/freighter-mobile-best-practices/references/i18n.md i18n framework usage + key structure + lint enforcement notes
docs/skills/freighter-mobile-best-practices/references/navigation.md Navigator hierarchy + typing + deep links conventions
docs/skills/freighter-mobile-best-practices/references/performance.md Performance rules/checklist and optimization guidance
docs/skills/freighter-mobile-best-practices/references/security.md Storage tiers + auth/security-sensitive areas overview
docs/skills/freighter-mobile-best-practices/references/styling.md NativeWind/SDS/bottom-sheet/modal styling guidance
docs/skills/freighter-mobile-best-practices/references/testing.md Jest + Maestro structure, commands, and e2e guidance
docs/skills/freighter-mobile-best-practices/references/walletconnect.md WalletConnect architecture, request handling, and validations

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

llms.txt Outdated
Comment on lines +30 to +33
- 434 TypeScript files, ~73,500 LOC
- Navigation: React Navigation with nested navigators
- dApp integration: WalletConnect v2 (4 RPC methods)
- Testing: Jest (unit) + Maestro (e2e, 6 test flows)
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The doc hardcodes "Maestro (e2e, 6 test flows)" and a TS file/LOC count. In the repo there are currently 10 YAML flows under e2e/flows/ (including debug/shared helpers), so this number is already inaccurate; consider updating the count or avoiding hardcoded numbers that will drift.

Suggested change
- 434 TypeScript files, ~73,500 LOC
- Navigation: React Navigation with nested navigators
- dApp integration: WalletConnect v2 (4 RPC methods)
- Testing: Jest (unit) + Maestro (e2e, 6 test flows)
- TypeScript codebase with React Native screens, state, and platform integrations
- Navigation: React Navigation with nested navigators
- dApp integration: WalletConnect v2 (4 RPC methods)
- Testing: Jest (unit) + Maestro (e2e)

Copilot uses AI. Check for mistakes.
Comment on lines +21 to +26
## Reference Index

| Concern | File | When to Read |
| -------------------- | ---------------------------- | --------------------------------------------------- |
| Code Style | references/code-style.md | Writing or reviewing any code |
| Architecture | references/architecture.md | Adding features, understanding the codebase |
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The markdown table syntax here uses a leading || which GitHub renders as an extra empty column. Replace || ... | ... | rows with standard | ... | ... | table rows so the Reference Index renders correctly.

Copilot uses AI. Check for mistakes.
Comment on lines +39 to +47
## Supported RPC Methods

| Method | Purpose |
| -------------------------- | -------------------------------------------- |
| `stellar_signXDR` | Sign a transaction XDR (does not submit) |
| `stellar_signAndSubmitXDR` | Sign and submit a transaction to the network |
| `stellar_signMessage` | Sign an arbitrary text message |
| `stellar_signAuthEntry` | Sign a Soroban authorization entry |

Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Table rows start with || (double pipe), which will render with an unintended empty first column in GitHub markdown. Use a single leading | for each row so the table displays as intended.

Copilot uses AI. Check for mistakes.
Comment on lines +68 to +77
### Available Test Flows (7 total)

1. `CreateWallet` — Full wallet creation flow
2. `ImportWallet` — Import via recovery phrase
3. `ImportFundedWallet` — Import a pre-funded wallet
4. `SendClassicTokenMainnet` — Send a classic Stellar token on mainnet
5. `SwapClassicTokenMainnet` — Swap tokens on mainnet
6. `SignMessageMockDapp` — Sign a message via WalletConnect mock dApp
7. `SignAuthEntryMockDapp` — Sign a Soroban auth entry via WalletConnect mock
dApp
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This section says there are "7 total" Maestro flows, but e2e/flows/ currently contains 10 YAML flows (onboarding/transactions/walletconnect/debug/shared, with SwitchToTestnet duplicated). Update the count/list or avoid hardcoding totals so the doc stays accurate.

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +12
| Tier | Implementation | Use For |
| ---------------------- | --------------------------------------------------------- | ---------------------------------------------------- |
| `secureDataStorage` | `react-native-keychain` (iOS Keychain / Android Keystore) | Private keys, seed phrases, encrypted credentials |
| `biometricDataStorage` | Biometric-gated keychain access | Passwords that require biometric confirmation |
| `dataStorage` | AsyncStorage | Non-sensitive settings, preferences, cached UI state |

Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Markdown table rows here use || which creates an extra empty column when rendered on GitHub. Switch to standard |-prefixed rows for these tables (same for other tables in this doc).

Copilot uses AI. Check for mistakes.
Comment on lines +95 to +96
- `BalancesList.tsx` — missing windowSize, maxToRenderPerBatch
- `CollectiblesGrid.tsx` — missing keyExtractor, windowSize, maxToRenderPerBatch
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This section references BalancesList.tsx and CollectiblesGrid.tsx as missing FlatList optimizations, but those filenames don't exist anywhere under src/ in the current repo. Either update these to the correct component filenames or remove the specific callouts to avoid misleading readers.

Suggested change
- `BalancesList.tsx` — missing windowSize, maxToRenderPerBatch
- `CollectiblesGrid.tsx` — missing keyExtractor, windowSize, maxToRenderPerBatch
- Some FlatList usages in the current codebase are still missing required
performance props and should be updated to include stable `keyExtractor`,
`windowSize`, `maxToRenderPerBatch`, and related virtualization settings as
applicable.

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +5
# Performance -- Freighter Mobile

Based on analysis of 436 React Native files. Current performance score:
**6.8/10**.

Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doc starts with "Based on analysis of 436 React Native files" while llms.txt claims 434 TypeScript files; these hardcoded metrics will drift and are already inconsistent within the PR. Consider removing precise counts/scores or generating them automatically so the docs remain trustworthy.

Copilot uses AI. Check for mistakes.
Comment on lines +186 to +195

| Category | Convention | Evidence |
| ----------------- | --------------------------------------------------- | --------------------------- |
| Screen components | `XxxScreen` suffix always | 40+ screens, 100% adherence |
| Hooks | `useXxx` always | 57 hooks, 100% adherence |
| Zustand stores | `useXxxStore` | 24 ducks, 100% adherence |
| Store actions | verb + noun (`fetchBalances`, `clearData`) | 95%+ |
| Constants | SCREAMING_SNAKE_CASE in `config/constants.ts` | 95%+ |
| Types/Interfaces | PascalCase with `Props`, `State`, `Config` suffixes | 500+ types, 100% |
| Enum values | Mixed PascalCase/SCREAMING_SNAKE per enum | Context-dependent |
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The tables in this doc use || at the start of rows (e.g., the naming deep dive table), which GitHub will render with an extra empty column. Use a single leading | per row for proper markdown table formatting.

Copilot uses AI. Check for mistakes.
Comment on lines +141 to +152
## Dual Bundle IDs

The app maintains separate identities for development and production:

| Concern | Dev | Prod |
| ---------------- | -------------------------- | ----------------------------- |
| Bundle ID | `org.stellar.freighterdev` | `org.stellar.freighterwallet` |
| Signing | Dev certificates | Prod certificates |
| Push tokens | Separate | Separate |
| Deep link scheme | `freighterdev://` | `freighterwallet://` |
| Keychain entries | Isolated | Isolated |

Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The dual bundle ID table rows start with ||, which renders incorrectly in GitHub markdown (extra empty first column). Use standard |-prefixed rows.

Copilot uses AI. Check for mistakes.
Comment on lines +97 to +112
## Running Tests

| Command | Purpose |
| ------------------------------ | -------------------------------------- |
| `yarn test` | Run Jest suite once |
| `yarn test:watch` | Run Jest in watch mode |
| `yarn test:e2e:ios <flow>` | Run a Maestro flow on iOS Simulator |
| `yarn test:e2e:android <flow>` | Run a Maestro flow on Android Emulator |

## CI Pipelines

| Workflow | Trigger | What It Does |
| ----------------- | ------------------- | ------------------------------------------ |
| `test.yml` | Push / PR | Runs the Jest test suite |
| `ios-e2e.yml` | Configured triggers | Runs Maestro iOS tests on macOS runner |
| `android-e2e.yml` | Configured triggers | Runs Maestro Android tests on Linux runner |
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The command/workflow tables here use || at the start of each row, which renders as an extra empty column in GitHub markdown. Use standard table rows starting with a single | so these tables format correctly.

Copilot uses AI. Check for mistakes.
Rewrite AGENTS.md as the single AI agent entry point:
- Add glossary section with domain-specific terminology
- Add documentation link index (replaces llms.txt)
- Remove sections that duplicate best-practices reference files
  (code style details, branch conventions, PR instructions)
- Keep unique context: repo map, architecture orientation (ducks/nav/WC),
  security alert list, known complexity/gotchas, pre-submission checklist
- Delete llms.txt (content absorbed into AGENTS.md)
- Delete CLAUDE.md (content absorbed into AGENTS.md)
@aristidesstaffieri
Copy link
Copy Markdown
Contributor

Code review

Found 1 issue:

  1. performance.md claims "No FastImage adoption despite availability" and lists "Adopt FastImage for remote images" as a P1 action item. However, FastImage (@d11/react-native-fast-image) is already adopted and actively used in 4 files: src/components/sds/Token/index.tsx, src/helpers/validateIconUrl.ts, src/ducks/tokenIcons.ts, and src/components/analytics/DebugBottomSheet.tsx. The "Image Optimization Score: 4/10" and the P1 recommendation are stale and will give incorrect guidance.

## Image Optimization -- Score: 4/10
No FastImage adoption despite availability. React Native's default Image has no
HTTP caching.
**RULE: Use FastImage for ALL remote images (token icons, NFTs, profile
images).**

| **P0** | Add FlatList optimization props to all lists | Improves scroll perf on 9 list components | 6/10 → 9/10 |
| **P1** | Adopt FastImage for remote images | Adds HTTP caching for all images | 4/10 → 8/10 |
| **P1** | Extract 123 inline handlers to useCallback | Stabilizes reference equality | 6/10 → 8/10 |

🤖 Generated with Claude Code

- If this code review was useful, please react with 👍. Otherwise, react with 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants