Agent skill

Code Review React Native

by talsec in talsec/Free-RASP-ReactNative

Performs strict code reviews on React Native plugin projects covering TypeScript, the Kotlin (Android) and Swift (iOS) native bridges, and the Expo config plugin.

MITAuto-check passedMobile

Install Code Review React Native

skills CLI
$ npx skills add talsec/Free-RASP-ReactNative --skill code-review-react-native -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install talsec/Free-RASP-ReactNative code-review-react-native --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/talsec/Free-RASP-ReactNative.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/code-review-react-native .claude/skills/code-review-react-native && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
code-review-react-native
GitHub stars
175
Token cost
~3.7k tokens
SKILL.md length
1,720 words
Files
1
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Performs strict code reviews on React Native plugin projects covering TypeScript, the Kotlin (Android) and Swift (iOS) native bridges, and the Expo config plugin.

  • Works in 12 steps: Gather context → Classify every changed file → Run the checklist below and produce the… → …
  • The user asks to review PR
  • SKILL.md covers Review priorities, in order, Workflow, Hard rules — block the merge and Significant issues — should fix, plus 2 more sections
  • Calls git, yarn and gh

What it does

Code Review React Native is an agent skill from talsec/Free-RASP-ReactNative. Performs strict code reviews on React Native plugin projects covering TypeScript, the Kotlin (Android) and Swift (iOS) native bridges, and the Expo config plugin. Focuses on optimal code, readability, maintainability, deduplication, single-responsibility, straightforward control flow, React Native best practices, the rule that native layers must not invent hardcoded fallbacks for values the TypeScript layer or platform SDK already owns, alignment of identifiers and API surface across TypeScript/Kotlin/Swift…

Its SKILL.md is about 3.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Mobile, covering Cross-platform mobile apps and Code review. It works with React Native, TypeScript, Kotlin and Expo. The repository describes itself as: React Native plugin for Android and iOS mobile devices. SDK providing app protection and threat monitoring. Shield your app with free RASP. Detect reverse engineering, root… The licence is MIT.

When your agent uses it

  • The user asks to review PR
  • Do a code review
  • Review this code
  • Code review for PRN

Example prompts

  • “review PR”
  • “do a code review”
  • “review this code”
  • “/code-review-react-native”

Workflow steps

12 steps, taken from the step headings in SKILL.md.

  1. Gather context
  2. Classify every changed file
  3. Run the checklist below and produce the report
  4. No hand-edits to generated / built files
  5. SemVer must match the change
  6. No hardcoded fallbacks in the native layer
  7. NativeModules name must be consistent across all layers
  8. NativeEventEmitter channel data aligned across TypeScript, Kotlin, and Swift
  9. EventIdentifiers must stay obfuscated — never replace with hardcoded strings
  10. NativeEventEmitter listener registration and cleanup symmetry
  11. Platform-specific features must be documented and gated
  12. Expo config plugin changes are complete and tested

What it can do on your machine

Read from SKILL.md and the folder at commit 0a0f551. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • yarn
    • gh
    • tsc
    • npm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git, yarn, gh and npm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Code Review React Native loads about 3.7k tokens when it runs. Until then it costs about 246 tokens; SKILL.md has 1,720 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~246
When it runs · the whole SKILL.md, loaded when a task matches
~3.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from talsec/Free-RASP-ReactNative at commit 0a0f551, republished under its MIT licence (© talsec). 1,720 words, ~3,732 tokens.

Download SKILL.mdSave it as .claude/skills/code-review-react-native/SKILL.md (or your agent's skills folder).
name
code-review-react-native
description
Performs strict code reviews on React Native plugin projects covering TypeScript, the Kotlin (Android) and Swift (iOS) native bridges, and the Expo config plugin. Focuses on optimal code, readability, maintainability, deduplication, single-responsibility, straightforward control flow, React Native best practices, the rule that native layers must not invent hardcoded fallbacks for values the TypeScript layer or platform SDK already owns, alignment of identifiers and API surface across TypeScript/Kotlin/Swift (especially NativeModules name, NativeEventEmitter channel data, and EventIdentifiers), and explicit documentation of platform-specific features. Use when the user asks to "review PR", "do a code review", "review this code", "code review for PR#N", or otherwise requests review of changes in a React Native plugin — including its built output (`lib/`), Expo config plugin output (`plugin/build/`), and native source under `android/` and `ios/`.

Code Review (React Native)

Strict, opinionated code review for React Native plugin codebases with Kotlin + Swift bridges and an optional Expo config plugin. Optimised for catching the kinds of issues that survive linters and tests but degrade a codebase over time.

Review priorities, in order

  1. Correctness & contract — bugs, breaking changes, public-API violations, SemVer; identifiers and API surface aligned across TypeScript, Kotlin, and Swift.
  2. Native-layer cleanliness — no hardcoded fallbacks for values owned by TypeScript or the platform SDK; no behaviour duplicated across language boundaries; platform-specific features explicitly documented.
  3. Single responsibility — each function, class, and file does one thing.
  4. Deduplication (DRY) — repeated parsing, serialisation, and validation patterns get extracted.
  5. Readability — naming, argument styles, generated-vs-handwritten boundaries, no surprises.
  6. Maintainability — generated files untouched, defaults documented in one place, tests for new public surface.
  7. React Native / TypeScript best practices — const, @deprecated discipline, null vs undefined, strict tsconfig honoured.
  8. Polish — JSDoc style, example brevity, changelog accuracy, PR description present.

Workflow

1. Gather context

If the user references a GitHub PR by number:

bash
gh pr view <N> --json title,body,author,state,baseRefName,headRefName,additions,deletions,changedFiles,files,url
gh pr diff <N>
git log <base>..<head> --oneline

If the changes are local:

bash
git diff <base>..HEAD --stat
git diff <base>..HEAD

Always read the full file (not only the diff) for any non-trivial change so you see the surrounding context the diff hides — especially around native bridges, event emitter wiring, and EventIdentifiers.

2. Classify every changed file

Each file falls into exactly one of these buckets, and the bucket determines what's acceptable:

BucketExamplesRule
Hand-written TypeScriptsrc/Full review applies.
Built JS outputlib/commonjs/, lib/module/, lib/typescript/Must not be hand-edited. Regenerate via yarn build (react-native-builder-bob).
Expo config plugin sourceplugin/src/Full review applies.
Expo config plugin buildplugin/build/Must not be hand-edited. Regenerate via yarn build or tsc -p plugin/tsconfig.build.json.
Hand-written nativeandroid/src/main/kotlin/**, ios/**/*.swiftFull review applies, with extra scrutiny on the bridge layer.
Build / configpackage.json, *.gradle, *.podspec, tsconfig.json, babel.config.jsVerify version bumps follow SemVer; confirm SDK/binary updates match changelog.
Docs / releaseCHANGELOG.md, README.mdVerify claims match the diff (e.g. SDK versions, breaking-change list, public-API additions).
3. Run the checklist below and produce the report

Hard rules — block the merge

1. No hand-edits to generated / built files

lib/ (built by react-native-builder-bob) and plugin/build/ (compiled from plugin/src/) must be touched only by their build tool.

Red flags:

  • Behaviour-changing edits inside lib/ that differ from what yarn build would produce.
  • plugin/build/ edited directly instead of editing plugin/src/ and re-running the build.
  • A // eslint-disable or // @ts-ignore directive added to a file inside lib/.

Action: ask the author to run yarn build and commit the clean output.

2. SemVer must match the change

A breaking public-API change requires a major version bump. "Public" includes anything exported from src/index.tsx and anything that changes the wire format with the native side.

Common breaks to flag:

  • Renamed or retyped fields on exported TypeScript types or interfaces.
  • Renamed string values consumers may pattern-match against.
  • Removed or repurposed enum variants that map to native callback codes.
  • Changed required/optional status on config parameters.

If CHANGELOG.md claims SemVer adherence and the bump doesn't match the change, call it out with the affected symbols and the recommended version.

3. No hardcoded fallbacks in the native layer

The native layer (Kotlin / Swift) is a transport adapter between TypeScript and the platform SDK. It must not:

  • Invent default values for fields the TypeScript layer marks required. Such defaults are unreachable but advertise an optional contract that doesn't exist.
  • Substitute defaults for nullable/optional fields. Either the SDK has its own default (skip the call) or the default belongs in TypeScript.
  • Encode the same default in multiple places. A default as a literal in optString("foo", "BAR"), as an enum in getOrDefault(Foo.BAR), and again as a fallback object is three sources of truth.
  • Hardcode enum names as raw strings (e.g. "SIDELOADED_ONLY"). Use the SDK enum's .name property or avoid manual parsing entirely.

Recommended remediation:

  • For required TypeScript fields: drop the native default; let parsing throw and surface through the existing error path.
  • For optional TypeScript fields: skip the builder/setter call when the field is absent; let the SDK apply its own default.
  • Document the default once — in the TypeScript JSDoc — so the public contract is unambiguous.
4. NativeModules name must be consistent across all layers

The string used to register and look up the native module must agree across three places:

LayerLocationValue
TypeScriptsrc/api/nativeModules.ts — NativeModules.FreeraspReactNative"FreeraspReactNative"
KotlinFreeraspReactNativeModule.kt companion — const val NAME = "FreeraspReactNative""FreeraspReactNative"
iOSRCT_EXPORT_MODULE() / moduleName override in Swift/ObjC bridge"FreeraspReactNative"

Any drift in this string causes the module to be undefined at runtime with no compile-time error.

5. NativeEventEmitter channel data aligned across TypeScript, Kotlin, and Swift

Threats and execution state are delivered through obfuscated event channels. The channel metadata is fetched at runtime from native via two methods:

MethodReturnsKotlinSwift
getThreatChannelData3 strings: [channelName, threatKey, malwareKey]getThreatChannelData() promisegetThreatChannelData(_:resolve:reject:)
getRaspExecutionStateChannelData2 strings: [channelName, key]getRaspExecutionStateChannelData()getRaspExecutionStateChannelData(_:resolve:reject:)

Verify for every change touching these methods:

  • Array length is the same on Kotlin and Swift sides.
  • The semantic order of items in the array is the same on both native sides and matches what src/channels/threat.ts and src/channels/raspExecutionState.ts destructure by index.
  • The TypeScript type declarations in src/types/types.ts (TalsecPlugin interface) reflect any change to the array shape.
6. EventIdentifiers must stay obfuscated — never replace with hardcoded strings

ios/utils/EventIdentifiers.swift derives all channel identifiers at runtime from RandomGenerator.generateRandomIdentifiers(length: N). This obfuscation is intentional and security-relevant.

Hard blocks:

  • Replacing a generatedNumbers[i] reference with a hardcoded string or integer constant.
  • Adding a new identifier slot without expanding length and updating all index references consistently.
  • Using the same index in two different identifier roles (index collision).

The Kotlin side generates its own independent random identifiers via an equivalent mechanism; they are not shared with iOS. This is by design — each process re-generates at launch. Do not attempt to synchronise iOS and Android identifier values.

7. NativeEventEmitter listener registration and cleanup symmetry

Every addListener(channelName, callback) call on NativeEventEmitter(FreeraspReactNative) must have a matching cleanup path.

Check:

  • removeListenerForEvent(channelName) is called in Kotlin's removeListenerForEvent react method, and the matching Swift handler does the same.
  • The returned EmitterSubscription (or the subscription stored in useFreeRasp) is .remove()d on cleanup.
  • Kotlin's addListener increments the listener count so the native module doesn't drop events on multi-listener setups.
Show full SKILL.md (701 more words)Show less
8. Platform-specific features must be documented and gated

Not every API works on both platforms. Some checks are Android-only (e.g. malware detection, package introspection), some iOS-only (e.g. jailbreak sub-checks).

Required:

  • JSDoc states the platform: any type, field, enum variant, or callback that only works on one platform must say so — e.g. /** Android only. No-op on iOS. */
  • Config class isolation: platform-specific config fields belong on the platform-specific config class, not on the shared TalsecConfig.
  • CHANGELOG calls out the platform: bullets for added/changed/removed features must say "(Android)" or "(iOS)" when applicable.

Red flags:

  • A TalsecConfig-level field read only by one of the two native handlers, with no platform marker.
  • A callback that fires only on one platform without a JSDoc note.
  • An enum variant with no native producer on one side.
9. Expo config plugin changes are complete and tested

If plugin/src/ changes:

  • Verify plugin/build/ is regenerated and committed.
  • Confirm the plugin modifies the correct build artifact (AndroidManifest.xml, Info.plist, Gradle properties, etc.) and does not duplicate a modification the user's app.json already handles.
  • The example app example/ should demonstrate or at least not break the plugin path.
10. Tests for new public API

Every newly exported type, enum, or function needs at least:

  • Construction / instantiation test (defaults, required fields).
  • Round-trip serialisation test if the type crosses the JS–native bridge as JSON.
  • Enum-name stability test if the enum maps to native callback codes (catching drift from native renames).

Significant issues — should fix

Single responsibility
  • A function that parses, validates, defaults, and constructs in one body is doing four things. Split.
  • A Kotlin class with parse*, build*, and dispatch* methods is three classes.
  • A TypeScript file that mixes API methods, listener helpers, and type definitions is three modules.
Deduplication

Flag verbatim or near-verbatim repetition, especially:

  • The same (0 until arr.length()).map { arr.getString(it) } pattern repeated for every JSON array field in Kotlin. Extract a helper.
  • The same value ?? defaultValue pattern repeated across multiple config fields. Use a helper or map.
  • Multiple runCatching { Enum.valueOf(s) }.getOrDefault(...) calls in Kotlin. Extract a generic parseEnumOr(default) helper.
Argument style for many-parameter constructors

Constructors with 3+ parameters of similar type should be called with named arguments. Positional calls are swap-bug magnets.

Old API still wired alongside the new one

When deprecating an API path, ensure the new path doesn't quietly run both code paths. Either short-circuit the deprecated path or document the precedence explicitly.

useFreeRasp hook completeness

The hook is the primary consumer entry point. If new config fields or callbacks are added, verify:

  • The hook's internal types accept the new fields.
  • Cleanup logic (in useEffect return) covers any new subscriptions.
  • The hook is re-exported from src/index.tsx.

Style & polish — call out, don't block

  • Trailing newlines, formatting churn: separate from the feature; mention but don't argue.
  • Verbose examples: example code that explicitly sets parameters to their defaults teaches nothing. Either drop the assignment or assign a non-default to demonstrate customisation.
  • Inconsistent terminology: e.g. MalwareConfig vs SuspiciousAppDetectionConfig in one PR is one term too many. Pin it before release.
  • JSDoc consistency: full sentences, end with a period, match the project's existing style.
  • @deprecated discipline: deprecating a field is fine; leaving the constructor accepting it with no warning is inconsistent.
  • PR description: an empty PR body for a release PR is a defect of its own. Aggregate conventional commits into a short summary.
  • Changelog accuracy: every bullet in CHANGELOG.md should be verifiable from git diff <base>..HEAD.
  • Yarn vs npm: this repo uses Yarn. Any instruction in the README or PR description to run npm install is wrong.

Output format

Structure the review as:

markdown
## Summary

<2–3 sentences: what the PR does, overall verdict>

## Blockers / Major issues

### 1. <short title — one line>

<context, citing file:line; show the offending snippet using a code reference>

<concrete remediation>

### 2. ...

## Significant issues

(same shape, less severe)

## Minor / polish

(numbered list, one to three lines each)

## Recommended action

<numbered, ordered list of what must change before merge>

Rules for the report:

  • Cite specific files and line numbers for every issue. When showing existing code, use the startLine:endLine:filepath reference form so the user can click through.
  • Prefer one detailed example over a vague generality; if a pattern repeats, mention it once and list the other locations.
  • Distinguish between "this is wrong" and "I'd prefer this." Flag the first as Major, the second as Polish.
  • Never assert facts about a closed-source SDK without verifying. If the SDK isn't readable from the repo, phrase findings as "verify whether the SDK provides X; if so, do not duplicate it."
  • End with a short, ordered "Recommended action" list — the actual gating items, not a wishlist.

© talsec, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/code-review-react-native of talsec/Free-RASP-ReactNative.

Open the folder on GitHubat commit 0a0f551

Compare with similar skills

Code Review React Native next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Code Review React Native compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Code Review React Native this skilltalsec/Free-RASP-ReactNative175—~3.7kAutomated safety check: PassMIT
Expo Brownfield Integrationmweinbach/agent-coworker1562 repos~900Automated safety check: NotesCustom licence
Simulator Audio E2Ehyochan/react-native-nitro-sound961—~1.1kAutomated safety check: PassMIT
Expo Brownfieldexpo/skills2.7k—~1.4kAutomated safety check: PassMIT
Clerk Expogeekskai/blog103—~2.8kAutomated safety check: NotesMIT
Analyticscli TS SDKLeoYeAI/openclaw-master-skills2.2k—~5.3kAutomated safety check: PassMIT

Similar skills

  • Expo Brownfield Integration

    mweinbach/agent-coworker

    Helps add Expo and React Native to an existing native iOS or Android app, and choose between a prebuilt AAR or XCFramework and a fully integrated build.

    156 GitHub starsUsed in 2 repos~900 tokens
    MobileAuto-check: notes
  • Simulator Audio E2E

    hyochan/react-native-nitro-sound

    Build and run repeatable react-native-nitro-sound recorder/player regression tests on an iOS Simulator or Android emulator, with explicit virtual-device selection, microphone permission, Maestro…

    961 GitHub stars~1.1k tokensUpdated 8 days ago
    MobileAuto-check passed
  • Expo Brownfield

    expo/skills

    Official

    Integrate Expo and React Native into an existing native iOS or Android app.

    2.7k GitHub stars~1.4k tokensUpdated today
    MobileAuto-check passed
  • Clerk Expo

    geekskai/blog

    Add Clerk authentication to Expo and React Native apps using @clerk/expo.

    103 GitHub stars~2.8k tokensUpdated today
    MobileAuto-check: notes
  • Analyticscli TS SDK

    LeoYeAI/openclaw-master-skills

    A skill your agent uses when integrating or upgrading the AnalyticsCLI TypeScript SDK in web, TypeScript, React Native, or Expo apps.

    2.2k GitHub stars~5.3k tokensUpdated 2 mo ago
    MobileAuto-check passed
  • Expo Tailwind Setup

    CherryHQ/cherry-studio-app

    Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling

    4k GitHub starsUsed in 8 repos~3k tokens
    MobileAuto-check passed

Categories

Questions about Code Review React Native

What does Code Review React Native do?

Performs strict code reviews on React Native plugin projects covering TypeScript, the Kotlin (Android) and Swift (iOS) native bridges, and the Expo config plugin. Code Review React Native is an agent skill from talsec/Free-RASP-ReactNative. Performs strict code reviews on React Native plugin projects covering TypeScript, the Kotlin (Android) and Swift (iOS) native bridges, and the Expo config plugin.

When should I use Code Review React Native?

Code Review React Native fits situations like: the user asks to review PR; do a code review; review this code; code review for PRN.

How do I install Code Review React Native in Claude Code?

Run `npx skills add talsec/Free-RASP-ReactNative --skill code-review-react-native -a claude-code`. Or copy the skill folder (.agents/skills/code-review-react-native in talsec/Free-RASP-ReactNative) into .claude/skills/code-review-react-native in your project. Claude Code loads it when a task matches its description.

How do I install Code Review React Native in Codex?

Run `npx skills add talsec/Free-RASP-ReactNative --skill code-review-react-native -a codex`. Or copy the skill folder (.agents/skills/code-review-react-native in talsec/Free-RASP-ReactNative) into .agents/skills/code-review-react-native in your project. Codex loads it when a task matches its description.

Can I use Code Review React Native in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add talsec/Free-RASP-ReactNative --skill code-review-react-native -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/code-review-react-native, .gemini/skills/code-review-react-native, .github/skills/code-review-react-native and .opencode/skills/code-review-react-native in your project.

What does Code Review React Native need to run?

Going by SKILL.md and its folder, Code Review React Native needs the command-line tools its instructions call (git, yarn, gh, tsc and npm).

Does Code Review React Native access the network?

SKILL.md contains no URLs. Its commands use git, gh and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Code Review React Native safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Code Review React Native use?

Code Review React Native is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Code Review React Native use?

About 3.7k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Code Review React Native?

Skills that share tags, products or a category with Code Review React Native: Expo Brownfield Integration (mweinbach/agent-coworker, 156 stars), Simulator Audio E2E (hyochan/react-native-nitro-sound, 961 stars), Expo Brownfield (expo/skills, 2.7k stars) and Clerk Expo (geekskai/blog, 103 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Code Review React Native?

talsec (a GitHub organization) maintains it in talsec/Free-RASP-ReactNative, which has 175 GitHub stars. The repository was last updated on October 5, 2026.

Source: talsec/Free-RASP-ReactNative on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.