Getting Started
This guide takes you from nothing to a running vignoble with a conductor.
Two deployment paths. The enterprise path (shared NATS cluster, cloud services) is described in full below. For a solo laptop install with no shared infrastructure, jump to Solo mode (laptop).
1
2
3
4
5
6
Install
Credentials
Create vignoble
Register vigne
Start daemon
Launch conductor- 1Install Pinard from a release bundle or source.
- 2Configure GitLab and NATS credentials.
- 3Scaffold the vignoble with
aoc init. - 4Register each repository as a vigne.
- 5Start the always-on daemon.
- 6Optionally enter the conductor control room.
Install
Pinard ships two ways.
Container images
Pre-built images are published to GitHub Container Registry on every release — no credentials needed to pull:
| Image | Contents |
|---|---|
ghcr.io/genentech/pinard | the agent/worker image — vendored Node/Pi runtime, aoc, and engram. Runs as régisseur, maître, or vendangeur (worker) depending on the args passed to pinard. |
ghcr.io/genentech/pinard-backend | k8s-hosted backend: webterm gateway + memory services + static docs site |
ghcr.io/genentech/pinard-webterm-gateway | standalone webterm gateway only |
docker pull ghcr.io/genentech/pinard:latest
docker pull ghcr.io/genentech/pinard-backend:latest
docker pull ghcr.io/genentech/pinard-webterm-gateway:latest
The pinard-backend and pinard-webterm-gateway images are for k8s-hosted backend
services; the pinard (agent/worker) image is for running a worker (or a
régisseur/maître) without a host install — e.g. on k8s or an HPC node. It bootstraps
credentials from PINARD_UNCORK_URL/PINARD_POUR_URL the same way the Singularity
(pinard-base.sif) build does. For a host install, use a release bundle or source
(below) instead.
From a release bundle (recommended)
A release is a single self-extracting .run archive (Linux/glibc x64). It bundles the
aoc binary, the launcher, the Pi extensions, and a vendored Node + Pi runtime — so the
host needs only the thin CLIs tmux git glab fzf, no Node/npm.
./pinard-linux-x64.run # installs to ~/.pinard, symlinks aoc/pinard into ~/.local/bin
From source
cd pinard/cmd/aoc && make install # builds + installs aoc to ~/.local/bin
./install # sets up config templates, permissions, pre-commit hook
Runtime requirements: ./install enforces Node ≥ 22.19.0 and Pi ≥ 0.80.6.
If nvm is available it activates the pinned Node (22 LTS) from .nvmrc automatically;
otherwise install Node 22 manually before running ./install. Node 22 LTS ships
native prebuilts for better-sqlite3, so no C++ compiler is needed on the host.
Set PINARD_NODE=/path/to/node to override which node binary is used when the nvm
default is too old; the launcher and daemon both respect this variable.
aoc is a static Go binary with zero runtime dependencies.
The engram CLI is installed (or upgraded/downgraded) to the same version the
cluster runs — pinned in .engram-version at the repo root. This keeps the local and
cloud engram in lockstep; a version drift can cause cloud sync to fail due to
mutation/chunk format mismatches. Re-running ./install after a cluster upgrade will
update your local engram CLI automatically.
Create a vignoble (interactive wizard)
The fastest path on a fresh machine is the interactive wizard. Run aoc init (or
pinard init) from any directory with no arguments and answer a few prompts:
$ aoc init
Welcome to Pinard! Let's create your first vignoble.
Vignoble name [myproject]:
Location
* 1) ~/vignoble-myproject
2) Use the current directory (/home/me/code)
Choice [1]:
Backend
* 1) Connect to a Git host (GitHub / GitLab)
2) Solo / local (no Git host — laptop-only)
Choice [1]:
Git provider
* 1) GitHub (github.com or GHES)
2) GitLab (self-hosted or gitlab.com)
Choice [1]:
Git host [github.com]:
GitHub org (optional):
Add a first repository now? [y/N]: y
Repository short name (e.g. my-app): my-api
Repository path (e.g. owner/my-app): myorg/my-api
Enable auto-merge? [y/N]:
The wizard:
- Scaffolds
~/vignoble-<name>(or the current directory) with all the required files. - Generates a
~/.config/pinard/credentials.yamltemplate if one does not exist — fill in theCHANGE_MEfields before starting the daemon. - Starts the daemon automatically.
Just press Enter to accept every default and you get a GitHub-backed vignoble at
~/vignoble-<name>. Run pinard from the vignoble directory to open the conductor.
Already have credentials? If
~/.config/pinard/credentials.yamlalready exists the wizard leaves it untouched.
Non-interactive (CI / scripts)
Passing all required flags bypasses the wizard entirely — safe for automation:
# GitLab
aoc init myproject --gitlab-host gitlab.example.com --gitlab-group mygroup
# GitHub (via pressoir block in vignes.yaml)
aoc init myproject --gitlab-host "" --path ~/vignoble-myproject
# Solo / local
aoc init myproject --local
Credentials
The wizard writes a template to ~/.config/pinard/credentials.yaml when none exists.
Fill in the CHANGE_ME fields and export the referenced env vars:
# GitHub-backed (template filled in by the wizard)
export PINARD_GITHUB_TOKEN="ghp_xxxxx"
export PINARD_NATS_PASSWORD="xxxxx"
echo 'export PINARD_GITHUB_TOKEN=...' >> ~/.config/pinard/env
echo 'export PINARD_NATS_PASSWORD=...' >> ~/.config/pinard/env
# GitLab-backed
export PINARD_GITLAB_TOKEN="glpat-xxxxx"
export PINARD_NATS_PASSWORD="xxxxx"
echo 'export PINARD_GITLAB_TOKEN=...' >> ~/.config/pinard/env
Secrets placed in ~/.config/pinard/env are sourced automatically by the launcher and
daemon. See Configuration for the full schema.
Register a vigne
The wizard can add a first repo during creation. To add more later:
aoc add vigne my-api --path ~/my-api --repo myorg/my-api
This appends an entry to vignes.yaml. Repeat for every repo. (Add --auto-merge only if
you want that vigne’s MRs merged automatically — it’s off by default; see
Configuration)
Run the daemon
The daemon is the always-on engine (MR/issue/schedule watchers, auto-spawn, dispatch):
aoc daemon start # self-daemonizes, logs to logs/aoc-daemon.log, PID in .state/daemon.pid
aoc daemon status # check it's alive
aoc daemon start/stop/restart/status manage the background process. It hot-reloads
itself when the aoc binary, vignes.yaml, or schedules.yaml change.
Launch the conductor
The conductor (régisseur) is an interactive Pi session that receives events, spawns agents, and lets you steer work conversationally:
cd ~/vignoble-myproject
pinard
Run pinard from anywhere (with no vignoble) to pick and attach to a running session via
fzf. The conductor is optional — the daemon does the mechanical work on its own — but it
gives you the LLM-powered control room.
Solo mode (laptop)
For a single-user laptop install with no shared NATS cluster or cloud services,
use aoc init --local. It writes a ~/.config/pinard/credentials.yaml pre-configured
for localhost endpoints (NATS on 4222, engram on 7437, SurrealDB on 8000,
webterm on 8080) and skips the --gitlab-host requirement.
1. Start the local service stack
Spin up the pinard-solo Docker image, which bundles NATS, engram, SurrealDB,
the memory services, and the webterm gateway under one supervisor:
docker run -d \
-v $(pwd)/pinard-data:/data \
-e SURREAL_PASS=changeme \
-e NATS_VIGNOBLE=myproject \
-p 4222:4222 -p 7437:7437 -p 8000:8000 -p 8080:8080 \
pinard-solo:latest
All persistent state (NATS JetStream store, engram database, SurrealDB) lives under
the mounted /data volume so restarts resume from the same state.
2. Scaffold the vignoble
aoc init myproject --local # no --gitlab-host required
# Optional: add GitLab details if you want issue/MR tracking
aoc init myproject --local --gitlab-host gitlab.com --gitlab-group mygroup
cd ~/vignoble-myproject
--local writes ~/.config/pinard/credentials.yaml with localhost endpoints. It does
not start the daemon — the daemon is started separately after services are up.
3. Set your LLM key and start the daemon
echo 'export ANTHROPIC_API_KEY=sk-ant-...' >> ~/.config/pinard/env
aoc daemon start
BYO LLM keys (ANTHROPIC_API_KEY, OPENAI_API_KEY) in ~/.config/pinard/env are
passed through to agents automatically — no proxy configuration needed.
To use OpenAI or DeepSeek natively (no Anthropic proxy), also set models.provider
in vignes.yaml. See Custom LLM provider for details.
4. Launch the conductor
cd ~/vignoble-myproject
pinard
macOS port overrides. If a native macOS Pinard services app is present, it writes
~/Library/Application Support/Pinard/config.jsonwith the ports it chose.aoc init --localreads this file automatically so the generatedcredentials.yamluses the same ports. You rarely need to set these manually.
Next steps
- Orchestration & Parcelles — how the régisseur, maîtres, and vendangeurs divide work.
- The SWE Process — drive work from GitLab issues.
- CLI Reference — the full
aocandpinardsurface.