.claude/skills/ts-checkly/SKILL.md
Expert guidance for Checkly, the synthetic monitoring platform that runs Playwright-based browser checks and API checks from locations worldwide. Helps developers implement monitoring-as-code (MaC) with the Checkly CLI, set up API and browser checks, configure alerting, and integrate monitoring into CI/CD pipelines.
npx skillsauth add eliferjunior/Claude checklyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Checkly, the synthetic monitoring platform that runs Playwright-based browser checks and API checks from locations worldwide. Helps developers implement monitoring-as-code (MaC) with the Checkly CLI, set up API and browser checks, configure alerting, and integrate monitoring into CI/CD pipelines.
# Install Checkly CLI
npm install -g checkly
# Initialize in your project
checkly init
# Project structure
# checkly.config.ts — Global configuration
# __checks__/
# api/
# health.check.ts
# orders-api.check.ts
# browser/
# login-flow.check.ts
# checkout.check.ts
// checkly.config.ts — Global configuration
import { defineConfig } from "checkly";
import { EmailAlertChannel, SlackAlertChannel } from "checkly/constructs";
const slackAlert = new SlackAlertChannel("slack-alerts", {
webhookUrl: process.env.SLACK_WEBHOOK_URL!,
channel: "#alerts",
sendFailure: true,
sendRecovery: true,
sendDegraded: true,
});
const emailAlert = new EmailAlertChannel("email-ops", {
address: "[email protected]",
sendFailure: true,
sendRecovery: true,
});
export default defineConfig({
projectName: "My SaaS",
logicalId: "my-saas-monitoring",
repoUrl: "https://github.com/myorg/my-saas",
checks: {
locations: ["us-east-1", "eu-west-1", "ap-southeast-1"],
frequency: 5, // Check every 5 minutes
tags: ["production"],
runtimeId: "2024.02",
alertChannels: [slackAlert, emailAlert],
browserChecks: {
frequency: 10, // Browser checks every 10 min
testMatch: "**/__checks__/browser/**/*.check.ts",
},
apiChecks: {
frequency: 1, // API checks every 1 min
testMatch: "**/__checks__/api/**/*.check.ts",
},
},
});
// __checks__/api/orders-api.check.ts — API endpoint monitoring
import { ApiCheck, AssertionBuilder } from "checkly/constructs";
new ApiCheck("orders-api-health", {
name: "Orders API — Health Check",
request: {
method: "GET",
url: "https://api.example.com/v1/health",
headers: [{ key: "Authorization", value: `Bearer {{MONITORING_API_KEY}}` }],
assertions: [
AssertionBuilder.statusCode().equals(200),
AssertionBuilder.jsonBody("$.status").equals("healthy"),
AssertionBuilder.responseTime().lessThan(2000), // Under 2 seconds
],
},
degradedResponseTime: 1000, // Mark as degraded if > 1s
maxResponseTime: 3000, // Mark as failed if > 3s
});
new ApiCheck("orders-create", {
name: "Orders API — Create Order Flow",
request: {
method: "POST",
url: "https://api.example.com/v1/orders",
headers: [
{ key: "Authorization", value: "Bearer {{MONITORING_API_KEY}}" },
{ key: "Content-Type", value: "application/json" },
],
body: JSON.stringify({
items: [{ productId: "test-product", quantity: 1 }],
test: true, // Flag so backend doesn't charge
}),
assertions: [
AssertionBuilder.statusCode().equals(201),
AssertionBuilder.jsonBody("$.id").isNotEmpty(),
AssertionBuilder.jsonBody("$.status").equals("pending"),
],
},
setupScript: {
// Run before the request — generate dynamic data
content: `
const crypto = require('crypto');
request.headers['X-Idempotency-Key'] = crypto.randomUUID();
`,
},
teardownScript: {
// Run after the request — clean up test data
content: `
if (response.statusCode === 201) {
const orderId = JSON.parse(response.body).id;
// Delete the test order
await fetch(\`https://api.example.com/v1/orders/\${orderId}\`, {
method: 'DELETE',
headers: { 'Authorization': 'Bearer ' + process.env.MONITORING_API_KEY },
});
}
`,
},
});
// __checks__/browser/checkout-flow.check.ts — E2E user flow monitoring
// Runs a real Playwright browser in Checkly's cloud every 10 minutes.
import { test, expect } from "@playwright/test";
test("Complete checkout flow", async ({ page }) => {
// Step 1: Navigate to product page
await page.goto("https://example.com/products/starter-plan");
await expect(page.getByRole("heading", { name: "Starter Plan" })).toBeVisible();
// Step 2: Add to cart
await page.getByRole("button", { name: "Start Free Trial" }).click();
await expect(page.getByText("Added to cart")).toBeVisible();
// Step 3: Go to checkout
await page.getByRole("link", { name: "Checkout" }).click();
await expect(page).toHaveURL(/.*checkout/);
// Step 4: Fill payment form (test card)
await page.getByLabel("Email").fill("[email protected]");
await page.getByLabel("Card number").fill("4242424242424242");
await page.getByLabel("Expiry").fill("12/28");
await page.getByLabel("CVC").fill("123");
// Step 5: Submit
await page.getByRole("button", { name: "Subscribe" }).click();
// Step 6: Verify success
await expect(page.getByText("Welcome to Starter Plan")).toBeVisible({ timeout: 10000 });
});
test("Login flow works", async ({ page }) => {
await page.goto("https://example.com/login");
await page.getByLabel("Email").fill(process.env.TEST_USER_EMAIL!);
await page.getByLabel("Password").fill(process.env.TEST_USER_PASSWORD!);
await page.getByRole("button", { name: "Sign in" }).click();
// Verify dashboard loads
await expect(page.getByRole("heading", { name: "Dashboard" })).toBeVisible();
await expect(page.getByText("Welcome back")).toBeVisible();
});
# .github/workflows/deploy.yml — Run checks after deployment
- name: Deploy to production
run: npm run deploy
- name: Run Checkly checks
uses: checkly/checkly-github-action@v1
with:
apiKey: ${{ secrets.CHECKLY_API_KEY }}
accountId: ${{ secrets.CHECKLY_ACCOUNT_ID }}
# Run all checks and fail the pipeline if any fail
command: "checkly test --record"
# Deploy checks to Checkly (like deploying infrastructure)
checkly deploy
# Test locally before deploying
checkly test
# Dry run — show what would change
checkly deploy --preview
npm install -g checkly
checkly login
checkly init
User request:
I have a Node.js API and a React frontend running in Docker. Set up Checkly for monitoring/deployment.
The agent creates the necessary configuration files based on patterns like # Install Checkly CLI, sets up the integration with the existing Docker setup, configures appropriate defaults for a Node.js + React stack, and provides verification commands to confirm everything is working.
User request:
Checkly is showing errors in our api checks. Here are the logs: [error output]
The agent analyzes the error output, identifies the root cause by cross-referencing with common Checkly issues, applies the fix (updating configuration, adjusting resource limits, or correcting syntax), and verifies the resolution with appropriate health checks.
development
Expert guidance for Fireworks AI, the platform for running open-source LLMs (Llama, Mixtral, Qwen, etc.) with enterprise-grade speed and reliability. Helps developers integrate Fireworks' inference API, fine-tune models, and deploy custom model endpoints with function calling and structured output support.
development
Convert any website into clean, structured data with Firecrawl — API-first web scraping service. Use when someone asks to "turn a website into markdown", "scrape website for LLM", "Firecrawl", "extract website content as clean text", "crawl and convert to structured data", or "scrape website for RAG". Covers single-page scraping, full-site crawling, structured extraction, and LLM-ready output.
tools
Expert guidance for Firebase, Google's platform for building and scaling web and mobile applications. Helps developers set up authentication, Firestore/Realtime Database, Cloud Functions, hosting, storage, and analytics using Firebase's SDK and CLI.
development
When the user needs to build file upload functionality for a web application. Use when the user mentions "file upload," "image upload," "upload endpoint," "multipart upload," "presigned URL," "S3 upload," "file validation," "upload to cloud storage," or "accept user files." Handles upload endpoints, file validation (type, size, magic bytes), cloud storage integration, and upload status tracking. For image/video processing after upload, see media-transcoder.