Build
Custom skills
Author your own @alias skills via API. Custom skills are scoped to a workspace, syncable to teammates, and runnable with the same engine as built-ins.
#Create a custom skill
const skill = await client.customSkills.create({
alias: 'brand-voice',
title: 'Brand voice review',
description: 'Reviews copy for tone-of-voice fit',
kind: 'critique',
systemPrompt: `
You are a brand voice reviewer for Acme Corp.
Read the user's content and return a markdown report with three sections:
1. **What works** — voice elements that are on-brand
2. **What slips** — places the voice is off
3. **Concrete rewrites** — three rewritten lines
Voice: confident, plainspoken, never corporate.
`.trim(),
sampleArgs: 'paste your hero copy here',
});
console.log('created', skill.id);#Run it
Once created, custom skills are reachable through the same skills.run endpoint. Use the alias without the @ prefix:
const result = await client.skills.run({
alias: 'brand-voice', // no @ in the API
text: 'Welcome to your dashboard!',
});
console.log(result.markdown);#Skill schema
| Field | Type | Description |
|---|---|---|
| aliasrequired | string | Lowercase, hyphenated. Used after @ in the workbench. Must be unique within the workspace. |
| titlerequired | string | Display name for the Skills hub and autocomplete. |
| descriptionrequired | string | One-liner shown in autocomplete. Keep under 80 chars. |
| kindrequired | "critique" | "augmenter" | Critique returns markdown; augmenter modifies files. |
| systemPromptrequired | string | The instructions the LLM follows. For augmenters, must specify the strict JSON output schema. |
| sampleArgs | string | Optional example argument shape shown in the autocomplete preview. |
| tags | string[] | Optional tags for grouping in the Skills hub. |
#Augmenter-kind: required output schema
For kind: 'augmenter', the system prompt must instruct the LLM to emit JSON in this exact shape — the engine parses it before applying:
{
"files": [
{ "path": "src/components/Banner.tsx", "contents": "..." },
{ "path": "src/styles/banner.css", "contents": "..." }
],
"summary": "Added a banner component and styles."
}#List, update, delete
// list
const skills = await client.customSkills.list();
// fetch one
const skill = await client.customSkills.get('skill_abc');
// update (author only)
await client.customSkills.update('skill_abc', {
systemPrompt: 'updated prompt…',
});
// delete (author only)
await client.customSkills.delete('skill_abc');#Author-only edits
Anyone with workspace access can run any custom skill, but only the author can edit or delete. The API enforces this with 403 forbidden on cross-author writes.
#Where to go next
PromptFloe developer docs