Setup Coolify + Doppler

VerifiedCaution

Provisions and updates a Coolify deployment from coolify.yaml, with Doppler secret injection.

Sby Skills Guide Bot
DevOpsIntermediate
7/27/2026
Claude Code
#coolify#doppler#deployment#secrets-management#github-actions

Recommended for

Automated summary

Provisions or updates a Coolify deployment from coolify.yaml, configures Doppler secret injection, and generates the GitHub Actions deploy workflow, with plan, seed, init_cicd, init_app, and validate subcommands.

Strengths

  • Idempotent provisioning across multiple environments and servers selected by the server alias in coolify.yaml.
  • Read-only plan mode gives a Terraform-style CREATE/EXISTS/PATCH diff before any changes.
  • Same-image promotion keeps only DOPPLER_TOKEN in Coolify and injects environment variables at runtime.
  • Includes validate and seed subcommands to check credentials, schema, and Doppler key presence.

Limitations

  • Requires an existing coolify.yaml and credentials in ~/.claude/coolify.json, or prior init_app/init_cicd setup.
  • Assumes a Coolify + Doppler + GitHub Actions stack and does not cover other secret managers or CI systems.
  • provision does not deploy immediately; the first deploy fires on push to main via the generated workflow.
When to use it

Use this when standardizing and maintaining multi-environment Coolify deployments with Doppler secrets and GitHub Actions from a repository config file.

When not to use it

Avoid this if the project does not use Coolify and Doppler, or if you need a one-off manual deployment without prior configuration.

Security analysis

Caution
Quality score82/100

This is a legitimate DevOps provisioning skill that drives Coolify, Doppler, Cloudflare, and SSH using credentials from a local config file. It wields powerful tools (Bash, network APIs, remote SSH) and handles real secrets, which warrants a 'caution' rating, but there are no destructive, exfiltrating, obfuscated, or safety-disabling instructions. The secret-handling model (only DOPPLER_TOKEN in Coolify, scoped per config) is explicitly disclosed with its risk tradeoffs.

Findings
  • •Uses Bash for provisioning and invokes helper scripts (provision.sh, seed.sh, validate.sh, lib-coolify-api.sh) under ~/.claude/skills/setup-coolify/scripts/ — meaningful local execution surface
  • •Makes network API calls to Coolify, Doppler, and Cloudflare, and SSH access to remote deploy hosts — powerful but legitimate operational tooling
  • •Reads long-lived credentials (api_key, doppler_account, ssh_host, doppler_token, cloudflare_api_token) from ~/.claude/coolify.json; compromise of that file or of the skill scripts grants wide control
  • •DOPPLER_TOKEN is stored in Coolify and the skill itself notes it is visible in UI/API/logs and can read all secrets in the matching Doppler config — a real blast-radius concern, though disclosed
  • •No evidence of exfiltration, obfuscation, base64 payloads, rm -rf, curl|sh, or disabling of safety; behavior is documented and idempotent
How this analysis is made

Examples

Plan production diff
Run /setup-coolify plan against our production server to show the CREATE/EXISTS/PATCH diff before provisioning.
Bootstrap app config
Use /setup-coolify init_app to bootstrap coolify.yaml and .github/workflows/deploy.yml for this repo.
Seed Doppler keys
Run /setup-coolify seed to fill missing Doppler keys from .env.local and .env.production without overwriting existing values.

name: setup-coolify description: This skill should be used when the user runs /setup-coolify, /setup-coolify provision, /setup-coolify plan, /setup-coolify seed, /setup-coolify init_cicd, /setup-coolify init_app, or /setup-coolify validate. Provisions and updates a Coolify deployment for the current repo from coolify.yaml, configures Doppler secret injection (all env_vars including NEXT_PUBLIC_* injected at runtime via DOPPLER_TOKEN — same-image promotion model), and generates .github/workflows/deploy.yml. Reads coolify.yaml from the working directory and credentials from ~/.claude/coolify.json. Designed to work across multiple repos and multiple Coolify servers via the server alias in coolify.yaml. disable-model-invocation: true argument-hint: "[provision | plan | seed | init_cicd | init_app | validate | (blank = provision)]" allowed-tools: Read Write Bash

setup-coolify

Arguments: $ARGUMENTS

Provision or update a Coolify + Doppler deployment from coolify.yaml in the current working directory. Same skill works for any repo and any Coolify server — the server: alias in coolify.yaml selects both the Coolify URL and the Doppler account.

Subcommands

| Form | Action | |------|--------| | /setup-coolify | Provision/update: ensures Doppler keys exist, upserts every app in the environments: map (staging + production required; extra envs like qa provisioned identically), syncs env vars, mounts Doppler-fallback volume. Does NOT deploy — the first deploy fires on push to main via the generated workflow. Idempotent. | | /setup-coolify provision | Explicit alias for blank — same as /setup-coolify with no arguments. Provision/update all apps idempotently. | | /setup-coolify plan | Read-only diff (Terraform-style): runs provision.sh --plan, reporting + CREATE / = EXISTS / ~ PATCH per resource (project, apps, volumes, Doppler tokens, DNS records) against live state, then exits. Nothing is mutated. Use before re-running provision on a production server. | | /setup-coolify seed | Explicit Doppler gap-fill from .env.local (seeds dev + stg) and .env.production (seeds prd). Runs bash $HOME/.claude/skills/setup-coolify/scripts/seed.sh. Logs every key set. Never overwrites an existing Doppler value. Run after creating a new repo's Doppler project before running provision. | | /setup-coolify init_cicd | Interactive setup of ~/.claude/coolify.json for a new server alias. Prompts for url, api_key, doppler_account, ssh_host, doppler_token. Validates existing credentials before prompting for replacement. | | /setup-coolify init_app | Bootstraps coolify.yaml and .github/workflows/deploy.yml in the current repo. Prompts for project name, server alias, domains, env vars, and optional deploy_server/deploy_ssh_host. Seeds dev+stg Doppler configs from .env.local when present. | | /setup-coolify validate | Strictly read-only validation: verifies coolify.yaml schema, coolify.json Tier 1 fields (url, api_key, doppler_account, ssh_host, doppler_token), Tier 2 feature-gated fields (cloudflare_api_token when dns.credential_source: coolify_json; deploy_ssh_host/deploy_vps_ip when deploy_server is set), Doppler key presence, Coolify API reachability. No Doppler mutations — run /setup-coolify seed separately to fill missing keys. |

Secrets injection model (same-image promotion)

Coolify receives only DOPPLER_TOKEN — a service token scoped to the matching Doppler config (stg or prd). No other secret values are stored in or pass through Coolify. At container start, the Dockerfile ENTRYPOINT runs doppler run which uses DOPPLER_TOKEN to fetch all env_vars secrets directly from Doppler and inject them into the process environment.

The same Docker image is promoted from staging to production without a rebuild; the only thing that differs between the two app instances is the DOPPLER_TOKEN (scoped to the matching Doppler config). This means:

  • Staging gets a service token for the stg Doppler config → all staging secrets
  • Production gets a service token for the prd Doppler config → all production secrets
  • DOPPLER_TOKEN itself is stored in Coolify and is visible in the Coolify UI, API responses, and deployment logs. It is a scoped service token — an attacker who obtains it can read all secrets in the matching Doppler config. Protect it accordingly (rotate on exposure; --rotate-tokens flag in provision).
  • Actual secret values (DATABASE_URL, API keys, etc.) are never stored in or pass through Coolify. They flow directly from Doppler to the container at start time via doppler run.

The # build_time: true trailing-comment annotation in coolify.yaml is reserved for a future per-env build mode and is NOT currently parsed by this skill. Under the current model, the annotation has no behavioural effect — every env_var is treated identically (runtime-injected). Do not rely on the annotation to change provisioning behaviour today.

Execution flow (provision = blank arguments)

  1. Load and validate config

    • Parse ./coolify.yaml. Bail if missing or invalid YAML.
    • Read ~/.claude/coolify.json. Look up servers.$SERVER_ALIAS entry. Bail if missing.
    • Run bash $HOME/.claude/skills/setup-coolify/scripts/validate.sh. If non-zero, print errors and bail BEFORE touching Coolify.
  2. Discover Coolify topology by lookup-by-name (no hardcoded UUIDs)

    • Source lib-coolify-api.sh. Call coolify_upsert_project "$PROJECT_NAME" to get project UUID.
    • Resolve DEPLOY_SERVER_NAME: uses deploy_server in coolify.yaml if set, otherwise reads server_name from ~/.claude/coolify.json (servers.<alias>.server_name, default localhost). Call coolify_get_server_uuid "$DEPLOY_SERVER_NAME". Bail if not found.
    • Call coolify_get_destination_uuid "$DEPLOY_SERVER_UUID" (which scans existing applications on the server first, falling back to /destinations).
    • Resolve DEPLOY_SSH_HOST: uses deploy_ssh_host in coolify.json if set, falling back to ssh_host. REQUIRED — bail if missing (used in step 3 to create the Doppler-cache Docker volume on the deployment VPS).
  3. Upsert staging app

    • Compute name: ${PROJECT_NAME}-staging (e.g. skillmap-staging).
    • coolify_find_app_by_name — if UUID returned, skip create. Else POST /applications/private-github-app with source_type: registry and docker_registry_image_name: $REGISTRY_IMAGE. PATCH is_auto_deploy_enabled=false.
    • Source lib-doppler-api.sh. Create a service token scoped to staging config. Set only DOPPLER_TOKEN on the Coolify app — no other secret values are stored in Coolify. The app's Dockerfile ENTRYPOINT runs doppler run which uses DOPPLER_TOKEN to fetch all env_vars secrets directly from Doppler at container start.
    • SSH to the deployment VPS (DEPLOY_SSH_HOST) and run docker volume create ${APP_UUID}-doppler-cache. PATCH the app with custom_docker_run_options: --mount source=${APP_UUID}-doppler-cache,target=/etc/doppler-cache.
  4. Upsert production app (same flow, name = ${PROJECT_NAME}-production)

  5. Write coolify_app_ids back to coolify.yaml (consumed by generate-workflow.sh to embed app UUIDs in deploy.yml; provisioning never reads it back — every run re-resolves by name)

  6. Done. provision.sh does NOT trigger an initial deploy. The first deploy is fired by pushing to main, which activates the generated .github/workflows/deploy.yml (build → GHCR → deploy-staging → smoke-test → deploy-production). To redeploy manually, push any commit to main or trigger the workflow from the GitHub Actions UI.

init_cicd flow

Interactive prompts (server credential collection):

  • Server alias to add (string, e.g. my-server)
  • Coolify URL (e.g. https://coolify.example.com)
  • API key (paste — token displayed once in Coolify UI)
  • Doppler account name (e.g. my-doppler-account)
  • SSH host alias (e.g. my-vps)
  • Cloudflare API token (optional — leave blank if DNS is managed outside Cloudflare or manually). When provided, stored as cloudflare_api_token under the server entry. Token requires Zone:DNS:Edit scope. Also prompt for dns_default block: zone name (e.g. example.com) and credential key (cloudflare_api_token). This pre-populates the dns: block for future coolify.yaml generation and is used by provision.sh and test/e2e.sh to auto-create DNS A records.

If the alias already exists in ~/.claude/coolify.json, validates existing credentials first (Coolify API ping + doppler whoami). Prompts to replace only if validation fails.

Re-run to fill missing fields: As the skill evolves, new fields are added to the server entry schema. Re-running /setup-coolify init_cicd for an existing alias is the supported upgrade path — it skips fields that already pass validation and only prompts for absent or failing fields. doppler_token is now a Tier 1 required field (not optional); validate will exit 1 if it is missing. Re-run init_cicd to add it to an existing entry.

Merge into ~/.claude/coolify.json (preserve existing servers). chmod 0600.

Example resulting server entry:

"my-server": {
  "url": "https://coolify.example.com",
  "api_key": "...",
  "doppler_account": "MyOrg",
  "ssh_host": "my-vps",
  "cloudflare_api_token": "...",
  "dns_default": {
    "provider": "cloudflare",
    "zone_name": "example.com",
    "credential_source": "coolify_json",
    "credential_key": "cloudflare_api_token"
  }
}

init_app flow

Run from the target repo root (bash ~/.claude/skills/setup-coolify/init/init.sh). Writes ./coolify.yaml and .github/workflows/deploy.yml.

Interactive prompts:

  • Project name, server alias, Doppler project, registry image, staging/production domains
  • DNS provider (cloudflare/none) and optional DNS zone + credential config
  • Optional deploy_server (Coolify-registered server name) and build context/Dockerfile
  • Env var keys

After writing files, detects .env.local and offers to seed dev and stg Doppler configs from it.

plan flow

Runs bash $HOME/.claude/skills/setup-coolify/scripts/provision.sh --plan.

Read-only: runs validate, resolves topology (project, server, destination, DNS zone), then for every environment reports + CREATE (resource absent), = EXISTS (matches desired state), or ~ PATCH (lists exactly which fields would change: domains, volume mount, image name, health_check_path, DNS record IP). Exits 0 without mutating anything.

validate flow

Runs bash $HOME/.claude/skills/setup-coolify/scripts/validate.sh.

Strictly read-only — no Doppler mutations.

  1. Parses and schema-checks coolify.yaml.
  2. Verifies coolify.json Tier 1 fields: url, api_key, doppler_account, ssh_host, doppler_token (hard fail if missing).
  3. Verifies coolify.json Tier 2 fields gated on coolify.yaml features: cloudflare_api_token (required when dns.credential_source: coolify_json), deploy_ssh_host/deploy_vps_ip (required when deploy_server: is set).
  4. Verifies Coolify API reachability, SSH connectivity, DNS credentials.
  5. Checks that every env_vars key from coolify.yaml exists in Doppler staging AND production with a non-placeholder value. Reports all failures before exiting (error-accumulation pattern).

To fill missing Doppler keys from local .env files, run /setup-coolify seed separately.

See also

  • ~/.claude/skills/setup-coolify/references/api-reference.md — Coolify + Doppler API endpoint reference
  • docs/schema.md (in the repo) — coolify.yaml and coolify.json schema reference, including the reserved build_time: true annotation

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/setup-coolify-doppler-ms2s7bqt/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/setup-coolify-doppler-ms2s7bqt' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/setup-coolify-doppler-ms2s7bqt/download' --output '.skill-downloads/setup-coolify-doppler-ms2s7bqt/SKILL.md.part' && mv '.skill-downloads/setup-coolify-doppler-ms2s7bqt/SKILL.md.part' '.skill-downloads/setup-coolify-doppler-ms2s7bqt/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

Tools declared by the author (check availability in your agent): Read Write Bash

Original excerpt: setup-coolify

Arguments: $ARGUMENTS

Provision or update a Coolify + Doppler deployment from coolify.yaml in the current working directory. Same skill works for any repo and any Coolify server — the server: alias in coolify.yaml selects both the Coolify URL and the Doppler account.

Subcommands

FormAction
/setup-coolifyProvision/update: ensures Doppler keys exist, upserts every app in the environments: map (staging + production required; extra envs like qa provisioned identically), syncs env vars, mounts Doppler-fallback volume. Does NOT deploy — the first deploy fires on push to main via the generated workflow. Idempotent.
/setup-coolify provisionExplicit alias for blank — same as /setup-coolify with no arguments. Provision/update all apps idempotently.
/setup-coolify planRead-only diff (Terraform-style): runs provision.sh --plan, reporting + CREATE / = EXISTS / ~ PATCH per resource (project, apps, volumes, Doppler tokens, DNS records) against live state, then exits. Nothing is mutated. Use before re-running provision on a production server.
/setup-coolify seedExplicit Doppler gap-fill from .env.local (seeds dev + stg) and .env.production (seeds prd). Runs bash $HOME/.claude/skills/setup-coolify/scripts/seed.sh. Logs every key set. Never overwrites an existing Doppler value. Run after creating a new repo's Doppler project before running provision.
/setup-coolify init_cicdInteractive setup of ~/.claude/coolify.json for a new server alias. Prompts for url, api_key, doppler_account, ssh_host, doppler_token. Validates existing credentials before prompting for replacement.
/setup-coolify init_appBootstraps coolify.yaml and .github/workflows/deploy.yml in the current repo. Prompts for project name, server alias, domains, env vars, and optional deploy_server/deploy_ssh_host. Seeds dev+stg Doppler configs from .env.local when present.
/setup-coolify validateStrictly read-only validation: verifies coolify.yaml schema, coolify.json Tier 1 fields (url, api_key, doppler_account, ssh_host, doppler_token), Tier 2 feature-gated fields (cloudflare_api_token when dns.credential_source: coolify_json; deploy_ssh_host/deploy_vps_ip when deploy_server is set), Doppler key presence, Coolify API reachability. No Doppler mutations — run /setup-coolify seed separately to fill missing keys.

Secrets injection model (same-image promotion)

Coolify receives only DOPPLER_TOKEN — a service token scoped to the matching Doppler config (stg or prd). No other secret values are stored in or pass through Coolify. At container start, the Dockerfile ENTRYPOINT runs doppler run which uses DOPPLER_TOKEN to fetch all env_vars secrets directly from Doppler and inject them into the process environment.

The same Docker image is promoted from staging to production without a rebuild; the only thing that differs between the two app instances is the DOPPLER_TOKEN (scoped to the matching Doppler config). This means:

  • Staging gets a service token for the stg Doppler config → all staging secrets
  • Production gets a service token for the prd Doppler config → all production secrets
  • DOPPLER_TOKEN itself is stored in Coolify and is visible in the Coolify UI, API responses, and deployment logs. It is a scoped service token — an attacker who obtains it can read all secrets in the matching Doppler config. Protect it accordingly (rotate on exposure; --rotate-tokens flag in provision).
  • Actual secret values (DATABASE_URL, API keys, etc.) are never stored in or pass through Coolify. They flow directly from Doppler to the container at start time via doppler run.

The # build_time: true trailing-comment annotation in coolify.yaml is reserved for a future per-env build mode and is NOT currently parsed by this skill. Under the current model, the annotation has no behavioural effect — every env_var is treated identically (runtime-injected). Do not rely on the annotation to change provisioning behaviour today.

Execution flow (provision = blank arguments)

  1. Load and validate config

    • Parse ./coolify.yaml. Bail if missing or invalid YAML.
    • Read ~/.claude/coolify.json. Look up servers.$SERVER_ALIAS entry. Bail if missing.
    • Run bash $HOME/.claude/skills/setup-coolify/scripts/validate.sh. If non-zero, print errors and bail BEFORE touching Coolify.
  2. Discover Coolify topology by lookup-by-name (no hardcoded UUIDs)

    • Source lib-coolify-api.sh. Call coolify_upsert_project "$PROJECT_NAME" to get project UUID.
    • Resolve DEPLOY_SERVER_NAME: uses deploy_server in coolify.yaml if set, otherwise reads server_name from ~/.claude/coolify.json (servers.<alias>.server_name, default localhost). Call coolify_get_server_uuid "$DEPLOY_SERVER_NAME". Bail if not found.
    • Call coolify_get_destination_uuid "$DEPLOY_SERVER_UUID" (which scans existing applications on the server first, falling back to /destinations).
    • Resolve DEPLOY_SSH_HOST: uses deploy_ssh_host in coolify.json if set, falling back to ssh_host. REQUIRED — bail if missing (used in step 3 to create the Doppler-cache Docker volume on the deployment VPS).
  3. Upsert staging app

    • Compute name: ${PROJECT_NAME}-staging (e.g. skillmap-staging).
    • coolify_find_app_by_name — if UUID returned, skip create. Else POST /applications/private-github-app with source_type: registry and docker_registry_image_name: $REGISTRY_IMAGE. PATCH is_auto_deploy_enabled=false.
    • Source lib-doppler-api.sh. Create a service token scoped to staging config. Set only DOPPLER_TOKEN on the Coolify app — no other secret values are stored in Coolify. The app's Dockerfile ENTRYPOINT runs doppler run which uses DOPPLER_TOKEN to fetch all env_vars secrets directly from Doppler at container start.
    • SSH to the deployment VPS (DEPLOY_SSH_HOST) and run docker volume create ${APP_UUID}-doppler-cache. PATCH the app with custom_docker_run_options: --mount source=${APP_UUID}-doppler-cache,target=/etc/doppler-cache.
  4. Upsert production app (same flow, name = ${PROJECT_NAME}-production)

  5. Write coolify_app_ids back to coolify.yaml (consumed by generate-workflow.sh to embed app UUIDs in deploy.yml; provisioning never reads it back — every run re-resolves by name)

  6. Done. provision.sh does NOT trigger an initial deploy. The first deploy is fired by pushing to main, which activates the generated .github/workflows/deploy.yml (build → GHCR → deploy-staging → smoke-test → deploy-production). To redeploy manually, push any commit to main or trigger the workflow from the GitHub Actions UI.

init_cicd flow

Interactive prompts (server credential collection):

  • Server alias to add (string, e.g. my-server)
  • Coolify URL (e.g. https://coolify.example.com)
  • API key (paste — token displayed once in Coolify UI)
  • Doppler account name (e.g. my-doppler-account)
  • SSH host alias (e.g. my-vps)
  • Cloudflare API token (optional — leave blank if DNS is managed outside Cloudflare or manually). When provided, stored as cloudflare_api_token under the server entry. Token requires Zone:DNS:Edit scope. Also prompt for dns_default block: zone name (e.g. example.com) and credential key (cloudflare_api_token). This pre-populates the dns: block for future coolify.yaml generation and is used by provision.sh and test/e2e.sh to auto-create DNS A records.

If the alias already exists in ~/.claude/coolify.json, validates existing credentials first (Coolify API ping + doppler whoami). Prompts to replace only if validation fails.

Re-run to fill missing fields: As the skill evolves, new fields are added to the server entry schema. Re-running /setup-coolify init_cicd for an existing alias is the supported upgrade path — it skips fields that already pass validation and only prompts for absent or failing fields. doppler_token is now a Tier 1 required field (not optional); validate will exit 1 if it is missing. Re-run init_cicd to add it to an existing entry.

Merge into ~/.claude/coolify.json (preserve existing servers). chmod 0600.

Example resulting server entry:

"my-server": {
  "url": "https://coolify.example.com",
  "api_key": "...",
  "doppler_account": "MyOrg",
  "ssh_host": "my-vps",
  "cloudflare_api_token": "...",
  "dns_default": {
    "provider": "cloudflare",
    "zone_name": "example.com",
    "credential_source": "coolify_json",
    "credential_key": "cloudflare_api_token"
  }
}

init_app flow

Run from the target repo root (bash ~/.claude/skills/setup-coolify/init/init.sh). Writes ./coolify.yaml and .github/workflows/deploy.yml.

Interactive prompts:

  • Project name, server alias, Doppler project, registry image, staging/production domains
  • DNS provider (cloudflare/none) and optional DNS zone + credential config
  • Optional deploy_server (Coolify-registered server name) and build context/Dockerfile
  • Env var keys

After writing files, detects .env.local and offers to seed dev and stg Doppler configs from it.

plan flow

Runs bash $HOME/.claude/skills/setup-coolify/scripts/provision.sh --plan.

Read-only: runs validate, resolves topology (project, server, destination, DNS zone), then for every environment reports + CREATE (resource absent), = EXISTS (matches desired state), or ~ PATCH (lists exactly which fields would change: domains, volume mount, image name, health_check_path, DNS record IP). Exits 0 without mutating anything.

validate flow

Runs bash $HOME/.claude/skills/setup-coolify/scripts/validate.sh.

Strictly read-only — no Doppler mutations.

  1. Parses and schema-checks coolify.yaml.
  2. Verifies coolify.json Tier 1 fields: url, api_key, doppler_account, ssh_host, doppler_token (hard fail if missing).
  3. Verifies coolify.json Tier 2 fields gated on coolify.yaml features: cloudflare_api_token (required when dns.credential_source: coolify_json), deploy_ssh_host/deploy_vps_ip (required when deploy_server: is set).
  4. Verifies Coolify API reachability, SSH connectivity, DNS credentials.
  5. Checks that every env_vars key from coolify.yaml exists in Doppler staging AND production with a non-placeholder value. Reports all failures before exiting (error-accumulation pattern).

To fill missing Doppler keys from local .env files, run /setup-coolify seed separately.

See also

  • ~/.claude/skills/setup-coolify/references/api-reference.md — Coolify + Doppler API endpoint reference
  • docs/schema.md (in the repo) — coolify.yaml and coolify.json schema reference, including the reserved build_time: true annotation

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.

Claude Code
test -f '.skill-downloads/setup-coolify-doppler-ms2s7bqt/SKILL.md' && test -s '.skill-downloads/setup-coolify-doppler-ms2s7bqt/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/setup-coolify' && cp -R '.skill-downloads/setup-coolify-doppler-ms2s7bqt' '.claude/skills/setup-coolify'

OpenSkills

OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.

Official OpenSkills installation
openskills install './.skill-downloads/setup-coolify-doppler-ms2s7bqt'

openskills read 'setup-coolify-doppler-ms2s7bqt'

Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.

For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.

openskills sync

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/setup-coolify-doppler-ms2s7bqt/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills