system/credentials.md
Restoring credentials on a fresh Mac?
bin/ecosystem-builddoes this automatically: it pullsRAILS_MASTER_KEYand other env vars fromheroku configandSOLANA_ADMIN_KEYfrom 1Password (agent.alex.solana), then writes.envfor both Rails apps. See house-burn-down.md. This doc is legacy system context while the neutral modules indocs/agents/modules/become canonical.
All sensitive credentials are stored as environment variables, never in code.
DATABASE_URL — PostgreSQL connection string (production only)GOOGLE_CLIENT_ID — Google OAuth client IDGOOGLE_CLIENT_SECRET — Google OAuth client secretRAILS_MASTER_KEY — Rails encrypted credentials keySOLANA_ADMIN_KEY — Alex Bot's Solana private key (base58), used by Turf Monster for onchain operationsANTHROPIC_API_KEY — Claude API key for AI chat (McRitchie Studio)X_BEARER_TOKEN — X (Twitter) API bearer token for News intake (McRitchie Studio). See docs/agents/system/news-pipeline.md for setup.mcritchie_studio_development (local PostgreSQL, no password)alex@mcritchie.studio; sign in by magic link in normal local development.All agents share a primary Gmail account and have individual forwarding addresses on the mcritchie.studio domain.
bot@mcritchie.studio — shared Gmail account used by all agentsalex@mcritchie.studio 1Password accountEach agent has a dedicated email that forwards to the shared bot@mcritchie.studio inbox:
| Agent | Purpose | |
|---|---|---|
| Alex | admin@mcritchie.studio |
Orchestrator, admin notifications |
| Avi | avi@mcritchie.studio |
Product Owner — PR review, release sign-off, ticket grooming |
| Carl | carl@mcritchie.studio |
Dev Backend Expert — Rails, ActiveRecord, jobs |
| Shannon | shannon@mcritchie.studio |
Dev UI Expert — frontend, Tailwind, Alpine, theme |
| Jasper | jasper@mcritchie.studio |
Dev Blockchain Expert — turf-vault, solana-studio, Phantom |
| Steffon | steffon@mcritchie.studio |
Infrastructure Expert — Heroku, deploys, CI, OPSEC |
| Turf Monster | turf@mcritchie.studio |
Sports data, Turf Monster app notifications |
| Mack | mack@mcritchie.studio |
Worker agent comms — scraping, processing, bulk ops |
| Mason | mason@mcritchie.studio |
Marketing — brand voice, launch comms, social, funnels (was Infrastructure pre 2026-05-23 — see mission.md) |
The 5 new agents (Avi/Carl/Shannon/Jasper/Steffon) were added 2026-05-23 alongside Mason's pivot from Infrastructure to Marketing. Forwarding addresses still need to be created on the
mcritchie.studiodomain — operator action — but the persona definitions live atdocs/agents/agents/<slug>/.
Each agent has a dedicated Solana wallet on devnet. Credentials stored in 1Password.
| Agent | Address | Role |
|---|---|---|
| Alex Bot | 8K81w4e6UcB7TiANhM9N8sAgijJvTxxybRi8AENRaRYd |
Rotated vault admin (signs routine onchain ops) |
| Alex Human | 7ZDJp7FUHhuceAqcW9CHe81hCiaMTjgWAXfprBM59Tcr |
Backup vault admin (recovery only) |
| Mason | CytJS23p1zCM2wvUUngiDePtbMB484ebD7bK4nDqWjrR |
Agent wallet |
| Mack | foUuRyeibadQoGdKXZ9pBGDqmkb1jY1jYsu8dZ29nds |
Agent wallet |
| Turf Monster | BLSBw8fXHzZc5pbaYCKMpMSsrtXBTbWXpUPVzMrXx9oo |
Agent wallet |
Wallet credentials are stored in the alex@mcritchie.studio 1Password account. Use the CLI to retrieve them programmatically.
There are two access modes — agent sessions use the service account, humans use the desktop-app integration:
Claude/agent sessions are already authenticated: a 1Password service account token lives in ~/.zprofile (OP_SERVICE_ACCOUNT_TOKEN, installed by mcritchie-studio/bin/setup-1pass-token), and agent shells initialize from the profile. Verify with /opt/homebrew/bin/op whoami (expect User Type: SERVICE_ACCOUNT). No --account flag, no biometric prompt, no token-sourcing preamble needed.
agent.* naming convention, or product items like Coinbase Developer Platform)./opt/homebrew/bin/op read|item|vault …. The session permission allow-rules match these full-path prefixes. Prefixing commands with eval/export token-sourcing, or running broad vault scans/listing hunts, trips the permission classifier as "credential exploration" and gets blocked.op item get --format json on items with secret fields — it dumps the secret into the session transcript.Worked example (CDP key → turf-monster .env):
bash
cd ~/projects/turf-monster && bin/setup-cdp-key # no args → reads the key from 1Password (op://agents/Coinbase Developer Platform) → writes .env, never echoes the secret
bin/setup-cdp-key defaults to a 1Password pull (PR #144); --clipboard (full JSON blob) and bin/setup-cdp-key <key-id> (secret in clipboard) remain as first-time/fallback modes.
.claude/settings*.json to self-grant access. Targeted reads of operator-named items via the allowed full-path commands are the sanctioned path. (Codified 2026-06-09 after the CDP key retrieval hit both walls.)Prerequisites: Install brew install 1password-cli, then enable "Integrate with 1Password CLI" in 1Password desktop app (Settings > Developer).
Account ID: MWOV5OT5BRHATI4EGMN26C5DPA
Vault layout:
- agents — All agent wallet credentials (renamed from "🦞 Bots" 2026-05-03)
- 🧱 Blockchain — General blockchain credentials
Retrieve a wallet's private key (items renamed 2026-05-03 to agent.* convention):
```bash
op item get "agent.alex.solana" --vault "agents" --account MWOV5OT5BRHATI4EGMN26C5DPA --fields "private key"
op item get "agent.mason.solana" --vault "agents" --account MWOV5OT5BRHATI4EGMN26C5DPA --fields "private key"
op item get "agent.mack.solana" --vault "agents" --account MWOV5OT5BRHATI4EGMN26C5DPA --fields "private key"
op item get "agent.turf.solana" --vault "agents" --account MWOV5OT5BRHATI4EGMN26C5DPA --fields "private key"
```
Set as env var (one-liner):
bash
export SOLANA_ADMIN_KEY=$(op item get "agent.alex.solana" --vault "agents" --account MWOV5OT5BRHATI4EGMN26C5DPA --fields "private key")
Item fields: Each wallet entry contains recovery phrase, private key (base58), and wallet address (base58 public key).
Alex Bot is the primary admin for routine TurfVault operations. Alex Human is the backup/admin cosigner. Current program IDs and signer set live in turf-vault/docs/CURRENT_DEPLOYMENT.md. The SOLANA_ADMIN_KEY env var in Turf Monster's .env holds the Alex Bot private key from agent.alex.solana.
.env files or credential fileshas_secure_passwordagents vault only) — credentials are never cached in plaintext either way.env files (gitignored), never in code or commitsWe emailed a one-tap sign-in link to . It expires shortly and can only be used once.
No email? Check spam, or close this and try again.