[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F989PJFAGFJRTB23TFNK6P":3,"skill-same:01M6F989PJFAGFJRTB23TFNK6P":78},{"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":23,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":6,"ownerHtmlUrl":60,"ownerBlogUrl":61,"ownerDescription":62,"updatedAt":63,"install":64,"resources":77},"01M6F989PJFAGFJRTB23TFNK6P","speak-deploy-integration",null,"Deploy Speak language learning integrations to Vercel, Fly.io, and Cloud Run platforms.\nUse when deploying Speak-powered applications to production,\nconfiguring platform-specific secrets, or setting up deployment pipelines.\nTrigger with phrases like \"deploy speak\", \"speak Vercel\",\n\"speak production deploy\", \"speak Cloud Run\", \"speak Fly.io\".","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\u002Fspeak-pack\u002Fskills\u002Fspeak-deploy-integration\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"integration","speak deploy integration","speak","deploy","write","when","cloud run","trigger","io","platform","language learning","up","vercel","edit","read","integrations","Bash","fly","secrets","applications","run","deployment","2026-11-10 10:12:30",false,"---\nname: speak-deploy-integration\ndescription: |\n  Deploy Speak language learning integrations to Vercel, Fly.io, and Cloud Run platforms.\n  Use when deploying Speak-powered applications to production,\n  configuring platform-specific secrets, or setting up deployment pipelines.\n  Trigger with phrases like \"deploy speak\", \"speak Vercel\",\n  \"speak production deploy\", \"speak Cloud Run\", \"speak Fly.io\".\nallowed-tools: Read, Write, Edit, Bash(vercel:*), Bash(fly:*), Bash(gcloud:*)\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\n---\n\n# Speak Deploy Integration\n\n## Overview\nDeploy Speak-powered language learning applications to popular platforms with proper secrets management.\n\n## Prerequisites\n- Speak API keys for production environment\n- Platform CLI installed (vercel, fly, or gcloud)\n- Application code ready for deployment\n- Environment variables documented\n- Audio storage configured\n\n## Vercel Deployment\n\n### Environment Setup\n```bash\n# Add Speak secrets to Vercel\nvercel secrets add speak_api_key sk_live_***\nvercel secrets add speak_app_id app_***\nvercel secrets add speak_webhook_secret whsec_***\n\n# Link to project\nvercel link\n\n# Deploy preview\nvercel\n\n# Deploy production\nvercel --prod\n```\n\n### vercel.json Configuration\n```json\n{\n  \"env\": {\n    \"SPEAK_API_KEY\": \"@speak_api_key\",\n    \"SPEAK_APP_ID\": \"@speak_app_id\"\n  },\n  \"functions\": {\n    \"api\u002F**\u002F*.ts\": {\n      \"maxDuration\": 60\n    },\n    \"api\u002Fspeech\u002F**\u002F*.ts\": {\n      \"maxDuration\": 120,\n      \"memory\": 1024\n    }\n  },\n  \"headers\": [\n    {\n      \"source\": \"\u002Fapi\u002Fspeech\u002F(.*)\",\n      \"headers\": [\n        { \"key\": \"Access-Control-Allow-Origin\", \"value\": \"*\" },\n        { \"key\": \"Access-Control-Allow-Methods\", \"value\": \"POST, OPTIONS\" }\n      ]\n    }\n  ]\n}\n```\n\n### Next.js API Routes for Speak\n```typescript\n\u002F\u002F pages\u002Fapi\u002Fspeak\u002Fsession.ts\nimport { SpeakClient } from '@speak\u002Flanguage-sdk';\nimport type { NextApiRequest, NextApiResponse } from 'next';\n\nconst client = new SpeakClient({\n  apiKey: process.env.SPEAK_API_KEY!,\n  appId: process.env.SPEAK_APP_ID!,\n});\n\nexport default async function handler(req: NextApiRequest, res: NextApiResponse) {\n  if (req.method !== 'POST') {\n    return res.status(405).json({ error: 'Method not allowed' });\n  }\n\n  try {\n    const { language, topic, difficulty } = req.body;\n\n    const session = await client.tutor.startSession({\n      language,\n      topic,\n      difficulty,\n    });\n\n    res.json({ sessionId: session.id });\n  } catch (error) {\n    console.error('Speak session error:', error);\n    res.status(500).json({ error: 'Failed to start session' });\n  }\n}\n```\n\n## Fly.io Deployment\n\n### fly.toml\n```toml\napp = \"my-speak-app\"\nprimary_region = \"iad\"\n\n[env]\n  NODE_ENV = \"production\"\n  SPEAK_TARGET_LANGUAGE = \"es\"\n\n[http_service]\n  internal_port = 3000\n  force_https = true\n  auto_stop_machines = false  # Keep warm for low latency\n  auto_start_machines = true\n  min_machines_running = 1\n\n[[services.http_checks]]\n  interval = 10000\n  grace_period = \"10s\"\n  method = \"get\"\n  path = \"\u002Fhealth\"\n  protocol = \"http\"\n  timeout = 2000\n\n# Larger instance for audio processing\n[[vm]]\n  cpu_kind = \"performance\"\n  cpus = 2\n  memory_mb = 2048\n```\n\n### Secrets Configuration\n```bash\n# Set Speak secrets\nfly secrets set SPEAK_API_KEY=sk_live_***\nfly secrets set SPEAK_APP_ID=app_***\nfly secrets set SPEAK_WEBHOOK_SECRET=whsec_***\n\n# Set audio storage (if using external)\nfly secrets set AUDIO_STORAGE_URL=https:\u002F\u002Fstorage.example.com\nfly secrets set AUDIO_ENCRYPTION_KEY=base64_key_here\n\n# Deploy\nfly deploy\n```\n\n### Volume for Audio Caching\n```bash\n# Create volume for audio cache\nfly volumes create speak_cache --size 10 --region iad\n\n# Update fly.toml\n[mounts]\n  source = \"speak_cache\"\n  destination = \"\u002Fapp\u002Fcache\"\n```\n\n## Google Cloud Run\n\n### Dockerfile\n```dockerfile\nFROM node:20-slim\n\nWORKDIR \u002Fapp\n\n# Install audio dependencies for speech processing\nRUN apt-get update && apt-get install -y \\\n    ffmpeg \\\n    libsox-fmt-all \\\n    && rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F*\n\nCOPY package*.json .\u002F\nRUN npm ci --only=production\n\nCOPY . .\nRUN npm run build\n\n# Non-root user for security\nUSER node\n\nCMD [\"npm\", \"start\"]\n```\n\n### Deploy Script\n```bash\n#!\u002Fbin\u002Fbash\n# deploy-cloud-run.sh\n\nPROJECT_ID=\"${GOOGLE_CLOUD_PROJECT}\"\nSERVICE_NAME=\"speak-service\"\nREGION=\"us-central1\"\n\n# Build and push image\ngcloud builds submit --tag gcr.io\u002F$PROJECT_ID\u002F$SERVICE_NAME\n\n# Deploy to Cloud Run\ngcloud run deploy $SERVICE_NAME \\\n  --image gcr.io\u002F$PROJECT_ID\u002F$SERVICE_NAME \\\n  --region $REGION \\\n  --platform managed \\\n  --allow-unauthenticated \\\n  --memory 2Gi \\\n  --cpu 2 \\\n  --timeout 120 \\\n  --concurrency 80 \\\n  --min-instances 1 \\\n  --set-secrets=SPEAK_API_KEY=speak-api-key:latest,SPEAK_APP_ID=speak-app-id:latest\n\n# Set up Cloud Storage for audio (optional)\ngsutil mb -l $REGION gs:\u002F\u002F$PROJECT_ID-speak-audio\ngcloud run services update $SERVICE_NAME \\\n  --set-env-vars=AUDIO_BUCKET=gs:\u002F\u002F$PROJECT_ID-speak-audio\n```\n\n### Cloud Run with WebSocket Support\n```yaml\n# cloudrun.yaml (for WebSocket connections needed for real-time speech)\napiVersion: serving.knative.dev\u002Fv1\nkind: Service\nmetadata:\n  name: speak-service\nspec:\n  template:\n    metadata:\n      annotations:\n        run.googleapis.com\u002Fexecution-environment: gen2\n        run.googleapis.com\u002Fsession-affinity: \"true\"\n    spec:\n      containerConcurrency: 80\n      timeoutSeconds: 300\n      containers:\n        - image: gcr.io\u002FPROJECT_ID\u002Fspeak-service\n          ports:\n            - name: http1\n              containerPort: 3000\n          resources:\n            limits:\n              cpu: \"2\"\n              memory: 2Gi\n```\n\n## Environment Configuration Pattern\n\n```typescript\n\u002F\u002F config\u002Fspeak.ts\ninterface SpeakConfig {\n  apiKey: string;\n  appId: string;\n  environment: 'development' | 'staging' | 'production';\n  webhookSecret?: string;\n  audioStorage?: {\n    type: 'local' | 's3' | 'gcs';\n    bucket?: string;\n  };\n}\n\nexport function getSpeakConfig(): SpeakConfig {\n  const env = process.env.NODE_ENV || 'development';\n\n  return {\n    apiKey: process.env.SPEAK_API_KEY!,\n    appId: process.env.SPEAK_APP_ID!,\n    environment: env as SpeakConfig['environment'],\n    webhookSecret: process.env.SPEAK_WEBHOOK_SECRET,\n    audioStorage: {\n      type: process.env.AUDIO_STORAGE_TYPE as any || 'local',\n      bucket: process.env.AUDIO_BUCKET,\n    },\n  };\n}\n```\n\n## Health Check Endpoint\n\n```typescript\n\u002F\u002F api\u002Fhealth.ts\nimport { SpeakClient } from '@speak\u002Flanguage-sdk';\n\nconst client = new SpeakClient({\n  apiKey: process.env.SPEAK_API_KEY!,\n  appId: process.env.SPEAK_APP_ID!,\n});\n\nexport async function GET() {\n  const start = Date.now();\n\n  try {\n    const speakHealth = await client.health.check();\n\n    return Response.json({\n      status: speakHealth.healthy ? 'healthy' : 'degraded',\n      services: {\n        speak: {\n          connected: speakHealth.healthy,\n          latencyMs: Date.now() - start,\n        },\n      },\n      timestamp: new Date().toISOString(),\n    });\n  } catch (error) {\n    return Response.json({\n      status: 'unhealthy',\n      services: {\n        speak: {\n          connected: false,\n          error: error instanceof Error ? error.message : 'Unknown error',\n        },\n      },\n      timestamp: new Date().toISOString(),\n    }, { status: 503 });\n  }\n}\n```\n\n## Output\n- Application deployed to production\n- Speak secrets securely configured\n- Health check endpoint functional\n- Audio processing infrastructure ready\n- Environment-specific configuration in place\n\n## Error Handling\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Secret not found | Missing configuration | Add secret via platform CLI |\n| Deploy timeout | Large build or audio deps | Increase build timeout |\n| Health check fails | Wrong API key | Verify environment variable |\n| Cold start issues | No warm-up | Configure minimum instances |\n| Audio timeout | Processing too slow | Increase memory\u002FCPU |\n\n## Examples\n\n### Quick Deploy Script\n```bash\n#!\u002Fbin\u002Fbash\n# Platform-agnostic deploy helper\ncase \"$1\" in\n  vercel)\n    vercel secrets add speak_api_key \"$SPEAK_API_KEY\"\n    vercel secrets add speak_app_id \"$SPEAK_APP_ID\"\n    vercel --prod\n    ;;\n  fly)\n    fly secrets set SPEAK_API_KEY=\"$SPEAK_API_KEY\"\n    fly secrets set SPEAK_APP_ID=\"$SPEAK_APP_ID\"\n    fly deploy\n    ;;\n  cloudrun)\n    gcloud run deploy speak-service \\\n      --set-secrets=SPEAK_API_KEY=speak-api-key:latest\n    ;;\nesac\n```\n\n## Resources\n- [Vercel Documentation](https:\u002F\u002Fvercel.com\u002Fdocs)\n- [Fly.io Documentation](https:\u002F\u002Ffly.io\u002Fdocs)\n- [Cloud Run Documentation](https:\u002F\u002Fcloud.google.com\u002Frun\u002Fdocs)\n- [Speak Deploy Guide](https:\u002F\u002Fdeveloper.speak.com\u002Fdocs\u002Fdeploy)\n\n## Next Steps\nFor webhook handling, see `speak-webhooks-events`.\n","# Speak Deploy Integration\n\n## Overview\nDeploy Speak-powered language learning applications to popular platforms with proper secrets management.\n\n## Prerequisites\n- Speak API keys for production environment\n- Platform CLI installed (vercel, fly, or gcloud)\n- Application code ready for deployment\n- Environment variables documented\n- Audio storage configured\n\n## Vercel Deployment\n\n### Environment Setup\n```bash\n# Add Speak secrets to Vercel\nvercel secrets add speak_api_key sk_live_***\nvercel secrets add speak_app_id app_***\nvercel secrets add speak_webhook_secret whsec_***\n\n# Link to project\nvercel link\n\n# Deploy preview\nvercel\n\n# Deploy production\nvercel --prod\n```\n\n### vercel.json Configuration\n```json\n{\n  \"env\": {\n    \"SPEAK_API_KEY\": \"@speak_api_key\",\n    \"SPEAK_APP_ID\": \"@speak_app_id\"\n  },\n  \"functions\": {\n    \"api\u002F**\u002F*.ts\": {\n      \"maxDuration\": 60\n    },\n    \"api\u002Fspeech\u002F**\u002F*.ts\": {\n      \"maxDuration\": 120,\n      \"memory\": 1024\n    }\n  },\n  \"headers\": [\n    {\n      \"source\": \"\u002Fapi\u002Fspeech\u002F(.*)\",\n      \"headers\": [\n        { \"key\": \"Access-Control-Allow-Origin\", \"value\": \"*\" },\n        { \"key\": \"Access-Control-Allow-Methods\", \"value\": \"POST, OPTIONS\" }\n      ]\n    }\n  ]\n}\n```\n\n### Next.js API Routes for Speak\n```typescript\n\u002F\u002F pages\u002Fapi\u002Fspeak\u002Fsession.ts\nimport { SpeakClient } from '@speak\u002Flanguage-sdk';\nimport type { NextApiRequest, NextApiResponse } from 'next';\n\nconst client = new SpeakClient({\n  apiKey: process.env.SPEAK_API_KEY!,\n  appId: process.env.SPEAK_APP_ID!,\n});\n\nexport default async function handler(req: NextApiRequest, res: NextApiResponse) {\n  if (req.method !== 'POST') {\n    return res.status(405).json({ error: 'Method not allowed' });\n  }\n\n  try {\n    const { language, topic, difficulty } = req.body;\n\n    const session = await client.tutor.startSession({\n      language,\n      topic,\n      difficulty,\n    });\n\n    res.json({ sessionId: session.id });\n  } catch (error) {\n    console.error('Speak session error:', error);\n    res.status(500).json({ error: 'Failed to start session' });\n  }\n}\n```\n\n## Fly.io Deployment\n\n### fly.toml\n```toml\napp = \"my-speak-app\"\nprimary_region = \"iad\"\n\n[env]\n  NODE_ENV = \"production\"\n  SPEAK_TARGET_LANGUAGE = \"es\"\n\n[http_service]\n  internal_port = 3000\n  force_https = true\n  auto_stop_machines = false  # Keep warm for low latency\n  auto_start_machines = true\n  min_machines_running = 1\n\n[[services.http_checks]]\n  interval = 10000\n  grace_period = \"10s\"\n  method = \"get\"\n  path = \"\u002Fhealth\"\n  protocol = \"http\"\n  timeout = 2000\n\n# Larger instance for audio processing\n[[vm]]\n  cpu_kind = \"performance\"\n  cpus = 2\n  memory_mb = 2048\n```\n\n### Secrets Configuration\n```bash\n# Set Speak secrets\nfly secrets set SPEAK_API_KEY=sk_live_***\nfly secrets set SPEAK_APP_ID=app_***\nfly secrets set SPEAK_WEBHOOK_SECRET=whsec_***\n\n# Set audio storage (if using external)\nfly secrets set AUDIO_STORAGE_URL=https:\u002F\u002Fstorage.example.com\nfly secrets set AUDIO_ENCRYPTION_KEY=base64_key_here\n\n# Deploy\nfly deploy\n```\n\n### Volume for Audio Caching\n```bash\n# Create volume for audio cache\nfly volumes create speak_cache --size 10 --region iad\n\n# Update fly.toml\n[mounts]\n  source = \"speak_cache\"\n  destination = \"\u002Fapp\u002Fcache\"\n```\n\n## Google Cloud Run\n\n### Dockerfile\n```dockerfile\nFROM node:20-slim\n\nWORKDIR \u002Fapp\n\n# Install audio dependencies for speech processing\nRUN apt-get update && apt-get install -y \\\n    ffmpeg \\\n    libsox-fmt-all \\\n    && rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F*\n\nCOPY package*.json .\u002F\nRUN npm ci --only=production\n\nCOPY . .\nRUN npm run build\n\n# Non-root user for security\nUSER node\n\nCMD [\"npm\", \"start\"]\n```\n\n### Deploy Script\n```bash\n#!\u002Fbin\u002Fbash\n# deploy-cloud-run.sh\n\nPROJECT_ID=\"${GOOGLE_CLOUD_PROJECT}\"\nSERVICE_NAME=\"speak-service\"\nREGION=\"us-central1\"\n\n# Build and push image\ngcloud builds submit --tag gcr.io\u002F$PROJECT_ID\u002F$SERVICE_NAME\n\n# Deploy to Cloud Run\ngcloud run deploy $SERVICE_NAME \\\n  --image gcr.io\u002F$PROJECT_ID\u002F$SERVICE_NAME \\\n  --region $REGION \\\n  --platform managed \\\n  --allow-unauthenticated \\\n  --memory 2Gi \\\n  --cpu 2 \\\n  --timeout 120 \\\n  --concurrency 80 \\\n  --min-instances 1 \\\n  --set-secrets=SPEAK_API_KEY=speak-api-key:latest,SPEAK_APP_ID=speak-app-id:latest\n\n# Set up Cloud Storage for audio (optional)\ngsutil mb -l $REGION gs:\u002F\u002F$PROJECT_ID-speak-audio\ngcloud run services update $SERVICE_NAME \\\n  --set-env-vars=AUDIO_BUCKET=gs:\u002F\u002F$PROJECT_ID-speak-audio\n```\n\n### Cloud Run with WebSocket Support\n```yaml\n# cloudrun.yaml (for WebSocket connections needed for real-time speech)\napiVersion: serving.knative.dev\u002Fv1\nkind: Service\nmetadata:\n  name: speak-service\nspec:\n  template:\n    metadata:\n      annotations:\n        run.googleapis.com\u002Fexecution-environment: gen2\n        run.googleapis.com\u002Fsession-affinity: \"true\"\n    spec:\n      containerConcurrency: 80\n      timeoutSeconds: 300\n      containers:\n        - image: gcr.io\u002FPROJECT_ID\u002Fspeak-service\n          ports:\n            - name: http1\n              containerPort: 3000\n          resources:\n            limits:\n              cpu: \"2\"\n              memory: 2Gi\n```\n\n## Environment Configuration Pattern\n\n```typescript\n\u002F\u002F config\u002Fspeak.ts\ninterface SpeakConfig {\n  apiKey: string;\n  appId: string;\n  environment: 'development' | 'staging' | 'production';\n  webhookSecret?: string;\n  audioStorage?: {\n    type: 'local' | 's3' | 'gcs';\n    bucket?: string;\n  };\n}\n\nexport function getSpeakConfig(): SpeakConfig {\n  const env = process.env.NODE_ENV || 'development';\n\n  return {\n    apiKey: process.env.SPEAK_API_KEY!,\n    appId: process.env.SPEAK_APP_ID!,\n    environment: env as SpeakConfig['environment'],\n    webhookSecret: process.env.SPEAK_WEBHOOK_SECRET,\n    audioStorage: {\n      type: process.env.AUDIO_STORAGE_TYPE as any || 'local',\n      bucket: process.env.AUDIO_BUCKET,\n    },\n  };\n}\n```\n\n## Health Check Endpoint\n\n```typescript\n\u002F\u002F api\u002Fhealth.ts\nimport { SpeakClient } from '@speak\u002Flanguage-sdk';\n\nconst client = new SpeakClient({\n  apiKey: process.env.SPEAK_API_KEY!,\n  appId: process.env.SPEAK_APP_ID!,\n});\n\nexport async function GET() {\n  const start = Date.now();\n\n  try {\n    const speakHealth = await client.health.check();\n\n    return Response.json({\n      status: speakHealth.healthy ? 'healthy' : 'degraded',\n      services: {\n        speak: {\n          connected: speakHealth.healthy,\n          latencyMs: Date.now() - start,\n        },\n      },\n      timestamp: new Date().toISOString(),\n    });\n  } catch (error) {\n    return Response.json({\n      status: 'unhealthy',\n      services: {\n        speak: {\n          connected: false,\n          error: error instanceof Error ? error.message : 'Unknown error',\n        },\n      },\n      timestamp: new Date().toISOString(),\n    }, { status: 503 });\n  }\n}\n```\n\n## Output\n- Application deployed to production\n- Speak secrets securely configured\n- Health check endpoint functional\n- Audio processing infrastructure ready\n- Environment-specific configuration in place\n\n## Error Handling\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Secret not found | Missing configuration | Add secret via platform CLI |\n| Deploy timeout | Large build or audio deps | Increase build timeout |\n| Health check fails | Wrong API key | Verify environment variable |\n| Cold start issues | No warm-up | Configure minimum instances |\n| Audio timeout | Processing too slow | Increase memory\u002FCPU |\n\n## Examples\n\n### Quick Deploy Script\n```bash\n#!\u002Fbin\u002Fbash\n# Platform-agnostic deploy helper\ncase \"$1\" in\n  vercel)\n    vercel secrets add speak_api_key \"$SPEAK_API_KEY\"\n    vercel secrets add speak_app_id \"$SPEAK_APP_ID\"\n    vercel --prod\n    ;;\n  fly)\n    fly secrets set SPEAK_API_KEY=\"$SPEAK_API_KEY\"\n    fly secrets set SPEAK_APP_ID=\"$SPEAK_APP_ID\"\n    fly deploy\n    ;;\n  cloudrun)\n    gcloud run deploy speak-service \\\n      --set-secrets=SPEAK_API_KEY=speak-api-key:latest\n    ;;\nesac\n```\n\n## Resources\n- [Vercel Documentation](https:\u002F\u002Fvercel.com\u002Fdocs)\n- [Fly.io Documentation](https:\u002F\u002Ffly.io\u002Fdocs)\n- [Cloud Run Documentation](https:\u002F\u002Fcloud.google.com\u002Frun\u002Fdocs)\n- [Speak Deploy Guide](https:\u002F\u002Fdeveloper.speak.com\u002Fdocs\u002Fdeploy)\n\n## Next Steps\nFor webhook handling, see `speak-webhooks-events`.\n",{"name":5,"author":51,"license":15,"version":52,"description":53,"allowed-tools":54},"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Deploy Speak language learning integrations to Vercel, Fly.io, and Cloud Run platforms.\nUse when deploying Speak-powered applications to production,\nconfiguring platform-specific secrets, or setting up deployment pipelines.\nTrigger with phrases like \"deploy speak\", \"speak Vercel\",\n\"speak production deploy\", \"speak Cloud Run\", \"speak Fly.io\".\n","Read, Write, Edit, Bash(vercel:*), Bash(fly:*), Bash(gcloud:*)","main","90b50ed0778745a80fd5bfb13b1843d45b9e82f7","tests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fspeak-pack\u002Fskills\u002Fspeak-deploy-integration",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":65,"prompt":75,"zipAvailable":76},[66,69,72],{"tool":67,"command":68},"npx","npx skills add Dicklesworthstone\u002Fpi_agent_rust --skill speak-deploy-integration",{"tool":70,"command":71},"bunx","bunx skills add Dicklesworthstone\u002Fpi_agent_rust --skill speak-deploy-integration",{"tool":73,"command":74},"pnpm","pnpm dlx skills add Dicklesworthstone\u002Fpi_agent_rust --skill speak-deploy-integration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fspeak-pack\u002Fskills\u002Fspeak-deploy-integration\u002FSKILL.md",true,[],[79,118,142,168,194,216],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":83,"licenseFileUrl":84,"sourceHtmlUrl":85,"categories":86,"keywords":90,"publishedAt":46},"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",[87],{"categoryNo":88,"categoryName":89,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117],"web artifacts builder","web","artifacts","artifacts builder","builder","frontend","css","components","react","component","routing","state management","state","shadcn","file","ui","Tools","Tailwind","use","html","single-file","simple","ui components","multi","for","jsx","suite",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":83,"licenseFileUrl":122,"sourceHtmlUrl":123,"categories":124,"keywords":129,"publishedAt":46},"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",[125,128],{"categoryNo":126,"categoryName":127,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":88,"categoryName":89,"taxonomyType":21,"taxonomyTypeDesc":22},[130,131,132,96,133,134,92,135,136,137,106,138,43,139,140,141,115],"testing","webapp testing","webapp","screenshots","playwright","debugging","toolkit","browser","logs","behavior","local","with",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":146,"sourceHtmlUrl":147,"categories":148,"keywords":149,"publishedAt":46},"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",[],[150,151,152,153,154,155,156,157,109,158,159,160,161,162,163,164,141,165,166,167,115,29],"analysis","neuropixels analysis","spike","metrics","data","open","quality","user","recordings","Neural","motion","visual","quality metrics","unit","sorting","curation","recording","load",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":83,"licenseFileUrl":172,"sourceHtmlUrl":173,"categories":174,"keywords":178,"publishedAt":46},"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",[175],{"categoryNo":176,"categoryName":177,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[179,180,181,182,183,184,185,186,39,187,188,189,190,191,141,115,192,29,193],"skill creator","creator","workflows","create","update","capabilities","knowledge","tool","specialized","guide","new skill","existing skill","users","Existing","new",{"skillNo":195,"name":196,"nameZh":6,"description":197,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":198,"sourceHtmlUrl":199,"categories":200,"keywords":202,"publishedAt":46},"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",[201],{"categoryNo":176,"categoryName":177,"taxonomyType":21,"taxonomyTypeDesc":22},[196,203,204,205,206,207,208,137,209,210,109,211,212,213,214,115,215],"google","browser automation","gemini","automation","auth","code","library","management","only","document","query","Citation","source",{"skillNo":217,"name":218,"nameZh":6,"description":219,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":83,"licenseFileUrl":220,"sourceHtmlUrl":221,"categories":222,"keywords":229,"publishedAt":46},"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",[223,226],{"categoryNo":224,"categoryName":225,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":227,"categoryName":228,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[230,231,232,180,233,107,234,235,185,109,236,191,237,238,239,115,240,29],"slack gif creator","slack","gif","validation","constraints","Animation","me","make","Utilities","concepts","request"]