Expo Data Fetching
expo/skills
A skill your agent uses when implementing or debugging ANY network request, API call, or data fetching.
A skill your agent uses when implementing or debugging ANY network request, API call, or data fetching.
$ npx skills add CherryHQ/cherry-studio-app --skill native-data-fetching -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install CherryHQ/cherry-studio-app native-data-fetching --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/CherryHQ/cherry-studio-app.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/native-data-fetching .claude/skills/native-data-fetching && rm -rf skills-srcUse ~/.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/
Install the "native-data-fetching" agent skill from https://github.com/CherryHQ/cherry-studio-app/tree/main/.agents/skills/native-data-fetching into .claude/skills/native-data-fetching/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "native-data-fetching", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/CherryHQ/cherry-studio-app/tree/main/.agents/skills/native-data-fetchingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add CherryHQ/cherry-studio-app --skill native-data-fetching -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install CherryHQ/cherry-studio-app native-data-fetching --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/CherryHQ/cherry-studio-app.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/native-data-fetching .agents/skills/native-data-fetching && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "native-data-fetching" agent skill from https://github.com/CherryHQ/cherry-studio-app/tree/main/.agents/skills/native-data-fetching into .agents/skills/native-data-fetching/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "native-data-fetching", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add CherryHQ/cherry-studio-app --skill native-data-fetching -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install CherryHQ/cherry-studio-app native-data-fetching --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/CherryHQ/cherry-studio-app.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/native-data-fetching .cursor/skills/native-data-fetching && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "native-data-fetching" agent skill from https://github.com/CherryHQ/cherry-studio-app/tree/main/.agents/skills/native-data-fetching into .cursor/skills/native-data-fetching/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "native-data-fetching", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/CherryHQ/cherry-studio-app.git --path .agents/skills/native-data-fetching--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add CherryHQ/cherry-studio-app --skill native-data-fetching -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install CherryHQ/cherry-studio-app native-data-fetching --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/CherryHQ/cherry-studio-app.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/native-data-fetching .gemini/skills/native-data-fetching && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "native-data-fetching" agent skill from https://github.com/CherryHQ/cherry-studio-app/tree/main/.agents/skills/native-data-fetching into .gemini/skills/native-data-fetching/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "native-data-fetching", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install CherryHQ/cherry-studio-app native-data-fetchingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add CherryHQ/cherry-studio-app --skill native-data-fetching -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/CherryHQ/cherry-studio-app.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/native-data-fetching .github/skills/native-data-fetching && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "native-data-fetching" agent skill from https://github.com/CherryHQ/cherry-studio-app/tree/main/.agents/skills/native-data-fetching into .github/skills/native-data-fetching/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "native-data-fetching", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add CherryHQ/cherry-studio-app --skill native-data-fetching -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install CherryHQ/cherry-studio-app native-data-fetching --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/CherryHQ/cherry-studio-app.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/native-data-fetching .opencode/skills/native-data-fetching && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "native-data-fetching" agent skill from https://github.com/CherryHQ/cherry-studio-app/tree/main/.agents/skills/native-data-fetching into .opencode/skills/native-data-fetching/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "native-data-fetching", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
native-data-fetchingA skill your agent uses when implementing or debugging ANY network request, API call, or data fetching.
Native Data Fetching is an agent skill from CherryHQ/cherry-studio-app. Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, and Expo Router data loaders (useLoaderData).
Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/expo-router-loaders.md`).
It sits in Development, covering Caching, Error handling and Cross-platform mobile apps. It works with Expo and TanStack. The repository describes itself as: 🍒 This is the mobile version of Cherry Studio. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 172945d. It shows what the files ask for, not the result of running them.
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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).
From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.production.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
TOKEN_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Native Data Fetching loads about 2.9k tokens when it runs, and up to ~5.4k if it reads all its reference files. Until then it costs about 58 tokens; SKILL.md has 400 words of instructions outside code blocks.
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.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
// .env// .env.development// .env.production- Restart the dev server after changing `.env` filesient-side URLs -> EXPO_PUBLIC_ prefix in .env| \-- Multiple environments -> .env.development, .env.production-> Use EXPO*PUBLIC* env vars with .env.development and .env.production files-> Client-safe keys: EXPO*PUBLIC* in .env. Secret keys: non-prefixed env vars in API routes onlyAutomated 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.
The full file from CherryHQ/cherry-studio-app at commit 172945d, republished under its MIT licence (© CherryHQ). 400 words, ~2,911 tokens.
.claude/skills/native-data-fetching/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.You MUST use this skill for ANY networking work including API requests, data fetching, caching, or network debugging.
Consult these resources as needed:
references/
expo-router-loaders.md Route-level data loading with Expo Router loaders (web, SDK 55+)Use this skill when:
useLoaderData, web SDK 55+)Simple GET request:
const fetchUser = async (userId: string) => {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
};POST request with body:
const createUser = async (userData: UserData) => {
const response = await fetch("https://api.example.com/users", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
body: JSON.stringify(userData),
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.message);
}
return response.json();
};Setup:
// app/_layout.tsx
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 60 * 5, // 5 minutes
retry: 2,
},
},
});
export default function RootLayout() {
return (
<QueryClientProvider client={queryClient}>
<Stack />
</QueryClientProvider>
);
}Fetching data:
import { useQuery } from "@tanstack/react-query";
function UserProfile({ userId }: { userId: string }) {
const { data, isLoading, error, refetch } = useQuery({
queryKey: ["user", userId],
queryFn: () => fetchUser(userId),
});
if (isLoading) return <Loading />;
if (error) return <Error message={error.message} />;
return <Profile user={data} />;
}Mutations:
import { useMutation, useQueryClient } from "@tanstack/react-query";
function CreateUserForm() {
const queryClient = useQueryClient();
const mutation = useMutation({
mutationFn: createUser,
onSuccess: () => {
// Invalidate and refetch
queryClient.invalidateQueries({ queryKey: ["users"] });
},
});
const handleSubmit = (data: UserData) => {
mutation.mutate(data);
};
return <Form onSubmit={handleSubmit} isLoading={mutation.isPending} />;
}Comprehensive error handling:
class ApiError extends Error {
constructor(message: string, public status: number, public code?: string) {
super(message);
this.name = "ApiError";
}
}
const fetchWithErrorHandling = async (url: string, options?: RequestInit) => {
try {
const response = await fetch(url, options);
if (!response.ok) {
const error = await response.json().catch(() => ({}));
throw new ApiError(
error.message || "Request failed",
response.status,
error.code
);
}
return response.json();
} catch (error) {
if (error instanceof ApiError) {
throw error;
}
// Network error (no internet, timeout, etc.)
throw new ApiError("Network error", 0, "NETWORK_ERROR");
}
};Retry logic:
const fetchWithRetry = async (
url: string,
options?: RequestInit,
retries = 3
) => {
for (let i = 0; i < retries; i++) {
try {
return await fetchWithErrorHandling(url, options);
} catch (error) {
if (i === retries - 1) throw error;
// Exponential backoff
await new Promise((r) => setTimeout(r, Math.pow(2, i) * 1000));
}
}
};Token management:
import * as SecureStore from "expo-secure-store";
const TOKEN_KEY = "auth_token";
export const auth = {
getToken: () => SecureStore.getItemAsync(TOKEN_KEY),
setToken: (token: string) => SecureStore.setItemAsync(TOKEN_KEY, token),
removeToken: () => SecureStore.deleteItemAsync(TOKEN_KEY),
};
// Authenticated fetch wrapper
const authFetch = async (url: string, options: RequestInit = {}) => {
const token = await auth.getToken();
return fetch(url, {
...options,
headers: {
...options.headers,
Authorization: token ? `Bearer ${token}` : "",
},
});
};Token refresh:
let isRefreshing = false;
let refreshPromise: Promise<string> | null = null;
const getValidToken = async (): Promise<string> => {
const token = await auth.getToken();
if (!token || isTokenExpired(token)) {
if (!isRefreshing) {
isRefreshing = true;
refreshPromise = refreshToken().finally(() => {
isRefreshing = false;
refreshPromise = null;
});
}
return refreshPromise!;
}
return token;
};Check network status:
import NetInfo from "@react-native-community/netinfo";
// Hook for network status
function useNetworkStatus() {
const [isOnline, setIsOnline] = useState(true);
useEffect(() => {
return NetInfo.addEventListener((state) => {
setIsOnline(state.isConnected ?? true);
});
}, []);
return isOnline;
}Offline-first with React Query:
import { onlineManager } from "@tanstack/react-query";
import NetInfo from "@react-native-community/netinfo";
// Sync React Query with network status
onlineManager.setEventListener((setOnline) => {
return NetInfo.addEventListener((state) => {
setOnline(state.isConnected ?? true);
});
});
// Queries will pause when offline and resume when onlineUsing environment variables for API configuration:
Expo supports environment variables with the EXPO_PUBLIC_ prefix. These are inlined at build time and available in your JavaScript code.
// .env
EXPO_PUBLIC_API_URL=https://api.example.com
EXPO_PUBLIC_API_VERSION=v1
// Usage in code
const API_URL = process.env.EXPO_PUBLIC_API_URL;
const fetchUsers = async () => {
const response = await fetch(`${API_URL}/users`);
return response.json();
};Environment-specific configuration:
// .env.development
EXPO_PUBLIC_API_URL=http://localhost:3000
// .env.production
EXPO_PUBLIC_API_URL=https://api.production.comCreating an API client with environment config:
// api/client.ts
const BASE_URL = process.env.EXPO_PUBLIC_API_URL;
if (!BASE_URL) {
throw new Error("EXPO_PUBLIC_API_URL is not defined");
}
export const apiClient = {
get: async <T,>(path: string): Promise<T> => {
const response = await fetch(`${BASE_URL}${path}`);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.json();
},
post: async <T,>(path: string, body: unknown): Promise<T> => {
const response = await fetch(`${BASE_URL}${path}`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.json();
},
};Important notes:
EXPO_PUBLIC_ are exposed to the client bundleEXPO_PUBLIC_ variables—they're visible in the built app.env filesEXPO_PUBLIC_ prefixTypeScript support:
// types/env.d.ts
declare global {
namespace NodeJS {
interface ProcessEnv {
EXPO_PUBLIC_API_URL: string;
EXPO_PUBLIC_API_VERSION?: string;
}
}
}
export {};Cancel on unmount:
useEffect(() => {
const controller = new AbortController();
fetch(url, { signal: controller.signal })
.then((response) => response.json())
.then(setData)
.catch((error) => {
if (error.name !== "AbortError") {
setError(error);
}
});
return () => controller.abort();
}, [url]);With React Query (automatic):
// React Query automatically cancels requests when queries are invalidated
// or components unmountUser asks about networking
|-- Route-level data loading (web, SDK 55+)?
| \-- Expo Router loaders — see references/expo-router-loaders.md
|
|-- Basic fetch?
| \-- Use fetch API with error handling
|
|-- Need caching/state management?
| |-- Complex app -> React Query (TanStack Query)
| \-- Simpler needs -> SWR or custom hooks
|
|-- Authentication?
| |-- Token storage -> expo-secure-store
| \-- Token refresh -> Implement refresh flow
|
|-- Error handling?
| |-- Network errors -> Check connectivity first
| |-- HTTP errors -> Parse response, throw typed errors
| \-- Retries -> Exponential backoff
|
|-- Offline support?
| |-- Check status -> NetInfo
| \-- Queue requests -> React Query persistence
|
|-- Environment/API config?
| |-- Client-side URLs -> EXPO_PUBLIC_ prefix in .env
| |-- Server secrets -> Non-prefixed env vars (API routes only)
| \-- Multiple environments -> .env.development, .env.production
|
\-- Performance?
|-- Caching -> React Query with staleTime
|-- Deduplication -> React Query handles this
\-- Cancellation -> AbortController or React QueryWrong: No error handling
const data = await fetch(url).then((r) => r.json());Right: Check response status
const response = await fetch(url);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();Wrong: Storing tokens in AsyncStorage
await AsyncStorage.setItem("token", token); // Not secure!Right: Use SecureStore for sensitive data
await SecureStore.setItemAsync("token", token);User: "How do I make API calls in React Native?" -> Use fetch, wrap with error handling
User: "Should I use React Query or SWR?" -> React Query for complex apps, SWR for simpler needs
User: "My app needs to work offline" -> Use NetInfo for status, React Query persistence for caching
User: "How do I handle authentication tokens?" -> Store in expo-secure-store, implement refresh flow
User: "API calls are slow" -> Check caching strategy, use React Query staleTime
User: "How do I configure different API URLs for dev and prod?" -> Use EXPOPUBLIC env vars with .env.development and .env.production files
User: "Where should I put my API key?" -> Client-safe keys: EXPOPUBLIC in .env. Secret keys: non-prefixed env vars in API routes only
User: "How do I load data for a page in Expo Router?" -> See references/expo-router-loaders.md for route-level loaders (web, SDK 55+). For native, use React Query or fetch.
© CherryHQ, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in .agents/skills/native-data-fetching of CherryHQ/cherry-studio-app.
Open the folder on GitHubat commit 172945d
We found 15 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 6 other GitHub owners. This page covers the copy in CherryHQ/cherry-studio-app, which our catalogue first saw on October 7, 2026.
Native Data Fetching 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Native Data Fetching this skillCherryHQ/cherry-studio-app | 4k | 6 repos | ~2.9k | Automated safety check: Notes | MIT | |
| Expo Data Fetchingexpo/skills | 2.7k | — | ~3.4k | Automated safety check: Notes | MIT | |
| Adynato Mobile APImajiayu000/claude-skill-registry | 666 | 1 repos | ~2.5k | Automated safety check: Pass | MIT | |
| Jazz UI Developmentgarden-co/classic-jazz | 2.5k | — | ~1.7k | Automated safety check: Pass | MIT | |
| QA Find Bugs Mobilebex-co/beancount-io | 294 | — | ~2.2k | Automated safety check: Notes | MIT | |
| Clerkgeekskai/blog | 103 | 3 repos | ~1.5k | Automated safety check: Pass | MIT |
expo/skills
A skill your agent uses when implementing or debugging ANY network request, API call, or data fetching.
majiayu000/claude-skill-registry
API integration patterns for Adynato mobile apps. An agent skill from majiayu000/claude-skill-registry.
garden-co/classic-jazz
A skill your agent uses when building, debugging, or optimizing Jazz applications.
bex-co/beancount-io
Hunt bugs in the running Beancount mobile app using local Expo MCP on the iPhone 17e simulator, sign in with QAEMAIL and QAPASSWORD, reproduce failures, trace root causes, and deduplicate findings.
geekskai/blog
Clerk authentication router. An agent skill from geekskai/blog.
giuseppe-trisciuoglio/developer-kit
Provides Next.js App Router data fetching patterns including SWR and React Query integration, parallel data fetching, Incremental Static Regeneration (ISR), revalidation strategies, and error…
CherryHQ/cherry-studio-app
Helps understand and write EAS workflow YAML files for Expo projects.
CherryHQ/cherry-studio-app
Complete guide for building beautiful apps with Expo Router.
CherryHQ/cherry-studio-app
Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling
CherryHQ/cherry-studio-app
Opt-in evidence-first causal diagnosis for bugs, browser or app/device failures, flaky behavior, and performance regressions.
CherryHQ/cherry-studio-app
Survey a whole React codebase as a senior React engineer, using React Doctor's scan as evidence, then produce a prioritized audit and self-contained implementation plans for other agents (or cheaper…
CherryHQ/cherry-studio-app
Iterative diagnose-and-fix workflow that repeatedly uses the diagnose skill to find a proven problem, plan the smallest credible improvement, implement it, re-diagnose, and continue until no useful…
Categories
A skill your agent uses when implementing or debugging ANY network request, API call, or data fetching. Native Data Fetching is an agent skill from CherryHQ/cherry-studio-app. Use when implementing or debugging ANY network request, API call, or data fetching.
Native Data Fetching fits situations like: debugging ANY network request; tasks that involve Caching; tasks that involve Error handling.
Run `npx skills add CherryHQ/cherry-studio-app --skill native-data-fetching -a claude-code`. Or copy the skill folder (.agents/skills/native-data-fetching in CherryHQ/cherry-studio-app) into .claude/skills/native-data-fetching in your project. Claude Code loads it when a task matches its description.
Run `npx skills add CherryHQ/cherry-studio-app --skill native-data-fetching -a codex`. Or copy the skill folder (.agents/skills/native-data-fetching in CherryHQ/cherry-studio-app) into .agents/skills/native-data-fetching in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add CherryHQ/cherry-studio-app --skill native-data-fetching -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/native-data-fetching, .gemini/skills/native-data-fetching, .github/skills/native-data-fetching and .opencode/skills/native-data-fetching in your project.
Going by SKILL.md and its folder, Native Data Fetching needs credentials named TOKEN_KEY. Our summary lists: Node.js; A credential in TOKEN_KEY.
SKILL.md names 1 domain. In commands or code: api.production.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Native Data Fetching is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.5k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Native Data Fetching: Expo Data Fetching (expo/skills, 2.7k stars), Adynato Mobile API (majiayu000/claude-skill-registry, 666 stars), Jazz UI Development (garden-co/classic-jazz, 2.5k stars) and QA Find Bugs Mobile (bex-co/beancount-io, 294 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
CherryHQ (a GitHub organization) maintains it in CherryHQ/cherry-studio-app, which has 3,972 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on October 3, 2026.
Source: CherryHQ/cherry-studio-app on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.