{"id":"ce3cbb3a-5124-40a6-b7ad-fd6fbd85cd41","shortId":"qMYucw","kind":"skill","title":"native-data-fetching","tagline":"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).","description":"# Expo Networking\n\n**You MUST use this skill for ANY networking work including API requests, data fetching, caching, or network debugging.**\n\n## References\n\nConsult these resources as needed:\n\n```\nreferences/\n  expo-router-loaders.md   Route-level data loading with Expo Router loaders (web, SDK 55+)\n```\n\n## When to Use\nUse this skill when:\n\n- Implementing API requests\n- Setting up data fetching (React Query, SWR)\n- Using Expo Router data loaders (`useLoaderData`, web SDK 55+)\n- Debugging network failures\n- Implementing caching strategies\n- Handling offline scenarios\n- Authentication/token management\n- Configuring API URLs and environment variables\n\n## Preferences\n\n- Avoid axios, prefer expo/fetch\n\n## Common Issues & Solutions\n\n### 1. Basic Fetch Usage\n\n**Simple GET request**:\n\n```tsx\nconst fetchUser = async (userId: string) => {\n  const response = await fetch(`https://api.example.com/users/${userId}`);\n\n  if (!response.ok) {\n    throw new Error(`HTTP error! status: ${response.status}`);\n  }\n\n  return response.json();\n};\n```\n\n**POST request with body**:\n\n```tsx\nconst createUser = async (userData: UserData) => {\n  const response = await fetch(\"https://api.example.com/users\", {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n      Authorization: `Bearer ${token}`,\n    },\n    body: JSON.stringify(userData),\n  });\n\n  if (!response.ok) {\n    const error = await response.json();\n    throw new Error(error.message);\n  }\n\n  return response.json();\n};\n```\n\n---\n\n### 2. React Query (TanStack Query)\n\n**Setup**:\n\n```tsx\n// app/_layout.tsx\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\n\nconst queryClient = new QueryClient({\n  defaultOptions: {\n    queries: {\n      staleTime: 1000 * 60 * 5, // 5 minutes\n      retry: 2,\n    },\n  },\n});\n\nexport default function RootLayout() {\n  return (\n    <QueryClientProvider client={queryClient}>\n      <Stack />\n    </QueryClientProvider>\n  );\n}\n```\n\n**Fetching data**:\n\n```tsx\nimport { useQuery } from \"@tanstack/react-query\";\n\nfunction UserProfile({ userId }: { userId: string }) {\n  const { data, isLoading, error, refetch } = useQuery({\n    queryKey: [\"user\", userId],\n    queryFn: () => fetchUser(userId),\n  });\n\n  if (isLoading) return <Loading />;\n  if (error) return <Error message={error.message} />;\n\n  return <Profile user={data} />;\n}\n```\n\n**Mutations**:\n\n```tsx\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nfunction CreateUserForm() {\n  const queryClient = useQueryClient();\n\n  const mutation = useMutation({\n    mutationFn: createUser,\n    onSuccess: () => {\n      // Invalidate and refetch\n      queryClient.invalidateQueries({ queryKey: [\"users\"] });\n    },\n  });\n\n  const handleSubmit = (data: UserData) => {\n    mutation.mutate(data);\n  };\n\n  return <Form onSubmit={handleSubmit} isLoading={mutation.isPending} />;\n}\n```\n\n---\n\n### 3. Error Handling\n\n**Comprehensive error handling**:\n\n```tsx\nclass ApiError extends Error {\n  constructor(message: string, public status: number, public code?: string) {\n    super(message);\n    this.name = \"ApiError\";\n  }\n}\n\nconst fetchWithErrorHandling = async (url: string, options?: RequestInit) => {\n  try {\n    const response = await fetch(url, options);\n\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({}));\n      throw new ApiError(\n        error.message || \"Request failed\",\n        response.status,\n        error.code\n      );\n    }\n\n    return response.json();\n  } catch (error) {\n    if (error instanceof ApiError) {\n      throw error;\n    }\n    // Network error (no internet, timeout, etc.)\n    throw new ApiError(\"Network error\", 0, \"NETWORK_ERROR\");\n  }\n};\n```\n\n**Retry logic**:\n\n```tsx\nconst fetchWithRetry = async (\n  url: string,\n  options?: RequestInit,\n  retries = 3\n) => {\n  for (let i = 0; i < retries; i++) {\n    try {\n      return await fetchWithErrorHandling(url, options);\n    } catch (error) {\n      if (i === retries - 1) throw error;\n      // Exponential backoff\n      await new Promise((r) => setTimeout(r, Math.pow(2, i) * 1000));\n    }\n  }\n};\n```\n\n---\n\n### 4. Authentication\n\n**Token management**:\n\n```tsx\nimport * as SecureStore from \"expo-secure-store\";\n\nconst TOKEN_KEY = \"auth_token\";\n\nexport const auth = {\n  getToken: () => SecureStore.getItemAsync(TOKEN_KEY),\n  setToken: (token: string) => SecureStore.setItemAsync(TOKEN_KEY, token),\n  removeToken: () => SecureStore.deleteItemAsync(TOKEN_KEY),\n};\n\n// Authenticated fetch wrapper\nconst authFetch = async (url: string, options: RequestInit = {}) => {\n  const token = await auth.getToken();\n\n  return fetch(url, {\n    ...options,\n    headers: {\n      ...options.headers,\n      Authorization: token ? `Bearer ${token}` : \"\",\n    },\n  });\n};\n```\n\n**Token refresh**:\n\n```tsx\nlet isRefreshing = false;\nlet refreshPromise: Promise<string> | null = null;\n\nconst getValidToken = async (): Promise<string> => {\n  const token = await auth.getToken();\n\n  if (!token || isTokenExpired(token)) {\n    if (!isRefreshing) {\n      isRefreshing = true;\n      refreshPromise = refreshToken().finally(() => {\n        isRefreshing = false;\n        refreshPromise = null;\n      });\n    }\n    return refreshPromise!;\n  }\n\n  return token;\n};\n```\n\n---\n\n### 5. Offline Support\n\n**Check network status**:\n\n```tsx\nimport NetInfo from \"@react-native-community/netinfo\";\n\n// Hook for network status\nfunction useNetworkStatus() {\n  const [isOnline, setIsOnline] = useState(true);\n\n  useEffect(() => {\n    return NetInfo.addEventListener((state) => {\n      setIsOnline(state.isConnected ?? true);\n    });\n  }, []);\n\n  return isOnline;\n}\n```\n\n**Offline-first with React Query**:\n\n```tsx\nimport { onlineManager } from \"@tanstack/react-query\";\nimport NetInfo from \"@react-native-community/netinfo\";\n\n// Sync React Query with network status\nonlineManager.setEventListener((setOnline) => {\n  return NetInfo.addEventListener((state) => {\n    setOnline(state.isConnected ?? true);\n  });\n});\n\n// Queries will pause when offline and resume when online\n```\n\n---\n\n### 6. Environment Variables\n\n**Using environment variables for API configuration**:\n\nExpo supports environment variables with the `EXPO_PUBLIC_` prefix. These are inlined at build time and available in your JavaScript code.\n\n```tsx\n// .env\nEXPO_PUBLIC_API_URL=https://api.example.com\nEXPO_PUBLIC_API_VERSION=v1\n\n// Usage in code\nconst API_URL = process.env.EXPO_PUBLIC_API_URL;\n\nconst fetchUsers = async () => {\n  const response = await fetch(`${API_URL}/users`);\n  return response.json();\n};\n```\n\n**Environment-specific configuration**:\n\n```tsx\n// .env.development\nEXPO_PUBLIC_API_URL=http://localhost:3000\n\n// .env.production\nEXPO_PUBLIC_API_URL=https://api.production.com\n```\n\n**Creating an API client with environment config**:\n\n```tsx\n// api/client.ts\nconst BASE_URL = process.env.EXPO_PUBLIC_API_URL;\n\nif (!BASE_URL) {\n  throw new Error(\"EXPO_PUBLIC_API_URL is not defined\");\n}\n\nexport const apiClient = {\n  get: async <T,>(path: string): Promise<T> => {\n    const response = await fetch(`${BASE_URL}${path}`);\n    if (!response.ok) throw new Error(`HTTP ${response.status}`);\n    return response.json();\n  },\n\n  post: async <T,>(path: string, body: unknown): Promise<T> => {\n    const response = await fetch(`${BASE_URL}${path}`, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify(body),\n    });\n    if (!response.ok) throw new Error(`HTTP ${response.status}`);\n    return response.json();\n  },\n};\n```\n\n**Important notes**:\n\n- Only variables prefixed with `EXPO_PUBLIC_` are exposed to the client bundle\n- Never put secrets (API keys with write access, database passwords) in `EXPO_PUBLIC_` variables—they're visible in the built app\n- Environment variables are inlined at **build time**, not runtime\n- Restart the dev server after changing `.env` files\n- For server-side secrets in API routes, use variables without the `EXPO_PUBLIC_` prefix\n\n**TypeScript support**:\n\n```tsx\n// types/env.d.ts\ndeclare global {\n  namespace NodeJS {\n    interface ProcessEnv {\n      EXPO_PUBLIC_API_URL: string;\n      EXPO_PUBLIC_API_VERSION?: string;\n    }\n  }\n}\n\nexport {};\n```\n\n---\n\n### 7. Request Cancellation\n\n**Cancel on unmount**:\n\n```tsx\nuseEffect(() => {\n  const controller = new AbortController();\n\n  fetch(url, { signal: controller.signal })\n    .then((response) => response.json())\n    .then(setData)\n    .catch((error) => {\n      if (error.name !== \"AbortError\") {\n        setError(error);\n      }\n    });\n\n  return () => controller.abort();\n}, [url]);\n```\n\n**With React Query** (automatic):\n\n```tsx\n// React Query automatically cancels requests when queries are invalidated\n// or components unmount\n```\n\n---\n\n## Decision Tree\n\n```\nUser asks about networking\n  |-- Route-level data loading (web, SDK 55+)?\n  |   \\-- Expo Router loaders — see references/expo-router-loaders.md\n  |\n  |-- Basic fetch?\n  |   \\-- Use fetch API with error handling\n  |\n  |-- Need caching/state management?\n  |   |-- Complex app -> React Query (TanStack Query)\n  |   \\-- Simpler needs -> SWR or custom hooks\n  |\n  |-- Authentication?\n  |   |-- Token storage -> expo-secure-store\n  |   \\-- Token refresh -> Implement refresh flow\n  |\n  |-- Error handling?\n  |   |-- Network errors -> Check connectivity first\n  |   |-- HTTP errors -> Parse response, throw typed errors\n  |   \\-- Retries -> Exponential backoff\n  |\n  |-- Offline support?\n  |   |-- Check status -> NetInfo\n  |   \\-- Queue requests -> React Query persistence\n  |\n  |-- Environment/API config?\n  |   |-- Client-side URLs -> EXPO_PUBLIC_ prefix in .env\n  |   |-- Server secrets -> Non-prefixed env vars (API routes only)\n  |   \\-- Multiple environments -> .env.development, .env.production\n  |\n  \\-- Performance?\n      |-- Caching -> React Query with staleTime\n      |-- Deduplication -> React Query handles this\n      \\-- Cancellation -> AbortController or React Query\n```\n\n## Common Mistakes\n\n**Wrong: No error handling**\n\n```tsx\nconst data = await fetch(url).then((r) => r.json());\n```\n\n**Right: Check response status**\n\n```tsx\nconst response = await fetch(url);\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst data = await response.json();\n```\n\n**Wrong: Storing tokens in AsyncStorage**\n\n```tsx\nawait AsyncStorage.setItem(\"token\", token); // Not secure!\n```\n\n**Right: Use SecureStore for sensitive data**\n\n```tsx\nawait SecureStore.setItemAsync(\"token\", token);\n```\n\n## Example Invocations\n\nUser: \"How do I make API calls in React Native?\"\n-> Use fetch, wrap with error handling\n\nUser: \"Should I use React Query or SWR?\"\n-> React Query for complex apps, SWR for simpler needs\n\nUser: \"My app needs to work offline\"\n-> Use NetInfo for status, React Query persistence for caching\n\nUser: \"How do I handle authentication tokens?\"\n-> Store in expo-secure-store, implement refresh flow\n\nUser: \"API calls are slow\"\n-> Check caching strategy, use React Query staleTime\n\nUser: \"How do I configure different API URLs for dev and prod?\"\n-> Use EXPO*PUBLIC* env vars with .env.development and .env.production files\n\nUser: \"Where should I put my API key?\"\n-> Client-safe keys: EXPO*PUBLIC* in .env. Secret keys: non-prefixed env vars in API routes only\n\nUser: \"How do I load data for a page in Expo Router?\"\n-> See references/expo-router-loaders.md for route-level loaders (web, SDK 55+). For native, use React Query or fetch.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["native","data","fetching","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-native-data-fetching","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/native-data-fetching","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34666 github stars · SKILL.md body (11,671 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T06:51:37.306Z","embedding":null,"createdAt":"2026-04-18T21:41:16.709Z","updatedAt":"2026-04-23T06:51:37.306Z","lastSeenAt":"2026-04-23T06:51:37.306Z","tsv":"'/netinfo':542,581 '/users':174,666 '/users/$':145 '0':382,400 '1':126,415 '1000':220,429 '2':200,226,427 '3':308,396 '3000':680 '4':430 '5':222,223,528 '55':74,100,924,1241 '6':605 '60':221 '7':863 'abortcontrol':874,1029 'aborterror':888 'access':796 'api':13,20,47,83,113,612,639,644,651,655,664,677,684,689,701,711,792,833,854,859,934,1010,1099,1160,1177,1199,1217 'api.example.com':144,173,641 'api.example.com/users':172 'api.example.com/users/$':143 'api.production.com':686 'api/client.ts':695 'apicli':718 'apierror':316,331,355,368,379 'app':809,942,1122,1129 'app/_layout.tsx':207 'application/json':181,762 'ask':914,1282 'async':136,165,334,390,471,503,659,720,742 'asyncstorag':1073 'asyncstorage.setitem':1076 'auth':446,450 'auth.gettoken':479,508 'authent':431,466,953,1148 'authentication/token':110 'authfetch':470 'author':182,486 'automat':897,901 'avail':630 'avoid':119 'await':141,170,192,342,350,406,420,478,507,662,727,751,1042,1055,1067,1075,1088 'axio':120 'backoff':419,981 'base':697,704,729,753 'basic':127,930 'bearer':183,488 'bodi':161,185,746,763,765 'boundari':1290 'build':627,815 'built':808 'bundl':788 'cach':26,51,105,1018,1142,1165 'caching/state':939 'call':14,1100,1161 'cancel':865,866,902,1028 'catch':352,363,410,884 'chang':824 'check':531,969,984,1049,1164 'clarif':1284 'class':315 'clear':1257 'client':233,690,787,995,1202 'client-saf':1201 'client-sid':994 'code':326,634,649 'common':123,1033 'communiti':541,580 'complex':941,1121 'compon':909 'comprehens':311 'config':693,993 'configur':112,613,672,1175 'connect':970 'const':134,139,163,168,190,213,247,281,284,296,332,340,348,388,443,449,469,476,501,505,549,650,657,660,696,717,725,749,871,1040,1053,1065 'constructor':319 'consult':56 'content':179,760 'content-typ':178,759 'control':872 'controller.abort':892 'controller.signal':878 'cover':18 'creat':687 'createus':164,288 'createuserform':280 'criteria':1293 'custom':951 'data':3,16,32,49,66,87,95,236,248,271,298,301,920,1041,1066,1086,1225 'databas':797 'debug':9,54,101 'decis':911 'declar':846 'dedupl':1023 'default':228 'defaultopt':217 'defin':715 'describ':1261 'dev':821,1180 'differ':1176 'env':636,825,1002,1008,1186,1208,1214 'env.development':674,1015,1189 'env.production':681,1016,1191 'environ':116,606,609,616,670,692,810,1014,1273 'environment-specif':669,1272 'environment/api':992 'error':24,151,153,191,196,250,263,265,309,312,318,349,364,366,370,372,381,384,411,417,708,736,770,885,890,936,965,968,973,978,1037,1062,1108 'error.code':360 'error.message':197,267,356 'error.name':887 'etc':376 'exampl':1092 'expert':1278 'expo':30,35,69,93,440,614,620,637,642,675,682,709,781,800,839,852,857,925,957,998,1153,1184,1205,1230 'expo-router-loaders.md':62 'expo-secure-stor':439,956,1152 'expo/fetch':122 'exponenti':418,980 'export':227,448,716,862 'expos':784 'extend':317 'fail':358 'failur':103 'fals':495,521 'fetch':4,17,19,50,88,128,142,171,235,343,467,481,663,728,752,875,931,933,1043,1056,1105,1248 'fetchus':135,257,658 'fetchwitherrorhandl':333,407 'fetchwithretri':389 'file':826,1192 'final':519 'first':565,971 'flow':964,1158 'form':303 'function':229,242,279,547 'get':131,719 'gettoken':451 'getvalidtoken':502 'global':847 'handl':25,107,310,313,937,966,1026,1038,1109,1147 'handlesubmit':297,305 'header':177,484,758 'hook':543,952 'http':152,737,771,972,1063 'implement':7,82,104,962,1156 'import':208,238,274,435,535,570,574,775 'includ':46 'inlin':625,813 'input':1287 'instanceof':367 'interfac':850 'internet':374 'invalid':290,907 'invoc':1093 'isload':249,260,306 'isonlin':550,562 'isrefresh':494,514,515,520 'issu':124 'istokenexpir':511 'javascript':633 'json.stringify':186,764 'key':445,454,460,465,793,1200,1204,1210 'let':398,493,496 'level':65,919,1237 'limit':1249 'load':67,921,1224 'loader':33,71,96,927,1238 'localhost':679 'logic':386 'make':1098 'manag':111,433,940 'match':1258 'math.pow':426 'messag':266,320,329 'method':175,756 'minut':224 'miss':1295 'mistak':1034 'multipl':1013 'must':38 'mutat':272,285 'mutation.ispending':307 'mutation.mutate':300 'mutationfn':287 'namespac':848 'nativ':2,540,579,1103,1243 'native-data-fetch':1 'need':60,938,948,1126,1130 'netinfo':536,575,986,1135 'netinfo.addeventlistener':556,591 'network':11,36,44,53,102,371,380,383,532,545,586,916,967 'never':789 'new':150,195,215,354,378,421,707,735,769,873,1061 'nodej':849 'non':1006,1212 'non-prefix':1005,1211 'note':776 'null':499,500,523 'number':324 'offlin':27,108,529,564,600,982,1133 'offline-first':563 'onlin':604 'onlinemanag':571 'onlinemanager.seteventlistener':588 'onsubmit':304 'onsuccess':289 'option':337,345,393,409,474,483 'options.headers':485 'output':1267 'page':1228 'pars':974 'password':798 'path':722,731,744,755 'paus':598 'perform':1017 'permiss':1288 'persist':991,1140 'post':158,176,741,757 'prefer':118,121 'prefix':622,779,841,1000,1007,1213 'process.env.expo':653,699 'processenv':851 'prod':1182 'profil':269 'promis':422,498,504,724,748 'public':322,325,621,638,643,654,676,683,700,710,782,801,840,853,858,999,1185,1206 'put':790,1197 'queri':22,90,202,204,218,568,584,596,896,900,905,944,946,990,1020,1025,1032,1115,1119,1139,1169,1246 'querycli':209,214,216,234,282 'queryclient.invalidatequeries':293 'queryclientprovid':210,232 'queryfn':256 'querykey':253,294 'queue':987 'r':423,425,1046 'r.json':1047 're':804 'react':21,89,201,539,567,578,583,895,899,943,989,1019,1024,1031,1102,1114,1118,1138,1168,1245 'react-native-commun':538,577 'refer':55,61 'references/expo-router-loaders.md':929,1233 'refetch':251,292 'refresh':491,961,963,1157 'refreshpromis':497,517,522,525 'refreshtoken':518 'removetoken':462 'request':12,48,84,132,159,357,864,903,988 'requestinit':338,394,475 'requir':1286 'resourc':58 'respons':140,169,341,661,726,750,880,975,1050,1054 'response.json':157,193,199,351,362,668,740,774,881,1068 'response.ok':148,189,347,733,767,1059 'response.status':155,359,738,772,1064 'restart':819 'resum':602 'retri':225,385,395,402,414,979 'return':156,198,231,261,264,268,302,361,405,480,524,526,555,561,590,667,739,773,891 'review':1279 'right':1048,1081 'rootlayout':230 'rout':64,834,918,1011,1218,1236 'route-level':63,917,1235 'router':31,70,94,926,1231 'runtim':818 'safe':1203 'safeti':1289 'scenario':109 'scope':1260 'sdk':73,99,923,1240 'secret':791,831,1004,1209 'secur':441,958,1080,1154 'securestor':437,1083 'securestore.deleteitemasync':463 'securestore.getitemasync':452 'securestore.setitemasync':458,1089 'see':928,1232 'sensit':1085 'server':822,829,1003 'server-sid':828 'set':85 'setdata':883 'seterror':889 'setisonlin':551,558 'setonlin':589,593 'settimeout':424 'settoken':455 'setup':205 'side':830,996 'signal':877 'simpl':130 'simpler':947,1125 'skill':41,80,1252 'skill-native-data-fetching' 'slow':1163 'solut':125 'source-sickn33' 'specif':671,1274 'staletim':219,1022,1170 'state':557,592 'state.isconnected':559,594 'status':154,323,533,546,587,985,1051,1137 'stop':1280 'storag':955 'store':442,959,1070,1150,1155 'strategi':106,1166 'string':138,246,321,327,336,392,457,473,723,745,856,861 'substitut':1270 'success':1292 'super':328 'support':28,530,615,843,983 'swr':23,91,949,1117,1123 'sync':582 'tanstack':203,945 'tanstack/react-query':212,241,278,573 'task':1256 'test':1276 'this.name':330 'throw':149,194,353,369,377,416,706,734,768,976,1060 'time':628,816 'timeout':375 'token':184,432,444,447,453,456,459,461,464,477,487,489,490,506,510,512,527,954,960,1071,1077,1078,1090,1091,1149 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'treat':1265 'tree':912 'tri':339,404 'true':516,553,560,595 'tsx':133,162,206,237,273,314,387,434,492,534,569,635,673,694,844,869,898,1039,1052,1074,1087 'type':180,761,977 'types/env.d.ts':845 'typescript':842 'unknown':747 'unmount':868,910 'url':114,335,344,391,408,472,482,640,652,656,665,678,685,698,702,705,712,730,754,855,876,893,997,1044,1057,1178 'usag':129,647 'use':5,39,77,78,92,608,835,932,1082,1104,1113,1134,1167,1183,1244,1250 'useeffect':554,870 'useloaderdata':34,97 'usemut':275,286 'usenetworkstatus':548 'usequeri':239,252 'usequerycli':276,283 'user':254,270,295,913,1094,1110,1127,1143,1159,1171,1193,1220 'userdata':166,167,187,299 'userid':137,146,244,245,255,258 'userprofil':243 'usest':552 'v1':646 'valid':1275 'var':1009,1187,1215 'variabl':117,607,610,617,778,802,811,836 'version':645,860 'visibl':805 'web':72,98,922,1239 'without':837 'work':45,1132 'wrap':1106 'wrapper':468 'write':795 'wrong':1035,1069","prices":[{"id":"788df9f9-d224-49db-85a8-5b2f973b6ea7","listingId":"ce3cbb3a-5124-40a6-b7ad-fd6fbd85cd41","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:41:16.709Z"}],"sources":[{"listingId":"ce3cbb3a-5124-40a6-b7ad-fd6fbd85cd41","source":"github","sourceId":"sickn33/antigravity-awesome-skills/native-data-fetching","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/native-data-fetching","isPrimary":false,"firstSeenAt":"2026-04-18T21:41:16.709Z","lastSeenAt":"2026-04-23T06:51:37.306Z"}],"details":{"listingId":"ce3cbb3a-5124-40a6-b7ad-fd6fbd85cd41","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"native-data-fetching","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34666,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-23T06:41:03Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"0abebd8e602ce5be4ec11967655570d3a7612eed","skill_md_path":"skills/native-data-fetching/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/native-data-fetching"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"native-data-fetching","license":"MIT","description":"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)."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/native-data-fetching"},"updatedAt":"2026-04-23T06:51:37.306Z"}}