---
title: Create a repo
description: Create a private repo for the workspace by purpose, optionally from a template.
cli_command: "wiblo repos create [name] --purpose <purpose>"
canonical_url: https://wiblo.app/docs/developers/cli/repos/repos-create
last_updated: 2026-10-11T19:02:53+02:00
md_url: https://wiblo.app/docs/developers/cli/repos/repos-create.md
---

# Create a repo

`$ wiblo repos create [name] --purpose <purpose>`

## Usage

```bash
wiblo repos create --purpose base
wiblo repos create "Main site" --purpose site
wiblo repos create "Bookings site" --purpose site --template starter-site
wiblo repos create "Main site" --purpose site --slug driftwood-physio --region cpt1
wiblo repos create "Scripts" --purpose other
```

```text
$ wiblo repos create "Main site" --purpose site
> Created Main site (site, 52ff2008-840d-4581-8b3f-df1ae5b4c9e4) from the starter-site template.
> Clone it with wiblo repos clone --only "Main site", or the whole workspace with wiblo repos clone.
> Live at https://driftwoodphysio.vercel.app
```

## Arguments and flags

<table>
  <thead>
    <tr><th></th><th>Description</th></tr>
  </thead>
  <tbody>
    <tr><td><code>name</code> (argument)</td><td>The repo's display name, 1 to 60 characters starting with a letter or number. Required for every purpose except <code>base</code>, whose name is always "Base".</td></tr>
    <tr><td><code>--purpose</code></td><td>Required. <code>base</code>, <code>site</code>, <code>app</code>, or <code>other</code>. Decides the template rule below.</td></tr>
    <tr><td><code>--template</code></td><td>A template slug of the same purpose (see <a href="/docs/developers/cli/repos/repos-templates">templates</a>). <code>base</code> and <code>site</code> have a default, so you may omit it. <code>app</code> and <code>other</code> start empty without it.</td></tr>
    <tr><td><code>--slug</code></td><td>Site only. The website's public name, which is also its address: the slug <code>driftwoodphysio</code> gives <code>https://driftwoodphysio.vercel.app</code>. Lowercase letters, digits, and hyphens between words (never three in a row), 3 to 63 characters. Without it the slug is the workspace name in lowercase letters and digits, with <code>-2</code> and up when that name is taken. A slug that breaks the rule answers <code>slug_invalid</code>, a reserved name answers <code>slug_reserved</code>, and a slug another site holds answers <code>slug_taken</code>.</td></tr>
    <tr><td><code>--region</code></td><td>Site only. Where the website's server code runs: <code>iad1</code> (Washington, D.C., the default), <code>sfo1</code> (San Francisco), <code>cpt1</code> (Cape Town), <code>syd1</code> (Sydney), or <code>lhr1</code> (London). Any other value answers <code>region_invalid</code>.</td></tr>
    <tr><td><code>--no-wait</code></td><td>Site only. Return once the first build starts, without waiting for the website to go live. The output then gives the address and says version 1 is building.</td></tr>
    <tr><td><code>--workspace</code></td><td>Workspace slug or id. Defaults to <code>WIBLO_WORKSPACE</code>, then the active workspace.</td></tr>
    <tr><td><code>--json</code></td><td>Print the envelope: <code>repo_created</code> with the repo (<code>id</code>, <code>purpose</code>, <code>template_slug</code>, <code>clone_url</code>) and the clone commands in <code>next[]</code>. For a site it also carries <code>site</code> (<code>slug</code>, <code>region</code>, <code>live_url</code>) and, after the wait, <code>live</code>, which is <code>true</code> once version 1 is live.</td></tr>
  </tbody>
</table>

## The purpose decides the template

<table>
  <thead>
    <tr><th>Purpose</th><th>Template</th><th>Without <code>--template</code></th><th>Per workspace</th></tr>
  </thead>
  <tbody>
    <tr><td><code>base</code></td><td>Always the base template</td><td>The base template</td><td>One. A second create answers <code>base_repo_exists</code>.</td></tr>
    <tr><td><code>site</code></td><td>Any site template</td><td>The default, <code>starter-site</code></td><td>Many</td></tr>
    <tr><td><code>app</code></td><td>Optional</td><td>An empty repository</td><td>Many</td></tr>
    <tr><td><code>other</code></td><td>Optional</td><td>An empty repository</td><td>Many</td></tr>
  </tbody>
</table>

## Behaviour

- Creating needs an owner or admin (`admin_required` otherwise). Every member can clone and push.
- A display name a live repo already holds, in any case, answers `repo_name_taken`.
- A template the catalog lacks, or one of another purpose, answers `template_not_found` before any request is made.
- Without `--purpose` the command does not guess: `missing_arguments` lists the four purposes and one ready command for each.
- `--slug` or `--region` on any purpose but `site` answers `validation_failed` before any request is made.
- A `site` repo also gets its website: an address, and version 1. A version is one build of the site at one commit, and version 1 is the build of the repo's first commit. It goes live at the address.
- In a terminal a spinner counts the seconds until version 1 is live. An agent, or any run with `--json`, waits ninety seconds at most, and `--no-wait` returns once the first build starts. The repo exists either way, and the command exits 0.
- The repository is created under Wiblo's GitHub organisation and is ready in a few seconds. Clone it with [`wiblo repos clone`](/docs/developers/cli/repos/repos-clone).
