# Your workspace's CI box

> What the machine that runs your repos' CI comes with, how to request it in a workflow and when to use the large one (8g).

URL: https://www.ghosty.studio/en/docs/factory/ci-box

Your workspace has its own machines for its repos' CI. Every job runs on a **fresh box** that is
deleted when it finishes: nothing carries over from the previous job and your secrets don't stay on it.

## How to request it

In the workflow, replace `ubuntu-latest` with your workspace label:

```yaml
jobs:
  test:
    runs-on: [self-hosted, ws-<your-workspace>]
```

"Prepare repo" already writes the CI with that label. Jobs left on `ubuntu-latest` keep running on
GitHub, using your GitHub minutes.

## What it comes with

It's built so a workflow written for `ubuntu-latest` runs unchanged:

- **Ubuntu 24.04** with passwordless `sudo`: `sudo apt-get install …` works.
- **Docker** with Buildx and Compose: `services:` (Postgres, Redis, MySQL…), `container:`,
  `docker build` and `docker compose up`.
- **Node 22** with pnpm and yarn (corepack), **Python 3**, a C/C++ compiler and `mise` for other
  versions. `actions/setup-node`, `setup-python` and friends work as on GitHub.
- **Playwright** with its system dependencies and Chromium.
- **Postgres, Redis, MySQL and SQLite** installed and stopped: `sudo systemctl start postgresql`
  if you'd rather not use `services:`.
- 4 vCPUs, 4 GB of RAM and 24 GB of disk.

## Cache and downloads

With no setup:

- `actions/cache`, the `cache:` option of `setup-node` and `setup-python`, and Buildx
  `cache-to: type=gha` store into a cache **next to the box**, not on GitHub. Each repo and branch
  only sees its own entries, with the same rules as GitHub's cache.
- Docker Hub images (`postgres:16`, `node:22`…) are pulled from a local mirror.

## The large box: `8g`

When a job combines Docker, a database and browsers, 4 GB may not be enough. Add `8g`:

```yaml
    runs-on: [self-hosted, ws-<your-workspace>, 8g]
```

It has 8 vCPUs and 8 GB, and takes **two CI slots** of your plan (if your plan has one, it takes all
of it while it runs).

## How many jobs at once

As many as your plan's CI slots (F1: 1, F2: 2, F3: 3). The rest wait in GitHub's queue and start on
their own when a slot frees up.
