{"id":"2b875a7a-c17c-43ab-9dc0-eaf331b87558","shortId":"rGjNZB","kind":"skill","title":"cc-skill-backend-patterns","tagline":"Backend architecture patterns, API design, database optimization, and server-side best practices for Node.js, Express, and Next.js API routes.","description":"# Backend Development Patterns\n\nBackend architecture patterns and best practices for scalable server-side applications.\n\n## API Design Patterns\n\n### RESTful API Structure\n\n```typescript\n// ✅ Resource-based URLs\nGET    /api/markets                 # List resources\nGET    /api/markets/:id             # Get single resource\nPOST   /api/markets                 # Create resource\nPUT    /api/markets/:id             # Replace resource\nPATCH  /api/markets/:id             # Update resource\nDELETE /api/markets/:id             # Delete resource\n\n// ✅ Query parameters for filtering, sorting, pagination\nGET /api/markets?status=active&sort=volume&limit=20&offset=0\n```\n\n### Repository Pattern\n\n```typescript\n// Abstract data access logic\ninterface MarketRepository {\n  findAll(filters?: MarketFilters): Promise<Market[]>\n  findById(id: string): Promise<Market | null>\n  create(data: CreateMarketDto): Promise<Market>\n  update(id: string, data: UpdateMarketDto): Promise<Market>\n  delete(id: string): Promise<void>\n}\n\nclass SupabaseMarketRepository implements MarketRepository {\n  async findAll(filters?: MarketFilters): Promise<Market[]> {\n    let query = supabase.from('markets').select('*')\n\n    if (filters?.status) {\n      query = query.eq('status', filters.status)\n    }\n\n    if (filters?.limit) {\n      query = query.limit(filters.limit)\n    }\n\n    const { data, error } = await query\n\n    if (error) throw new Error(error.message)\n    return data\n  }\n\n  // Other methods...\n}\n```\n\n### Service Layer Pattern\n\n```typescript\n// Business logic separated from data access\nclass MarketService {\n  constructor(private marketRepo: MarketRepository) {}\n\n  async searchMarkets(query: string, limit: number = 10): Promise<Market[]> {\n    // Business logic\n    const embedding = await generateEmbedding(query)\n    const results = await this.vectorSearch(embedding, limit)\n\n    // Fetch full data\n    const markets = await this.marketRepo.findByIds(results.map(r => r.id))\n\n    // Sort by similarity\n    return markets.sort((a, b) => {\n      const scoreA = results.find(r => r.id === a.id)?.score || 0\n      const scoreB = results.find(r => r.id === b.id)?.score || 0\n      return scoreA - scoreB\n    })\n  }\n\n  private async vectorSearch(embedding: number[], limit: number) {\n    // Vector search implementation\n  }\n}\n```\n\n### Middleware Pattern\n\n```typescript\n// Request/response processing pipeline\nexport function withAuth(handler: NextApiHandler): NextApiHandler {\n  return async (req, res) => {\n    const token = req.headers.authorization?.replace('Bearer ', '')\n\n    if (!token) {\n      return res.status(401).json({ error: 'Unauthorized' })\n    }\n\n    try {\n      const user = await verifyToken(token)\n      req.user = user\n      return handler(req, res)\n    } catch (error) {\n      return res.status(401).json({ error: 'Invalid token' })\n    }\n  }\n}\n\n// Usage\nexport default withAuth(async (req, res) => {\n  // Handler has access to req.user\n})\n```\n\n## Database Patterns\n\n### Query Optimization\n\n```typescript\n// ✅ GOOD: Select only needed columns\nconst { data } = await supabase\n  .from('markets')\n  .select('id, name, status, volume')\n  .eq('status', 'active')\n  .order('volume', { ascending: false })\n  .limit(10)\n\n// ❌ BAD: Select everything\nconst { data } = await supabase\n  .from('markets')\n  .select('*')\n```\n\n### N+1 Query Prevention\n\n```typescript\n// ❌ BAD: N+1 query problem\nconst markets = await getMarkets()\nfor (const market of markets) {\n  market.creator = await getUser(market.creator_id)  // N queries\n}\n\n// ✅ GOOD: Batch fetch\nconst markets = await getMarkets()\nconst creatorIds = markets.map(m => m.creator_id)\nconst creators = await getUsers(creatorIds)  // 1 query\nconst creatorMap = new Map(creators.map(c => [c.id, c]))\n\nmarkets.forEach(market => {\n  market.creator = creatorMap.get(market.creator_id)\n})\n```\n\n### Transaction Pattern\n\n```typescript\nasync function createMarketWithPosition(\n  marketData: CreateMarketDto,\n  positionData: CreatePositionDto\n) {\n  // Use Supabase transaction\n  const { data, error } = await supabase.rpc('create_market_with_position', {\n    market_data: marketData,\n    position_data: positionData\n  })\n\n  if (error) throw new Error('Transaction failed')\n  return data\n}\n\n// SQL function in Supabase\nCREATE OR REPLACE FUNCTION create_market_with_position(\n  market_data jsonb,\n  position_data jsonb\n)\nRETURNS jsonb\nLANGUAGE plpgsql\nAS $$\nBEGIN\n  -- Start transaction automatically\n  INSERT INTO markets VALUES (market_data);\n  INSERT INTO positions VALUES (position_data);\n  RETURN jsonb_build_object('success', true);\nEXCEPTION\n  WHEN OTHERS THEN\n    -- Rollback happens automatically\n    RETURN jsonb_build_object('success', false, 'error', SQLERRM);\nEND;\n$$;\n```\n\n## Caching Strategies\n\n### Redis Caching Layer\n\n```typescript\nclass CachedMarketRepository implements MarketRepository {\n  constructor(\n    private baseRepo: MarketRepository,\n    private redis: RedisClient\n  ) {}\n\n  async findById(id: string): Promise<Market | null> {\n    // Check cache first\n    const cached = await this.redis.get(`market:${id}`)\n\n    if (cached) {\n      return JSON.parse(cached)\n    }\n\n    // Cache miss - fetch from database\n    const market = await this.baseRepo.findById(id)\n\n    if (market) {\n      // Cache for 5 minutes\n      await this.redis.setex(`market:${id}`, 300, JSON.stringify(market))\n    }\n\n    return market\n  }\n\n  async invalidateCache(id: string): Promise<void> {\n    await this.redis.del(`market:${id}`)\n  }\n}\n```\n\n### Cache-Aside Pattern\n\n```typescript\nasync function getMarketWithCache(id: string): Promise<Market> {\n  const cacheKey = `market:${id}`\n\n  // Try cache\n  const cached = await redis.get(cacheKey)\n  if (cached) return JSON.parse(cached)\n\n  // Cache miss - fetch from DB\n  const market = await db.markets.findUnique({ where: { id } })\n\n  if (!market) throw new Error('Market not found')\n\n  // Update cache\n  await redis.setex(cacheKey, 300, JSON.stringify(market))\n\n  return market\n}\n```\n\n## Error Handling Patterns\n\n### Centralized Error Handler\n\n```typescript\nclass ApiError extends Error {\n  constructor(\n    public statusCode: number,\n    public message: string,\n    public isOperational = true\n  ) {\n    super(message)\n    Object.setPrototypeOf(this, ApiError.prototype)\n  }\n}\n\nexport function errorHandler(error: unknown, req: Request): Response {\n  if (error instanceof ApiError) {\n    return NextResponse.json({\n      success: false,\n      error: error.message\n    }, { status: error.statusCode })\n  }\n\n  if (error instanceof z.ZodError) {\n    return NextResponse.json({\n      success: false,\n      error: 'Validation failed',\n      details: error.errors\n    }, { status: 400 })\n  }\n\n  // Log unexpected errors\n  console.error('Unexpected error:', error)\n\n  return NextResponse.json({\n    success: false,\n    error: 'Internal server error'\n  }, { status: 500 })\n}\n\n// Usage\nexport async function GET(request: Request) {\n  try {\n    const data = await fetchData()\n    return NextResponse.json({ success: true, data })\n  } catch (error) {\n    return errorHandler(error, request)\n  }\n}\n```\n\n### Retry with Exponential Backoff\n\n```typescript\nasync function fetchWithRetry<T>(\n  fn: () => Promise<T>,\n  maxRetries = 3\n): Promise<T> {\n  let lastError: Error\n\n  for (let i = 0; i < maxRetries; i++) {\n    try {\n      return await fn()\n    } catch (error) {\n      lastError = error as Error\n\n      if (i < maxRetries - 1) {\n        // Exponential backoff: 1s, 2s, 4s\n        const delay = Math.pow(2, i) * 1000\n        await new Promise(resolve => setTimeout(resolve, delay))\n      }\n    }\n  }\n\n  throw lastError!\n}\n\n// Usage\nconst data = await fetchWithRetry(() => fetchFromAPI())\n```\n\n## Authentication & Authorization\n\n### JWT Token Validation\n\n```typescript\nimport jwt from 'jsonwebtoken'\n\ninterface JWTPayload {\n  userId: string\n  email: string\n  role: 'admin' | 'user'\n}\n\nexport function verifyToken(token: string): JWTPayload {\n  try {\n    const payload = jwt.verify(token, process.env.JWT_SECRET!) as JWTPayload\n    return payload\n  } catch (error) {\n    throw new ApiError(401, 'Invalid token')\n  }\n}\n\nexport async function requireAuth(request: Request) {\n  const token = request.headers.get('authorization')?.replace('Bearer ', '')\n\n  if (!token) {\n    throw new ApiError(401, 'Missing authorization token')\n  }\n\n  return verifyToken(token)\n}\n\n// Usage in API route\nexport async function GET(request: Request) {\n  const user = await requireAuth(request)\n\n  const data = await getDataForUser(user.userId)\n\n  return NextResponse.json({ success: true, data })\n}\n```\n\n### Role-Based Access Control\n\n```typescript\ntype Permission = 'read' | 'write' | 'delete' | 'admin'\n\ninterface User {\n  id: string\n  role: 'admin' | 'moderator' | 'user'\n}\n\nconst rolePermissions: Record<User['role'], Permission[]> = {\n  admin: ['read', 'write', 'delete', 'admin'],\n  moderator: ['read', 'write', 'delete'],\n  user: ['read', 'write']\n}\n\nexport function hasPermission(user: User, permission: Permission): boolean {\n  return rolePermissions[user.role].includes(permission)\n}\n\nexport function requirePermission(permission: Permission) {\n  return async (request: Request) => {\n    const user = await requireAuth(request)\n\n    if (!hasPermission(user, permission)) {\n      throw new ApiError(403, 'Insufficient permissions')\n    }\n\n    return user\n  }\n}\n\n// Usage\nexport const DELETE = requirePermission('delete')(async (request: Request) => {\n  // Handler with permission check\n})\n```\n\n## Rate Limiting\n\n### Simple In-Memory Rate Limiter\n\n```typescript\nclass RateLimiter {\n  private requests = new Map<string, number[]>()\n\n  async checkLimit(\n    identifier: string,\n    maxRequests: number,\n    windowMs: number\n  ): Promise<boolean> {\n    const now = Date.now()\n    const requests = this.requests.get(identifier) || []\n\n    // Remove old requests outside window\n    const recentRequests = requests.filter(time => now - time < windowMs)\n\n    if (recentRequests.length >= maxRequests) {\n      return false  // Rate limit exceeded\n    }\n\n    // Add current request\n    recentRequests.push(now)\n    this.requests.set(identifier, recentRequests)\n\n    return true\n  }\n}\n\nconst limiter = new RateLimiter()\n\nexport async function GET(request: Request) {\n  const ip = request.headers.get('x-forwarded-for') || 'unknown'\n\n  const allowed = await limiter.checkLimit(ip, 100, 60000)  // 100 req/min\n\n  if (!allowed) {\n    return NextResponse.json({\n      error: 'Rate limit exceeded'\n    }, { status: 429 })\n  }\n\n  // Continue with request\n}\n```\n\n## Background Jobs & Queues\n\n### Simple Queue Pattern\n\n```typescript\nclass JobQueue<T> {\n  private queue: T[] = []\n  private processing = false\n\n  async add(job: T): Promise<void> {\n    this.queue.push(job)\n\n    if (!this.processing) {\n      this.process()\n    }\n  }\n\n  private async process(): Promise<void> {\n    this.processing = true\n\n    while (this.queue.length > 0) {\n      const job = this.queue.shift()!\n\n      try {\n        await this.execute(job)\n      } catch (error) {\n        console.error('Job failed:', error)\n      }\n    }\n\n    this.processing = false\n  }\n\n  private async execute(job: T): Promise<void> {\n    // Job execution logic\n  }\n}\n\n// Usage for indexing markets\ninterface IndexJob {\n  marketId: string\n}\n\nconst indexQueue = new JobQueue<IndexJob>()\n\nexport async function POST(request: Request) {\n  const { marketId } = await request.json()\n\n  // Add to queue instead of blocking\n  await indexQueue.add({ marketId })\n\n  return NextResponse.json({ success: true, message: 'Job queued' })\n}\n```\n\n## Logging & Monitoring\n\n### Structured Logging\n\n```typescript\ninterface LogContext {\n  userId?: string\n  requestId?: string\n  method?: string\n  path?: string\n  [key: string]: unknown\n}\n\nclass Logger {\n  log(level: 'info' | 'warn' | 'error', message: string, context?: LogContext) {\n    const entry = {\n      timestamp: new Date().toISOString(),\n      level,\n      message,\n      ...context\n    }\n\n    console.log(JSON.stringify(entry))\n  }\n\n  info(message: string, context?: LogContext) {\n    this.log('info', message, context)\n  }\n\n  warn(message: string, context?: LogContext) {\n    this.log('warn', message, context)\n  }\n\n  error(message: string, error: Error, context?: LogContext) {\n    this.log('error', message, {\n      ...context,\n      error: error.message,\n      stack: error.stack\n    })\n  }\n}\n\nconst logger = new Logger()\n\n// Usage\nexport async function GET(request: Request) {\n  const requestId = crypto.randomUUID()\n\n  logger.info('Fetching markets', {\n    requestId,\n    method: 'GET',\n    path: '/api/markets'\n  })\n\n  try {\n    const markets = await fetchMarkets()\n    return NextResponse.json({ success: true, data: markets })\n  } catch (error) {\n    logger.error('Failed to fetch markets', error as Error, { requestId })\n    return NextResponse.json({ error: 'Internal error' }, { status: 500 })\n  }\n}\n```\n\n**Remember**: Backend patterns enable scalable, maintainable server-side applications. Choose patterns that fit your complexity level.\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\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":["skill","backend","patterns","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-cc-skill-backend-patterns","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/cc-skill-backend-patterns","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 · 34882 github stars · SKILL.md body (13,396 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-24T12:50:43.840Z","embedding":null,"createdAt":"2026-04-18T21:34:02.563Z","updatedAt":"2026-04-24T12:50:43.840Z","lastSeenAt":"2026-04-24T12:50:43.840Z","tsv":"'+1':361,367 '/api/markets':53,57,63,67,72,77,88,1287 '0':96,236,244,766,1129 '1':404,783 '10':196,349 '100':1079,1081 '1000':794 '1s':786 '2':792 '20':94 '2s':787 '3':758 '300':576,641 '400':706 '401':283,303,851,871 '403':975 '429':1092 '4s':788 '5':570 '500':723,1316 '60000':1080 'a.id':234 'abstract':100 'access':102,183,317,906 'action':1346 'activ':90,343 'add':1046,1112,1176 'admin':827,914,920,929,933 'allow':1075,1084 'api':9,24,41,45,880 'apierror':654,683,850,870,974 'apierror.prototype':671 'applic':40,1326,1340 'architectur':7,30 'ascend':346 'asid':592 'ask':1384 'async':135,190,249,271,312,423,535,581,595,726,752,855,883,960,986,1010,1061,1111,1122,1146,1167,1272 'authent':810 'author':811,863,873 'automat':483,508 'await':162,203,208,217,290,332,355,372,380,391,401,436,547,563,572,586,609,624,638,734,772,795,807,890,895,965,1076,1134,1174,1182,1291 'b':228 'b.id':242 'backend':4,6,26,29,1318 'background':1096 'backoff':750,785 'bad':350,365 'base':50,905 'baserepo':530 'batch':387 'bearer':278,865 'begin':480 'best':17,33 'block':1181 'boolean':948 'boundari':1392 'build':498,511 'busi':178,199 'c':411,413 'c.id':412 'cach':518,521,543,546,552,555,556,568,591,606,608,613,616,617,637 'cache-asid':590 'cachedmarketrepositori':525 'cachekey':602,611,640 'catch':299,741,774,846,1137,1299 'cc':2 'cc-skill-backend-pattern':1 'central':649 'check':542,992 'checklimit':1011 'choos':1327 'clarif':1386 'class':131,184,524,653,1002,1103,1210 'clear':1359 'column':329 'complex':1332 'console.error':710,1139 'console.log':1230 'const':159,201,206,215,229,237,274,288,330,353,370,375,389,393,399,406,433,545,561,601,607,622,732,789,805,836,860,888,893,923,963,982,1019,1022,1031,1056,1066,1074,1130,1162,1172,1221,1266,1277,1289 'constructor':186,528,657 'context':1219,1229,1236,1241,1245,1250,1256,1261 'continu':1093 'control':907 'creat':64,117,438,461,465 'createmarketdto':119,427 'createmarketwithposit':425 'createpositiondto':429 'creator':400 'creatorid':394,403 'creatormap':407 'creatormap.get':417 'creators.map':410 'criteria':1395 'crypto.randomuuid':1279 'current':1047 'data':101,118,124,160,171,182,214,331,354,434,443,446,456,470,473,489,495,733,740,806,894,902,1297 'databas':11,320,560 'date':1225 'date.now':1021 'db':621 'db.markets.findunique':625 'default':310 'delay':790,801 'delet':76,79,127,913,932,937,983,985 'describ':1347,1363 'design':10,42 'detail':703 'develop':27 'email':824 'embed':202,210,251 'enabl':1320 'end':517 'entri':1222,1232 'environ':1375 'environment-specif':1374 'eq':341 'error':161,165,168,285,300,305,435,449,452,515,632,646,650,656,675,681,688,693,700,709,712,713,718,721,742,745,762,775,777,779,847,1087,1138,1142,1216,1251,1254,1255,1259,1262,1300,1306,1308,1312,1314 'error.errors':704 'error.message':169,689,1263 'error.stack':1265 'error.statuscode':691 'errorhandl':674,744 'everyth':352 'exceed':1045,1090 'except':502 'execut':1147,1152,1342 'expert':1380 'exponenti':749,784 'export':264,309,672,725,829,854,882,941,954,981,1060,1166,1271 'express':21 'extend':655 'fail':454,702,1141,1302 'fals':347,514,687,699,717,1042,1110,1144 'fetch':212,388,558,619,1281,1304 'fetchdata':735 'fetchfromapi':809 'fetchmarket':1292 'fetchwithretri':754,808 'filter':84,107,137,147,154 'filters.limit':158 'filters.status':152 'findal':106,136 'findbyid':111,536 'first':544 'fit':1330 'fn':755,773 'forward':1071 'found':635 'full':213 'function':265,424,458,464,596,673,727,753,830,856,884,942,955,1062,1168,1273 'generateembed':204 'get':52,56,59,87,728,885,1063,1274,1285 'getdataforus':896 'getmarket':373,392 'getmarketwithcach':597 'getus':381,402 'good':325,386 'handl':647 'handler':267,296,315,651,989 'happen':507 'haspermiss':943,969 'id':58,68,73,78,112,122,128,337,383,398,419,537,550,565,575,583,589,598,604,627,917 'identifi':1012,1025,1052 'implement':133,257,526 'import':816 'in-memori':996 'includ':952 'index':1156 'indexjob':1159 'indexqueu':1163 'indexqueue.add':1183 'info':1214,1233,1239 'input':1389 'insert':484,490 'instanceof':682,694 'instead':1179 'insuffici':976 'interfac':104,820,915,1158,1197 'intern':719,1313 'invalid':306,852 'invalidatecach':582 'ip':1067,1078 'isoper':665 'job':1097,1113,1117,1131,1136,1140,1148,1151,1190 'jobqueu':1104,1165 'json':284,304 'json.parse':554,615 'json.stringify':577,642,1231 'jsonb':471,474,476,497,510 'jsonwebtoken':819 'jwt':812,817 'jwt.verify':838 'jwtpayload':821,834,843 'key':1207 'languag':477 'lasterror':761,776,803 'layer':175,522 'let':141,760,764 'level':1213,1227,1333 'limit':93,155,194,211,253,348,994,1000,1044,1057,1089,1351 'limiter.checklimit':1077 'list':54 'log':707,1192,1195,1212 'logcontext':1198,1220,1237,1246,1257 'logger':1211,1267,1269 'logger.error':1301 'logger.info':1280 'logic':103,179,200,1153 'm':396 'm.creator':397 'maintain':1322 'map':409,1007 'market':110,115,140,144,198,216,335,358,371,376,378,390,415,439,442,466,469,486,488,540,549,562,567,574,578,580,588,603,623,629,633,643,645,1157,1282,1290,1298,1305 'market.creator':379,382,416,418 'marketdata':426,444 'marketfilt':108,138 'marketid':1160,1173,1184 'marketrepo':188 'marketrepositori':105,134,189,527,531 'markets.foreach':414 'markets.map':395 'markets.sort':226 'marketservic':185 'match':1360 'math.pow':791 'maxrequest':1014,1040 'maxretri':757,768,782 'memori':998 'messag':662,668,1189,1217,1228,1234,1240,1243,1249,1252,1260 'method':173,1203,1284 'middlewar':258 'minut':571 'miss':557,618,872,1397 'moder':921,934 'monitor':1193 'n':360,366,384 'name':338 'need':328 'new':167,408,451,631,796,849,869,973,1006,1058,1164,1224,1268 'next.js':23 'nextapihandl':268,269 'nextresponse.json':685,697,715,737,899,1086,1186,1294,1311 'node.js':20 'null':116,541 'number':195,252,254,660,1009,1015,1017 'object':499,512 'object.setprototypeof':669 'offset':95 'old':1027 'optim':12,323 'order':344 'other':504 'output':1369 'outsid':1029 'overview':1350 'pagin':86 'paramet':82 'patch':71 'path':1205,1286 'pattern':5,8,28,31,43,98,176,259,321,421,593,648,1101,1319,1328 'payload':837,845 'permiss':910,928,946,947,953,957,958,971,977,991,1390 'pipelin':263 'plpgsql':478 'posit':441,445,468,472,492,494 'positiondata':428,447 'post':62,1169 'practic':18,34 'prevent':363 'privat':187,248,529,532,1004,1105,1108,1121,1145 'problem':369 'process':262,1109,1123 'process.env.jwt':840 'promis':109,114,120,126,130,139,197,539,585,600,756,759,797,1018,1115,1124,1150 'public':658,661,664 'put':66 'queri':81,142,149,156,163,192,205,322,362,368,385,405 'query.eq':150 'query.limit':157 'queu':1191 'queue':1098,1100,1106,1178 'r':220,232,240 'r.id':221,233,241 'rate':993,999,1043,1088 'ratelimit':1003,1059 'read':911,930,935,939 'recentrequest':1032,1053 'recentrequests.length':1039 'recentrequests.push':1049 'record':925 'redi':520,533 'redis.get':610 'redis.setex':639 'rediscli':534 'rememb':1317 'remov':1026 'replac':69,277,463,864 'repositori':97 'req':272,297,313,677 'req.headers.authorization':276 'req.user':293,319 'req/min':1082 'request':678,729,730,746,858,859,886,887,892,961,962,967,987,988,1005,1023,1028,1048,1064,1065,1095,1170,1171,1275,1276 'request.headers.get':862,1068 'request.json':1175 'request/response':261 'requestid':1201,1278,1283,1309 'requests.filter':1033 'requir':1388 'requireauth':857,891,966 'requirepermiss':956,984 'res':273,298,314 'res.status':282,302 'resolv':798,800 'resourc':49,55,61,65,70,75,80 'resource-bas':48 'respons':679 'rest':44 'result':207 'results.find':231,239 'results.map':219 'retri':747 'return':170,225,245,270,281,295,301,455,475,496,509,553,579,614,644,684,696,714,736,743,771,844,875,898,949,959,978,1041,1054,1085,1185,1293,1310 'review':1381 'role':826,904,919,927 'role-bas':903 'rolepermiss':924,950 'rollback':506 'rout':25,881 'safeti':1391 'scalabl':36,1321 'scope':1362 'score':235,243 'scorea':230,246 'scoreb':238,247 'search':256 'searchmarket':191 'secret':841 'select':145,326,336,351,359 'separ':180 'server':15,38,720,1324 'server-sid':14,37,1323 'servic':174 'settimeout':799 'side':16,39,1325 'similar':224 'simpl':995,1099 'singl':60 'skill':3,1338,1354 'skill-cc-skill-backend-patterns' 'sort':85,91,222 'source-sickn33' 'specif':1376 'sql':457 'sqlerrm':516 'stack':1264 'start':481 'status':89,148,151,339,342,690,705,722,1091,1315 'statuscod':659 'stop':1382 'strategi':519 'string':113,123,129,193,538,584,599,663,823,825,833,918,1008,1013,1161,1200,1202,1204,1206,1208,1218,1235,1244,1253 'structur':46,1194 'substitut':1372 'success':500,513,686,698,716,738,900,1187,1295,1394 'supabas':333,356,431,460 'supabase.from':143 'supabase.rpc':437 'supabasemarketrepositori':132 'super':667 'task':1358 'test':1378 'this.baserepo.findbyid':564 'this.execute':1135 'this.log':1238,1247,1258 'this.marketrepo.findbyids':218 'this.process':1120 'this.processing':1119,1125,1143 'this.queue.length':1128 'this.queue.push':1116 'this.queue.shift':1132 'this.redis.del':587 'this.redis.get':548 'this.redis.setex':573 'this.requests.get':1024 'this.requests.set':1051 'this.vectorsearch':209 'throw':166,450,630,802,848,868,972 'time':1034,1036 'timestamp':1223 'toisostr':1226 'token':275,280,292,307,813,832,839,853,861,867,874,877 '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' 'transact':420,432,453,482 'treat':1367 'tri':287,605,731,770,835,1133,1288 'true':501,666,739,901,1055,1126,1188,1296 'type':909 'typescript':47,99,177,260,324,364,422,523,594,652,751,815,908,1001,1102,1196 'unauthor':286 'unexpect':708,711 'unknown':676,1073,1209 'updat':74,121,636 'updatemarketdto':125 'url':51 'usag':308,724,804,878,980,1154,1270 'use':430,1336,1352 'user':289,294,828,889,916,922,926,938,944,945,964,970,979 'user.role':951 'user.userid':897 'userid':822,1199 'valid':701,814,1377 'valu':487,493 'vector':255 'vectorsearch':250 'verifytoken':291,831,876 'volum':92,340,345 'warn':1215,1242,1248 'window':1030 'windowm':1016,1037 'withauth':266,311 'workflow':1344 'write':912,931,936,940 'x':1070 'x-forwarded-for':1069 'z.zoderror':695","prices":[{"id":"da97f23d-f971-453e-bdbe-3879a809ffab","listingId":"2b875a7a-c17c-43ab-9dc0-eaf331b87558","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:34:02.563Z"}],"sources":[{"listingId":"2b875a7a-c17c-43ab-9dc0-eaf331b87558","source":"github","sourceId":"sickn33/antigravity-awesome-skills/cc-skill-backend-patterns","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/cc-skill-backend-patterns","isPrimary":false,"firstSeenAt":"2026-04-18T21:34:02.563Z","lastSeenAt":"2026-04-24T12:50:43.840Z"}],"details":{"listingId":"2b875a7a-c17c-43ab-9dc0-eaf331b87558","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"cc-skill-backend-patterns","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34882,"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-24T06:41:17Z","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":"6624736bb061e572c4e18af2a6f4e8d88184dac6","skill_md_path":"skills/cc-skill-backend-patterns/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/cc-skill-backend-patterns"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"cc-skill-backend-patterns","description":"Backend architecture patterns, API design, database optimization, and server-side best practices for Node.js, Express, and Next.js API routes."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/cc-skill-backend-patterns"},"updatedAt":"2026-04-24T12:50:43.840Z"}}