Add Service Documentation
This skill guides you through documenting a new service in the Coolify documentation repository.
When to Use This Skill
- Adding documentation for a new service from the Coolify repository
- Creating service pages with proper formatting and images
- Following documentation standards for service pages
Architecture: Frontmatter-Driven Generation
The services listing is generated, not hand-edited. There is no manual catalog to maintain.
| Generator |
Reads |
Writes |
scripts/generate-service-list.mjs |
every docs/services/*.md frontmatter |
docs/.vitepress/theme/data/services.json (consumed by List.vue) |
scripts/generate-services-page.mjs |
every docs/services/*.md frontmatter |
docs/services/all.md |
Both scripts share scripts/services-data.mjs, which:
- Parses each markdown's YAML frontmatter
- Auto-resolves the logo by scanning
docs/public/images/services/ for files matching <slug>-logo, <slug>_logo, <slug>logo, the bare <slug>, or the same variants of the title
- Falls back to the first image referenced in the markdown body if frontmatter has no
icon and no asset matches
- Marks a service as disabled if frontmatter has
disabled: true or the body contains SERVICE HIDDEN | NOT AVAILABLE | REMOVED FROM COOLIFY | TEMPORARILY DISABLED
The generators run automatically on bun run dev, bun run build, and bun run preview. You can also run them on demand with bun run generate:services.
Quick Start Workflow
- Identify the service from Coolify's GitHub repository (
templates/compose/)
- Extract metadata from the YAML template header
- Download the logo from GitHub and save to
docs/public/images/services/ using a name the resolver will pick up
- Create documentation at
docs/services/{service-slug}.md with the required frontmatter (title, description, category)
- Regenerate listings with
bun run generate:services (or just bun run dev — it runs the generators first)
- Commit the new markdown, the logo, and the regenerated
services.json and all.md
File Structure
Coolify Repository (GitHub):
├── templates/compose/
│ └── service-name.yaml # Service template with metadata
└── public/svgs/
└── service-logo.svg # Service logo
https://github.com/coollabsio/coolify/tree/main/templates/compose
https://github.com/coollabsio/coolify/tree/main/public/svgs
Documentation Repository:
├── docs/
│ ├── services/
│ │ ├── service-name.md # Service documentation page (you create)
│ │ └── all.md # Generated — DO NOT hand-edit
│ ├── public/images/services/
│ │ └── service-logo.svg # Logo (you add)
│ └── .vitepress/theme/
│ ├── data/services.json # Generated — DO NOT hand-edit
│ └── components/Services/
│ └── List.vue # Renders services.json (no service entries inside it)
└── scripts/
├── generate-service-list.mjs
├── generate-services-page.mjs
└── services-data.mjs
Required Files for a New Service
You only edit two things; the rest is generated:
- Service documentation (
docs/services/{slug}.md) — with frontmatter
- Service logo (
docs/public/images/services/)
After your edits, bun run generate:services produces:
docs/.vitepress/theme/data/services.json
docs/services/all.md
Commit all four files together.
Required Frontmatter
---
title: "Service Name"
description: "Short description used on the listing card and in all.md."
og:
description: "Optional longer SEO/social-card description."
category: "Analytics"
icon: "/docs/images/services/service-name-logo.svg"
---
| Field |
Required |
Purpose |
title |
yes |
Card title; also name in services.json |
description |
yes |
Card description and all.md entry |
category |
yes |
Group heading in all.md; filter in the listing |
icon |
optional |
Only needed when the auto-resolver can't find a matching logo |
og.description |
optional |
Longer text for social cards |
disabled |
optional |
true hides the service from the listing while keeping the page accessible |
Detailed Instructions
Service-specific:
- METADATA.md — Extracting service info from the upstream YAML template
- DOCUMENTATION.md — Writing the markdown body and frontmatter
- IMAGES.md — Service logo handling and the icon resolver
- CATALOG.md — Categories, the generation pipeline, and disabled services
- TEMPLATES.md — Ready-to-use markdown templates
Shared guidelines:
Important Rules
- Never hand-edit
docs/services/all.md or docs/.vitepress/theme/data/services.json — both are regenerated and your changes will be overwritten.
- Download logos locally: never link to external image URLs.
- Skip ignored services: if the upstream YAML has
# ignore: true, don't document it.
- Images: use
 for the logo; use <ZoomableImage> only for screenshots.
- UTM parameters: append
?utm_source=coolify.io to all external links.
- File naming: lowercase, kebab-case slug; the filename is the slug.
- Logo naming: name the asset so the resolver finds it without an explicit
icon field. <slug>.svg, <slug>-logo.svg, or <slug>_logo.svg all work.
Testing
# Regenerate listings explicitly (optional — dev does this for you)
bun run generate:services
# Start dev server (runs generate:services first)
bun run dev
# Verify:
# - Service appears on the listing page (/docs/services/)
# - Logo displays
# - Service page loads at /docs/services/{slug}
# - Service appears under the right category in /docs/services/all
# - Category filter includes it
# Build for production
bun run build
Troubleshooting
Logo not showing:
- Check that the file lives in
docs/public/images/services/ and the basename matches one of the resolver candidates (<slug>, <slug>-logo, <slug>_logo, <slug>logo, <title>, <title>-logo).
- If the auto-resolver can't be made to work, set
icon: explicitly in frontmatter using a /docs/images/services/... path.
- Path must start with
/docs/images/services/ (not /public/).
Service missing from the listing:
- Re-run
bun run generate:services and check the resulting services.json and all.md.
- Ensure your frontmatter has
title, description, and category.
- Ensure the file isn't named
all.md, introduction.md, or overview.md — those are excluded.
- Confirm
disabled: true is not set, and that the body doesn't contain a hide pattern (SERVICE HIDDEN, NOT AVAILABLE, REMOVED FROM COOLIFY, TEMPORARILY DISABLED).
Wrong category grouping in all.md:
- The
category field is matched verbatim. See CATALOG.md for the existing list.
Related Commands
/new-services — automated service documentation generator
- Inspect existing services in
docs/services/ for reference frontmatter shapes
Source: coollabsio/coolify-docs — distributed by TomeVault.
1---2name: adding-service-documentation3description: Documents new Coolify one-click services by creating markdown pages in docs/services/, downloading logos to docs/public/images/services/, and regenerating the services listing. Use when adding service documentation, creating service pages, onboarding services from templates/compose/, or refreshing the services catalog. Use when this capability is needed.4---56# Add Service Documentation78This skill guides you through documenting a new service in the Coolify documentation repository.910## When to Use This Skill1112- Adding documentation for a new service from the Coolify repository13- Creating service pages with proper formatting and images14- Following documentation standards for service pages1516## Architecture: Frontmatter-Driven Generation1718The services listing is **generated**, not hand-edited. There is no manual catalog to maintain.1920| Generator | Reads | Writes |21|---|---|---|22| `scripts/generate-service-list.mjs` | every `docs/services/*.md` frontmatter | `docs/.vitepress/theme/data/services.json` (consumed by `List.vue`) |23| `scripts/generate-services-page.mjs` | every `docs/services/*.md` frontmatter | `docs/services/all.md` |2425Both scripts share `scripts/services-data.mjs`, which:26- Parses each markdown's YAML frontmatter27- Auto-resolves the logo by scanning `docs/public/images/services/` for files matching `<slug>-logo`, `<slug>_logo`, `<slug>logo`, the bare `<slug>`, or the same variants of the `title`28- Falls back to the first image referenced in the markdown body if frontmatter has no `icon` and no asset matches29- Marks a service as disabled if frontmatter has `disabled: true` or the body contains `SERVICE HIDDEN | NOT AVAILABLE | REMOVED FROM COOLIFY | TEMPORARILY DISABLED`3031The generators run automatically on `bun run dev`, `bun run build`, and `bun run preview`. You can also run them on demand with `bun run generate:services`.3233## Quick Start Workflow34351. **Identify the service** from Coolify's GitHub repository (`templates/compose/`)362. **Extract metadata** from the YAML template header373. **Download the logo** from GitHub and save to `docs/public/images/services/` using a name the resolver will pick up384. **Create documentation** at `docs/services/{service-slug}.md` with the required frontmatter (`title`, `description`, `category`)395. **Regenerate listings** with `bun run generate:services` (or just `bun run dev` — it runs the generators first)406. **Commit** the new markdown, the logo, and the regenerated `services.json` and `all.md`4142## File Structure4344```45Coolify Repository (GitHub):46├── templates/compose/47│ └── service-name.yaml # Service template with metadata48└── public/svgs/49 └── service-logo.svg # Service logo5051https://github.com/coollabsio/coolify/tree/main/templates/compose52https://github.com/coollabsio/coolify/tree/main/public/svgs5354Documentation Repository:55├── docs/56│ ├── services/57│ │ ├── service-name.md # Service documentation page (you create)58│ │ └── all.md # Generated — DO NOT hand-edit59│ ├── public/images/services/60│ │ └── service-logo.svg # Logo (you add)61│ └── .vitepress/theme/62│ ├── data/services.json # Generated — DO NOT hand-edit63│ └── components/Services/64│ └── List.vue # Renders services.json (no service entries inside it)65└── scripts/66 ├── generate-service-list.mjs67 ├── generate-services-page.mjs68 └── services-data.mjs69```7071## Required Files for a New Service7273You only edit two things; the rest is generated:74751. **Service documentation** (`docs/services/{slug}.md`) — with frontmatter762. **Service logo** (`docs/public/images/services/`)7778After your edits, `bun run generate:services` produces:79- `docs/.vitepress/theme/data/services.json`80- `docs/services/all.md`8182Commit all four files together.8384## Required Frontmatter8586```yaml87---88title: "Service Name"89description: "Short description used on the listing card and in all.md."90og:91 description: "Optional longer SEO/social-card description."92category: "Analytics"93icon: "/docs/images/services/service-name-logo.svg"94---95```9697| Field | Required | Purpose |98|---|---|---|99| `title` | yes | Card title; also `name` in `services.json` |100| `description` | yes | Card description and `all.md` entry |101| `category` | yes | Group heading in `all.md`; filter in the listing |102| `icon` | optional | Only needed when the auto-resolver can't find a matching logo |103| `og.description` | optional | Longer text for social cards |104| `disabled` | optional | `true` hides the service from the listing while keeping the page accessible |105106## Detailed Instructions107108**Service-specific:**109- [METADATA.md](./METADATA.md) — Extracting service info from the upstream YAML template110- [DOCUMENTATION.md](./DOCUMENTATION.md) — Writing the markdown body and frontmatter111- [IMAGES.md](./IMAGES.md) — Service logo handling and the icon resolver112- [CATALOG.md](./CATALOG.md) — Categories, the generation pipeline, and disabled services113- [TEMPLATES.md](./TEMPLATES.md) — Ready-to-use markdown templates114115**Shared guidelines:**116- [FRONTMATTER.md](../_shared/FRONTMATTER.md) — Title, description, Open Graph117- [IMAGES.md](../_shared/IMAGES.md) — General image syntax118- [LINKS.md](../_shared/LINKS.md) — Internal and external link formatting119- [CONTAINERS.md](../_shared/CONTAINERS.md) — VitePress callout containers120121## Important Rules1221231. **Never hand-edit `docs/services/all.md` or `docs/.vitepress/theme/data/services.json`** — both are regenerated and your changes will be overwritten.1242. **Download logos locally**: never link to external image URLs.1253. **Skip ignored services**: if the upstream YAML has `# ignore: true`, don't document it.1264. **Images**: use `` for the logo; use `<ZoomableImage>` only for screenshots.1275. **UTM parameters**: append `?utm_source=coolify.io` to all external links.1286. **File naming**: lowercase, kebab-case slug; the filename is the slug.1297. **Logo naming**: name the asset so the resolver finds it without an explicit `icon` field. `<slug>.svg`, `<slug>-logo.svg`, or `<slug>_logo.svg` all work.130131## Testing132133```bash134# Regenerate listings explicitly (optional — dev does this for you)135bun run generate:services136137# Start dev server (runs generate:services first)138bun run dev139140# Verify:141# - Service appears on the listing page (/docs/services/)142# - Logo displays143# - Service page loads at /docs/services/{slug}144# - Service appears under the right category in /docs/services/all145# - Category filter includes it146147# Build for production148bun run build149```150151## Troubleshooting152153**Logo not showing:**154- Check that the file lives in `docs/public/images/services/` and the basename matches one of the resolver candidates (`<slug>`, `<slug>-logo`, `<slug>_logo`, `<slug>logo`, `<title>`, `<title>-logo`).155- If the auto-resolver can't be made to work, set `icon:` explicitly in frontmatter using a `/docs/images/services/...` path.156- Path must start with `/docs/images/services/` (not `/public/`).157158**Service missing from the listing:**159- Re-run `bun run generate:services` and check the resulting `services.json` and `all.md`.160- Ensure your frontmatter has `title`, `description`, and `category`.161- Ensure the file isn't named `all.md`, `introduction.md`, or `overview.md` — those are excluded.162- Confirm `disabled: true` is not set, and that the body doesn't contain a hide pattern (`SERVICE HIDDEN`, `NOT AVAILABLE`, `REMOVED FROM COOLIFY`, `TEMPORARILY DISABLED`).163164**Wrong category grouping in `all.md`:**165- The `category` field is matched verbatim. See [CATALOG.md](./CATALOG.md) for the existing list.166167## Related Commands168169- `/new-services` — automated service documentation generator170- Inspect existing services in `docs/services/` for reference frontmatter shapes171172---173> Source: [coollabsio/coolify-docs](https://github.com/coollabsio/coolify-docs) — distributed by [TomeVault](https://tomevault.io).174<!-- tomevault:4.0:skill_md:2026-06-18 -->