[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F6DM0G1D100VC9J0Q0DXG3":3,"skill-same:01M6F6DM0G1D100VC9J0Q0DXG3":75},{"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":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":58,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6F6DM0G1D100VC9J0Q0DXG3","documenso-performance-tuning",null,"Optimize Documenso integration performance with caching, batching, and efficient patterns.\nUse when improving response times, reducing API calls,\nor optimizing bulk document operations.\nTrigger with phrases like \"documenso performance\", \"optimize documenso\",\n\"documenso caching\", \"documenso batch operations\".","Dicklesworthstone\u002Fpi_agent_rust","Dicklesworthstone","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F35050222?v=4","01M6CG26AR942CSVMN1M5E3DSE","Jeff Emanuel","01M6CG26EPP71PSHW1VDS71121",1986,"MIT","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fdocumenso-pack\u002Fskills\u002Fdocumenso-performance-tuning\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"tuning","documenso","documenso performance tuning","performance tuning","performance","optimize","when","batching","calls","with","bulk","trigger","io","caching","patterns","document","use","operations","edit","write","read","api","integration","batch","2026-11-10 10:12:30",false,"---\nname: documenso-performance-tuning\ndescription: |\n  Optimize Documenso integration performance with caching, batching, and efficient patterns.\n  Use when improving response times, reducing API calls,\n  or optimizing bulk document operations.\n  Trigger with phrases like \"documenso performance\", \"optimize documenso\",\n  \"documenso caching\", \"documenso batch operations\".\nallowed-tools: Read, Write, Edit\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\n---\n\n# Documenso Performance Tuning\n\n## Overview\nOptimize Documenso integrations for speed, efficiency, and scalability.\n\n## Prerequisites\n- Working Documenso integration\n- Performance monitoring in place\n- Redis or caching layer (recommended)\n\n## Caching Strategies\n\n### Step 1: Document Metadata Cache\n\n```typescript\nimport Redis from \"ioredis\";\n\nconst redis = new Redis(process.env.REDIS_URL);\nconst CACHE_TTL = 300; \u002F\u002F 5 minutes\n\ninterface CachedDocument {\n  id: string;\n  title: string;\n  status: string;\n  recipientCount: number;\n  cachedAt: string;\n}\n\nasync function getDocumentCached(\n  documentId: string\n): Promise\u003CCachedDocument | null> {\n  \u002F\u002F Try cache first\n  const cacheKey = `doc:${documentId}`;\n  const cached = await redis.get(cacheKey);\n\n  if (cached) {\n    return JSON.parse(cached);\n  }\n\n  \u002F\u002F Fetch from API\n  const client = getDocumensoClient();\n  const doc = await client.documents.getV0({ documentId });\n\n  \u002F\u002F Cache the result\n  const cacheData: CachedDocument = {\n    id: doc.id!,\n    title: doc.title!,\n    status: doc.status!,\n    recipientCount: doc.recipients?.length ?? 0,\n    cachedAt: new Date().toISOString(),\n  };\n\n  await redis.setex(cacheKey, CACHE_TTL, JSON.stringify(cacheData));\n\n  return cacheData;\n}\n\n\u002F\u002F Invalidate cache on webhook events\nasync function invalidateDocumentCache(documentId: string): Promise\u003Cvoid> {\n  await redis.del(`doc:${documentId}`);\n}\n```\n\n### Step 2: Template Cache\n\n```typescript\n\u002F\u002F Templates change rarely - longer TTL\nconst TEMPLATE_CACHE_TTL = 3600; \u002F\u002F 1 hour\n\nasync function getTemplateCached(templateId: string) {\n  const cacheKey = `tmpl:${templateId}`;\n  const cached = await redis.get(cacheKey);\n\n  if (cached) {\n    return JSON.parse(cached);\n  }\n\n  const client = getDocumensoClient();\n  const template = await client.templates.getV0({ templateId });\n\n  await redis.setex(cacheKey, TEMPLATE_CACHE_TTL, JSON.stringify(template));\n\n  return template;\n}\n\n\u002F\u002F Bulk cache templates on startup\nasync function warmTemplateCache(templateIds: string[]): Promise\u003Cvoid> {\n  const client = getDocumensoClient();\n\n  console.log(`Warming cache for ${templateIds.length} templates...`);\n\n  for (const templateId of templateIds) {\n    try {\n      await getTemplateCached(templateId);\n    } catch (error) {\n      console.warn(`Failed to cache template ${templateId}`);\n    }\n  }\n}\n```\n\n## Batch Operations\n\n### Step 3: Batch Document Creation\n\n```typescript\nimport PQueue from \"p-queue\";\n\ninterface DocumentInput {\n  title: string;\n  templateId: string;\n  recipients: Array\u003C{ email: string; name: string }>;\n}\n\nasync function batchCreateDocuments(\n  inputs: DocumentInput[]\n): Promise\u003CMap\u003Cstring, string>> {\n  const results = new Map\u003Cstring, string>(); \u002F\u002F title -> documentId\n\n  \u002F\u002F Queue with rate limiting\n  const queue = new PQueue({\n    concurrency: 3,\n    interval: 1000,\n    intervalCap: 5,\n  });\n\n  \u002F\u002F Process in batches\n  const promises = inputs.map((input) =>\n    queue.add(async () => {\n      const envelope = await client.envelopes.useV0({\n        templateId: input.templateId,\n        title: input.title,\n        recipients: input.recipients.map((r, i) => ({\n          email: r.email,\n          name: r.name,\n          signerIndex: i,\n        })),\n      });\n\n      results.set(input.title, envelope.envelopeId!);\n      return envelope;\n    })\n  );\n\n  await Promise.all(promises);\n\n  return results;\n}\n```\n\n### Step 4: Batch Recipient Updates\n\n```typescript\n\u002F\u002F Use bulk API when available\nasync function addRecipientsBatch(\n  documentId: string,\n  recipients: Array\u003C{ email: string; name: string; role: string }>\n): Promise\u003Cstring[]> {\n  \u002F\u002F Use createManyV0 for batch creation\n  const result = await client.documentsRecipients.createManyV0({\n    documentId,\n    recipients: recipients.map((r) => ({\n      email: r.email,\n      name: r.name,\n      role: r.role as any,\n    })),\n  });\n\n  return result.recipientIds ?? [];\n}\n```\n\n## Connection Pooling\n\n### Step 5: HTTP Client Optimization\n\n```typescript\nimport { Documenso } from \"@documenso\u002Fsdk-typescript\";\n\n\u002F\u002F Reuse client instance (connection pooling is handled internally)\nlet clientInstance: Documenso | null = null;\n\nexport function getDocumensoClient(): Documenso {\n  if (!clientInstance) {\n    clientInstance = new Documenso({\n      apiKey: process.env.DOCUMENSO_API_KEY ?? \"\",\n      \u002F\u002F SDK handles connection pooling internally\n      timeoutMs: 30000,\n      retryConfig: {\n        strategy: \"backoff\",\n        backoff: {\n          initialInterval: 500,\n          maxInterval: 30000,\n          exponent: 1.5,\n          maxElapsedTime: 120000,\n        },\n        retryConnectionErrors: true,\n      },\n    });\n  }\n  return clientInstance;\n}\n```\n\n## Response Size Optimization\n\n### Step 6: Pagination for Large Lists\n\n```typescript\n\u002F\u002F Efficient pagination\nasync function* iterateDocuments(\n  pageSize = 100\n): AsyncGenerator\u003CDocumentInfo[]> {\n  let page = 1;\n  let hasMore = true;\n\n  while (hasMore) {\n    const result = await client.documents.findV0({\n      page,\n      perPage: pageSize,\n    });\n\n    const docs = result.documents ?? [];\n\n    if (docs.length > 0) {\n      yield docs;\n    }\n\n    hasMore = docs.length === pageSize;\n    page++;\n  }\n}\n\n\u002F\u002F Usage\nasync function processAllDocuments() {\n  for await (const batch of iterateDocuments(100)) {\n    console.log(`Processing ${batch.length} documents...`);\n    await processBatch(batch);\n  }\n}\n```\n\n### Step 7: Field Selection (When Available)\n\n```typescript\n\u002F\u002F Request only needed fields to reduce payload size\n\u002F\u002F Note: Check SDK for field selection support\nasync function getDocumentStatus(documentId: string) {\n  const doc = await client.documents.getV0({ documentId });\n\n  \u002F\u002F Extract only what's needed\n  return {\n    id: doc.id,\n    status: doc.status,\n    completedAt: doc.completedAt,\n  };\n}\n```\n\n## Async Processing\n\n### Step 8: Background Job Queue\n\n```typescript\nimport Bull from \"bull\";\n\nconst documentQueue = new Bull(\"document-processing\", {\n  redis: process.env.REDIS_URL,\n});\n\n\u002F\u002F Add job instead of processing synchronously\nasync function createDocumentAsync(input: DocumentInput): Promise\u003Cstring> {\n  const job = await documentQueue.add(\"create-document\", input, {\n    attempts: 3,\n    backoff: { type: \"exponential\", delay: 1000 },\n  });\n\n  return job.id.toString();\n}\n\n\u002F\u002F Process jobs in background\ndocumentQueue.process(\"create-document\", async (job) => {\n  const { title, templateId, recipients } = job.data;\n\n  const envelope = await client.envelopes.useV0({\n    templateId,\n    title,\n    recipients: recipients.map((r: any, i: number) => ({\n      email: r.email,\n      name: r.name,\n      signerIndex: i,\n    })),\n  });\n\n  return { documentId: envelope.envelopeId };\n});\n```\n\n## Performance Monitoring\n\n### Step 9: Request Timing\n\n```typescript\nclass PerformanceMonitor {\n  private timings: number[] = [];\n\n  async track\u003CT>(operation: () => Promise\u003CT>): Promise\u003CT> {\n    const start = Date.now();\n    try {\n      return await operation();\n    } finally {\n      const duration = Date.now() - start;\n      this.timings.push(duration);\n\n      \u002F\u002F Keep last 1000 timings\n      if (this.timings.length > 1000) {\n        this.timings = this.timings.slice(-1000);\n      }\n    }\n  }\n\n  getMetrics() {\n    const sorted = [...this.timings].sort((a, b) => a - b);\n    return {\n      count: this.timings.length,\n      p50: sorted[Math.floor(sorted.length * 0.5)] ?? 0,\n      p95: sorted[Math.floor(sorted.length * 0.95)] ?? 0,\n      p99: sorted[Math.floor(sorted.length * 0.99)] ?? 0,\n      avg:\n        this.timings.reduce((a, b) => a + b, 0) \u002F this.timings.length || 0,\n    };\n  }\n}\n\nconst perfMonitor = new PerformanceMonitor();\n\n\u002F\u002F Wrap API calls\nasync function getDocumentTimed(documentId: string) {\n  return perfMonitor.track(() =>\n    client.documents.getV0({ documentId })\n  );\n}\n```\n\n## Performance Checklist\n\n- [ ] Caching implemented for frequently accessed data\n- [ ] Batch operations used where available\n- [ ] Connection pooling via singleton client\n- [ ] Pagination for large result sets\n- [ ] Background processing for non-blocking operations\n- [ ] Request timing and monitoring in place\n- [ ] Rate limiting prevents API throttling\n- [ ] Cache invalidation on webhook events\n\n## Output\n- Reduced API latency with caching\n- Efficient bulk operations\n- Background processing configured\n- Performance metrics available\n\n## Error Handling\n| Performance Issue | Cause | Solution |\n|------------------|-------|----------|\n| Slow responses | No caching | Add caching layer |\n| Rate limits | Too many requests | Use queue\u002Fbatching |\n| Memory issues | Large responses | Use pagination |\n| Timeout errors | Slow processing | Use background jobs |\n\n## Resources\n- [Redis Caching](https:\u002F\u002Fredis.io\u002Fdocs\u002Fmanual\u002Fpatterns\u002F)\n- [Bull Queue](https:\u002F\u002Fgithub.com\u002FOptimalBits\u002Fbull)\n- [p-queue](https:\u002F\u002Fgithub.com\u002Fsindresorhus\u002Fp-queue)\n\n## Next Steps\nFor cost optimization, see `documenso-cost-tuning`.\n","# Documenso Performance Tuning\n\n## Overview\nOptimize Documenso integrations for speed, efficiency, and scalability.\n\n## Prerequisites\n- Working Documenso integration\n- Performance monitoring in place\n- Redis or caching layer (recommended)\n\n## Caching Strategies\n\n### Step 1: Document Metadata Cache\n\n```typescript\nimport Redis from \"ioredis\";\n\nconst redis = new Redis(process.env.REDIS_URL);\nconst CACHE_TTL = 300; \u002F\u002F 5 minutes\n\ninterface CachedDocument {\n  id: string;\n  title: string;\n  status: string;\n  recipientCount: number;\n  cachedAt: string;\n}\n\nasync function getDocumentCached(\n  documentId: string\n): Promise\u003CCachedDocument | null> {\n  \u002F\u002F Try cache first\n  const cacheKey = `doc:${documentId}`;\n  const cached = await redis.get(cacheKey);\n\n  if (cached) {\n    return JSON.parse(cached);\n  }\n\n  \u002F\u002F Fetch from API\n  const client = getDocumensoClient();\n  const doc = await client.documents.getV0({ documentId });\n\n  \u002F\u002F Cache the result\n  const cacheData: CachedDocument = {\n    id: doc.id!,\n    title: doc.title!,\n    status: doc.status!,\n    recipientCount: doc.recipients?.length ?? 0,\n    cachedAt: new Date().toISOString(),\n  };\n\n  await redis.setex(cacheKey, CACHE_TTL, JSON.stringify(cacheData));\n\n  return cacheData;\n}\n\n\u002F\u002F Invalidate cache on webhook events\nasync function invalidateDocumentCache(documentId: string): Promise\u003Cvoid> {\n  await redis.del(`doc:${documentId}`);\n}\n```\n\n### Step 2: Template Cache\n\n```typescript\n\u002F\u002F Templates change rarely - longer TTL\nconst TEMPLATE_CACHE_TTL = 3600; \u002F\u002F 1 hour\n\nasync function getTemplateCached(templateId: string) {\n  const cacheKey = `tmpl:${templateId}`;\n  const cached = await redis.get(cacheKey);\n\n  if (cached) {\n    return JSON.parse(cached);\n  }\n\n  const client = getDocumensoClient();\n  const template = await client.templates.getV0({ templateId });\n\n  await redis.setex(cacheKey, TEMPLATE_CACHE_TTL, JSON.stringify(template));\n\n  return template;\n}\n\n\u002F\u002F Bulk cache templates on startup\nasync function warmTemplateCache(templateIds: string[]): Promise\u003Cvoid> {\n  const client = getDocumensoClient();\n\n  console.log(`Warming cache for ${templateIds.length} templates...`);\n\n  for (const templateId of templateIds) {\n    try {\n      await getTemplateCached(templateId);\n    } catch (error) {\n      console.warn(`Failed to cache template ${templateId}`);\n    }\n  }\n}\n```\n\n## Batch Operations\n\n### Step 3: Batch Document Creation\n\n```typescript\nimport PQueue from \"p-queue\";\n\ninterface DocumentInput {\n  title: string;\n  templateId: string;\n  recipients: Array\u003C{ email: string; name: string }>;\n}\n\nasync function batchCreateDocuments(\n  inputs: DocumentInput[]\n): Promise\u003CMap\u003Cstring, string>> {\n  const results = new Map\u003Cstring, string>(); \u002F\u002F title -> documentId\n\n  \u002F\u002F Queue with rate limiting\n  const queue = new PQueue({\n    concurrency: 3,\n    interval: 1000,\n    intervalCap: 5,\n  });\n\n  \u002F\u002F Process in batches\n  const promises = inputs.map((input) =>\n    queue.add(async () => {\n      const envelope = await client.envelopes.useV0({\n        templateId: input.templateId,\n        title: input.title,\n        recipients: input.recipients.map((r, i) => ({\n          email: r.email,\n          name: r.name,\n          signerIndex: i,\n        })),\n      });\n\n      results.set(input.title, envelope.envelopeId!);\n      return envelope;\n    })\n  );\n\n  await Promise.all(promises);\n\n  return results;\n}\n```\n\n### Step 4: Batch Recipient Updates\n\n```typescript\n\u002F\u002F Use bulk API when available\nasync function addRecipientsBatch(\n  documentId: string,\n  recipients: Array\u003C{ email: string; name: string; role: string }>\n): Promise\u003Cstring[]> {\n  \u002F\u002F Use createManyV0 for batch creation\n  const result = await client.documentsRecipients.createManyV0({\n    documentId,\n    recipients: recipients.map((r) => ({\n      email: r.email,\n      name: r.name,\n      role: r.role as any,\n    })),\n  });\n\n  return result.recipientIds ?? [];\n}\n```\n\n## Connection Pooling\n\n### Step 5: HTTP Client Optimization\n\n```typescript\nimport { Documenso } from \"@documenso\u002Fsdk-typescript\";\n\n\u002F\u002F Reuse client instance (connection pooling is handled internally)\nlet clientInstance: Documenso | null = null;\n\nexport function getDocumensoClient(): Documenso {\n  if (!clientInstance) {\n    clientInstance = new Documenso({\n      apiKey: process.env.DOCUMENSO_API_KEY ?? \"\",\n      \u002F\u002F SDK handles connection pooling internally\n      timeoutMs: 30000,\n      retryConfig: {\n        strategy: \"backoff\",\n        backoff: {\n          initialInterval: 500,\n          maxInterval: 30000,\n          exponent: 1.5,\n          maxElapsedTime: 120000,\n        },\n        retryConnectionErrors: true,\n      },\n    });\n  }\n  return clientInstance;\n}\n```\n\n## Response Size Optimization\n\n### Step 6: Pagination for Large Lists\n\n```typescript\n\u002F\u002F Efficient pagination\nasync function* iterateDocuments(\n  pageSize = 100\n): AsyncGenerator\u003CDocumentInfo[]> {\n  let page = 1;\n  let hasMore = true;\n\n  while (hasMore) {\n    const result = await client.documents.findV0({\n      page,\n      perPage: pageSize,\n    });\n\n    const docs = result.documents ?? [];\n\n    if (docs.length > 0) {\n      yield docs;\n    }\n\n    hasMore = docs.length === pageSize;\n    page++;\n  }\n}\n\n\u002F\u002F Usage\nasync function processAllDocuments() {\n  for await (const batch of iterateDocuments(100)) {\n    console.log(`Processing ${batch.length} documents...`);\n    await processBatch(batch);\n  }\n}\n```\n\n### Step 7: Field Selection (When Available)\n\n```typescript\n\u002F\u002F Request only needed fields to reduce payload size\n\u002F\u002F Note: Check SDK for field selection support\nasync function getDocumentStatus(documentId: string) {\n  const doc = await client.documents.getV0({ documentId });\n\n  \u002F\u002F Extract only what's needed\n  return {\n    id: doc.id,\n    status: doc.status,\n    completedAt: doc.completedAt,\n  };\n}\n```\n\n## Async Processing\n\n### Step 8: Background Job Queue\n\n```typescript\nimport Bull from \"bull\";\n\nconst documentQueue = new Bull(\"document-processing\", {\n  redis: process.env.REDIS_URL,\n});\n\n\u002F\u002F Add job instead of processing synchronously\nasync function createDocumentAsync(input: DocumentInput): Promise\u003Cstring> {\n  const job = await documentQueue.add(\"create-document\", input, {\n    attempts: 3,\n    backoff: { type: \"exponential\", delay: 1000 },\n  });\n\n  return job.id.toString();\n}\n\n\u002F\u002F Process jobs in background\ndocumentQueue.process(\"create-document\", async (job) => {\n  const { title, templateId, recipients } = job.data;\n\n  const envelope = await client.envelopes.useV0({\n    templateId,\n    title,\n    recipients: recipients.map((r: any, i: number) => ({\n      email: r.email,\n      name: r.name,\n      signerIndex: i,\n    })),\n  });\n\n  return { documentId: envelope.envelopeId };\n});\n```\n\n## Performance Monitoring\n\n### Step 9: Request Timing\n\n```typescript\nclass PerformanceMonitor {\n  private timings: number[] = [];\n\n  async track\u003CT>(operation: () => Promise\u003CT>): Promise\u003CT> {\n    const start = Date.now();\n    try {\n      return await operation();\n    } finally {\n      const duration = Date.now() - start;\n      this.timings.push(duration);\n\n      \u002F\u002F Keep last 1000 timings\n      if (this.timings.length > 1000) {\n        this.timings = this.timings.slice(-1000);\n      }\n    }\n  }\n\n  getMetrics() {\n    const sorted = [...this.timings].sort((a, b) => a - b);\n    return {\n      count: this.timings.length,\n      p50: sorted[Math.floor(sorted.length * 0.5)] ?? 0,\n      p95: sorted[Math.floor(sorted.length * 0.95)] ?? 0,\n      p99: sorted[Math.floor(sorted.length * 0.99)] ?? 0,\n      avg:\n        this.timings.reduce((a, b) => a + b, 0) \u002F this.timings.length || 0,\n    };\n  }\n}\n\nconst perfMonitor = new PerformanceMonitor();\n\n\u002F\u002F Wrap API calls\nasync function getDocumentTimed(documentId: string) {\n  return perfMonitor.track(() =>\n    client.documents.getV0({ documentId })\n  );\n}\n```\n\n## Performance Checklist\n\n- [ ] Caching implemented for frequently accessed data\n- [ ] Batch operations used where available\n- [ ] Connection pooling via singleton client\n- [ ] Pagination for large result sets\n- [ ] Background processing for non-blocking operations\n- [ ] Request timing and monitoring in place\n- [ ] Rate limiting prevents API throttling\n- [ ] Cache invalidation on webhook events\n\n## Output\n- Reduced API latency with caching\n- Efficient bulk operations\n- Background processing configured\n- Performance metrics available\n\n## Error Handling\n| Performance Issue | Cause | Solution |\n|------------------|-------|----------|\n| Slow responses | No caching | Add caching layer |\n| Rate limits | Too many requests | Use queue\u002Fbatching |\n| Memory issues | Large responses | Use pagination |\n| Timeout errors | Slow processing | Use background jobs |\n\n## Resources\n- [Redis Caching](https:\u002F\u002Fredis.io\u002Fdocs\u002Fmanual\u002Fpatterns\u002F)\n- [Bull Queue](https:\u002F\u002Fgithub.com\u002FOptimalBits\u002Fbull)\n- [p-queue](https:\u002F\u002Fgithub.com\u002Fsindresorhus\u002Fp-queue)\n\n## Next Steps\nFor cost optimization, see `documenso-cost-tuning`.\n",{"name":5,"author":48,"license":15,"version":49,"description":50,"allowed-tools":51},"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Optimize Documenso integration performance with caching, batching, and efficient patterns.\nUse when improving response times, reducing API calls,\nor optimizing bulk document operations.\nTrigger with phrases like \"documenso performance\", \"optimize documenso\",\n\"documenso caching\", \"documenso batch operations\".\n","Read, Write, Edit","main","90b50ed0778745a80fd5bfb13b1843d45b9e82f7","tests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fdocumenso-pack\u002Fskills\u002Fdocumenso-performance-tuning",233,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust","https:\u002F\u002Fgithub.com\u002FDicklesworthstone","https:\u002F\u002Fwww.jeffreyemanuel.com\u002F","Building in NY","2026-11-13 03:33:43",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add Dicklesworthstone\u002Fpi_agent_rust --skill documenso-performance-tuning",{"tool":67,"command":68},"bunx","bunx skills add Dicklesworthstone\u002Fpi_agent_rust --skill documenso-performance-tuning",{"tool":70,"command":71},"pnpm","pnpm dlx skills add Dicklesworthstone\u002Fpi_agent_rust --skill documenso-performance-tuning","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fdocumenso-pack\u002Fskills\u002Fdocumenso-performance-tuning\u002FSKILL.md",true,[],[76,116,140,166,193,214],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":80,"licenseFileUrl":81,"sourceHtmlUrl":82,"categories":83,"keywords":89,"publishedAt":43},"01M6FEGPPK0ZTKCCM0R3E3KS33","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FSKILL.md",[84],{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,35,108,109,110,111,112,113,114,115],"web artifacts builder","web","artifacts","artifacts builder","builder","frontend","css","components","react","component","routing","state management","state","shadcn","file","ui","Tools","Tailwind","html","single-file","simple","ui components","multi","for","jsx","suite",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":80,"licenseFileUrl":120,"sourceHtmlUrl":121,"categories":122,"keywords":127,"publishedAt":43},"01M6FEE9VTK1W4GY21AKREJXRG","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FSKILL.md",[123,126],{"categoryNo":124,"categoryName":125,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},[128,129,130,95,131,132,91,133,134,135,105,136,137,138,139,28,113],"testing","webapp testing","webapp","screenshots","playwright","debugging","toolkit","browser","logs","applications","behavior","local",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":144,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":43},"01M6FE20F7ZTQBFWKF4MPJ2SBX","neuropixels-analysis","Neuropixels neural recording analysis. Load SpikeGLX\u002FOpenEphys data, preprocess, motion correction, Kilosort4 spike sorting, quality metrics, Allen\u002FIBL curation, AI-assisted visual analysis, for Neuropixels 1.0\u002F2.0 extracellular electrophysiology. Use when working with neural recordings, spike sorting, extracellular electrophysiology, or when the user mentions Neuropixels, SpikeGLX, Open Ephys, Kilosort, quality metrics, or unit curation.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fneuropixels-analysis\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fneuropixels-analysis\u002FSKILL.md",[],[148,149,150,151,152,153,154,155,35,156,157,158,159,160,161,162,28,163,164,165,113,25],"analysis","neuropixels analysis","spike","metrics","data","open","quality","user","recordings","Neural","motion","visual","quality metrics","unit","sorting","curation","recording","load",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":80,"licenseFileUrl":170,"sourceHtmlUrl":171,"categories":172,"keywords":176,"publishedAt":43},"01M6FDP0PDK6F1GGX395C7625Z","skill-creator","Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fskill-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fskill-creator\u002FSKILL.md",[173],{"categoryNo":174,"categoryName":175,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000023","Skill与智能体开发",[177,178,179,180,181,182,183,184,185,186,187,188,189,190,28,113,191,25,192],"skill creator","creator","workflows","create","update","capabilities","knowledge","tool","integrations","specialized","guide","new skill","existing skill","users","Existing","new",{"skillNo":194,"name":195,"nameZh":6,"description":196,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":197,"sourceHtmlUrl":198,"categories":199,"keywords":201,"publishedAt":43},"01M6FDM8Y7VK7NYG9SM7QPA3PW","notebooklm","Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automation, library management, persistent auth. Drastically reduced hallucinations through document-only responses.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fnotebooklm\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fnotebooklm\u002FSKILL.md",[200],{"categoryNo":174,"categoryName":175,"taxonomyType":87,"taxonomyTypeDesc":88},[195,202,203,204,205,206,207,135,208,209,35,210,34,211,212,113,213],"google","browser automation","gemini","automation","auth","code","library","management","only","query","Citation","source",{"skillNo":215,"name":216,"nameZh":6,"description":217,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":80,"licenseFileUrl":218,"sourceHtmlUrl":219,"categories":220,"keywords":227,"publishedAt":43},"01M6FDHPXE10J3XGTCH5HBHS1M","slack-gif-creator","Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like \"make me a GIF of X doing Y for Slack.\"","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fenterprise-communication\u002Fslack-gif-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fenterprise-communication\u002Fslack-gif-creator\u002FSKILL.md",[221,224],{"categoryNo":222,"categoryName":223,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":225,"categoryName":226,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000016","图像与多媒体",[228,229,230,178,231,106,232,233,183,35,234,190,235,236,237,113,238,25],"slack gif creator","slack","gif","validation","constraints","Animation","me","make","Utilities","concepts","request"]