> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vers.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Concepts

> The vocabulary you need to read the rest of the docs.

Four small concepts explain everything else in Vers. Start here if the CLI reference feels like a list of unrelated commands — after these four pages it won't.

<CardGroup cols={2}>
  <Card title="VMs" icon="microchip" href="/concepts/vms">
    The unit of compute. Branchable, forkable, states and resources.
  </Card>

  <Card title="Commits" icon="camera" href="/concepts/commits">
    Immutable snapshots. Content-addressable, restorable anywhere.
  </Card>

  <Card title="HEAD and aliases" icon="crosshairs" href="/concepts/head-and-aliases">
    How commands know which VM you mean when you don't say.
  </Card>

  <Card title="Dockerfile support" icon="hammer" href="/concepts/dockerfile">
    How `vers build` turns a Dockerfile into a commit.
  </Card>

  <Card title="Repositories and Tags" icon="folder-tree" href="/repositories">
    Named scopes for commits — versioning, publishing, and forking.
  </Card>
</CardGroup>

## The shape of Vers in one page

Vers gives you three primitives and one rule.

| Primitive  | What it is                                                                                              |
| ---------- | ------------------------------------------------------------------------------------------------------- |
| **VM**     | A running Firecracker microVM. Has an ID, a state (Running, Paused…), and a parent.                     |
| **Commit** | An immutable snapshot of a VM's filesystem + memory. Content-addressable by id.                         |
| **Branch** | A new VM made from a parent VM (or a commit). It inherits the exact state, including running processes. |

The rule: **every VM is either rooted (`vers run`) or branched from another VM or a commit.** That's the tree. The CLI's job is to let you move around it — create nodes (`run`, `branch`), freeze nodes (`commit`), navigate between them (`checkout`), throw nodes away (`kill`).

Everything else — tags, repos, aliases, env vars, Dockerfile builds — is ergonomics layered on top.

## What's the difference between a commit and a branch?

Easy to conflate, worth pinning down.

* A **commit** is a frozen *state* with an id. It doesn't run. It exists forever (until you delete it). You can create N VMs from the same commit and they'll all start identical.
* A **branch** is a new running *VM*. It was created from either a live VM (pausing it briefly to capture state) or a commit. Once it's running, it's independent of its parent — no shared memory, no linked disk, changes on either side don't touch the other.

Analogy: a commit is a git commit, a branch is a running clone of your working tree. Except here the "working tree" is a full Linux VM including in-memory state.

## Next steps

* If you're new: jump to [What is Vers?](/overview) for the narrative intro.
* If you know Vers and want to look something up: the [CLI reference](/cli-reference/overview) is exhaustive.
* If you're building a specific thing: the [Examples](/examples/static-web-app) show end-to-end flows.
