[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F7T019EYWD94YC37CT1QHC":3,"skill-same:01M6F7T019EYWD94YC37CT1QHC":82},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":59,"commitSha":60,"skillDirectory":61,"forksCount":62,"repositoryHtmlUrl":63,"repositoryHomepageUrl":64,"ownerHtmlUrl":65,"ownerBlogUrl":6,"ownerDescription":66,"updatedAt":67,"install":68,"resources":81},"01M6F7T019EYWD94YC37CT1QHC","brightdata-sdk-patterns",null,"Apply production-ready Bright Data SDK patterns for TypeScript and Python.\nUse when implementing Bright Data integrations, refactoring SDK usage,\nor establishing team coding standards for Bright Data.\nTrigger with phrases like \"brightdata SDK patterns\", \"brightdata best practices\",\n\"brightdata code patterns\", \"idiomatic brightdata\".","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fbrightdata-sdk-patterns\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000033","数据分析师",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"sdk","brightdata sdk patterns","patterns","brightdata","data","team","refactoring","integrations","coding","read","write","edit","scraping","ready","standards","coding standards","code","io","code patterns","typescript","2026-11-10 10:12:30",false,"---\nname: brightdata-sdk-patterns\ndescription: |\n  Apply production-ready Bright Data SDK patterns for TypeScript and Python.\n  Use when implementing Bright Data integrations, refactoring SDK usage,\n  or establishing team coding standards for Bright Data.\n  Trigger with phrases like \"brightdata SDK patterns\", \"brightdata best practices\",\n  \"brightdata code patterns\", \"idiomatic brightdata\".\nallowed-tools: Read, Write, Edit\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ntags: [saas, scraping, data, brightdata]\ncompatible-with: claude-code\n---\n\n# Bright Data SDK Patterns\n\n## Overview\n\nProduction-ready patterns for Bright Data proxy integrations. Since Bright Data uses HTTP proxy protocols (not a dedicated SDK), these patterns wrap proxy configuration, retry logic, session management, and response parsing into reusable modules.\n\n## Prerequisites\n\n- Completed `brightdata-install-auth` setup\n- Familiarity with async\u002Fawait and HTTP proxy protocols\n- axios or node-fetch installed\n\n## Instructions\n\n### Step 1: Proxy Client Singleton\n\n```typescript\n\u002F\u002F src\u002Fbrightdata\u002Fclient.ts\nimport axios, { AxiosInstance, AxiosRequestConfig } from 'axios';\nimport https from 'https';\nimport 'dotenv\u002Fconfig';\n\nlet instance: AxiosInstance | null = null;\n\nexport function getBrightDataClient(options?: {\n  country?: string;\n  session?: string;\n  zone?: string;\n}): AxiosInstance {\n  const { BRIGHTDATA_CUSTOMER_ID, BRIGHTDATA_ZONE, BRIGHTDATA_ZONE_PASSWORD } = process.env;\n  const zone = options?.zone || BRIGHTDATA_ZONE!;\n\n  let username = `brd-customer-${BRIGHTDATA_CUSTOMER_ID}-zone-${zone}`;\n  if (options?.country) username += `-country-${options.country}`;\n  if (options?.session) username += `-session-${options.session}`;\n\n  if (!instance || options) {\n    instance = axios.create({\n      proxy: {\n        host: 'brd.superproxy.io',\n        port: 33335,\n        auth: { username, password: BRIGHTDATA_ZONE_PASSWORD! },\n      },\n      httpsAgent: new https.Agent({ rejectUnauthorized: false }),\n      timeout: 60000,\n      headers: { 'User-Agent': 'Mozilla\u002F5.0 (compatible; Scraper\u002F1.0)' },\n    });\n  }\n  return instance;\n}\n```\n\n### Step 2: Retry Wrapper with Proxy Error Handling\n\n```typescript\n\u002F\u002F src\u002Fbrightdata\u002Fretry.ts\nexport async function scrapeWithRetry\u003CT>(\n  url: string,\n  parser: (html: string) => T,\n  config = { maxRetries: 3, baseDelayMs: 2000, maxDelayMs: 30000 }\n): Promise\u003CT> {\n  const client = getBrightDataClient();\n\n  for (let attempt = 0; attempt \u003C= config.maxRetries; attempt++) {\n    try {\n      const response = await client.get(url);\n      return parser(response.data);\n    } catch (error: any) {\n      const status = error.response?.status;\n      \u002F\u002F Bright Data proxy errors that warrant retry\n      const retryable = [502, 503, 407, 429].includes(status) || error.code === 'ETIMEDOUT';\n\n      if (attempt === config.maxRetries || !retryable) throw error;\n\n      const delay = Math.min(\n        config.baseDelayMs * Math.pow(2, attempt) + Math.random() * 1000,\n        config.maxDelayMs\n      );\n      console.log(`Attempt ${attempt + 1} failed (${status || error.code}), retrying in ${delay.toFixed(0)}ms`);\n      await new Promise(r => setTimeout(r, delay));\n    }\n  }\n  throw new Error('Unreachable');\n}\n```\n\n### Step 3: Session Management for Sticky IPs\n\n```typescript\n\u002F\u002F src\u002Fbrightdata\u002Fsessions.ts — maintain same IP across requests\nimport { v4 as uuidv4 } from 'uuid';\n\nexport class StickySession {\n  private sessionId: string;\n  private client: AxiosInstance;\n\n  constructor(country?: string) {\n    this.sessionId = uuidv4();\n    this.client = getBrightDataClient({\n      country,\n      session: this.sessionId, \u002F\u002F Same session = same exit IP\n    });\n  }\n\n  async get(url: string) {\n    return this.client.get(url);\n  }\n\n  \u002F\u002F Create new session (rotates IP)\n  rotate(): void {\n    this.sessionId = uuidv4();\n    this.client = getBrightDataClient({ session: this.sessionId });\n  }\n}\n\n\u002F\u002F Usage: login flow that needs consistent IP\nconst session = new StickySession('us');\nawait session.get('https:\u002F\u002Fexample.com\u002Flogin'); \u002F\u002F IP: 1.2.3.4\nawait session.get('https:\u002F\u002Fexample.com\u002Fdashboard'); \u002F\u002F IP: 1.2.3.4 (same)\nsession.rotate();\nawait session.get('https:\u002F\u002Fexample.com\u002Fother'); \u002F\u002F IP: 5.6.7.8 (new)\n```\n\n### Step 4: HTML Response Parser with Cheerio\n\n```typescript\n\u002F\u002F src\u002Fbrightdata\u002Fparser.ts\nimport * as cheerio from 'cheerio';\n\nexport function parseProductPage(html: string) {\n  const $ = cheerio.load(html);\n  return {\n    title: $('h1').first().text().trim(),\n    price: $('[data-price], .price').first().text().trim(),\n    description: $('meta[name=\"description\"]').attr('content') || '',\n    images: $('img[src]').map((_, el) => $(el).attr('src')).get().slice(0, 10),\n    inStock: !$('.out-of-stock').length,\n  };\n}\n\nexport function parseSearchResults(html: string) {\n  const $ = cheerio.load(html);\n  return $('div.g, [data-result]').map((i, el) => ({\n    rank: i + 1,\n    title: $(el).find('h3').text().trim(),\n    link: $(el).find('a').attr('href') || '',\n    snippet: $(el).find('.VwiC3b, .st').text().trim(),\n  })).get();\n}\n```\n\n### Step 5: Python Context Manager\n\n```python\n# brightdata\u002Fclient.py\nimport os, requests\nfrom contextlib import contextmanager\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n@contextmanager\ndef brightdata_session(country=None, city=None):\n    \"\"\"Context manager for Bright Data proxy sessions.\"\"\"\n    cid = os.environ['BRIGHTDATA_CUSTOMER_ID']\n    zone = os.environ['BRIGHTDATA_ZONE']\n    pwd = os.environ['BRIGHTDATA_ZONE_PASSWORD']\n\n    username = f'brd-customer-{cid}-zone-{zone}'\n    if country: username += f'-country-{country}'\n    if city: username += f'-city-{city}'\n\n    proxy_url = f'http:\u002F\u002F{username}:{pwd}@brd.superproxy.io:33335'\n    session = requests.Session()\n    session.proxies = {'http': proxy_url, 'https': proxy_url}\n    session.verify = '.\u002Fbrd-ca.crt'\n    session.headers['User-Agent'] = 'Mozilla\u002F5.0'\n\n    try:\n        yield session\n    finally:\n        session.close()\n\n# Usage\nwith brightdata_session(country='us') as s:\n    resp = s.get('https:\u002F\u002Fexample.com')\n    print(resp.status_code)\n```\n\n## Output\n\n- Reusable proxy client singleton with geo-targeting\n- Retry wrapper handling 502, 503, 407, 429, and timeouts\n- Sticky session management for multi-step scraping flows\n- HTML parsing utilities with cheerio\n- Python context manager pattern\n\n## Error Handling\n\n| Pattern | Use Case | Benefit |\n|---------|----------|---------|\n| Singleton client | All proxy requests | Consistent config, connection reuse |\n| Retry wrapper | Transient proxy errors | Auto-recovery from 502\u002F503 |\n| Sticky sessions | Login flows, pagination | Same IP across requests |\n| Response cache | Development | Avoids burning proxy credits |\n\n## Resources\n\n- [Bright Data Proxy Docs](https:\u002F\u002Fdocs.brightdata.com\u002Fgeneral\u002Faccount\u002Fproxy-infrastructure)\n- [Session Management](https:\u002F\u002Fdocs.brightdata.com\u002Fgeneral\u002Faccount\u002Fproxy-infrastructure#sessions)\n- [Cheerio Documentation](https:\u002F\u002Fcheerio.js.org\u002F)\n\n## Next Steps\n\nApply patterns in `brightdata-core-workflow-a` for real-world browser scraping.\n\n","# Bright Data SDK Patterns\n\n## Overview\n\nProduction-ready patterns for Bright Data proxy integrations. Since Bright Data uses HTTP proxy protocols (not a dedicated SDK), these patterns wrap proxy configuration, retry logic, session management, and response parsing into reusable modules.\n\n## Prerequisites\n\n- Completed `brightdata-install-auth` setup\n- Familiarity with async\u002Fawait and HTTP proxy protocols\n- axios or node-fetch installed\n\n## Instructions\n\n### Step 1: Proxy Client Singleton\n\n```typescript\n\u002F\u002F src\u002Fbrightdata\u002Fclient.ts\nimport axios, { AxiosInstance, AxiosRequestConfig } from 'axios';\nimport https from 'https';\nimport 'dotenv\u002Fconfig';\n\nlet instance: AxiosInstance | null = null;\n\nexport function getBrightDataClient(options?: {\n  country?: string;\n  session?: string;\n  zone?: string;\n}): AxiosInstance {\n  const { BRIGHTDATA_CUSTOMER_ID, BRIGHTDATA_ZONE, BRIGHTDATA_ZONE_PASSWORD } = process.env;\n  const zone = options?.zone || BRIGHTDATA_ZONE!;\n\n  let username = `brd-customer-${BRIGHTDATA_CUSTOMER_ID}-zone-${zone}`;\n  if (options?.country) username += `-country-${options.country}`;\n  if (options?.session) username += `-session-${options.session}`;\n\n  if (!instance || options) {\n    instance = axios.create({\n      proxy: {\n        host: 'brd.superproxy.io',\n        port: 33335,\n        auth: { username, password: BRIGHTDATA_ZONE_PASSWORD! },\n      },\n      httpsAgent: new https.Agent({ rejectUnauthorized: false }),\n      timeout: 60000,\n      headers: { 'User-Agent': 'Mozilla\u002F5.0 (compatible; Scraper\u002F1.0)' },\n    });\n  }\n  return instance;\n}\n```\n\n### Step 2: Retry Wrapper with Proxy Error Handling\n\n```typescript\n\u002F\u002F src\u002Fbrightdata\u002Fretry.ts\nexport async function scrapeWithRetry\u003CT>(\n  url: string,\n  parser: (html: string) => T,\n  config = { maxRetries: 3, baseDelayMs: 2000, maxDelayMs: 30000 }\n): Promise\u003CT> {\n  const client = getBrightDataClient();\n\n  for (let attempt = 0; attempt \u003C= config.maxRetries; attempt++) {\n    try {\n      const response = await client.get(url);\n      return parser(response.data);\n    } catch (error: any) {\n      const status = error.response?.status;\n      \u002F\u002F Bright Data proxy errors that warrant retry\n      const retryable = [502, 503, 407, 429].includes(status) || error.code === 'ETIMEDOUT';\n\n      if (attempt === config.maxRetries || !retryable) throw error;\n\n      const delay = Math.min(\n        config.baseDelayMs * Math.pow(2, attempt) + Math.random() * 1000,\n        config.maxDelayMs\n      );\n      console.log(`Attempt ${attempt + 1} failed (${status || error.code}), retrying in ${delay.toFixed(0)}ms`);\n      await new Promise(r => setTimeout(r, delay));\n    }\n  }\n  throw new Error('Unreachable');\n}\n```\n\n### Step 3: Session Management for Sticky IPs\n\n```typescript\n\u002F\u002F src\u002Fbrightdata\u002Fsessions.ts — maintain same IP across requests\nimport { v4 as uuidv4 } from 'uuid';\n\nexport class StickySession {\n  private sessionId: string;\n  private client: AxiosInstance;\n\n  constructor(country?: string) {\n    this.sessionId = uuidv4();\n    this.client = getBrightDataClient({\n      country,\n      session: this.sessionId, \u002F\u002F Same session = same exit IP\n    });\n  }\n\n  async get(url: string) {\n    return this.client.get(url);\n  }\n\n  \u002F\u002F Create new session (rotates IP)\n  rotate(): void {\n    this.sessionId = uuidv4();\n    this.client = getBrightDataClient({ session: this.sessionId });\n  }\n}\n\n\u002F\u002F Usage: login flow that needs consistent IP\nconst session = new StickySession('us');\nawait session.get('https:\u002F\u002Fexample.com\u002Flogin'); \u002F\u002F IP: 1.2.3.4\nawait session.get('https:\u002F\u002Fexample.com\u002Fdashboard'); \u002F\u002F IP: 1.2.3.4 (same)\nsession.rotate();\nawait session.get('https:\u002F\u002Fexample.com\u002Fother'); \u002F\u002F IP: 5.6.7.8 (new)\n```\n\n### Step 4: HTML Response Parser with Cheerio\n\n```typescript\n\u002F\u002F src\u002Fbrightdata\u002Fparser.ts\nimport * as cheerio from 'cheerio';\n\nexport function parseProductPage(html: string) {\n  const $ = cheerio.load(html);\n  return {\n    title: $('h1').first().text().trim(),\n    price: $('[data-price], .price').first().text().trim(),\n    description: $('meta[name=\"description\"]').attr('content') || '',\n    images: $('img[src]').map((_, el) => $(el).attr('src')).get().slice(0, 10),\n    inStock: !$('.out-of-stock').length,\n  };\n}\n\nexport function parseSearchResults(html: string) {\n  const $ = cheerio.load(html);\n  return $('div.g, [data-result]').map((i, el) => ({\n    rank: i + 1,\n    title: $(el).find('h3').text().trim(),\n    link: $(el).find('a').attr('href') || '',\n    snippet: $(el).find('.VwiC3b, .st').text().trim(),\n  })).get();\n}\n```\n\n### Step 5: Python Context Manager\n\n```python\n# brightdata\u002Fclient.py\nimport os, requests\nfrom contextlib import contextmanager\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n@contextmanager\ndef brightdata_session(country=None, city=None):\n    \"\"\"Context manager for Bright Data proxy sessions.\"\"\"\n    cid = os.environ['BRIGHTDATA_CUSTOMER_ID']\n    zone = os.environ['BRIGHTDATA_ZONE']\n    pwd = os.environ['BRIGHTDATA_ZONE_PASSWORD']\n\n    username = f'brd-customer-{cid}-zone-{zone}'\n    if country: username += f'-country-{country}'\n    if city: username += f'-city-{city}'\n\n    proxy_url = f'http:\u002F\u002F{username}:{pwd}@brd.superproxy.io:33335'\n    session = requests.Session()\n    session.proxies = {'http': proxy_url, 'https': proxy_url}\n    session.verify = '.\u002Fbrd-ca.crt'\n    session.headers['User-Agent'] = 'Mozilla\u002F5.0'\n\n    try:\n        yield session\n    finally:\n        session.close()\n\n# Usage\nwith brightdata_session(country='us') as s:\n    resp = s.get('https:\u002F\u002Fexample.com')\n    print(resp.status_code)\n```\n\n## Output\n\n- Reusable proxy client singleton with geo-targeting\n- Retry wrapper handling 502, 503, 407, 429, and timeouts\n- Sticky session management for multi-step scraping flows\n- HTML parsing utilities with cheerio\n- Python context manager pattern\n\n## Error Handling\n\n| Pattern | Use Case | Benefit |\n|---------|----------|---------|\n| Singleton client | All proxy requests | Consistent config, connection reuse |\n| Retry wrapper | Transient proxy errors | Auto-recovery from 502\u002F503 |\n| Sticky sessions | Login flows, pagination | Same IP across requests |\n| Response cache | Development | Avoids burning proxy credits |\n\n## Resources\n\n- [Bright Data Proxy Docs](https:\u002F\u002Fdocs.brightdata.com\u002Fgeneral\u002Faccount\u002Fproxy-infrastructure)\n- [Session Management](https:\u002F\u002Fdocs.brightdata.com\u002Fgeneral\u002Faccount\u002Fproxy-infrastructure#sessions)\n- [Cheerio Documentation](https:\u002F\u002Fcheerio.js.org\u002F)\n\n## Next Steps\n\nApply patterns in `brightdata-core-workflow-a` for real-world browser scraping.\n\n",{"name":5,"tags":52,"author":54,"license":15,"version":55,"description":56,"allowed-tools":57,"compatible-with":58},[53,39,31,30],"saas","Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Apply production-ready Bright Data SDK patterns for TypeScript and Python.\nUse when implementing Bright Data integrations, refactoring SDK usage,\nor establishing team coding standards for Bright Data.\nTrigger with phrases like \"brightdata SDK patterns\", \"brightdata best practices\",\n\"brightdata code patterns\", \"idiomatic brightdata\".\n","Read, Write, Edit","claude-code","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fbrightdata-sdk-patterns",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":69,"prompt":79,"zipAvailable":80},[70,73,76],{"tool":71,"command":72},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill brightdata-sdk-patterns",{"tool":74,"command":75},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill brightdata-sdk-patterns",{"tool":77,"command":78},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill brightdata-sdk-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fbrightdata-sdk-patterns\u002FSKILL.md",true,[],[83,97,107,115,121,128],{"skillNo":84,"name":85,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":93,"publishedAt":47},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[88],{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[94,95,96],"model","model hierarchy","model hierarchy skill",{"skillNo":98,"name":99,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":103,"publishedAt":47},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[102],{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},[104,105,106],"MCP","zoom","zoom mcp",{"skillNo":108,"name":109,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":47},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[27,113,114,105],"zoom apps sdk","apps",{"skillNo":116,"name":117,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":47},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[117],{"skillNo":122,"name":123,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":127,"publishedAt":47},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[126],{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},[123],{"skillNo":129,"name":130,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":47},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[130]]