A terminal that codes with you
Anthropic's official CLI. Open a terminal, type claude, and chat with Claude — except now Claude can read your files, run your build, edit code, run tests, and commit to git.
Foundation kit for any new operator. What Claude Code is, how to install it, how to wire it into Obsidian as long-term memory, the plugins / MCPs / APIs to add to your stack, and the mistakes we already paid for so you don't have to.
Anthropic's official CLI. Open a terminal, type claude, and chat with Claude — except now Claude can read your files, run your build, edit code, run tests, and commit to git.
Web chat answers questions. Claude Code does the work. It runs locally, respects your permissions, and operates inside the project folder you opened. Treat it like a senior engineer pair-programming over your shoulder.
Spinning up Next.js apps, wiring Supabase, building GHL automations, writing tests, debugging Vercel deploys, drafting docs. Anything you'd open VS Code for — plus everything you'd ask a teammate to do.
When you close the terminal, Claude loses everything. Your project's architecture, decisions, bugs, todos — gone. That's why we use Obsidian as external memory.
Claude has no memory between sessions. Every new terminal is a brand new colleague who has never seen your project. If you don't teach the context every time, Claude will guess — and guesses cause bugs.
Retype "we use Supabase, the users table has these columns, the auth flow works like this..." every session. Slow. Expensive. Inconsistent.
Plain markdown files inside an Obsidian vault. Claude reads them at session start. Context restored in seconds. Zero retyping.
Obsidian is just markdown on disk — Claude reads it natively. But Obsidian gives you a clean editor, backlinks, search, and graph view.
Start with this exact layout. Don't add folders until you've felt the need for one. Keep the surface area small while you learn.
# Your Obsidian Vault — copy this exact structure claude-memory/ ├── CLAUDE.md # Global rules — who you are, your stack, your habits ├── Projects/ │ └── my-first-app/ │ ├── CLAUDE.md # Project-specific stack, brand, scope │ ├── MEMORY.md # Decisions, workarounds, bugs you've hit │ ├── SESSION.md # Chronological log — what was built, when │ └── GOALS.md # Sprint goals, blockers, todos ├── Templates/ # Starter copies of the four files └── Notes/ # Free-form thinking, anything that isn't a project
The global CLAUDE.md defines you and your defaults — name, OS, stack preferences, communication style. Each project gets its own folder with four files. That's it.
| File | What goes in it | When to update |
|---|---|---|
CLAUDE.md |
Project scope, tech stack, env variables, brand colors, project-specific coding rules, security rules. | Rarely. Only when scope or architecture changes. |
MEMORY.md |
Lessons learned: bugs hit, workarounds that worked, decisions made and the reasoning, things that look weird but are intentional. | Whenever you discover something non-obvious. |
SESSION.md |
Chronological log. Date, what you built, commit hash, what's next. One section per session. | End of every session, no exceptions. |
GOALS.md |
Current sprint goals as checklist. Blockers. Things parked for later. | Whenever you finish a goal or hit a blocker. |
# my-first-app — Project Rules ## Stack - Next.js 14 (App Router, TS strict) - Tailwind CSS - Local state only (no DB yet) ## Brand - Charcoal #111111 / White #FFFFFF - Geist font, no purple ## Env - .env.local in root - NEVER commit secrets ## Coding Rules - Functional components only - One feature per commit - Run typecheck between tasks
# Memory — my-first-app ## Decisions - (none yet) ## Workarounds - (none yet) ## Known Bugs - (none yet) ## Things That Look Weird - (none yet) # Add an entry whenever something # non-obvious happens. Future-you # will thank you.
# Sessions — my-first-app ## Session 01 — 2026-04-28 - Built: scaffolded Next.js, added layout - Commit: a1b2c3d - Time: 45 min - Next: todo input + list ## Session 02 — 2026-04-29 - Built: ... - Commit: ... - Next: ...
# Goals — my-first-app
## Current Sprint
- [x] Scaffold Next.js
- [x] Add layout component
- [ ] Todo input field
- [ ] Persist to localStorage
- [ ] Delete + edit todos
## Blockers
- None
## Parked (out of scope for now)
- Sync to cloud
- Multi-user
Empty templates are easy to ignore. Here's a real one — pulled from a roofing client demo build. Notice the why on every line. That's the part that makes future-you (or your colleague) actually trust the file.
# Memory — my-project
## Decisions
- (none yet)
## Workarounds
- (none yet)
## Known Bugs
- (none yet)
## Things That Look Weird
- (none yet)
# Memory — Roofing Demo Site ## Decisions - Cloudflare Pages over Vercel # zero monthly cost, custom domain easy - Lead photos from Unsplash, not stock libs # faster + better licensing - POST /api/lead, not GET # GHL webhook sender requires POST ## Workarounds - Stitch can't render Geist — exports use serif Fix: re-port wordmarks manually after Stitch - PowerShell swallows -- in mcp commands Fix: pass MCP args positionally ## Known Bugs - Booking iframe height jumps on first load # tracking — not critical for demo ## Things That Look Weird - /api/lead validates phone in E.164 only # GHL contact create rejects local format
Claude Code runs on Node. Download the LTS build from nodejs.org and install. Confirm:
# both should print a version
node -v
npm -v
One command, globally:
npm install -g @anthropic-ai/claude-code
If your username has a space (looking at you, Windows), run PowerShell as admin and quote paths.
From any folder:
claude
It opens a browser, you sign in to Anthropic, the CLI is authenticated. Once per machine.
Navigate to any code folder, then start Claude scoped to that folder:
cd ~/Projects/my-app claude
Claude can now read every file in that folder. It will ask permission before editing or running commands. Approve once per command type.
Download from obsidian.md and install. Create a new vault — call it claude-memory or anything you want.
Inside your new vault, create the folders + four files from slide 03/05:
claude-memory/ ├── CLAUDE.md ├── Projects/ │ └── my-first-app/ │ ├── CLAUDE.md │ ├── MEMORY.md │ ├── SESSION.md │ └── GOALS.md ├── Templates/ └── Notes/
Claude can read your vault directly via the Obsidian MCP server. This means Claude can search, read, and update notes without you copy-pasting. Set this up once.
Open Obsidian → Settings → Community Plugins → turn off Restricted Mode → Browse → search "Local REST API" by Adam Coddington → Install → Enable.
Open the plugin's settings tab and copy the API Key shown there. You'll paste it into Claude in the next step.
From any folder, run:
claude mcp add obsidian \
-e OBSIDIAN_API_KEY=your-key-here \
npx mcp-obsidian
Windows / PowerShell users: skip the -- separator. PowerShell strips it. Pass args positionally.
Quit and re-run claude. Then ask:
List all files in my Obsidian vault. Then read claude-memory/CLAUDE.md.
If Claude returns the list and reads the file, you're wired in.
-- separator from the install command?Read these files before we start: - CLAUDE.md - MEMORY.md - SESSION.md - GOALS.md Don't summarize back. Just absorb.
Claude silently absorbs your decisions, your bugs, your goals, your stack. You're back at full speed without retyping anything. The most important habit on the team.
Update SESSION.md with what we did, GOALS.md with progress, and MEMORY.md if anything non-obvious came up. Then commit.
Next session — yours, your colleague's, on a different machine — picks up exactly where you left off. The vault becomes a long-term, searchable knowledge base.
For a Next.js app, let the official scaffolder do the work:
# pick TS, App Router, Tailwind, ESLint when prompted npx create-next-app@latest my-first-app cd my-first-app git init && git add -A && git commit -m "feat: initial scaffold"
For an empty playground project, use mkdir my-first-app && cd my-first-app && git init instead.
Inside claude-memory/Projects/my-first-app/, create the four files. Copy the starter templates from slide 05 to give Claude (and you) a head start.
claude
First message:
I'm working on "my-first-app" — a Next.js todo app, local state, no DB. Read the four memory files from my Obsidian vault (via the obsidian MCP) at: claude-memory/Projects/my-first-app/ Don't summarize back. Just absorb, then wait for my next instruction.
Ask Claude to add a todo input + list. Watch it edit files. Approve commands. When it works, run git commit.
Update SESSION.md with what we did, GOALS.md with what's left, and MEMORY.md if any decision was non-obvious. Then we're done.
Open Obsidian. Check the files. Real persistent memory, written by Claude, owned by you.
Open the terminal, run claude, paste the start-of-session prompt. Within five seconds, full context loaded. You're back at full speed. That's the whole game.
If you've shipped a GHL Snapshot or built a workflow template, you already understand this. Claude Code extends through the same idea — drop in modules someone already built, then customize.
| What you know in GHL | What it is in Claude Code |
|---|---|
| Snapshot | Plugin — installable bundle (MCPs + skills + agents + commands all in one). Drop in via /plugin install. |
| Workflow Template | Skill — a saved playbook Claude invokes when its description matches the task. Lives in .claude/skills/<name>/SKILL.md. |
| Specialist Account Manager | Agent — a scoped role with its own model + tool access. Owns its domain. Lives in .claude/agents/<name>.md. |
| Webhook (in / out) | MCP server — live two-way bridge to an external tool. Covered on the next slide. |
| Custom HTTP request action | Direct API call — Claude writes code that hits any API directly. Covered after. |
An MCP gives Claude a permanent tool. Install once, use forever. Here's the stack we'd recommend for anyone who lives in GHL all day.
| MCP | What you can ask Claude to do |
|---|---|
| GHL CORE | Pull a contact, search conversations, update an opportunity, send a Convo AI message, list pipelines, fetch an order, post a blog. 36 tools total. |
| Obsidian CORE | Read / write your project memory files (the four files). Required for the workflow this deck teaches. |
| GitHub | Open PRs, search code, manage issues — for any repo where you push automations or custom apps. |
| Supabase | Query DB, run migrations, generate types — when you build custom dashboards on top of GHL. |
| Gmail + Calendar | Search and draft email, create + read events — for client recaps, scheduling, syncing project timelines. |
| Chrome DevTools / Playwright | Open a real browser, click around your live GHL build, screenshot, debug a broken funnel. |
| Context7 | Pull the latest API docs for any library (GHL, Stripe, VAPI, Next.js…). Beats guessing from training data. |
| Vercel | Read-ish: list projects + deployments, fetch logs. Use the Vercel CLI for actual deploys (vercel deploy --prod). |
locationId. Switching accounts = edit ~/.claude.json and restart Claude. Always verify with locations_get-location before any write.# Pattern for adding any HTTP MCP (works for GHL, Vercel, Linear, etc.) claude mcp add <name> --scope user \ --transport http \ --url <endpoint-from-vendor-docs> \ --header "Authorization: Bearer <your-token>" # GHL example — Private Integration Token + sub-account ID claude mcp add ghl --scope user --transport http \ --url https://services.leadconnectorhq.com/mcp/ \ --header "Authorization: Bearer pit-XXXXXXXXXXXX" \ --header "locationId: YYYYYYYYYYYY" # NEVER paste a real token into the chat. Set it once. Verify access. Move on.
Not everything has an MCP yet. When you need a raw connection, ask Claude to call the API directly — same pattern as a custom HTTP request action in a GHL workflow.
| Service | What you'd build |
|---|---|
| Anthropic API | Build your own AI tool or SaaS — call Claude from your app, wrap it in a UI, charge clients. The foundation under everything Paul ships. |
| VAPI.ai | Voice AI agent management — list / create / update assistants, pull call transcripts, trigger outbound calls. No MCP exists yet. |
| GHL REST API | When the MCP misses a feature: SaaS sub-account creation, custom values, advanced workflow triggers, snapshot deploys. |
| Stripe | Payments, subscriptions, invoices, webhooks — for your own SaaS or any product you sell outside GHL. |
| Twilio / SendGrid | Raw SMS or email when you can't use GHL — rare, but happens (e.g. compliance-isolated flows). |
# Ask Claude something like this — and it builds the route "Add a Next.js API route /api/transcribe that calls the VAPI API to fetch the latest call transcript for assistant <id>. Use VAPI_KEY from .env.local. Validate input with zod. Return 400 on missing id." # Claude will: # 1. read your existing env keys + project structure # 2. pull current VAPI docs (via Context7 if installed) # 3. write the route with auth + validation + error handling # 4. run the typecheck # 5. ask permission before each file edit
.env.local and .gitignore — never paste a live key into the chat or commit one to git. Once a key is in git history, rotate immediately.Claude guesses recipient_id when the schema says receiver_id. Cascade of bugs.Fix: read the schema / generated types BEFORE writing any DB query.
Building feature 4 on broken types from feature 3 multiplies bugs across the session.Fix: run npx tsc --noEmit after every task. Fix before next.
An agent silently wiped supabase.ts once. Sessions broke for hours.Fix: at session start, verify supabase.ts, next.config, .env keys exist and aren't empty.
git add -A in a multi-agent runStages another agent's half-finished work or — worse — secrets.Fix: stage files explicitly by name. Run git status before every commit.
Stale .next/ cache produces phantom type errors that lead you down dead ends.Fix: rm -rf .next and rebuild before debugging further.
Once a key is in git history, it's compromised. Rotation, panic, a bad afternoon.Fix: add .env.local to .gitignore on day one. Always.
--Commands like claude mcp add foo -- npx pkg silently fail with "missing argument" on PowerShell.Fix: drop the -- and pass args positionally. Or edit the config file directly.
Windows paths like C:\Users\Bob Smith\ break git-based plugin installs.Fix: quote all paths with double quotes. Or rename your user folder before installing tools.
When something breaks, you can't bisect. You're rewriting the world.Fix: one feature = one commit. Conventional prefixes: feat: fix: chore:.
Two agents editing layout.tsx at once = one of them gets overwritten.Fix: only one process touches a shared file at a time. Run agents sequentially when they share scope.
The Obsidian MCP only works while the desktop app is running. Closed app = "connection refused" + a broken session start.Fix: leave Obsidian open. Set it to launch at login on your dev machine.
<your-key> as-isPowerShell reads < as stdin redirection. Command does something weird, no error.Fix: replace placeholders before running. Never leave angle brackets in shell commands.
Always start a session by loading the four files. Skipping this is the #1 source of dumb bugs.
If you don't write to SESSION.md before closing, future-you will redo work. Always log.
Working feature = git commit. Don't batch six features into one commit. Future-you needs the granularity.
API keys, env vars, tokens — never go in git. Use .env.local and add it to .gitignore immediately.
After any code change, ask Claude to run the build or types check. Catches 80% of bugs before you do.
Build something you actually need. The first project is the one that makes the habit stick.
Send the error, what you tried, what you expected. Five minutes of asking beats two hours of stuck.
Once basics feel natural, ask Paul for the global CLAUDE.md. Agency-specific rules live there.