[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F6AKKBWX9N2MH4MMR02B7R":3,"skill-same:01M6F6AKKBWX9N2MH4MMR02B7R":76},{"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":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":58,"ownerHtmlUrl":59,"ownerBlogUrl":6,"ownerDescription":60,"updatedAt":61,"install":62,"resources":75},"01M6F6AKKBWX9N2MH4MMR02B7R","abridge-cost-tuning",null,"Optimize Abridge clinical AI costs through tier selection, session management,\nand usage monitoring for healthcare organizations.\nUse when analyzing Abridge billing, optimizing encounter volume,\nor right-sizing your Abridge contract for provider count.\nTrigger: \"abridge cost\", \"abridge pricing\", \"abridge billing\",\n\"abridge budget\", \"abridge ROI\".","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\u002Fabridge-cost-tuning\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"cost","abridge cost tuning","abridge","tuning","selection","monitoring","analyzing","billing","session management","io","clinical","volume","optimize","code","edit","write","read","Bash","healthcare","Budget","2026-11-10 10:12:30",false,"---\nname: abridge-cost-tuning\ndescription: |\n  Optimize Abridge clinical AI costs through tier selection, session management,\n  and usage monitoring for healthcare organizations.\n  Use when analyzing Abridge billing, optimizing encounter volume,\n  or right-sizing your Abridge contract for provider count.\n  Trigger: \"abridge cost\", \"abridge pricing\", \"abridge billing\",\n  \"abridge budget\", \"abridge ROI\".\nallowed-tools: Read, Write, Edit, Bash(npm:*)\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ntags: [saas, healthcare, ai, abridge, cost-optimization]\ncompatible-with: claude-code\n---\n\n# Abridge Cost Tuning\n\n## Overview\n\nAbridge pricing is enterprise, sales-led, and per-provider. Cost optimization focuses on maximizing provider adoption (to justify per-provider cost), reducing wasted sessions, and choosing the right tier for your org size.\n\n## Pricing Model (Enterprise)\n\n| Factor | Impact | Optimization Lever |\n|--------|--------|-------------------|\n| Provider count | Primary cost driver | Only enroll active providers |\n| EHR depth | Integration complexity premium | Start with basic, upgrade incrementally |\n| Specialty count | Some specialties cost more | Phase specialty rollout |\n| Session volume | Included in per-provider pricing | No per-session cost concern |\n| Patient summaries | May be add-on | Enable only for portal-integrated sites |\n| Languages | Included (28+ languages) | No incremental cost |\n\n## Instructions\n\n### Step 1: Provider Utilization Tracking\n\n```typescript\n\u002F\u002F src\u002Fcost\u002Fprovider-utilization.ts\ninterface ProviderUsage {\n  providerId: string;\n  enrolledDate: Date;\n  sessionsThisMonth: number;\n  lastSessionDate: Date | null;\n  adoptionStatus: 'active' | 'low_usage' | 'dormant' | 'never_used';\n}\n\nfunction classifyProviderUsage(provider: ProviderUsage): string {\n  if (provider.sessionsThisMonth === 0 && !provider.lastSessionDate) return 'never_used';\n  if (provider.sessionsThisMonth === 0) return 'dormant';\n\n  const daysSinceEnrolled = (Date.now() - provider.enrolledDate.getTime()) \u002F 86400000;\n  const sessionsPerDay = provider.sessionsThisMonth \u002F Math.min(daysSinceEnrolled, 30);\n\n  if (sessionsPerDay \u003C 1) return 'low_usage';\n  return 'active';\n}\n\nfunction generateUtilizationReport(providers: ProviderUsage[]): {\n  total: number;\n  active: number;\n  lowUsage: number;\n  dormant: number;\n  neverUsed: number;\n  wastedLicenseCost: string;\n} {\n  const classified = providers.map(p => ({ ...p, status: classifyProviderUsage(p) }));\n\n  const active = classified.filter(p => p.status === 'active').length;\n  const lowUsage = classified.filter(p => p.status === 'low_usage').length;\n  const dormant = classified.filter(p => p.status === 'dormant').length;\n  const neverUsed = classified.filter(p => p.status === 'never_used').length;\n  const wastedPercent = ((dormant + neverUsed) \u002F providers.length * 100).toFixed(1);\n\n  return {\n    total: providers.length,\n    active,\n    lowUsage,\n    dormant,\n    neverUsed,\n    wastedLicenseCost: `${wastedPercent}% of licenses are unused`,\n  };\n}\n```\n\n### Step 2: Session Waste Detection\n\n```typescript\n\u002F\u002F src\u002Fcost\u002Fsession-waste.ts\ninterface SessionMetrics {\n  sessionId: string;\n  durationSeconds: number;\n  segmentCount: number;\n  noteGenerated: boolean;\n  noteAccepted: boolean;\n  noteEdited: boolean;\n}\n\nfunction detectSessionWaste(sessions: SessionMetrics[]): {\n  totalSessions: number;\n  wastedSessions: number;\n  wasteReasons: Record\u003Cstring, number>;\n} {\n  const wasteReasons: Record\u003Cstring, number> = {\n    abandoned: 0,           \u002F\u002F Session started but no note generated\n    too_short: 0,           \u002F\u002F \u003C 30 seconds of content\n    rejected: 0,            \u002F\u002F Note generated but clinician rejected it\n    duplicate: 0,           \u002F\u002F Multiple sessions for same encounter\n  };\n\n  for (const session of sessions) {\n    if (!session.noteGenerated && session.segmentCount > 0) wasteReasons.abandoned++;\n    if (session.durationSeconds \u003C 30) wasteReasons.too_short++;\n    if (session.noteGenerated && !session.noteAccepted) wasteReasons.rejected++;\n  }\n\n  const wastedSessions = Object.values(wasteReasons).reduce((a, b) => a + b, 0);\n\n  return { totalSessions: sessions.length, wastedSessions, wasteReasons };\n}\n```\n\n### Step 3: ROI Calculator\n\n```typescript\n\u002F\u002F src\u002Fcost\u002Froi-calculator.ts\ninterface RoiInputs {\n  providerCount: number;\n  avgEncountersPerProviderPerDay: number;\n  avgMinutesSavedPerEncounter: number;  \u002F\u002F Abridge claims 2-3 hours\u002Fday savings\n  providerHourlyRate: number;           \u002F\u002F Loaded cost including benefits\n  abridgeAnnualCost: number;            \u002F\u002F Total contract value\n  workingDaysPerYear: number;\n}\n\nfunction calculateRoi(inputs: RoiInputs): {\n  annualTimeSavedHours: number;\n  annualLaborSavings: number;\n  netSavings: number;\n  roiPercent: number;\n  paybackMonths: number;\n} {\n  const dailyMinutesSaved = inputs.avgEncountersPerProviderPerDay * inputs.avgMinutesSavedPerEncounter;\n  const annualHoursSaved = (dailyMinutesSaved \u002F 60) * inputs.workingDaysPerYear * inputs.providerCount;\n  const annualLaborSavings = annualHoursSaved * inputs.providerHourlyRate;\n  const netSavings = annualLaborSavings - inputs.abridgeAnnualCost;\n  const roiPercent = (netSavings \u002F inputs.abridgeAnnualCost) * 100;\n  const paybackMonths = (inputs.abridgeAnnualCost \u002F annualLaborSavings) * 12;\n\n  return {\n    annualTimeSavedHours: Math.round(annualHoursSaved),\n    annualLaborSavings: Math.round(annualLaborSavings),\n    netSavings: Math.round(netSavings),\n    roiPercent: Math.round(roiPercent),\n    paybackMonths: Math.round(paybackMonths * 10) \u002F 10,\n  };\n}\n\n\u002F\u002F Example: 50 providers, 15 encounters\u002Fday, 5 min saved each, $150\u002Fhr loaded\n\u002F\u002F ROI = significant positive return within first year\n```\n\n### Step 4: Cost Optimization Recommendations\n\n```typescript\n\u002F\u002F src\u002Fcost\u002Frecommendations.ts\nfunction generateCostRecommendations(\n  utilization: ReturnType\u003Ctypeof generateUtilizationReport>,\n  waste: ReturnType\u003Ctypeof detectSessionWaste>,\n): string[] {\n  const recs: string[] = [];\n\n  if (utilization.neverUsed > 0) {\n    recs.push(`Remove ${utilization.neverUsed} never-used provider licenses`);\n  }\n  if (utilization.dormant > 0) {\n    recs.push(`Re-engage or remove ${utilization.dormant} dormant providers`);\n  }\n  if (waste.wasteReasons.abandoned > waste.totalSessions * 0.1) {\n    recs.push('Investigate high abandoned session rate — may indicate training gap');\n  }\n  if (waste.wasteReasons.rejected > waste.totalSessions * 0.2) {\n    recs.push('High note rejection rate — review note templates with clinical leads');\n  }\n\n  return recs;\n}\n```\n\n## Output\n\n- Provider utilization report with waste identification\n- Session waste detection with categorized reasons\n- ROI calculator for contract justification\n- Actionable cost optimization recommendations\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Usage data unavailable | API doesn't expose metrics | Request usage reports from Abridge CSM |\n| ROI negative | Low adoption | Focus on provider training before renewal |\n| High waste rate | Poor onboarding | Invest in provider change management |\n\n## Resources\n\n- [Abridge Pricing](https:\u002F\u002Fwww.abridge.com\u002F)\n- [Abridge ROI Studies](https:\u002F\u002Fwww.abridge.com\u002Fplatform)\n\n## Next Steps\n\nFor architecture design, see `abridge-reference-architecture`.\n\n","# Abridge Cost Tuning\n\n## Overview\n\nAbridge pricing is enterprise, sales-led, and per-provider. Cost optimization focuses on maximizing provider adoption (to justify per-provider cost), reducing wasted sessions, and choosing the right tier for your org size.\n\n## Pricing Model (Enterprise)\n\n| Factor | Impact | Optimization Lever |\n|--------|--------|-------------------|\n| Provider count | Primary cost driver | Only enroll active providers |\n| EHR depth | Integration complexity premium | Start with basic, upgrade incrementally |\n| Specialty count | Some specialties cost more | Phase specialty rollout |\n| Session volume | Included in per-provider pricing | No per-session cost concern |\n| Patient summaries | May be add-on | Enable only for portal-integrated sites |\n| Languages | Included (28+ languages) | No incremental cost |\n\n## Instructions\n\n### Step 1: Provider Utilization Tracking\n\n```typescript\n\u002F\u002F src\u002Fcost\u002Fprovider-utilization.ts\ninterface ProviderUsage {\n  providerId: string;\n  enrolledDate: Date;\n  sessionsThisMonth: number;\n  lastSessionDate: Date | null;\n  adoptionStatus: 'active' | 'low_usage' | 'dormant' | 'never_used';\n}\n\nfunction classifyProviderUsage(provider: ProviderUsage): string {\n  if (provider.sessionsThisMonth === 0 && !provider.lastSessionDate) return 'never_used';\n  if (provider.sessionsThisMonth === 0) return 'dormant';\n\n  const daysSinceEnrolled = (Date.now() - provider.enrolledDate.getTime()) \u002F 86400000;\n  const sessionsPerDay = provider.sessionsThisMonth \u002F Math.min(daysSinceEnrolled, 30);\n\n  if (sessionsPerDay \u003C 1) return 'low_usage';\n  return 'active';\n}\n\nfunction generateUtilizationReport(providers: ProviderUsage[]): {\n  total: number;\n  active: number;\n  lowUsage: number;\n  dormant: number;\n  neverUsed: number;\n  wastedLicenseCost: string;\n} {\n  const classified = providers.map(p => ({ ...p, status: classifyProviderUsage(p) }));\n\n  const active = classified.filter(p => p.status === 'active').length;\n  const lowUsage = classified.filter(p => p.status === 'low_usage').length;\n  const dormant = classified.filter(p => p.status === 'dormant').length;\n  const neverUsed = classified.filter(p => p.status === 'never_used').length;\n  const wastedPercent = ((dormant + neverUsed) \u002F providers.length * 100).toFixed(1);\n\n  return {\n    total: providers.length,\n    active,\n    lowUsage,\n    dormant,\n    neverUsed,\n    wastedLicenseCost: `${wastedPercent}% of licenses are unused`,\n  };\n}\n```\n\n### Step 2: Session Waste Detection\n\n```typescript\n\u002F\u002F src\u002Fcost\u002Fsession-waste.ts\ninterface SessionMetrics {\n  sessionId: string;\n  durationSeconds: number;\n  segmentCount: number;\n  noteGenerated: boolean;\n  noteAccepted: boolean;\n  noteEdited: boolean;\n}\n\nfunction detectSessionWaste(sessions: SessionMetrics[]): {\n  totalSessions: number;\n  wastedSessions: number;\n  wasteReasons: Record\u003Cstring, number>;\n} {\n  const wasteReasons: Record\u003Cstring, number> = {\n    abandoned: 0,           \u002F\u002F Session started but no note generated\n    too_short: 0,           \u002F\u002F \u003C 30 seconds of content\n    rejected: 0,            \u002F\u002F Note generated but clinician rejected it\n    duplicate: 0,           \u002F\u002F Multiple sessions for same encounter\n  };\n\n  for (const session of sessions) {\n    if (!session.noteGenerated && session.segmentCount > 0) wasteReasons.abandoned++;\n    if (session.durationSeconds \u003C 30) wasteReasons.too_short++;\n    if (session.noteGenerated && !session.noteAccepted) wasteReasons.rejected++;\n  }\n\n  const wastedSessions = Object.values(wasteReasons).reduce((a, b) => a + b, 0);\n\n  return { totalSessions: sessions.length, wastedSessions, wasteReasons };\n}\n```\n\n### Step 3: ROI Calculator\n\n```typescript\n\u002F\u002F src\u002Fcost\u002Froi-calculator.ts\ninterface RoiInputs {\n  providerCount: number;\n  avgEncountersPerProviderPerDay: number;\n  avgMinutesSavedPerEncounter: number;  \u002F\u002F Abridge claims 2-3 hours\u002Fday savings\n  providerHourlyRate: number;           \u002F\u002F Loaded cost including benefits\n  abridgeAnnualCost: number;            \u002F\u002F Total contract value\n  workingDaysPerYear: number;\n}\n\nfunction calculateRoi(inputs: RoiInputs): {\n  annualTimeSavedHours: number;\n  annualLaborSavings: number;\n  netSavings: number;\n  roiPercent: number;\n  paybackMonths: number;\n} {\n  const dailyMinutesSaved = inputs.avgEncountersPerProviderPerDay * inputs.avgMinutesSavedPerEncounter;\n  const annualHoursSaved = (dailyMinutesSaved \u002F 60) * inputs.workingDaysPerYear * inputs.providerCount;\n  const annualLaborSavings = annualHoursSaved * inputs.providerHourlyRate;\n  const netSavings = annualLaborSavings - inputs.abridgeAnnualCost;\n  const roiPercent = (netSavings \u002F inputs.abridgeAnnualCost) * 100;\n  const paybackMonths = (inputs.abridgeAnnualCost \u002F annualLaborSavings) * 12;\n\n  return {\n    annualTimeSavedHours: Math.round(annualHoursSaved),\n    annualLaborSavings: Math.round(annualLaborSavings),\n    netSavings: Math.round(netSavings),\n    roiPercent: Math.round(roiPercent),\n    paybackMonths: Math.round(paybackMonths * 10) \u002F 10,\n  };\n}\n\n\u002F\u002F Example: 50 providers, 15 encounters\u002Fday, 5 min saved each, $150\u002Fhr loaded\n\u002F\u002F ROI = significant positive return within first year\n```\n\n### Step 4: Cost Optimization Recommendations\n\n```typescript\n\u002F\u002F src\u002Fcost\u002Frecommendations.ts\nfunction generateCostRecommendations(\n  utilization: ReturnType\u003Ctypeof generateUtilizationReport>,\n  waste: ReturnType\u003Ctypeof detectSessionWaste>,\n): string[] {\n  const recs: string[] = [];\n\n  if (utilization.neverUsed > 0) {\n    recs.push(`Remove ${utilization.neverUsed} never-used provider licenses`);\n  }\n  if (utilization.dormant > 0) {\n    recs.push(`Re-engage or remove ${utilization.dormant} dormant providers`);\n  }\n  if (waste.wasteReasons.abandoned > waste.totalSessions * 0.1) {\n    recs.push('Investigate high abandoned session rate — may indicate training gap');\n  }\n  if (waste.wasteReasons.rejected > waste.totalSessions * 0.2) {\n    recs.push('High note rejection rate — review note templates with clinical leads');\n  }\n\n  return recs;\n}\n```\n\n## Output\n\n- Provider utilization report with waste identification\n- Session waste detection with categorized reasons\n- ROI calculator for contract justification\n- Actionable cost optimization recommendations\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Usage data unavailable | API doesn't expose metrics | Request usage reports from Abridge CSM |\n| ROI negative | Low adoption | Focus on provider training before renewal |\n| High waste rate | Poor onboarding | Invest in provider change management |\n\n## Resources\n\n- [Abridge Pricing](https:\u002F\u002Fwww.abridge.com\u002F)\n- [Abridge ROI Studies](https:\u002F\u002Fwww.abridge.com\u002Fplatform)\n\n## Next Steps\n\nFor architecture design, see `abridge-reference-architecture`.\n\n",{"name":5,"tags":44,"author":48,"license":15,"version":49,"description":50,"allowed-tools":51,"compatible-with":52},[45,37,46,21,47],"saas","ai","cost-optimization","Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Optimize Abridge clinical AI costs through tier selection, session management,\nand usage monitoring for healthcare organizations.\nUse when analyzing Abridge billing, optimizing encounter volume,\nor right-sizing your Abridge contract for provider count.\nTrigger: \"abridge cost\", \"abridge pricing\", \"abridge billing\",\n\"abridge budget\", \"abridge ROI\".\n","Read, Write, Edit, Bash(npm:*)","claude-code","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fabridge-cost-tuning",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":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill abridge-cost-tuning",{"tool":68,"command":69},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill abridge-cost-tuning",{"tool":71,"command":72},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill abridge-cost-tuning","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fabridge-cost-tuning\u002FSKILL.md",true,[],[77,91,101,110,116,123],{"skillNo":78,"name":79,"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":80,"categories":81,"keywords":87,"publishedAt":39},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[82],{"categoryNo":83,"categoryName":84,"taxonomyType":85,"taxonomyTypeDesc":86},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[88,89,90],"model","model hierarchy","model hierarchy skill",{"skillNo":92,"name":93,"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":94,"categories":95,"keywords":97,"publishedAt":39},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[96],{"categoryNo":83,"categoryName":84,"taxonomyType":85,"taxonomyTypeDesc":86},[98,99,100],"MCP","zoom","zoom mcp",{"skillNo":102,"name":103,"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":104,"categories":105,"keywords":106,"publishedAt":39},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[107,108,109,99],"sdk","zoom apps sdk","apps",{"skillNo":111,"name":112,"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":113,"categories":114,"keywords":115,"publishedAt":39},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[112],{"skillNo":117,"name":118,"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":119,"categories":120,"keywords":122,"publishedAt":39},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[121],{"categoryNo":83,"categoryName":84,"taxonomyType":85,"taxonomyTypeDesc":86},[118],{"skillNo":124,"name":125,"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":126,"categories":127,"keywords":128,"publishedAt":39},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[125]]