Claude-code-plugins-plus-skills coreweave-webhooks-events
install
source · Clone the upstream repo
git clone https://github.com/jeremylongshore/claude-code-plugins-plus-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/jeremylongshore/claude-code-plugins-plus-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/saas-packs/coreweave-pack/skills/coreweave-webhooks-events" ~/.claude/skills/jeremylongshore-claude-code-plugins-plus-skills-coreweave-webhooks-events && rm -rf "$T"
manifest:
plugins/saas-packs/coreweave-pack/skills/coreweave-webhooks-events/SKILL.mdsource content
CoreWeave Webhooks & Events
Overview
CoreWeave emits Kubernetes-native events and custom status callbacks for GPU workload lifecycle management. Monitor instance readiness, job completion, volume attachment, and node health to build automated scaling, alerting, and recovery pipelines for GPU-accelerated inference and training workloads.
Webhook Registration
const response = await fetch("https://api.coreweave.com/v1/webhooks", { method: "POST", headers: { "Authorization": `Bearer ${process.env.COREWEAVE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ url: "https://yourapp.com/webhooks/coreweave", events: ["instance.ready", "job.completed", "volume.attached", "node.unhealthy"], secret: process.env.COREWEAVE_WEBHOOK_SECRET, }), });
Signature Verification
import crypto from "crypto"; import { Request, Response, NextFunction } from "express"; function verifyCoreWeaveSignature(req: Request, res: Response, next: NextFunction) { const signature = req.headers["x-coreweave-signature"] as string; const timestamp = req.headers["x-coreweave-timestamp"] as string; const payload = `${timestamp}.${req.body.toString()}`; const expected = crypto.createHmac("sha256", process.env.COREWEAVE_WEBHOOK_SECRET!) .update(payload).digest("hex"); if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) { return res.status(401).json({ error: "Invalid signature" }); } next(); }
Event Handler
import express from "express"; const app = express(); app.post("/webhooks/coreweave", express.raw({ type: "application/json" }), verifyCoreWeaveSignature, (req, res) => { const event = JSON.parse(req.body.toString()); res.status(200).json({ received: true }); switch (event.type) { case "instance.ready": registerEndpoint(event.data.instance_id, event.data.gpu_type); break; case "job.completed": collectArtifacts(event.data.job_id, event.data.output_path); break; case "volume.attached": mountStorage(event.data.volume_id, event.data.node_name); break; case "node.unhealthy": drainAndReschedule(event.data.node_id, event.data.reason); break; } });
Event Types
| Event | Payload Fields | Use Case |
|---|---|---|
| , , | Register inference endpoint |
| , , | Collect training artifacts |
| , , | Confirm storage availability |
| , , | Drain node and reschedule pods |
| , , | Clean up resources and alert |
Retry & Idempotency
const processed = new Set<string>(); async function handleIdempotent(event: { id: string; type: string; data: any }) { if (processed.has(event.id)) return; await routeEvent(event); processed.add(event.id); if (processed.size > 10_000) { const entries = Array.from(processed); entries.slice(0, entries.length - 10_000).forEach((id) => processed.delete(id)); } }
Error Handling
| Issue | Cause | Fix |
|---|---|---|
| Signature mismatch | Clock skew between clusters | Validate timestamp within 5-minute window |
Duplicate | Rescheduled pod on same node | Track instance IDs for deduplication |
Stale | Transient GPU memory error | Wait for consecutive events before draining |
Missing | Job failed before writing | Check before collecting artifacts |
Resources
Next Steps
See
coreweave-security-basics.