# Agent skills

> Teach any coding agent to ask ExtraOrbital whenever a project needs a database, a bucket, a key or a secret.

An [Agent Skill](https://agentskills.io) is a folder with a `SKILL.md` that a coding agent
loads when the task in front of it matches the skill's description. ExtraOrbital publishes
one main skill, `extraorbital`, whose description names what projects keep asking for: a
MongoDB or Postgres database, Redis, a bucket, a vector index, an OpenAI or Anthropic key,
Stripe test keys, a git remote, a secret like `AUTH_SECRET`, an `.env.example` nobody filled
in. With it installed, the agent runs `npx extraorbital provision .` instead of stopping to
ask you to sign up for something.

## What the main skill teaches

- Dry-run `provision` when the plan matters, then provision; `add <resource>` for one
  resource, `add SESSION_SECRET` for a secret nothing issues.
- Every command is idempotent and takes `--json`, and each exit code means one thing to
  do next.
- Credential values are never printed, logged or committed.
- A human is needed only when the free allowance runs out: the command prints a link, and
  the agent shows it to you and waits instead of retrying.
- `push` sends the variables to Vercel; the MCP server is there for agents that prefer
  tools.

The skill is short on purpose. The table of every service, its variables and its
allowance is a separate file it reads only when needed, `references/resources.md`.

## Copy a prompt into any agent

Paste this into Claude Code, Codex, Cursor, Windsurf, Gemini CLI or any other coding
agent. It installs the skill where that agent keeps skills, optionally registers the
MCP server, then dry-runs `provision` on the open project and reports back. The same
text is at [/prompt.md](https://extraorbital.dev/prompt.md).

```txt title="Prompt" copy="Copy prompt"
Set up ExtraOrbital for this project, then tell me what it would provision.

ExtraOrbital (https://extraorbital.dev) gives a project its databases, caches, buckets, vector indexes, AI gateway keys, Stripe test keys and generated secrets with one command: `npx extraorbital provision .`. No signup, no card, no human in the loop.

1. Install the `extraorbital` skill into your own skills directory, so you reach for it whenever a project needs a resource or has unfilled env vars.
   - Preferred: `npx skills add https://extraorbital.dev --skill extraorbital -y` (add `-a <agent>`, e.g. `-a claude-code`, `-a codex`, `-a cursor`, if it installs for the wrong agent).
   - Otherwise download https://extraorbital.dev/skills/extraorbital/SKILL.md and https://extraorbital.dev/skills/extraorbital/references/resources.md into `<skills dir>/extraorbital/`, keeping that layout. Usual skills directories: Claude Code `~/.claude/skills/` (or `.claude/skills/` in the project); Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Zed `.agents/skills/` in the project (Codex also `~/.agents/skills/`, Cursor `~/.cursor/skills/`, Gemini CLI `~/.gemini/skills/`); Windsurf `.windsurf/skills/`.
   - If you have no skills directory, save SKILL.md as a rules or instructions file you always read (e.g. `.cursor/rules/extraorbital.md`, or a section of AGENTS.md).
2. Optional, if you support MCP: register the ExtraOrbital MCP server, locally as the stdio command `npx -y extraorbital mcp`, or remotely at https://extraorbital.dev/mcp.
3. In this project, run `npx extraorbital provision . --dry-run`. It creates nothing and writes nothing to the project (a first run only registers this machine's keypair): it lists the resources this project would get, the reason for each (a variable in .env.example, an unfilled line in .env, a name used in the source) and the secrets it would generate.
4. Report back: which skill directory you installed into, the dry-run plan, and anything that failed. Do not provision for real until I confirm. Never print credential values.

More: https://extraorbital.dev/llms.txt · https://extraorbital.dev/skills.md
```

## Install

The skills are published at
[extraorbital.dev/skills.md](https://extraorbital.dev/skills.md) and mirrored to the
[`extraorbital/skills`](https://github.com/extraorbital/skills) repository.

### Any agent, with the skills CLI

```bash
npx skills add https://extraorbital.dev --skill extraorbital
```

The [skills CLI](https://github.com/vercel-labs/skills) reads
`/.well-known/agent-skills/index.json`, asks which of your agents to install into, and
copies the folder there. `-g` installs for your user instead of the project, `-a codex`
picks the agent, and `--skill '*'` takes the framework recipes too.

### Claude Code

```txt
/plugin marketplace add extraorbital/skills
/plugin install extraorbital@extraorbital
```

`extraorbital-recipes@extraorbital` adds the framework recipes. Without plugins, copy the
folder into `~/.claude/skills/extraorbital/` or the project's `.claude/skills/`.

### Codex, Cursor, Gemini CLI, Copilot and others

These read skills from `.agents/skills/` in the project:

```bash
mkdir -p .agents/skills/extraorbital/references
curl -fsSL https://extraorbital.dev/skills/extraorbital/SKILL.md \
  -o .agents/skills/extraorbital/SKILL.md
curl -fsSL https://extraorbital.dev/skills/extraorbital/references/resources.md \
  -o .agents/skills/extraorbital/references/resources.md
```

For every project at once, use the agent's own folder instead: `~/.agents/skills/` for
Codex, `~/.cursor/skills/` for Cursor, `~/.gemini/skills/` for Gemini CLI. Windsurf reads
`.windsurf/skills/`. An agent with no skills support can take `SKILL.md` as a rules file.

### Claude.ai

Zip the `extraorbital` folder and upload it under **Customize → Skills**. The skill works
by running the CLI, which needs code execution with network access; in a chat app the
[MCP server](/docs/mcp) is usually the better fit.

## Framework recipes

48 more skills, one per resource and framework, each with the client to install,
a connection module in the framework's usual place, a route that exercises it, a way to
verify it and the pitfalls. They are generated from the same service registry the CLI
reads, so a variable name in a skill is always one the CLI writes.

| Resource | Next.js | SvelteKit | Nuxt | Express | FastAPI | Django |
| --- | --- | --- | --- | --- | --- | --- |
| MongoDB | [mongodb-nextjs](https://extraorbital.dev/skills/mongodb-nextjs/SKILL.md) | [mongodb-sveltekit](https://extraorbital.dev/skills/mongodb-sveltekit/SKILL.md) | [mongodb-nuxt](https://extraorbital.dev/skills/mongodb-nuxt/SKILL.md) | [mongodb-express](https://extraorbital.dev/skills/mongodb-express/SKILL.md) | [mongodb-fastapi](https://extraorbital.dev/skills/mongodb-fastapi/SKILL.md) | [mongodb-django](https://extraorbital.dev/skills/mongodb-django/SKILL.md) |
| Postgres | [postgres-nextjs](https://extraorbital.dev/skills/postgres-nextjs/SKILL.md) | [postgres-sveltekit](https://extraorbital.dev/skills/postgres-sveltekit/SKILL.md) | [postgres-nuxt](https://extraorbital.dev/skills/postgres-nuxt/SKILL.md) | [postgres-express](https://extraorbital.dev/skills/postgres-express/SKILL.md) | [postgres-fastapi](https://extraorbital.dev/skills/postgres-fastapi/SKILL.md) | [postgres-django](https://extraorbital.dev/skills/postgres-django/SKILL.md) |
| Redis | [redis-nextjs](https://extraorbital.dev/skills/redis-nextjs/SKILL.md) | [redis-sveltekit](https://extraorbital.dev/skills/redis-sveltekit/SKILL.md) | [redis-nuxt](https://extraorbital.dev/skills/redis-nuxt/SKILL.md) | [redis-express](https://extraorbital.dev/skills/redis-express/SKILL.md) | [redis-fastapi](https://extraorbital.dev/skills/redis-fastapi/SKILL.md) | [redis-django](https://extraorbital.dev/skills/redis-django/SKILL.md) |
| S3 storage | [s3-nextjs](https://extraorbital.dev/skills/s3-nextjs/SKILL.md) | [s3-sveltekit](https://extraorbital.dev/skills/s3-sveltekit/SKILL.md) | [s3-nuxt](https://extraorbital.dev/skills/s3-nuxt/SKILL.md) | [s3-express](https://extraorbital.dev/skills/s3-express/SKILL.md) | [s3-fastapi](https://extraorbital.dev/skills/s3-fastapi/SKILL.md) | [s3-django](https://extraorbital.dev/skills/s3-django/SKILL.md) |
| Vector index | [vector-nextjs](https://extraorbital.dev/skills/vector-nextjs/SKILL.md) | [vector-sveltekit](https://extraorbital.dev/skills/vector-sveltekit/SKILL.md) | [vector-nuxt](https://extraorbital.dev/skills/vector-nuxt/SKILL.md) | [vector-express](https://extraorbital.dev/skills/vector-express/SKILL.md) | [vector-fastapi](https://extraorbital.dev/skills/vector-fastapi/SKILL.md) | [vector-django](https://extraorbital.dev/skills/vector-django/SKILL.md) |
| AI Gateway | [ai-gateway-nextjs](https://extraorbital.dev/skills/ai-gateway-nextjs/SKILL.md) | [ai-gateway-sveltekit](https://extraorbital.dev/skills/ai-gateway-sveltekit/SKILL.md) | [ai-gateway-nuxt](https://extraorbital.dev/skills/ai-gateway-nuxt/SKILL.md) | [ai-gateway-express](https://extraorbital.dev/skills/ai-gateway-express/SKILL.md) | [ai-gateway-fastapi](https://extraorbital.dev/skills/ai-gateway-fastapi/SKILL.md) | [ai-gateway-django](https://extraorbital.dev/skills/ai-gateway-django/SKILL.md) |
| Stripe test keys | [stripe-nextjs](https://extraorbital.dev/skills/stripe-nextjs/SKILL.md) | [stripe-sveltekit](https://extraorbital.dev/skills/stripe-sveltekit/SKILL.md) | [stripe-nuxt](https://extraorbital.dev/skills/stripe-nuxt/SKILL.md) | [stripe-express](https://extraorbital.dev/skills/stripe-express/SKILL.md) | [stripe-fastapi](https://extraorbital.dev/skills/stripe-fastapi/SKILL.md) | [stripe-django](https://extraorbital.dev/skills/stripe-django/SKILL.md) |
| Speech-to-text (Deepgram) | [deepgram-nextjs](https://extraorbital.dev/skills/deepgram-nextjs/SKILL.md) | [deepgram-sveltekit](https://extraorbital.dev/skills/deepgram-sveltekit/SKILL.md) | [deepgram-nuxt](https://extraorbital.dev/skills/deepgram-nuxt/SKILL.md) | [deepgram-express](https://extraorbital.dev/skills/deepgram-express/SKILL.md) | [deepgram-fastapi](https://extraorbital.dev/skills/deepgram-fastapi/SKILL.md) | [deepgram-django](https://extraorbital.dev/skills/deepgram-django/SKILL.md) |

Every skill with its description and install command: [/skills.md](https://extraorbital.dev/skills.md).

## How they stay current

The recipes are generated, not written: the variable names come from the same service
registry the CLI and the API read, the framework conventions from one table, and a test
fails when the committed skills differ from what the generator would write. A new
service or framework is a change to that data, and every skill that mentions it follows.

`/skills/<name>/SKILL.md` serves each file as plain markdown, and
[`/skills.md`](https://extraorbital.dev/skills.md) lists them all.

## Next

- [MCP server](/docs/mcp): the same capabilities as tools, for chat apps and MCP clients
- [Quickstart](/docs/quickstart): what `provision` reads and writes
- [CLI reference](/docs/cli): every command, flag and exit code

---

More for agents: [Sitemap](https://extraorbital.dev/sitemap.md) · [llms.txt](https://extraorbital.dev/llms.txt) · [agents.md](https://extraorbital.dev/agents.md)
