Complete setup guide · plug in, run each step, you're done
Open Terminal (Spotlight → Terminal). Paste this one-liner. It will prompt for your Mac password.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
After it finishes, run the two eval commands it prints at the bottom (they add brew to PATH).
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile eval "$(/opt/homebrew/bin/brew shellenv)"
brew --version should print a version number.brew install node
node --version and npm --versionbrew install python@3.13 # Make it the default python3 echo 'export PATH="/opt/homebrew/opt/python@3.13/bin:$PATH"' >> ~/.zprofile source ~/.zprofile # Install uv (fast pip replacement — used by graphify) curl -LsSf https://astral.sh/uv/install.sh | sh
python3 --version → 3.13.xbrew install git gh
git --version and gh --versionnpm install -g @anthropic-ai/claude-code
claude --versionbrew install railway
ssh-keygen -t ed25519 -C "kleakes3@gmail.com" # Press Enter 3x to accept defaults (no passphrase) # Copy public key to clipboard cat ~/.ssh/id_ed25519.pub | pbcopy
Then go to github.com → Settings → SSH and GPG keys → New SSH key, paste from clipboard, save.
ssh -T git@github.com
gh auth login
Choose: GitHub.com → SSH → your key → Login with a web browser. Opens Safari — approve, done.
railway login
~/.railway/config.json.git clone git@github.com:sleeezy3k/claude-dotfiles.git ~/.claude
Then tell Claude Code where your Anthropic API key is (first-time login):
claude # opens interactive login — paste your Anthropic API key
1. Download Obsidian from obsidian.md → install the .dmg → open it.
2. In Obsidian: Settings → Obsidian Sync → Log in → use your Obsidian account credentials.
3. Your vault named "Jarvis" will appear. Select it and set the local path to ~/Documents/Jarvis.
4. Wait ~5-10 minutes for the full sync to complete.
The auto-sync hook runs at every Claude Code session start — but it only pulls repos that already exist. For the very first time, clone them:
# Jarvis stack (private) git clone git@github.com:sleeezy3k/jarvis-terminal.git ~/jarvis-terminal git clone git@github.com:sleeezy3k/jarvis-rag-mcp.git ~/jarvis-rag-mcp git clone git@github.com:sleeezy3k/jarvis-voice.git ~/jarvis-voice # Project repos (if you use them on Mac too) git clone git@github.com:sleeezy3k/fluxath-crm.git ~/fluxath-crm git clone git@github.com:sleeezy3k/stash.git ~/stash
cd ~/jarvis-terminal && npm install --no-audit --no-fund cd ~/jarvis-rag-mcp && npm install --no-audit --no-fund
Options to transfer:
• AirDrop: On the PC, right-click the file and AirDrop to your Mac Mini
• USB drive: Copy to USB on PC, paste to Mac Mini
• Email yourself: kleakes3@gmail.com → paste contents into a new file
PC file location: C:\Users\k\.jarvis-terminal-config.json
Mac destination: ~/.jarvis-terminal-config.json
The file should look like this (fill in if creating fresh):
{
"elevenlabs_api_key": "YOUR_KEY_HERE",
"elevenlabs_voice_id": "9BWtsMINqrJLrRacOk9x",
"elevenlabs_model": "eleven_turbo_v2_5",
"anthropic_api_key": "YOUR_KEY_HERE",
"anthropic_model": "claude-sonnet-4-6",
"openai_api_key": "YOUR_KEY_HERE",
"notion_token": "YOUR_KEY_HERE"
}
openai_api_key. The rest unlock voice + Notion activity feed.pip3 install graphifyy
Test it (from inside the vault):
cd ~/Documents/Jarvis graphify . --update
cd ~/Documents/Jarvis first — graphify reads the vault's manifest from the current directory.claude mcp add jarvis-rag --scope user -- node /Users/$(whoami)/jarvis-rag-mcp/server.js
claude mcp list → should show jarvis-rag ✓ Connected (only after the bridge is running in Step 18)claude mcp list to confirm it's there.Create a launchd plist so the Jarvis bridge starts automatically every time you log in to your Mac Mini:
NODE_PATH=$(which node)
USERNAME=$(whoami)
cat > ~/Library/LaunchAgents/com.kevin.jarvis-terminal.plist << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>com.kevin.jarvis-terminal</string>
<key>ProgramArguments</key>
<array>
<string>$NODE_PATH</string>
<string>/Users/$USERNAME/jarvis-terminal/server.js</string>
</array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
<key>StandardOutPath</key><string>/tmp/jarvis-terminal.log</string>
<key>StandardErrorPath</key><string>/tmp/jarvis-terminal.err</string>
<key>WorkingDirectory</key><string>/Users/$USERNAME/jarvis-terminal</string>
</dict>
</plist>
EOF
# Load it now (no need to restart)
launchctl load ~/Library/LaunchAgents/com.kevin.jarvis-terminal.plist
curl http://127.0.0.1:6789/status → should return {"ok":true,...}# If launchd already loaded it, just check status: curl http://127.0.0.1:6789/status # If not running, start manually: cd ~/jarvis-terminal && nohup node server.js > /tmp/jarvis-bridge.log 2>&1 & sleep 2 && curl http://127.0.0.1:6789/status
TOKEN=$(cat ~/.jarvis-terminal-token | tr -d '[:space:]')
curl -sS -X POST "http://127.0.0.1:6789/rag/reindex" \
-H "X-Jarvis-Token: $TOKEN" \
-H "Content-Type: application/json" \
-d '{"full": true}'
# Poll until done (runs in background — check status):
watch -n 5 'curl -sS "http://127.0.0.1:6789/rag/status" -H "X-Jarvis-Token: '"$TOKEN"'" | python3 -m json.tool'
text-embedding-3-small — about $0.01 for ~4,000 chunks. Incremental reindexes after this cost fractions of a cent."indexing": false and a chunk count (typically 3,000–5,000).cd ~/Documents/Jarvis claude
At the SessionStart you should see hooks running in the background (repos sync pull, graphify update). The CLAUDE.md should be loaded with all your Jarvis instructions.
claude mcp list
jarvis-rag should show ✓ Connected. If it shows Disconnected, the bridge isn't running — check Step 18.open http://127.0.0.1:6789/dashboard
In Obsidian → Settings → Community Plugins → Local REST API:
1. Enable the plugin (should already be installed via Obsidian Sync)
2. Generate API key → copy it
3. Add to ~/.claude/settings.local.json (create if missing):
{
"obsidian_api_key": "YOUR_KEY_HERE"
}
curl.exe -k (not PowerShell Invoke-RestMethod) if you test the Obsidian REST API directly — TLS self-signed cert.echo "=== Versions ===" && \ node --version && npm --version && python3 --version && \ claude --version && gh --version && railway --version && \ graphify --version 2>/dev/null || echo "graphify: check ~/.local/bin" echo "" echo "=== Jarvis Bridge ===" && \ curl -sf http://127.0.0.1:6789/status | python3 -m json.tool echo "" echo "=== GitHub Auth ===" && \ gh auth status echo "" echo "=== Railway Auth ===" && \ railway whoami echo "" echo "=== Obsidian Vault ===" && \ ls ~/Documents/Jarvis | wc -l | xargs echo "files:" echo "" echo "=== ~/.claude synced ===" && \ cd ~/.claude && git log --oneline -1
| Symptom | Fix |
| Bridge not running | cd ~/jarvis-terminal && node server.js |
| jarvis-rag shows Disconnected | Start bridge first, then reopen Claude Code |
| Reindex returns 503 | Add openai_api_key to ~/.jarvis-terminal-config.json |
| Dashboard 404 | Bridge looks for ~/jarvis-terminal/dashboard/agent-os.html |
| node not found in launchd | Run which node → update plist ProgramArguments |
| Memory out of date | cd ~/.claude && git pull (or just reopen Claude Code) |