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

# Quickstart

> From nothing to a running install with your first page.

## What you need

<CardGroup cols={2}>
  <Card title="A machine and a hostname" icon="server">
    One small box. The app listens on plain HTTP and expects something in front of it for TLS.
  </Card>

  <Card title="An OpenRouter key" icon="key">
    Every model call runs through it. A plain inference key, not a provisioning key.
  </Card>

  <Card title="A Vercel Sandbox" icon="box">
    Token, team id and project id. Gus runs its harness there and nowhere else.
  </Card>

  <Card title="Nothing else" icon="database">
    No Postgres to install, no Redis, no object store. All optional, all configured later.
  </Card>
</CardGroup>

## 1. Start it

<CodeGroup>
  ```sh Docker theme={null}
  docker run -d --name craftspace \
    -p 8080:8080 \
    -v craftspace-data:/data \
    -e CRAFTSPACE_URL=https://craftspace.example.com \
    ghcr.io/abuaboud/craftspace:latest
  ```

  ```sh Binary theme={null}
  curl -fsSL -o craftspace \
    https://github.com/abuaboud/craftspace/releases/latest/download/craftspace-linux-x64
  chmod +x craftspace
  CRAFTSPACE_URL=https://craftspace.example.com ./craftspace supervise
  ```

  ```sh From source theme={null}
  git clone https://github.com/abuaboud/craftspace.git
  cd craftspace
  npm install
  npm run dev
  ```
</CodeGroup>

<Info>
  `CRAFTSPACE_URL` is the address people will reach this install on. Every other origin derives from it, so
  on a single domain it is the only one you have to set. Set it before anyone signs in: it is what OAuth
  callbacks, invite links and the MCP endpoint are all built from.
</Info>

## 2. Create the first account

Open the install and sign in. The first account to arrive becomes the **install owner**, which is the only
account that can change server settings.

<Frame caption="With no mail provider configured, the sign-in code goes to the server log and the screen says so.">
  <img src="https://mintcdn.com/craftspace/SiaoGlGo-jgJemnj/images/sign-in.png?fit=max&auto=format&n=SiaoGlGo-jgJemnj&q=85&s=da022ca273423b0d79f523ba3b7d322a" alt="The Craftspace sign-in screen" width="2880" height="1800" data-path="images/sign-in.png" />
</Frame>

<Warning>
  This is first-come and there is no screen to hand it over. On a box that is already reachable from the
  internet, create your own account before you tell anyone the URL.
</Warning>

## 3. Give it a model

Settings, then the server settings screen. Everything this server runs on is on one page, and the two
under **Gus's runtime** are the ones that are not optional.

<Frame caption="Server settings on a fresh install. Gus stays unconfigured until both runtime cards are set up.">
  <img src="https://mintcdn.com/craftspace/SiaoGlGo-jgJemnj/images/server-settings.png?fit=max&auto=format&n=SiaoGlGo-jgJemnj&q=85&s=178498b9b1608c8179ef818a2b85e324" alt="The server settings screen, listing OpenRouter and Vercel Sandbox as not set up" width="2880" height="1800" data-path="images/server-settings.png" />
</Frame>

Paste an OpenRouter API key.

Mint a plain key at [openrouter.ai/settings/keys](https://openrouter.ai/settings/keys). A *provisioning*
or *management* key looks valid and then fails on every answer, so the check refuses one on purpose. Leave
the per-team cap blank, or set it to `0`, unless you actually want a ceiling.

## 4. Give it a sandbox

On the same screen, add the Vercel Sandbox token, team id and project id. Until both this and the model
key are set, Gus will tell you it is unconfigured rather than half-working.

## 5. Write something, then read it from an agent

Make a page. Then [point an agent at your MCP endpoint](/agents/mcp) and ask it something only that page
knows. That round trip is the whole product, and it is worth doing on day one.
