# Build with a baseline OS

Choose a Debian or Ubuntu baseline and build a package bundle without capturing a snapshot.

Source: https://debark.dev/docs/get-started/no-target-machine

---
A **baseline OS** describes a stock Debian or Ubuntu installation: its release, installation
variant, and architecture. Choose one on the online computer to build without taking a snapshot
of the offline machine.

Use a baseline when you know the target’s standard installation or cannot access it yet.
A snapshot is more accurate for a customized machine because it records its actual packages
and apt settings.

## Choose a baseline

Use the [baseline OS list](/docs/get-started/supported-systems#baseline-os-list) to find exact
IDs for each release and variant, and the [architecture table](/docs/get-started/supported-systems#target-architecture)
to choose the value for `--arch`.

List the choices in your installed CLI:

```bash
debark snapshot list-bases
```

The built-in releases are Debian 12 and 13, and Ubuntu 22.04, 24.04, and 26.04. Each has three variants:

| Variant   | What it assumes is already installed                 |
| --------- | ---------------------------------------------------- |
| `minimal` | The base system and apt.                             |
| `server`  | The base system and a standard server package set.   |
| `desktop` | The base system and the default desktop environment. |

An ID combines the distribution, release, and variant: `ubuntu:24.04/minimal`.
Omitting the variant selects `minimal`.

These choices describe the target; they do not install an operating system. Choose the variant
that matches the machine. A desktop baseline on a minimal machine can leave needed packages
out of the bundle.

Use `--arch amd64` or `--arch arm64` to select the target architecture. If you can access
the target, `dpkg --print-architecture` reports it. Without `--arch`, the CLI uses the
builder’s architecture.

## Build on the online computer

You need the [CLI](/docs/get-started/installation) and a working [build backend](/docs/concepts/backends).
Create a signing key once, or reuse an existing one:

```bash
debark keygen --out operator.key
```

For example, prepare `jq` for Ubuntu 24.04 minimal on amd64:

```bash
debark build --base ubuntu:24.04/minimal --arch amd64 \
  --out ./bundle --sign operator.key jq
```

No target snapshot file is needed. Debark uses the baseline’s package assumptions to work out
the downloads, then creates an ordinary package bundle.

Use either `--base` or `--snapshot`, never both. You can also use package lists, vendor
.deb files, and the other [build options](/docs/guides/building-a-bundle).

## Choose through interactive prompts

If you prefer questions to flags:

```bash
debark build --interactive
```

When asked whether you have a target snapshot, answer no. Choose the distribution, release,
variant, and architecture, then enter your packages and build options.

The [interactive CLI guide](/docs/get-started/interactive) explains the prompts and saved package list.

## Save a baseline for reuse

You can optionally save the generated baseline as a snapshot file:

```bash
debark snapshot from-base ubuntu:24.04/minimal \
  --arch amd64 --out base.tar.zst
```

Then pass `--snapshot base.tar.zst` in later builds. It still describes an assumed baseline,
not a captured machine. This extra step is not needed for `build --base`.

To choose and save a baseline through prompts, run:

```bash
debark snapshot from-base --interactive
```

## Check the bundle on the target

Follow the [quickstart](/docs/get-started/quickstart#3-transfer-the-bundle-and-public-key) to
transfer the bundle and provide the public key separately. Preview the installation:

```bash
debark install ./bundle --key operator.pub --status
```

The report compares the baseline’s assumptions with the real machine and warns if assumed
packages are missing. Review those warnings before installing. If the baseline does not
fit, capture a snapshot of the target and rebuild.

Baseline builds have less end-to-end testing than builds from captured snapshots.

<NextSteps
  items={[
    {
      title: 'Use the interactive CLI',
      href: '/docs/get-started/interactive',
      description: 'Choose the target and packages through prompts.',
    },
    {
      title: 'Snapshots',
      href: '/docs/concepts/snapshots',
      description: 'Use the actual package state of a customized machine.',
    },
  ]}
/>
