Agent skill

Community Migration

by jingjing2222 in jingjing2222/react-native-nitro-geolocation

Migrate React Native apps from @react-native-community/geolocation to react-native-nitro-geolocation.

MITAuto-check passedMobile

Install Community Migration

skills CLI
$ npx skills add jingjing2222/react-native-nitro-geolocation --skill community-migration -a claude-code

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

GitHub CLI
$ gh skill install jingjing2222/react-native-nitro-geolocation community-migration --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/jingjing2222/react-native-nitro-geolocation.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/community-migration .claude/skills/community-migration && 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
community-migration
GitHub stars
115
Token cost
~3.5k tokens
SKILL.md length
1,406 words
Files
3 (incl. scripts)
Skills in repo
2
Repo updated
First seen
Licence
MIT

At a glance

Migrate React Native apps from @react-native-community/geolocation to react-native-nitro-geolocation.

  • Works in 2 steps: Bootstrap safely to /compat so the app… → Refactor from /compat to the recommended…
  • Installing the Nitro packages
  • SKILL.md covers Workflow, Docs Reference, Best Practice Target and Selection Criteria, plus 5 more sections
  • Runs JavaScript scripts from its folder; calls node, curl and rg; reaches react-native-nitro-geolocation.pages.dev

What it does

Community Migration is an agent skill from jingjing2222/react-native-nitro-geolocation. Migrate React Native apps from @react-native-community/geolocation to react-native-nitro-geolocation. Use when installing the Nitro packages, running the bundled compat bootstrap codemod, removing @react-native-community/geolocation, then refactoring community-compatible call sites to Promise functions, requestPermission, setConfiguration, useWatchPosition, watchPosition, and unwatch.

Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including scripts (for example `agents/openai.yaml`).

It sits in Mobile, covering Cross-platform mobile apps, Refactoring and Code migrations. It works with React Native, React, Android and iOS. The repository describes itself as: A React Native Geolocation module Using Nitro. The licence is MIT.

When your agent uses it

  • Installing the Nitro packages
  • Running the bundled compat bootstrap codemod
  • Removing @react-native-community/geolocation
  • Then refactoring community-compatible call sites to Promise functions

Example prompts

  • “/community-migration”

Requirements

  • Node.js

Workflow steps

2 steps, taken from the first numbered list in SKILL.md.

  1. Bootstrap safely to /compat so the app stops depending on
  2. Refactor from /compat to the recommended API shape.

What it can do on your machine

Read from SKILL.md and the folder at commit 89704cf. 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

    Ships 1 file in scripts/ (JavaScript), which the agent can run.

    Shell commands in SKILL.md call:

    • node
    • curl
    • rg
    • pnpm
    • npm
    • bun
    • yarn

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

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • react-native-nitro-geolocation.pages.dev

    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

Community Migration loads about 3.5k tokens when it runs. Until then it costs about 102 tokens; SKILL.md has 1,406 words of instructions outside code blocks.

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

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); the scripts in this folder are not scanned.

SKILL.md

The full file from jingjing2222/react-native-nitro-geolocation at commit 89704cf, republished under its MIT licence (© jingjing2222). 1,406 words, ~3,461 tokens.

Download SKILL.mdSave it as .claude/skills/community-migration/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
community-migration
description
Migrate React Native apps from @react-native-community/geolocation to react-native-nitro-geolocation. Use when installing the Nitro packages, running the bundled compat bootstrap codemod, removing @react-native-community/geolocation, then refactoring community-compatible call sites to Promise functions, requestPermission, setConfiguration, useWatchPosition, watchPosition, and unwatch.

Community Geolocation Migration

Use a two-phase migration:

  1. Bootstrap safely to /compat so the app stops depending on @react-native-community/geolocation.
  2. Refactor from /compat to the recommended API shape.

Do not start by hand-converting every callback call site. First make the mechanical package/import migration small and reversible, verify it, then do the semantic API refactor.

Workflow

  1. Inspect the target app root and check the worktree state.
  2. Resolve scripts/migrate-to-compat.mjs relative to this SKILL.md.
  3. Run a dry run from the target app root:
    bash
    node <skill-dir>/scripts/migrate-to-compat.mjs --root <app-root> --dry-run
  4. If the dry run is expected, run it for real:
    bash
    node <skill-dir>/scripts/migrate-to-compat.mjs --root <app-root>
    The script detects packageManager or lockfiles, installs missing react-native-nitro-modules and react-native-nitro-geolocation, rewrites @react-native-community/geolocation import sources to react-native-nitro-geolocation/compat, removes @react-native-community/geolocation, and prints package-manager-specific validation commands that exist in the app's package.json.
  5. Run the printed validation commands. Do not hardcode yarn, npm, pnpm, or bun; use the detected package manager and only scripts that exist.
  6. Refresh the public docs context when network is available:
    bash
    curl -fsSL https://react-native-nitro-geolocation.pages.dev/llms.txt
    curl -fsSL https://react-native-nitro-geolocation.pages.dev/llms-full.txt
    Read llms.txt first as the docs index. Use llms-full.txt only when you need exact API names, option semantics, or examples for the API, Compat API, quick start, or platform setup. If the app already pins an older react-native-nitro-geolocation version, confirm an API exists in node_modules/react-native-nitro-geolocation or the installed package types before using docs-only APIs.
  7. Find remaining community geolocation usage:
    bash
    rg "@react-native-community/geolocation|react-native-nitro-geolocation/compat|setRNConfiguration|requestAuthorization|watchPosition|clearWatch|stopObserving|navigator\\.geolocation"
    Treat navigator.geolocation as a manual-review compatibility site, not as the primary migration scope.
  8. Inspect each call site before refactoring. Identify whether it is in a React function component, class component, hook, service module, background task, or test.
  9. Replace compat imports with named imports from react-native-nitro-geolocation. Remove Geolocation default-object usage when the migrated file no longer needs it.
  10. Convert one-shot and permission APIs to async/await or explicit Promise chains. Preserve existing loading, state, and error behavior.
  11. Migrate watches to useWatchPosition only where React hook rules allow it. Use watchPosition plus unwatch for non-component code, class components, callbacks, conditionals, and services.
  12. Flag unsupported or semantic changes in comments or the final report instead of guessing.
  13. Run the target app's relevant detected validation commands again. If validating an actual migrated app flow on device, use agent-device when available.

Docs Reference

Use these docs endpoints as the source of truth during the API refactor:

  • https://react-native-nitro-geolocation.pages.dev/llms.txt - concise index of available docs pages.
  • https://react-native-nitro-geolocation.pages.dev/llms-full.txt - complete rendered docs content for agent consumption.

Prefer llms.txt for navigation and llms-full.txt for exact API details. Do not paste or load the full docs into the final answer; use them to check facts before editing. If network is unavailable, fall back to local package docs, README files, and TypeScript declarations in the installed package.

Best Practice Target

The final migration is not just "no type errors." Prefer this target state:

  • No app runtime imports from @react-native-community/geolocation, navigator.geolocation, or react-native-nitro-geolocation/compat. Keep /compat only in deliberate compatibility examples, tests, or migration fallback code the user explicitly wants to preserve.
  • Configure once near app startup with setConfiguration(). Do not leave setRNConfiguration() or skipPermissionRequests in migrated runtime code.
  • Use explicit permission flow. Use checkPermission() only to read status without prompting; call requestPermission() from a user-understandable app moment before location work needs permission.
  • Use Promise APIs for one-shot work. Prefer getCurrentPosition() when the app needs a fresh position, and getLastKnownPosition() only for cache-first UI where stale data is acceptable.
  • Use lifecycle-safe watches. In function components or custom hooks, prefer useWatchPosition({ enabled }); outside hook-safe code, use watchPosition() with scoped unwatch(token) cleanup.
  • Use explicit accuracy presets instead of enableHighAccuracy. Preserve existing timeout, distance, interval, and cache semantics unless the old code was clearly relying on deprecated defaults.
  • Keep permission, provider/settings, and watch cleanup behavior visible in the code. Do not hide prompts or global cleanup in utility functions unless that is already the app's architecture.
  • Use typed errors where handling is specific. Match on LocationErrorCodes for permission denied, timeout, settings-not-satisfied, or provider/setup failures instead of parsing error messages.

Selection Criteria

Apply these criteria at each call site, in this order:

  1. Preserve user-visible behavior first: same trigger, same loading state, same success/error UI, same cleanup timing.
  2. Respect React rules: never introduce hooks in classes, callbacks, conditionals, loops, services, or non-React modules.
  3. Prefer the narrowest lifecycle: hook-managed watch for component state, token-managed watch for services, one-shot Promise for button/request flows.
  4. Prefer explicit user consent: do not convert old implicit permission behavior into an app-start permission prompt.
  5. Prefer battery-aware defaults: only request high accuracy, frequent intervals, background updates, or settings dialogs when the old code or app feature justifies it.
  6. Prefer type-safe function names at module boundaries: avoid passing a Geolocation object through app code after refactoring.

Use this API choice table:

Legacy patternTargetChoose it whenAvoid it when
getCurrentPosition(success, error, options)await getCurrentPosition(options)A user action or flow needs a fresh position.The UI can start from cached location only; consider getLastKnownPosition().
Cached/stale startup read via maximumAgeawait getLastKnownPosition(options)Startup UI, stale-while-refresh, or cache-only flows can tolerate no fresh request.The feature needs a fresh fix or should prompt provider/settings resolution.
requestAuthorization(success, error)await requestPermission()The app is ready to show the native permission prompt.You only need to display current status; use checkPermission().
setRNConfiguration(config)setConfiguration(config)App startup or native bootstrap code sets global location config once.A screen-level call would repeatedly mutate global config.
watchPosition in a function componentuseWatchPosition({ enabled, ...options })Position drives React render state and the call can be at hook-safe top level.The code is a class component, event callback, conditional branch, or service.
watchPosition in services/classes/taskswatchPosition(...) + unwatch(token)A non-React lifecycle owns the subscription.A React function component can express the lifecycle with enabled.
clearWatch(id)unwatch(token)Stopping one known watch.The old code intentionally stopped every watcher; review stopObserving().
enableHighAccuracy: trueaccuracy: { android: "high", ios: "best" }The feature needs precise location.Low-power or approximate location is enough.
Android precise flow that can fail due to settingsgetLocationAvailability() / requestLocationSettings() before location requestThe UX can ask users to enable provider/settings for navigation or precise location.Passive/background or approximate flows should not interrupt users.
Show full SKILL.md (406 more words)Show less

Import Patterns

The bootstrap script handles this mechanical source rewrite:

ts
import Geolocation from "@react-native-community/geolocation";

to:

ts
import Geolocation from "react-native-nitro-geolocation/compat";

After verification, refactor compat imports to named imports:

ts
import {
  getCurrentPosition,
  requestPermission,
  setConfiguration,
  useWatchPosition,
  watchPosition,
  unwatch
} from "react-native-nitro-geolocation";

Import only the symbols each file needs.

navigator.geolocation usage is reported by the script but not rewritten. It needs manual inspection because it is often a global shim or browser fallback.

API Mappings

getCurrentPosition

Before:

ts
Geolocation.getCurrentPosition(
  (position) => setPosition(position),
  (error) => setError(error),
  { enableHighAccuracy: true, timeout: 15000 }
);

After:

ts
try {
  const position = await getCurrentPosition({
    accuracy: { android: "high", ios: "best" },
    timeout: 15000
  });
  setPosition(position);
} catch (error) {
  setError(error);
}

If the containing function cannot become async, keep the Promise chain:

ts
getCurrentPosition(options).then(onSuccess).catch(onError);
requestAuthorization

Replace requestAuthorization(success?, error?) with requestPermission(). Move success callback behavior after a granted result and move error callback behavior into catch.

ts
const status = await requestPermission();
if (status === "granted") {
  onGranted();
}
setRNConfiguration

Replace setRNConfiguration with setConfiguration at app startup.

ts
setConfiguration({
  authorizationLevel: "whenInUse",
  enableBackgroundLocationUpdates: false,
  locationProvider: "auto"
});

Do not migrate skipPermissionRequests; there is no equivalent because permission requests must be explicit through requestPermission().

watchPosition in React Components

Use useWatchPosition in function components or custom hooks only. Preserve the old start/stop condition through enabled.

Before:

tsx
useEffect(() => {
  const watchId = Geolocation.watchPosition(onPosition, onError, {
    enableHighAccuracy: true,
    distanceFilter: 10
  });

  return () => Geolocation.clearWatch(watchId);
}, []);

After:

tsx
const { position, error, isWatching } = useWatchPosition({
  enabled: true,
  accuracy: { android: "high", ios: "best" },
  distanceFilter: 10
});

Wire position, error, and isWatching into the component's existing state or render path. If callbacks perform side effects, add a separate useEffect that reacts to position or error.

watchPosition Outside Hook-Safe Code

Use the low-level watch function outside function component top level:

ts
const token = watchPosition(onPosition, onError, {
  accuracy: { android: "high", ios: "best" },
  distanceFilter: 10
});

unwatch(token);

Replace clearWatch(watchId) with unwatch(token). Keep stopObserving() only when the old code intentionally stopped all geolocation subscriptions; otherwise prefer targeted unwatch(token).

Options

  • Replace enableHighAccuracy: true with accuracy: { android: "high", ios: "best" }.
  • For enableHighAccuracy: false, prefer omitting accuracy unless the old code clearly required reduced precision. If reduced precision matters, choose an explicit preset and note the semantic decision.
  • Preserve timeout, maximumAge, distanceFilter, interval, fastestInterval, and useSignificantChanges when present.
  • Prefer platform options such as granularity, waitForAccurateLocation, activityType, and pausesLocationUpdatesAutomatically only when the migrated code already has an equivalent requirement.

Do Not Guess

Flag these for the user instead of silently rewriting:

  • Code that relies on skipPermissionRequests.
  • Class components where a hook migration would require a component refactor.
  • Watch callbacks with side effects that need ordering guarantees.
  • Global navigator.geolocation monkey patches.
  • Tests that assert exact legacy callback timing or watch id types.
  • Permission flows that depend on iOS "always" vs "when in use" copy or timing.

Verification

Use the target app's detected package manager and existing scripts. The bootstrap script prints commands for available typecheck, lint, and test scripts, for example pnpm typecheck, npm run lint, bun run test, or yarn test.

Do not invent missing scripts. If a project has no standard validation scripts, run the nearest equivalent documented by that app. For device-sensitive behavior, verify at least one permission request, one current-position request, and one watch start/stop flow on iOS or Android.

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

Files

SKILL.md and 2 other files (scripts) in skills/community-migration of jingjing2222/react-native-nitro-geolocation.

  • SKILL.md
  • agents/openai.yaml
  • scripts/migrate-to-compat.mjs

Open the folder on GitHubat commit 89704cf

Compare with similar skills

Community Migration 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.

Community Migration compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Community Migration this skilljingjing2222/react-native-nitro-geolocation115—~3.5kAutomated safety check: PassMIT
Code Guidelinesgetsentry/sentry-react-native1.8k—~3.2kAutomated safety check: PassMIT
Screenmapaleqsio/screenmap244—~7.2kAutomated safety check: PassMIT
ThemingCode-with-Beto/skills140—~2.5kAutomated safety check: PassNone
Upgrade Rn Versionbrandingbrand/flagship165—~3.7kAutomated safety check: PassMIT
Upgrade React NativeShopify/flash-list7.2k—~1.9kAutomated safety check: PassMIT

Similar skills

  • Code Guidelines

    getsentry/sentry-react-native

    Official

    Enforce Sentry React Native SDK code guidelines for implementation, refactoring, and review.

    1.8k GitHub stars~3.2k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Screenmap

    aleqsio/screenmap

    Generate a visual navigation map of an Expo / React Native or NativeScript app.

    244 GitHub stars~7.2k tokensUpdated 6 days ago
    MobileAuto-check passed
  • Theming

    Code-with-Beto/skills

    Scaffold a unified, cross-platform color theme system into an Expo Router app.

    140 GitHub stars~2.5k tokensUpdated 3 mo ago
    MobileAuto-check passed
  • Upgrade Rn Version

    brandingbrand/flagship

    Adopt a new stable React Native minor into Flagship Code. An agent skill from brandingbrand/flagship.

    165 GitHub stars~3.7k tokensUpdated 9 days ago
    MobileAuto-check passed
  • Upgrade React Native

    Shopify/flash-list

    Official

    Upgrade the React Native fixture app to a new version. An agent skill from Shopify/flash-list.

    7.2k GitHub stars~1.9k tokensUpdated 9 days ago
    MobileAuto-check passed
  • Fishjam React Native Client

    software-mansion-labs/skills

    React Native / Expo SDK for Fishjam — video/audio streaming on iOS and Android.

    291 GitHub stars~1.9k tokensUpdated 13 days ago
    MobileAuto-check passed

More from jingjing2222/react-native-nitro-geolocation

  • Service Migration

    jingjing2222/react-native-nitro-geolocation

    Migrate React Native apps directly from react-native-geolocation-service to react-native-nitro-geolocation without using /compat.

    115 GitHub stars~2.3k tokensUpdated 27 days ago
    Auto-check passed

Questions about Community Migration

What does Community Migration do?

Migrate React Native apps from @react-native-community/geolocation to react-native-nitro-geolocation. Community Migration is an agent skill from jingjing2222/react-native-nitro-geolocation. Migrate React Native apps from @react-native-community/geolocation to react-native-nitro-geolocation.

When should I use Community Migration?

Community Migration fits situations like: installing the Nitro packages; running the bundled compat bootstrap codemod; removing @react-native-community/geolocation; then refactoring community-compatible call sites to Promise functions.

How do I install Community Migration in Claude Code?

Run `npx skills add jingjing2222/react-native-nitro-geolocation --skill community-migration -a claude-code`. Or copy the skill folder (skills/community-migration in jingjing2222/react-native-nitro-geolocation) into .claude/skills/community-migration in your project. Claude Code loads it when a task matches its description.

How do I install Community Migration in Codex?

Run `npx skills add jingjing2222/react-native-nitro-geolocation --skill community-migration -a codex`. Or copy the skill folder (skills/community-migration in jingjing2222/react-native-nitro-geolocation) into .agents/skills/community-migration in your project. Codex loads it when a task matches its description.

Can I use Community Migration 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 jingjing2222/react-native-nitro-geolocation --skill community-migration -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/community-migration, .gemini/skills/community-migration, .github/skills/community-migration and .opencode/skills/community-migration in your project.

What does Community Migration need to run?

Going by SKILL.md and its folder, Community Migration needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node, curl, rg, pnpm, npm and bun). Our summary lists: Node.js.

Does Community Migration access the network?

SKILL.md names 1 domain. In commands or code: react-native-nitro-geolocation.pages.dev; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Community Migration 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Community Migration use?

Community Migration 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 Community Migration use?

About 3.5k tokens (SKILL.md is roughly 14k 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 Community Migration?

Skills that share tags, products or a category with Community Migration: Code Guidelines (getsentry/sentry-react-native, 1.8k stars), Screenmap (aleqsio/screenmap, 244 stars), Theming (Code-with-Beto/skills, 140 stars) and Upgrade Rn Version (brandingbrand/flagship, 165 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Community Migration?

jingjing2222 (a GitHub user) maintains it in jingjing2222/react-native-nitro-geolocation, which has 115 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on September 13, 2026.

Source: jingjing2222/react-native-nitro-geolocation on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.