# Choose packs

> Pick the packs a project uses with axx-packs.yaml and axx pack add, remove, list and update.

Source: https://axx.nimbusxr.us/next/guides/use-packs/

A **pack** is a set of steps. Axx publishes `rest`, `mock` (mocked dependencies, and mocked AI models: [Test AI features](https://axx.nimbusxr.us/next/guides/test-ai-features/)), `grpc` ([Call gRPC services](https://axx.nimbusxr.us/next/guides/test-grpc/)), `jsonrpc` ([Call JSON-RPC services](https://axx.nimbusxr.us/next/guides/test-jsonrpc/)), `graphql` ([Call GraphQL services](https://axx.nimbusxr.us/next/guides/test-graphql/)), `mcp` ([Test MCP servers](https://axx.nimbusxr.us/next/guides/test-mcp/)), `a2a` ([Test A2A agents](https://axx.nimbusxr.us/next/guides/test-a2a/)), `sql`, `mongo`, `redis` ([Seed and check Redis](https://axx.nimbusxr.us/next/guides/test-redis/)), `kafka`, `amqp`, `mqtt`, `nats` ([Test message brokers](https://axx.nimbusxr.us/next/guides/test-message-brokers/)), `websocket` ([Test WebSockets](https://axx.nimbusxr.us/next/guides/test-websockets/)), `sse` ([Test event streams](https://axx.nimbusxr.us/next/guides/test-event-streams/)), `asyncapi` (their messages checked against your AsyncAPI document: [Validate against AsyncAPI](https://axx.nimbusxr.us/next/guides/validate-asyncapi/)), `logs`, `files` (the files your services write: [Check files](https://axx.nimbusxr.us/next/guides/check-files/)), `mail` ([Check emails](https://axx.nimbusxr.us/next/guides/check-emails/)), `cli` (commands: [Run commands](https://axx.nimbusxr.us/next/guides/run-commands/)) and `web-core` (web apps in real browsers: [Test web apps](https://axx.nimbusxr.us/next/guides/test-web-apps/)), with the packs that build on it: `web-screenshots`, `web-a11y`, `web-network`, `web-lighthouse` and `web-coverage`, `mobile-android` and `mobile-ios` (Android apps on emulators, iOS apps on simulators: [Test mobile apps](https://axx.nimbusxr.us/next/guides/test-mobile-apps/)), which build on `mobile-core`, and `desktop-macos`, `desktop-windows` and `desktop-linux` (desktop apps, through the operating system's accessibility tree), which build on `desktop-core`. It also publishes packs for cloud services, one per service, named after its cloud ([Test cloud services](https://axx.nimbusxr.us/next/guides/test-cloud-services/)):

- **AWS:** `aws-s3`, `aws-sqs`, `aws-sns`, `aws-eventbridge` and `aws-dynamodb`, which build on `aws-core`.
- **Google Cloud:** `gcp-storage`, `gcp-pubsub`, `gcp-bigquery` and `gcp-firestore`, which build on `gcp-core`.
- **Azure:** `azure-blob` and `azure-servicebus`.

Each pack's steps, settings and tools are on its page of the [pack reference](https://axx.nimbusxr.us/next/references/packs/). A project can write packs of its own, or use packs other teams publish. Every pack, Axx's or anyone else's, is used the same way: the project lists it in `axx-packs.yaml`, next to `axx.yaml`.

## Choose the packs a project uses

```console
$ axx pack add rest sql
created axx-packs.yaml
added rest, sql
$ axx pack list
  rest                                     axx       46 steps
  sql                                      axx       17 steps
  mock                                     axx       not used
  mongo                                    axx       not used
  ...
```

```yaml title="axx-packs.yaml"
packs:
  - rest
  - sql
```

Only the listed packs are loaded, so their steps are the only ones `axx validate`, `axx steps` and the skills know about. Listing a pack that builds on another (a web pack such as `web-a11y`, `mobile-android`, `desktop-macos`, or an AWS or Google Cloud pack) loads that one too: `web-core`, `mobile-core` or `desktop-core` (and `app-core`, which they build on), `aws-core` or `gcp-core`. `axx pack remove` takes packs off the list. `axx init` starts the file with `rest`, which its first feature uses. Commit `axx-packs.yaml`.

The first `axx` command that needs the project's steps prepares Axx with its packs:

```console
$ axx validate
axx: preparing rest, sql (once; cached for later runs)
axx: ready in 31s
2 files, 6 scenarios, 41 steps: ok
```

This happens once for each list of packs. Later runs start immediately. The first time, Axx downloads what it needs, so it takes longer. In CI, keep Axx's cache between runs ([Run in CI](https://axx.nimbusxr.us/next/guides/run-in-ci/#keep-axxs-cache)).

## Add your own packs

Your own packs are listed the same way, by path or by Go module:

```console
$ axx pack new ./steps                          # create a pack in this repository
$ axx pack add github.com/team/axx-grpc@v1.2.0  # use a pack published as a Go module
```

[Write custom steps](https://axx.nimbusxr.us/next/guides/write-custom-steps/) shows what goes in a pack. When you change a pack in the repository, the next `axx` command prepares Axx with the new version.

Versions of module packs are pinned in `axx-packs.lock` (commit it). `axx pack update` moves them to the latest version, or to the version written in `axx-packs.yaml`, and prepares Axx again.
