Github Actions Cicd logo

Github Actions Cicd

Community
Omar-Obando
github-actions-cicd

Use when creating GitHub Actions workflows, implementing CI/CD pipelines, configuring runners, matrices, environments, secrets, artifacts, caching, concurrency, reusable workflows, composite actions, Docker/npm actions, marketplace integration, workflow optimization, security hardening, and production CI/CD best practices.

Overview

PublisherOmar-Obando
Repositoryqwen-orchestrator
Skill namegithub-actions-cicd
Stars
53
Forks
13
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by Omar-Obando on GitHub. Read the source before you install it.

Installation

Install the Github Actions Cicd AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/Omar-Obando/qwen-orchestrator/tree/main/skills/github-actions-cicd
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/Omar-Obando/qwen-orchestrator.git /tmp/qwen-orchestrator
mkdir -p .claude/skills
cp -r /tmp/qwen-orchestrator/skills/github-actions-cicd .claude/skills/github-actions-cicd
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Github Actions Cicd in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Github Actions Cicd on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Github Actions Cicd is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

GitHub Actions CI/CD Skill — Workflow Automation Best Practices

Overview

This skill provides comprehensive guidance for creating and optimizing GitHub Actions workflows, including workflow triggers, job orchestration, runner management, matrix builds, environment protection, secret management, artifact handling, caching strategies, concurrency controls, reusable workflows, composite actions, Docker/npm action development, marketplace integration, workflow optimization, security hardening, and production CI/CD best practices. Based on GitHub official documentation and GitHub Certified: GitHub Actions standards.

When to Use

Use this skill when:

  • Creating GitHub Actions workflow files (.github/workflows/)
  • Configuring workflow triggers (push, pull_request, schedule, workflow_dispatch, repository_dispatch)
  • Defining jobs and steps with dependencies (needs)
  • Selecting runners (ubuntu-latest, windows-latest, macos-latest, self-hosted)
  • Implementing matrix builds for multiple Node.js, Python, or OS versions
  • Configuring environments and protection rules
  • Managing secrets and injecting them into workflows
  • Uploading and downloading artifacts between jobs
  • Caching dependencies (npm, pip, gradle, maven, pnpm, yarn)
  • Setting concurrency controls and cancel-in-progress
  • Creating reusable workflows for cross-repository sharing
  • Building composite actions for step reuse
  • Developing Docker container actions
  • Publishing npm actions to GitHub Marketplace
  • Discovering and integrating marketplace actions
  • Implementing action composition patterns
  • Optimizing workflow execution speed and cost
  • Hardening workflow security (dependency review, code scanning, secret scanning)
  • Configuring self-hosted runners
  • Setting up permission scoping and least privilege
  • Implementing production CI/CD best practices

Do NOT use this skill when:

  • Containerizing applications with Docker (use docker-containerization skill)
  • Deploying to Kubernetes (use kubernetes-orchestration skill)
  • Setting up cloud infrastructure (use terraform-iac skill)
  • Configuring monitoring and alerting (use monitoring skill)
  • Writing application code (use backend-developer or frontend-developer skill)
  • Managing database schema (use database-design skill)
  • Implementing security policies (use security-auditor skill)
  • Designing microservices architecture (use microservices-architecture skill)

Why avoid: GitHub Actions is for workflow automation and CI/CD, not application development, infrastructure provisioning, or runtime orchestration. Use the specialized skill for each domain.

Core Concepts

Workflow Trigger Types

TriggerEventUse Case
pushCode pushed to repositoryBuild, test, deploy on commit
pull_requestPR opened/updated/syncedCI checks before merge
scheduleCron expressionScheduled maintenance, reports
workflow_dispatchManual triggerOn-demand deployments
repository_dispatchAPI-triggeredExternal system integration
releaseRelease created/publishedProduction deployment
workflow_runAnother workflow completesPost-workflow actions
page_buildGitHub Pages buildDocumentation deployment

Runner Types

RunnerOSUse Case
ubuntu-latestLinux (Ubuntu)Default, most actions
windows-latestWindows.NET, Windows-specific builds
macos-latestmacOSiOS, Xcode builds
self-hostedAnyCustom tools, GPU, cost reduction
ubuntu-22.04Linux (specific)Pinned OS version
windows-2022Windows (specific)Pinned Windows version

Job Dependency Patterns

PatternConfigurationUse Case
Sequentialneeds: [previous_job]Build → Test → Deploy
ParallelNo needsLint + Test + Security
Conditionalif: success() && needs.job.result == 'success'Deploy only if tests pass
Matrixstrategy.matrixMulti-version testing
Fan-out/Fan-inMultiple jobs depend on oneBuild → [Test A, Test B, Test C] → Deploy

Workflow Examples

Complete CI/CD Pipeline

yaml
# .github/workflows/ci-cd.yml
name: CI/CD Pipeline

# ============================================
# Workflow Triggers
# ============================================
on:
  push:
    branches: [main, develop]
    paths:
      - 'src/**'
      - 'package.json'
      - 'package-lock.json'
      - '.github/workflows/**'
  pull_request:
    branches: [main, develop]
  workflow_dispatch:
    inputs:
      environment:
        description: 'Deployment environment'
        required: true
        default: 'staging'
        type: choice
        options:
          - staging
          - production
      skip_tests:
        description: 'Skip test suite'
        required: false
        default: false
        type: boolean

# ============================================
# Concurrency Control
# ============================================
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

# ============================================
# Workflow-level Permissions (Least Privilege)
# ============================================
permissions:
  contents: read
  security-events: write
  actions: read

# ============================================
# Environment Variables
# ============================================
env:
  NODE_VERSION: '20'
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  # ============================================
  # Job 1: Security Scanning (runs in parallel)
  # ============================================
  security-scan:
    name: Security Scan
    runs-on: ubuntu-latest
    permissions:
      contents: read
      security-events: write
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Dependency Review
        uses: actions/dependency-review-action@v4
        if: github.event_name == 'pull_request'

      - name: Secret Scanning
        uses: gitleaks/gitleaks-action@v2

      - name: CodeQL Analysis
        uses: github/codeql-action/init@v3
        with:
          languages: javascript

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v3

  # ============================================
  # Job 2: Linting (runs in parallel)
  # ============================================
  lint:
    name: Lint & Type Check
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run ESLint
        run: npm run lint

      - name: Run Type Check
        run: npm run typecheck

  # ============================================
  # Job 3: Unit Tests with Matrix
  # ============================================
  test:
    name: Test (Node ${{ matrix.node }}, ${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    needs: [lint]
    strategy:
      fail-fast: false
      matrix:
        node: ['18', '20', '22']
        os: [ubuntu-latest, windows-latest, macos-latest]
        exclude:
          - node: '18'
            os: windows-latest
          - node: '18'
            os: macos-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js ${{ matrix.node }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm test
        env:
          CI: true

      - name: Upload coverage
        uses: codecov/codecov-action@v4
        with:
          files: ./coverage/lcov.info
          flags: unittests
          name: codecov-umbrella

  # ============================================
  # Job 4: Build with Caching
  # ============================================
  build:
    name: Build Application
    runs-on: ubuntu-latest
    needs: [test, security-scan]
    outputs:
      version: ${{ steps.version.outputs.version }}
      image_tag: ${{ steps.image_tag.outputs.tag }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Generate version
        id: version
        run: |
          VERSION=$(node -p "require('./package.json').version")
          echo "version=$VERSION" >> $GITHUB_OUTPUT

      - name: Build application
        run: npm run build

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: build-output
          path: dist/
          retention-days: 7
          if-no-files-found: error

      - name: Set image tag
        id: image_tag
        run: echo "tag=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}" >> $GITHUB_OUTPUT

  # ============================================
  # Job 5: Docker Build and Push
  # ============================================
  docker:
    name: Build and Push Docker Image
    runs-on: ubuntu-latest
    needs: [build]
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    permissions:
      contents: read
      packages: write
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          tags: |
            type=semver,pattern={{version}}
            type=sha,prefix=
            type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

  # ============================================
  # Job 6: Deploy to Staging
  # ============================================
  deploy-staging:
    name: Deploy to Staging
    runs-on: ubuntu-latest
    needs: [docker]
    if: github.ref == 'refs/heads/main'
    environment:
      name: staging
      url: https://staging.example.com
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Download build artifacts
        uses: actions/download-artifact@v4
        with:
          name: build-output
          path: dist/

      - name: Deploy to staging
        run: |
          echo "Deploying to staging environment"
          # Add deployment commands here
        env:
          DEPLOY_TOKEN: ${{ secrets.STAGING_DEPLOY_TOKEN }}

      - name: Verify deployment
        run: |
          echo "Verifying staging deployment"
          # Add health check commands here

  # ============================================
  # Job 7: Deploy to Production
  # ============================================
  deploy-production:
    name: Deploy to Production
    runs-on: ubuntu-latest
    needs: [deploy-staging]
    if: github.event_name == 'workflow_dispatch'
    environment:
      name: production
      url: https://example.com
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Download build artifacts
        uses: actions/download-artifact@v4
        with:
          name: build-output
          path: dist/

      - name: Deploy to production
        run: |
          echo "Deploying to production environment"
          # Add deployment commands here
        env:
          DEPLOY_TOKEN: ${{ secrets.PRODUCTION_DEPLOY_TOKEN }}

      - name: Notify deployment
        if: always()
        uses: slackapi/slack-github-action@v1
        with:
          payload: |
            {
              "text": "Production deployment ${{ job.status }}",
              "blocks": [
                {
                  "type": "section",
                  "text": {
                    "type": "mrkdwn",
                    "text": "*Production Deployment* - ${{ job.status }}"
                  }
                }
              ]
            }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

Reusable Workflow

yaml
# .github/workflows/reusable-deploy.yml
name: Reusable Deploy

on:
  workflow_call:
    inputs:
      environment:
        required: true
        type: string
      image_tag:
        required: true
        type: string
      config_file:
        required: false
        type: string
        default: 'deploy-config.yml'
    secrets:
      DEPLOY_TOKEN:
        required: true
      DATABASE_URL:
        required: true

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: ${{ inputs.environment }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Deploy to ${{ inputs.environment }}
        run: |
          echo "Deploying ${{ inputs.image_tag }} to ${{ inputs.environment }}"
          echo "Using config: ${{ inputs.config_file }}"
        env:
          DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
          DATABASE_URL: ${{ secrets.DATABASE_URL }}

Using Reusable Workflow

yaml
# .github/workflows/call-deploy.yml
name: Call Deploy

on:
  workflow_dispatch:
    inputs:
      environment:
        required: true
        type: choice
        options:
          - staging
          - production

jobs:
  call-deploy:
    uses: ./.github/workflows/reusable-deploy.yml
    with:
      environment: ${{ github.event.inputs.environment }}
      image_tag: latest
    secrets:
      DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
      DATABASE_URL: ${{ secrets.DATABASE_URL }}

Composite Action

Creating a Composite Action

yaml
# .github/actions/setup-node-project/action.yml
name: 'Setup Node.js Project'
description: 'Complete Node.js project setup with caching'

inputs:
  node-version:
    description: 'Node.js version'
    required: false
    default: '20'
  cache:
    description: 'Enable npm caching'
    required: false
    default: 'true'

runs:
  using: 'composite'
  steps:
    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: ${{ inputs.node-version }}
        cache: ${{ inputs.cache }}

    - name: Install dependencies
      shell: bash
      run: npm ci

    - name: Cache node_modules
      if: inputs.cache == 'true'
      uses: actions/cache@v4
      with:
        path: node_modules
        key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-node-

Using Composite Action

yaml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-node-project
        with:
          node-version: '20'
          cache: 'true'
      - run: npm run build

Docker Action

Creating a Docker Action

dockerfile
# action.dockerfile
FROM node:20-alpine

WORKDIR /app

COPY action.yml .
COPY index.js .
COPY package.json .
COPY package-lock.json .

RUN npm ci --production

ENTRYPOINT ["node", "/app/index.js"]
yaml
# action.yml
name: 'My Docker Action'
description: 'Custom Docker-based action'

inputs:
  input1:
    description: 'First input'
    required: true
  input2:
    description: 'Second input'
    required: false
    default: 'default-value'

outputs:
  output1:
    description: 'Output value'
    value: ${{ steps.run.outputs.output1 }}

runs:
  using: 'docker'
  image: 'Dockerfile'
  args:
    - ${{ inputs.input1 }}
    - ${{ inputs.input2 }}
javascript
// index.js
const core = require('@actions/core');
const { exec } = require('child_process_process');

async function run() {
  try {
    const input1 = core.getInput('input1');
    const input2 = core.getInput('input2');

    // Your action logic here
    const result = `Processed: ${input1} with ${input2}`;

    core.setOutput('output1', result);
    core.info(result);
  } catch (error) {
    core.setFailed(error.message);
  }
}

run();

Caching Strategies

npm Cache

yaml
- uses: actions/cache@v4
  with:
    path: ~/.npm
    key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-npm-

pip Cache

yaml
- uses: actions/cache@v4
  with:
    path: ~/.cache/pip
    key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
    restore-keys: |
      ${{ runner.os }}-pip-

Gradle Cache

yaml
- uses: actions/cache@v4
  with:
    path: |
      ~/.gradle/caches
      ~/.gradle/wrapper
    key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
    restore-keys: |
      ${{ runner.os }}-gradle-

Maven Cache

yaml
- uses: actions/cache@v4
  with:
    path: ~/.m2/repository
    key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
    restore-keys: |
      ${{ runner.os }}-maven-

Environment Protection Rules

yaml
environment:
  name: production
  url: https://example.com
  protection_rules:
    required_reviewers: 2
    wait_timer: 5 # minutes
    bypass_actors:
      - type: Team
        name: platform-team

Self-Hosted Runner Setup

Runner Registration Script

bash
#!/bin/bash
# Install self-hosted runner

# Download runner
curl -o actions-runner-linux-x64-2.315.0.tar.gz \
  -L https://github.com/actions/runner/releases/download/v2.315.0/actions-runner-linux-x64-2.315.0.tar.gz

# Extract
tar xzf actions-runner-linux-x64-2.315.0.tar.gz

# Configure
./config.sh --url https://github.com/OWNER/REPO \
  --token $RUNNER_TOKEN \
  --unattended \
  --replace \
  --work _work \
  --labels self-hosted

# Run as service
sudo ./svc.sh install
sudo ./svc.sh start

Using Self-Hosted Runner

yaml
jobs:
  build:
    runs-on: [self-hosted, linux, x64]
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm run build

Security Hardening

Dependency Review

yaml
- name: Dependency Review
  uses: actions/dependency-review-action@v4
  with:
    fail-on-severity: high
    deny-licenses: GPL-3.0, AGPL-3.0
    comment-summary-in-pr: always

Code Scanning with CodeQL

yaml
- name: Initialize CodeQL
  uses: github/codeql-action/init@v3
  with:
    languages: javascript, python
    queries: security-extended

- name: Perform CodeQL Analysis
  uses: github/codeql-action/analyze@v3

Secret Scanning

yaml
- name: Secret Scanning
  uses: gitleaks/gitleaks-action@v2
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Workflow Optimization

Parallel Execution

yaml
jobs:
  lint:
    runs-on: ubuntu-latest
    steps: [...]

  test-unit:
    runs-on: ubuntu-latest
    steps: [...]

  test-integration:
    runs-on: ubuntu-latest
    steps: [...]

  build:
    runs-on: ubuntu-latest
    needs: [lint, test-unit, test-integration]
    steps: [...]

Conditional Execution

yaml
jobs:
  deploy:
    runs-on: ubuntu-latest
    if: |
      github.ref == 'refs/heads/main' &&
      github.event_name == 'push' &&
      success()
    steps: [...]

Path Filtering

yaml
on:
  push:
    paths:
      - 'src/**'
      - 'package.json'
      - '.github/workflows/**'

Production Checklist

Before deploying workflows to production:

  • Workflow triggers are specific (not *)
  • Concurrency controls prevent duplicate runs
  • Permissions follow least privilege principle
  • Secrets are properly scoped and rotated
  • Caching is configured for dependencies
  • Artifacts have retention policies
  • Environment protection rules are set
  • Security scanning is enabled
  • Workflow notifications are configured
  • Retry logic for flaky steps
  • Timeout limits on long-running jobs
  • Self-hosted runners are isolated
  • Composite actions are versioned
  • Reusable workflows have input validation
  • Docker actions use pinned base images
  • npm actions are published to registry
  • Marketplace actions are from trusted sources
  • Workflow optimization reduces execution time
  • Security hardening is comprehensive
  • Production best practices are followed

Real-World Impact

Before this skill:

  • Manual deployment processes
  • Inconsistent CI/CD pipelines
  • No security scanning
  • Slow workflow execution
  • Poor artifact management

After this skill:

  • Automated CI/CD pipelines
  • Consistent workflow patterns
  • Comprehensive security scanning
  • Optimized workflow execution
  • Efficient artifact management

Cross-References

  • docker-containerization - For Docker action development
  • kubernetes-orchestration - For Kubernetes deployment workflows
  • devops-pipeline - For broader CI/CD pipeline design
  • security-auditor - For security scanning integration
  • testing-strategy - For test automation in workflows

References

Frequently asked questions

What does the Github Actions Cicd AI skill do?

Use when creating GitHub Actions workflows, implementing CI/CD pipelines, configuring runners, matrices, environments, secrets, artifacts, caching, concurrency, reusable workflows, composite actions, Docker/npm actions, marketplace integration, workflow optimization, security hardening, and production CI/CD best practices.

Why use Github Actions Cicd on TypingMind?

Because you install it once and use it with any model. Github Actions Cicd is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Github Actions Cicd in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/Omar-Obando/qwen-orchestrator/tree/main/skills/github-actions-cicd. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Github Actions Cicd?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Github Actions Cicd?

As many as you like. As long as a model supports skills, you can use Github Actions Cicd with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Github Actions Cicd AI skill free?

Yes. It is published on GitHub by Omar-Obando under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇