Keymap

SPACE
Next slide
Previous slide
HOME
First slide
END
Last slide
F
Toggle fullscreen
P
Print / save as PDF
?
Show / hide this card
Press ? or ESC to close
PAUL AI SOLUTIONS   /   INTERNAL
FIELD MANUAL / 001
REV 3.0   /   2026.04.28
DocumentOnboarding Kit
AudienceGHL Operators
SubjectClaude Code + Obsidian + MCP
Time~ 25 Minutes
Build with
Claude.
Remember
everything.

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.

next   back
SPACE next   F fullscreen
P print   ? all keys
01
What is Claude Code
< FOUNDATIONS >
Definition

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.

How it differs from chat

It acts on your machine

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.

What you'll use it for

Building, fixing, shipping

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.

The catch

Claude forgets between sessions

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.

02
The memory problem
< CORE CONCEPT >

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.

The naive way

Re-explain every time

Retype "we use Supabase, the users table has these columns, the auth flow works like this..." every session. Slow. Expensive. Inconsistent.

Our way

Markdown files Claude reads first

Plain markdown files inside an Obsidian vault. Claude reads them at session start. Context restored in seconds. Zero retyping.

Why Obsidian

Local files + great UX

Obsidian is just markdown on disk — Claude reads it natively. But Obsidian gives you a clean editor, backlinks, search, and graph view.

03
Vault structure
< SCHEMA >

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.

04
The four files
< PROJECT MEMORY >
FileWhat goes in itWhen 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.
05
Starter templates — copy these
< FILE STRUCTURE >
CLAUDE.md (project)
# 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.md
# 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.
SESSION.md
# 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.md
# 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
06
What MEMORY.md looks like after 5 sessions
< REAL EXAMPLE >

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.

Empty (what you start with)
# Memory — my-project

## Decisions
- (none yet)

## Workarounds
- (none yet)

## Known Bugs
- (none yet)

## Things That Look Weird
- (none yet)
Lived-in (after 5 sessions)
# 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
Rule: every entry answers "why is this here?" in one line. That's the difference between a real memory file and a graveyard of half-thoughts.
07
Install — Node + Claude
< SETUP   1 / 3 >
A

Install Node.js

Claude Code runs on Node. Download the LTS build from nodejs.org and install. Confirm:

# both should print a version
node -v
npm -v
B

Install Claude Code

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.

C

Log in

From any folder:

claude

It opens a browser, you sign in to Anthropic, the CLI is authenticated. Once per machine.

08
Install — Project + Obsidian
< SETUP   2 / 3 >
D

Open a project

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.

E

Install Obsidian

Download from obsidian.md and install. Create a new vault — call it claude-memory or anything you want.

F

Set up the vault layout

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/
09
Wire Claude into Obsidian
< SETUP   3 / 3 >

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.

G

Enable the Local REST API plugin in Obsidian

Open Obsidian → SettingsCommunity 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.

H

Add the Obsidian MCP server to Claude Code

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.

I

Restart Claude + test

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.

J

If it fails — check these five things

  • Did you restart Claude after editing the MCP config? HTTP MCPs only reload on client restart.
  • Is the Obsidian app actually open? The MCP talks to the desktop app — closed app = "connection refused".
  • Is the Local REST API plugin showing "Running" in its settings tab? Toggle off/on if not.
  • PowerShell users — did you remove the -- separator from the install command?
  • Wrong API key — copy it again from the plugin settings, no spaces, no angle brackets.
10
Session protocol — START
< HABIT   1 / 2 >
[   IN   ]
Load context first. Every session starts the same way — Claude reads your four files before touching code.
Paste this to Claude

The opening prompt

Read these files before we start:
- CLAUDE.md
- MEMORY.md
- SESSION.md
- GOALS.md

Don't summarize back. Just absorb.
Why this works

5 seconds, full context

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.

11
Session protocol — END
< HABIT   2 / 2 >
[ OUT ]
Persist what you learned. If you don't write to disk, future-you redoes the work. Always log.
Paste this to Claude

The closing prompt

Update SESSION.md with what we did,
GOALS.md with progress, and MEMORY.md
if anything non-obvious came up.
Then commit.
Result

Memory survives the night

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.

12
First project — setup
< HANDS-ON   1 / 2 >
1

Scaffold the project

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.

2

Create the four memory files in your vault

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.

3

Start Claude in the project folder

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.
13
First project — build & persist
< HANDS-ON   2 / 2 >
4

Build something small

Ask Claude to add a todo input + list. Watch it edit files. Approve commands. When it works, run git commit.

5

End the session — write to memory

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.

6

Tomorrow — pick up where you left off

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.

14
Extend Claude — plugins, skills, agents
< POWER USER   1 / 3 >

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 GHLWhat it is in Claude Code
SnapshotPlugin — installable bundle (MCPs + skills + agents + commands all in one). Drop in via /plugin install.
Workflow TemplateSkill — a saved playbook Claude invokes when its description matches the task. Lives in .claude/skills/<name>/SKILL.md.
Specialist Account ManagerAgent — 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 actionDirect API call — Claude writes code that hits any API directly. Covered after.
Mental model: GHL = your CRM, extends with snapshots / workflows / sub-account staff. Claude Code = your engineer, extends with plugins / skills / agents. Same shape, different stack.
15
Your GHL operator MCP stack
< POWER USER   2 / 3 >

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.

MCPWhat you can ask Claude to do
GHL COREPull a contact, search conversations, update an opportunity, send a Convo AI message, list pipelines, fetch an order, post a blog. 36 tools total.
Obsidian CORERead / write your project memory files (the four files). Required for the workflow this deck teaches.
GitHubOpen PRs, search code, manage issues — for any repo where you push automations or custom apps.
SupabaseQuery DB, run migrations, generate types — when you build custom dashboards on top of GHL.
Gmail + CalendarSearch and draft email, create + read events — for client recaps, scheduling, syncing project timelines.
Chrome DevTools / PlaywrightOpen a real browser, click around your live GHL build, screenshot, debug a broken funnel.
Context7Pull the latest API docs for any library (GHL, Stripe, VAPI, Next.js…). Beats guessing from training data.
VercelRead-ish: list projects + deployments, fetch logs. Use the Vercel CLI for actual deploys (vercel deploy --prod).
GHL MCP gotcha: it's locked to one sub-account at a time via 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.
16
Direct API — the escape hatch
< POWER USER   3 / 3 >

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.

ServiceWhat you'd build
Anthropic APIBuild 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.aiVoice AI agent management — list / create / update assistants, pull call transcripts, trigger outbound calls. No MCP exists yet.
GHL REST APIWhen the MCP misses a feature: SaaS sub-account creation, custom values, advanced workflow triggers, snapshot deploys.
StripePayments, subscriptions, invoices, webhooks — for your own SaaS or any product you sell outside GHL.
Twilio / SendGridRaw 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
Rule: keys live in .env.local and .gitignorenever paste a live key into the chat or commit one to git. Once a key is in git history, rotate immediately.
17
Mistakes — schema, build, secrets
< LESSONS   1 / 2 >
M1
Assuming column names

Claude guesses recipient_id when the schema says receiver_id. Cascade of bugs.Fix: read the schema / generated types BEFORE writing any DB query.

M2
Stacking unverified tasks

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.

M3
Skipping the critical-files check

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.

M4
git add -A in a multi-agent run

Stages another agent's half-finished work or — worse — secrets.Fix: stage files explicitly by name. Run git status before every commit.

M5
Debugging false errors on Windows

Stale .next/ cache produces phantom type errors that lead you down dead ends.Fix: rm -rf .next and rebuild before debugging further.

M6
Committing secrets

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.

18
Mistakes — shell, agents, discipline
< LESSONS   2 / 2 >
M7
PowerShell swallows --

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.

M8
Username with spaces

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.

M9
Batching 6 features into 1 commit

When something breaks, you can't bisect. You're rewriting the world.Fix: one feature = one commit. Conventional prefixes: feat: fix: chore:.

M10
Letting Claude write to shared files in parallel

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.

M11
Forgetting Obsidian must stay open

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.

M12
Pasting <your-key> as-is

PowerShell reads < as stdin redirection. Command does something weird, no error.Fix: replace placeholders before running. Never leave angle brackets in shell commands.

19
Five rules — non-negotiable
< LAWS >
01
Read before you write

Always start a session by loading the four files. Skipping this is the #1 source of dumb bugs.

02
Update at session end

If you don't write to SESSION.md before closing, future-you will redo work. Always log.

03
Commit after every win

Working feature = git commit. Don't batch six features into one commit. Future-you needs the granularity.

04
Never commit secrets

API keys, env vars, tokens — never go in git. Use .env.local and add it to .gitignore immediately.

05
Ask Claude to verify

After any code change, ask Claude to run the build or types check. Catches 80% of bugs before you do.

SectionClosing
StatusReady to Build
NextFirst Project
SupportSlack Paul
Now go
build
something
real.
Next steps

Pick a real problem

Build something you actually need. The first project is the one that makes the habit stick.

Stuck?

Ask, don't guess

Send the error, what you tried, what you expected. Five minutes of asking beats two hours of stuck.

Going deeper

Read the global CLAUDE.md

Once basics feel natural, ask Paul for the global CLAUDE.md. Agency-specific rules live there.

INTRO / 19
USE SPACE   ? KEYS