Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Deploy applications that integrate with Lindy AI agents. Use when deploying webhook receivers, callback handlers, or applications connected to Lindy agents. Trigger with phrases like "deploy lindy", "lindy deployment", "lindy production deploy", "release lindy integration".
.claude/skills/jeremylongshore-lindy-deploy-integration/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 36% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 70% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 31% | 0% |
Lindy agents run on Lindy's managed infrastructure. Deployment focuses on your integration layer: webhook receivers, callback handlers, and application code that Lindy agents interact with via HTTP Request actions and webhook triggers.
typescript// src/server.ts — Production-ready Lindy webhook receiver import express from 'express'; import helmet from 'helmet'; const app = express(); app.use(helmet()); app.use(express.json({ limit: '1mb' })); // Health check for load balancer app.get('/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString(), version: process.env.APP_VERSION || 'unknown', }); }); // Lindy webhook receiver with auth verification app.post('/lindy/callback', (req, res) => { const auth = req.headers.authorization; if (auth !== `Bearer ${process.env.LINDY_WEBHOOK_SECRET}`) { return res.status(401).json({ error: 'Unauthorized' }); } // Respond immediately, process async res.json({ received: true }); // Async processing processWebhook(req.body).catch(err => { console.error('Webhook processing error:', err); }); }); async function processWebhook(payload: any) { const { taskId, status, result } = payload; // Your business logic here console.log(`Task ${taskId}: ${status}`, result); } const PORT = process.env.PORT || 3000; app.listen(PORT, () => console.log(`Listening on :${PORT}`));
dockerfile# Dockerfile FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --production COPY dist/ ./dist/ EXPOSE 3000 ENV NODE_ENV=production HEALTHCHECK --interval=30s --timeout=3s \ CMD wget -qO- http://localhost:3000/health || exit 1 CMD ["node", "dist/server.js"]
bash# Build and run docker build -t lindy-integration . docker run -d \ -p 3000:3000 \ -e LINDY_API_KEY="$LINDY_API_KEY" \ -e LINDY_WEBHOOK_SECRET="$LINDY_WEBHOOK_SECRET" \ --name lindy-app \ lindy-integration
bash# Install Vercel CLI npm i -g vercel # Set secrets vercel secrets add lindy-api-key "$LINDY_API_KEY" vercel secrets add lindy-webhook-secret "$LINDY_WEBHOOK_SECRET" # Deploy vercel --prod
json// vercel.json { "env": { "LINDY_API_KEY": "@lindy-api-key", "LINDY_WEBHOOK_SECRET": "@lindy-webhook-secret" } }
After deployment, update all Lindy agents with production URLs:
OLD: https://abc123.ngrok.io/lindy/callback NEW: https://api.yourapp.com/lindy/callback
bash#!/bin/bash echo "=== Post-Deploy Verification ===" PROD_URL="https://api.yourapp.com" # Health check echo "[1/3] Health check..." curl -sf "$PROD_URL/health" | jq . # Webhook endpoint reachable echo "[2/3] Webhook endpoint..." STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ -X POST "$PROD_URL/lindy/callback" \ -H "Authorization: Bearer $LINDY_WEBHOOK_SECRET" \ -H "Content-Type: application/json" \ -d '{"test": true}') echo "Webhook endpoint: HTTP $STATUS (expect 200)" # Trigger a test agent run echo "[3/3] Agent trigger test..." curl -s -X POST "https://public.lindy.ai/api/v1/webhooks/YOUR_ID" \ -H "Authorization: Bearer $LINDY_WEBHOOK_SECRET" \ -H "Content-Type: application/json" \ -d '{"event": "deploy.verify", "env": "production"}' echo "Agent triggered — check Tasks tab in Lindy dashboard"
bash# If deployment fails, rollback: # Vercel vercel rollback # Docker docker stop lindy-app docker run -d --name lindy-app-rollback \ -e LINDY_API_KEY="$LINDY_API_KEY" \ -e LINDY_WEBHOOK_SECRET="$LINDY_WEBHOOK_SECRET" \ lindy-integration:previous-tag # Update Lindy agents back to previous URLs if needed
| Step | Verification | |------|-------------| | Build passes | npm run build exits 0 | | Tests pass | npm test all green | | Secrets configured | API key + webhook secret in platform | | Health check responds | GET /health returns 200 | | Webhook auth works | POST with valid token returns 200 | | Webhook auth rejects | POST without token returns 401 | | Lindy agent URLs updated | HTTP Request actions point to prod | | End-to-end test | Trigger agent, receive callback |
| Issue | Cause | Solution | |-------|-------|----------| | Webhook 502 | App crashed/not running | Check container logs, restart | | Webhook timeout | Slow processing | Respond 200 immediately, process async | | Wrong URL in Lindy | Not updated post-deploy | Update HTTP Request action URLs | | SSL error | Certificate issue | Verify HTTPS cert is valid | | Secret mismatch | Dev secret in prod | Verify production secrets match Lindy config |
See lindy-webhooks-events for advanced webhook patterns.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 24,293 | 21,298 | -12% | 1 | 1 | 0% | 3,915 | 5,140 | +31% | 0 | 0 | — |
case-02 | pass→pass | 22,019 | 26,651 | +21% | 1 | 1 | 0% | 2,882 | 5,771 | +100% | 0 | 0 | — |
case-03 | fail→fail | 36,183 | 24,869 | -31% | 1 | 1 | 0% | 5,861 | 5,643 | -4% | 0 | 0 | — |
case-04 | pass→pass | 23,450 | 15,229 | -35% | 1 | 1 | 0% | 3,099 | 3,441 | +11% | 0 | 0 | — |
case-05 | fail→pass | 20,577 | 17,189 | -16% | 1 | 1 | 0% | 2,847 | 3,860 | +36% | 0 | 0 | — |
case-06 | fail→pass | 16,299 | 13,999 | -14% | 1 | 1 | 0% | 1,946 | 3,306 | +70% | 0 | 0 | — |
case-07 | fail→pass | 18,659 | 25,388 | +36% | 1 | 1 | 0% | 3,568 | 4,789 | +34% | 0 | 0 | — |
case-08 | fail→pass | 15,404 | 5,955 | -61% | 1 | 1 | 0% | 1,936 | 2,537 | +31% | 0 | 0 | — |
case-09 | pass→pass | 13,788 | 3,285 | -76% | 1 | 1 | 0% | 1,799 | 2,136 | +19% | 0 | 0 | — |
case-10 | fail→pass | 19,348 | 12,075 | -38% | 1 | 1 | 0% | 2,036 | 2,884 | +42% | 0 | 0 | — |
case-11 | fail→pass | 15,641 | 11,632 | -26% | 1 | 1 | 0% | 2,281 | 3,441 | +51% | 0 | 0 | — |
case-12 | fail→fail | 22,321 | 21,493 | -4% | 1 | 1 | 0% | 2,413 | 4,071 | +69% | 0 | 0 | — |
case-13 | pass→fail | 19,507 | 14,108 | -28% | 1 | 1 | 0% | 2,248 | 4,142 | +84% | 0 | 0 | — |
case-14 | fail→pass | 13,977 | 4,065 | -71% | 1 | 1 | 0% | 2,405 | 2,277 | -5% | 0 | 0 | — |
case-15 | fail→pass | 18,322 | 18,214 | -1% | 1 | 1 | 0% | 2,725 | 3,440 | +26% | 0 | 0 | — |
case-16 | fail→pass | 26,007 | 13,222 | -49% | 1 | 1 | 0% | 2,768 | 4,096 | +48% | 0 | 0 | — |
case-17 | pass→pass | 20,812 | 16,417 | -21% | 1 | 1 | 0% | 2,170 | 4,493 | +107% | 0 | 0 | — |
case-18 | fail→pass | 8,076 | 5,005 | -38% | 1 | 1 | 0% | 1,396 | 2,642 | +89% | 0 | 0 | — |
case-19 | pass→pass | 15,533 | 13,768 | -11% | 1 | 1 | 0% | 1,852 | 2,941 | +59% | 0 | 0 | — |
case-20 | pass→pass | 22,459 | 18,272 | -19% | 1 | 1 | 0% | 2,984 | 4,053 | +36% | 0 | 0 | — |
case-21 | pass→pass | 15,847 | 19,879 | +25% | 1 | 1 | 0% | 3,096 | 4,554 | +47% | 0 | 0 | — |
case-22 | pass→pass | 17,617 | 19,202 | +9% | 1 | 1 | 0% | 2,491 | 4,126 | +66% | 0 | 0 | — |
case-23 | fail→pass | 11,413 | 11,346 | -1% | 1 | 1 | 0% | 1,960 | 2,730 | +39% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +48 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.