Project Registry
Overdeck’s project registry enables multi-project management with intelligent issue routing and label-based workspace creation.Overview
Projects are registered in~/.overdeck/projects.yaml. Each project can have:
- Issue routing rules - Route issues to different subdirectories based on labels
- Custom workspace commands - For complex polyrepo setups
- Linear team mapping - Connect projects to Linear teams
projects.yaml is the source of truth, much of this configuration is also surfaced in the dashboard’s Settings page, alongside model routing for the agents and conversations Overdeck runs and tracker API keys.
Overdeck manages both the workflow pipeline and the agents and conversations
that move issues through it. The Settings page is where model routing for those
agents lives, while per-project routing and workspace rules below are edited in
~/.overdeck/projects.yaml.Registering Projects
Clone a repository
Clone a repository directly into Overdeck:owner/repo shorthand is expanded, into a GitHub HTTPS URL.
Optional flags: --parent <dir> (default ~/Projects), --name <name>,
--issue-prefix <PREFIX>, and --dry-run.
--dry-run prints the resolved intent as a single JSON document and writes
nothing — no directory, no registration, no context layer, no hooks. Credentials
embedded in a URL are redacted from that output.
Credentials live on the server. Clones run non-interactively
(GIT_TERMINAL_PROMPT=0, ssh -o BatchMode=yes), so nothing can hang waiting on
a prompt nobody can see. A private repository therefore needs credentials
already available on the machine running Overdeck — an SSH key loaded into that
machine’s agent, or a configured credential helper. When they are missing you
get a typed message naming the problem, and it never suggests ssh-add for an
HTTPS failure.
Cancelling. Press Ctrl-C (or use Cancel in the dashboard) and the clone
child is stopped for real: SIGTERM first, SIGKILL if it has not exited five
seconds later. The command exits 130 once cleanup has settled. A directory the
clone created is removed; a directory that already existed is never touched.
Unknown hosts clone fine. You get a usable folder name and no guessed
tracker configuration, since there is no provider to infer one from.
Add existing
Register a repository that already exists on your machine:github_repo/gitlab_repo— the remote slugtracker— GitHub or GitLab, from the remote hostworkspace.default_branch— the repository’s default branch, or nothing at all when the repository is detached or has no commits yet (a guessedmainwould point every later workspace at a branch that may not exist). The diff panel’s “vs main” view compares against this branch, so a project onmasterortrunkstill gets a correct “vs main” view.issue_prefix— proposed from the project key, up to ten characters- The main workspace row
ℹ Using the repository root /home/you/code/app. This keeps two
projects from fighting over one checkout. A name you pass with --name is kept;
otherwise the name comes from the root folder. A home directory that is itself a
repository (a dotfiles-managed ~) is the one exception: folders under it stay
plain folders. A linked worktree is recognized as a repository. A plain folder
that is not a repository at all is fine — it registers as a project without one.
workspaces/ is excluded through <project>/.git/info/exclude, which is local
and untracked. Overdeck never edits your tracked .gitignore, so a freshly
cloned repository does not come back dirty. If you want the exclusion shared
with your team, add it to .gitignore yourself.
Tests and quality gates are not detected. Configure those yourself — see
Project Configuration.
Finish an interrupted setup
If creation stops after the project was registered — say the main workspace could not be created — the repository is on disk and the project exists. Repair it instead of cloning again:--path is
a consistency check, not a relocation — a mismatch refuses rather than repairing
the wrong project.
Dashboard
The sidebar+, the command palette, the workspace-page chips, and the
HomePage button open the Add a project dialog over the page you are on.
/projects/new still works and shows the same dialog as a full page;
?mode=clone, ?mode=existing or ?mode=new skips the first step.
The first step focuses Open a folder; the arrow keys move between the
choices and Enter picks one.
- Open a folder — type a path or browse the server’s folders, starting in
~/Projects. What happens next depends on what the folder is:- A Git repository — review it and add it. A folder inside a repository adds the repository root, with the note “Using the repository root ~/code/app.”
- A folder with repositories in it — the dialog lists the repositories it
found, all checked. Add N projects adds each checked one as its own
project; a failure on one row does not stop the rest. Add this folder as
one project adds a single multi-repo project spanning the checked
repositories: it registers
workspace.type: polyrepowith oneworkspace.reposentry per repository and keeps.pan/in the first one (pan_records.repo). No tracker is set, since several remotes do not name one; add it yourself. See Polyrepo Configuration. - A plain folder — the dialog explains that agents and terminals work there but branches, isolated copies and pull requests won’t, and offers Add as folder or Back.
- Clone from URL — download a Git repository. Press Enter to clone once the URL checks out.
- Create new project — start an empty Git repository. Press Enter to create once the name checks out.
~ and ~/sub expand against the server’s home,
since the browser has no idea what they mean on the machine holding the files.
Name and issue prefix live under Options, already filled in; anything you type
there survives a change to the URL or folder.
While a clone runs, the form is frozen and shows git’s own phases. Cancel stops
the real process. If the connection drops, the page says so and keeps the
operation rather than pretending it finished — it never re-enables Create on a
result it has not seen. After a server restart an in-flight clone genuinely
cannot be resolved from memory, so you are offered Check again rather than an
automatic retry that might clone a second copy.
Project or workspace?
A project is a repository with its own issues and pipeline. Use projects to register separate codebases. If you already have a project registered and want another checkout of it (e.g., for a feature branch, a long-lived testing branch, or a release branch), create a workspace instead. Workspaces share the same project registry entry and codebase but isolate development state per branch.Rename and list
Rename a project
Project Configuration
Projects are defined in~/.overdeck/projects.yaml:
Configuration Fields
*Not required if
issue_prefixes or issue_pattern is specified.
Separate the issue tracker from the code host
Thetracker field selects where issues and workflow states live. Code-host fields such as github_repo and gitlab_repo independently select where Overdeck reads pull requests or merge requests.
Set tracker explicitly whenever those systems differ. For example, this project tracks LEX-* issues in Linear while hosting its source code and pull requests on GitHub:
github_repo to force Linear routing, because that would also remove the project’s GitHub pull-request lens.
See Issue Tracker Integration for troubleshooting and additional examples.
Repositories a conversation can link pull requests from
A conversation can be linked to a pull request only when the PR’s repository is configured for the conversation’s project. The conversation’s project is its explicit project (set withpan conv move)
or else the registered project whose path contains its working directory.
These repositories count as configured:
github_repo(on the host of the project’s GitHuboriginremote, orgithub.com)gitlab_repo(on the host of the project’s GitLaboriginremote, orgitlab.com)- every
workspace.repos[].remotewritten as a URL, for polyrepo projects (a bare forge name such asremote: githubnames no repository) - the
originremote of the project checkout and of the conversation’s working directory
#42 refers to PR 42 in the first of these: github_repo, then gitlab_repo,
then the origin remotes. A link to any other repository is refused, and
nothing is stored.
Release Configuration
The optionalrelease: section tells Overdeck how to coordinate a project’s post-merge rollout across multiple components. Overdeck resolves a release plan, waits for each component to become healthy, runs verification commands, halts the plan on failure, and runs a rollback hook when one is configured.
Component fields
Release semantics
trigger: automeans Overdeck waits and verifies an external deploy; it does not invoke the provider deploy itself.- Components are released in
depends_onorder using a topological sort. A component is only started after its dependencies pass. - If any check fails, Overdeck stops all later components and records the final issue-level status.
- Projects without a
release:section are skipped cleanly — no failure is recorded.
Release status lifecycle
Issue-levelreleaseStatus moves through the following values:
pending → releasing → passedpending → releasing → failedpending → releasing → partialpending → releasing → rolled_backpending → skipped
The seven possible values are: pending, releasing, passed, failed, partial, rolled_back, and skipped.
Inspect or retry a release from the CLI with pan rollout:
pan rollout is distinct from pan release, which publishes npm stable/canary packages.
Gauntlet Lane Configuration
The optionalgauntlet: section sets per-project defaults for gauntlet lanes, the conversations that pan lane start launches for a gauntlet loop. Every field is optional.
Label-Based Routing
Issues are routed to different subdirectories based on their labels:- Labeled issues - Matched against
issue_routingrules in order - Default route - Issues without matching labels use the
default: truepath - Fallback - If no default, uses the project root path
/home/user/projects/myn/splash/workspaces/feature-min-xxx/.
Linear Project Mapping
If you have multiple Linear projects, configure which local directory each maps to. Create/edit~/.overdeck/project-mappings.json:
Custom Workspace Commands (Legacy)
Note: For most polyrepo projects, use the built-in workspace configuration (see Polyrepo Configuration) instead of custom scripts. Custom commands are only needed for highly specialized setups.
For projects that need logic beyond what the configuration supports, you can specify custom workspace scripts:
workspace_command is specified, Overdeck calls your script instead of creating a standard git worktree. The script receives the normalized issue ID (e.g., min-123) as an argument.
When workspace_remove_command is specified, Overdeck calls your script when deleting workspaces (e.g., aborting planning with “delete workspace” enabled). This is important for complex setups that need to:
- Stop Docker containers and remove volumes
- Clean up root-owned files created by containers
- Remove git worktrees from multiple repositories
- Release port assignments
- Remove DNS entries
- Creating git worktrees for multiple repositories (polyrepo structure)
- Setting up Docker Compose files and dev containers
- Configuring environment variables and
.envfiles - Setting up DNS entries for workspace-specific URLs (e.g., Traefik routing)
- Creating a
./devscript for container management - Copying agent configuration templates (CLAUDE.md, .mcp.json, etc.)
pan workspace create command will automatically detect and use your custom script.
Project Initialization
When registering a new project with Overdeck (pan project add), the system will:
- Check for existing PRD - Look for
docs/PRD.md,PRD.md,README.md, or similar - If found: Use it to create/update the canonical PRD format, prompting for any missing crucial information
- If not found: Generate one by:
- Analyzing the codebase structure
- Identifying key technologies and patterns
- Asking discovery questions about the product
Progressive Workspaces
For large projects with 10+ repositories, progressive workspaces provide on-demand repo checkout. Enable inworkspace config:
See Progressive Polyrepo for full documentation.
Related Guides
- Polyrepo Configuration - Multi-repository workspace setup
- Progressive Polyrepo - Large-scale polyrepo with on-demand checkout
- Setup Wizard - Interactive project configuration
- Meta Repos - Team conventions and onboarding kits
- Issue Tracker Integration - Connecting to Linear, GitHub, Rally, etc.
- Workspaces - Workspace management