---
title: Choose a Geistdocs package
description: Choose between the public Geistdocs package and Vercel's private Geistcn-backed package
type: guide
summary: Use the public package by default and the private package only where restricted Vercel npm dependencies are already available.
url: /docs/packages
source: apps/template/content/docs/packages.mdx
related:
  - /docs/getting-started
  - /docs/deployment
  - /docs/migration
---

# Choose a Geistdocs package

Geistdocs ships as two packages built from the same runtime and template. They expose the same API and intentionally share the same visual design, layout, interactions, and product behavior. A site should look and work the same with either package; only the underlying primitive and asset provider differs.

> Note:
  `@vercel/geistdocs-private` uses restricted Geistcn components and assets
  intended only for internal, non-OSS applications. Vercel-owned OSS
  repositories and projects with external contributors must use
  `@vercel/geistdocs`. Do not expose the private package, its dependencies,
  credentials, or downloaded assets outside authorized internal environments.

| Package | Access | UI provider | Recommended use |
| --- | --- | --- | --- |
| `@vercel/geistdocs` | Public | Package-owned public primitives and vendored assets | Open-source repositories, external contributors, and all projects without private Vercel npm access |
| `@vercel/geistdocs-private` | Private; restricted access | Restricted `@vercel/geistcn` components and `@vercel/geistcn-assets`; requires authenticated access to Vercel's private npm registry | Internal environments such as `front`; never public repositories or projects requiring external contributor access |

## Use the public package by default

Create a public Geistdocs project with:

```bash title="Terminal"
pnpm dlx @vercel/geistdocs@latest init --name my-docs
```

The generated project has no dependency or peer dependency on `@vercel/geistcn` or `@vercel/geistcn-assets`. Contributors can install it using normal public npm access.

## Use the private package inside Vercel

Create the private variant with:

```bash title="Terminal"
pnpm dlx @vercel/geistdocs-private@latest init --name my-docs
```

The private initializer asks whether the generated template will be used in a public repository. Answer **Yes** to generate the public `@vercel/geistdocs` variant without restricted dependencies. Answer **No** to keep `@vercel/geistdocs-private`.

The generated private template installs `@vercel/geistcn` and `@vercel/geistcn-assets` directly. Both local development and deployment must be authenticated to Vercel's private npm registry. This makes it suitable only for internal environments such as `front`, where that access already exists and remains limited to authorized Vercel users.

Do not use the private package in a public repository or provide its registry access to external contributors. Use the public package whenever anyone outside Vercel needs to install, build, or contribute to the project—even if the site itself is deployed on Vercel.

## Keep package identities consistent

The CLI writes the package that initialized the project into every generated import and dependency. Keep one Geistdocs package throughout the app and update it with that package's CLI. Do not install both variants or combine imports from them.

Switching variants should require only changing package identity and provider-specific dependency metadata. Application content, configuration, route adapters, and Geistdocs APIs remain the same.
