gantry: Skill for Claude Code

.claude/skills/deploy-and-release/SKILL.md

deploy-and-release is a skill for Claude Code from geleynse/gantry. It costs 52 tokens per session (2,501 once invoked), scanned A, original, MIT.

A deployment and release guide for Gantry, the server that runs the application. It covers Docker, systemd, single-file binaries, releases, CI checks, and production settings.

In plain words
What is it for?
Deploying Gantry with Docker, Bun and systemd, or a standalone binary; creating releases; checking CI requirements; and configuring production authentication and environment variables.
Why use it?
It explains what each deployment option needs and highlights operational limits, such as using only one Gantry process with a given fleet directory.

Skill for Claude Code

Written for Claude Code: installed under .claude/.

This is geleynse/gantry's own configuration. It tells Claude Code how to work on gantry itself, so it is not a mod to install elsewhere. Copy it as a starting point and replace the rules that are about this project. Everything gantry configures →

Needs its repository: it runs a file that does not travel with it, so clone the repository first. The line is bun scripts/gantry-setup.ts ./my-fleet # scaffold locally (idempotent).

Reuse

Borrowing it

Nothing to install: this file belongs to geleynse/gantry. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.

Copy the file
curl -O https://raw.githubusercontent.com/geleynse/gantry/main/.claude/skills/deploy-and-release/SKILL.md
Clone the repo
git clone --depth 1 https://github.com/geleynse/gantry

Made for: Claude Code.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for deploy-and-release

README.md
[![agentmods](https://agentmods.dev/badge/skills/geleynse/gantry/deploy-and-release/github.svg)](https://agentmods.dev/skills/geleynse/gantry/deploy-and-release)
Your own site
<a href="https://agentmods.dev/skills/geleynse/gantry/deploy-and-release"><img src="https://agentmods.dev/badge/skills/geleynse/gantry/deploy-and-release/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for deploy-and-release

Your own site · 80×15
<a href="https://agentmods.dev/skills/geleynse/gantry/deploy-and-release"><img src="https://agentmods.dev/badge/skills/geleynse/gantry/deploy-and-release.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 52 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 2,501 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 1 finding. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00052 $0.02501
Opus 5 $0.00026 $0.01251
Sonnet 5 $0.00010 $0.00500
Haiku 4.5 $0.00005 $0.00250

Measured 8d ago against content hash dc802707fdda, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-08, from the pricing page.

Security

Grade A, and why

deploy-and-release scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 8d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Makes network callslowCapability

Not a fault in itself. Listed so you know the mod talks to something, and to what.

healthcheck: { test: ["CMD", "curl", "-sf", "http://localhost:3100/health"], interval: 30s, timeout: 5s, retries: 3, start_period: 10s }
.claude/skills/deploy-and-release/SKILL.md · 104 lines

How it starts

The opening of the file, as written. The whole thing — 104 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Deploy and Release — Gantry

Full walkthroughs (Cloudflare Tunnel, nginx/Caddy configs, systemd unit): docs/deployment.md. This skill covers what's actually wired in CI/CD, the exact scaffolding behavior, and gaps between docs and code. For build mechanics (esbuild config, bun run dev's "stale client bundle" trap, binary packaging internals) see the build-and-dev skill — not duplicated here.

Three deployment shapes

Shape Needs on target host Build step
Docker (docker-compose.yml) Docker + Compose only docker compose up --build (multi-stage Dockerfile builds inside the container)
systemd + Bun Bun runtime bun install && bun run build (or build:binary) on the host or a build machine
Single binary Nothing — no Bun, no Node, no npm bun run build:binary on a build machine, then scp the binary

All three serve one Express process on port 3100 (PORT/GANTRY_PORT), one FLEET_DIR per process, one SQLite file ($FLEET_DIR/data/fleet.db). Only one Gantry instance may run against a given FLEET_DIR — SQLite lock contention otherwise (see docs/getting-started.md "Database locked" troubleshooting entry).

docker-compose.yml (verified against the actual file)

services:
  gantry:
    build: { context: ., dockerfile: Dockerfile }
    image: gantry:local
    ports: ["${GANTRY_PORT:-3100}:3100"]
    volumes: ["${FLEET_DIR:-./_data}:/data"]
    environment:
      - FLEET_DIR=/data
      - LOG_LEVEL=${LOG_LEVEL:-info}
      - TRUST_PROXY=${TRUST_PROXY:-0}
      - GANTRY_SECRET=${GANTRY_SECRET:-}
    restart: unless-stopped
    healthcheck: { test: ["CMD", "curl", "-sf", "http://localhost:3100/health"], interval: 30s, timeout: 5s, retries: 3, start_period: 10s }

Single named volume mount at /data — that's the entire persistence surface: gantry.json, fleet-credentials.enc.json, data/fleet.db, logs/, agent prompt .txt files. Host-side path comes from $FLEET_DIR env var (defaults to ./_data next to the compose file) — this is a host path substituted into the bind mount, separate from the container's FLEET_DIR=/data env var baked into the environment: block. Don't confuse the two when debugging "my config isn't picked up" — the container always reads /data regardless of what the host-side $FLEET_DIR was set to.

Read the full file on GitHub · 104 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 8d ago First seen · 104 lines · 52 tokens per session scan A dc802707fdda

Subscribe to this mod's changes

deploy-and-release is a skill published in the GitHub repository geleynse/gantry (3 stars, last pushed 3d ago), licensed MIT. It adds 52 tokens to every session and 2,501 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.