Configuration
Catalyst uses a two-layer configuration system that keeps secrets out of git while allowing project metadata to be shared with your team.
Layer 1: Project Config
Section titled “Layer 1: Project Config”Location: .claude/config.json (in your project root — safe to commit)
This file contains non-sensitive project metadata:
{ "catalyst": { "projectKey": "acme", "repository": { "org": "acme-corp", "name": "api" }, "project": { "ticketPrefix": "ACME", "name": "Acme Corp Project" }, "thoughts": { "user": null } }}Key fields:
catalyst.projectKey— Links to your secrets config filecatalyst.project.ticketPrefix— Your Linear/project ticket prefix (e.g., “ENG”, “PROJ”)- Project name and repository metadata
Layer 2: Secrets Config
Section titled “Layer 2: Secrets Config”Location: ~/.config/catalyst/config-{projectKey}.json (never committed)
This file contains API tokens and secrets:
{ "catalyst": { "linear": { "apiToken": "lin_api_...", "teamKey": "ACME", "defaultTeam": "ACME" }, "sentry": { "org": "acme-corp", "project": "acme-web", "authToken": "sntrys_..." }, "railway": { "token": "...", "projectId": "..." }, "posthog": { "apiKey": "...", "projectId": "..." }, "exa": { "apiKey": "..." } }}The unified setup script handles both layers:
curl -fsSL https://raw.githubusercontent.com/coalesce-labs/catalyst/main/setup-catalyst.sh | bashYou’ll be asked for:
- Project location (existing repo or clone fresh)
- Project key (defaults to GitHub org name)
- Ticket prefix (e.g., “ENG”, “PROJ”)
- Your name (for the thoughts system)
- API tokens for integrations (optional ones can be skipped)
The script is idempotent — safe to re-run to add or update integrations.
Thoughts System Setup
Section titled “Thoughts System Setup”The thoughts system provides git-backed persistent context across sessions.
The setup script handles this automatically, but for manual setup:
cd /path/to/your-projecthumanlayer thoughts init
# Or with a specific profilehumanlayer thoughts init --profile coalesce-labsThe resulting directory structure:
<org_root>/├── thoughts/ # Shared by all org projects│ ├── repos/│ │ ├── project-a/│ │ │ ├── {your_name}/│ │ │ └── shared/│ │ └── project-b/│ └── global/├── project-a/│ └── thoughts/ # Symlinks to ../thoughts/repos/project-a/└── project-b/ └── thoughts/ # Symlinks to ../thoughts/repos/project-b/Syncing Thoughts
Section titled “Syncing Thoughts”humanlayer thoughts synchumanlayer thoughts statushumanlayer thoughts sync -m "Updated research on feature X"Backing Up to GitHub
Section titled “Backing Up to GitHub”cd <org_root>/thoughtsgh repo create my-thoughts --private --source=. --pushSwitching Between Projects
Section titled “Switching Between Projects”Change the projectKey in .claude/config.json:
{ "catalyst": { "projectKey": "work" }}Each project key maps to a different secrets file in ~/.config/catalyst/.
Troubleshooting
Section titled “Troubleshooting”Config not being read
Section titled “Config not being read”- File exists:
ls .claude/config.json - Valid JSON:
cat .claude/config.json | jq - Correct location: must be in the
.claude/directory - Secrets file exists:
ls ~/.config/catalyst/config-{projectKey}.json
Thoughts not syncing
Section titled “Thoughts not syncing”humanlayer thoughts statushumanlayer thoughts init # Re-initialize if needed