Mac Mini Setup — Jarvis Clone

Complete setup guide · plug in, run each step, you're done

~90 min total
0 / 24 done
Tick each step as you go — progress saves in this tab

What you'll have when done

All memory + skills synced automatically
Obsidian vault with full knowledge graph
Jarvis bridge auto-starts at login
RAG search over your entire vault
Claude Code with all 46+ skills
Railway + GitHub + all CLI tools
Session logs bridge PC ↔ Mac — pick up anywhere
Dashboard at localhost:6789
1
System Tools
~25 min
Install Homebrew
macOS package manager — installs everything else

Open Terminal (Spotlight → Terminal). Paste this one-liner. It will prompt for your Mac password.

Terminal
/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).

After install — add to PATH
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
Verify: brew --version should print a version number.
Install Node.js LTS
Required for Claude Code, Jarvis bridge, and MCP servers
Terminal
brew install node
Verify: node --version and npm --version
Install Python 3.13 + uv
For graphify and voice stack
Terminal
brew 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
Verify: python3 --version → 3.13.x
Install git + GitHub CLI
git usually pre-installed on Mac, gh is the GitHub CLI
Terminal
brew install git gh
Verify: git --version and gh --version
Install Claude Code CLI
The main tool — this is what you use every day
Terminal
npm install -g @anthropic-ai/claude-code
Verify: claude --version
Install Railway CLI
Deploy + manage FLUXATH CRM and other Railway projects
Terminal
brew install railway
You'll log in to Railway in Phase 2 — this just installs the binary.
2
Identity & Auth
~10 min
Generate SSH key + add to GitHub
Required to clone private repos (jarvis-terminal, jarvis-rag-mcp, etc.)
Terminal
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.

Test SSH connection
ssh -T git@github.com
Should say: Hi sleeezy3k! You've successfully authenticated...
gh auth login
Authenticate GitHub CLI (separate from SSH)
Terminal
gh auth login

Choose: GitHub.com → SSH → your key → Login with a web browser. Opens Safari — approve, done.

railway login
Opens browser OAuth — logs into sleeezy3k's Projects
Terminal
railway login
Must run in a real Terminal — not inside Claude Code's shell. Railway OAuth needs a browser callback. Login persists at ~/.railway/config.json.
3
Sync Your Brain
~20 min
Clone ~/.claude (all memory, settings, skills, hooks)
This single step restores your entire Claude Code brain
AUTO
This restores everything: all 46+ skills, all memory files, all hooks (session-start auto-pull, session-end auto-push), CLAUDE.md, MCP settings.
Terminal
git clone git@github.com:sleeezy3k/claude-dotfiles.git ~/.claude

Then tell Claude Code where your Anthropic API key is (first-time login):

First Claude Code login
claude  # opens interactive login — paste your Anthropic API key
After this, every time you open Claude Code on the Mac Mini, it auto-pulls the latest memory from GitHub — same as the PC.
Install Obsidian + sign into Obsidian Sync
Vault (~800 files) downloads automatically after login
AUTO

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.

Done when the Obsidian sync status shows 0 files remaining and you can see your notes.
The Obsidian REST API plugin uses a per-device API key. After sync, go to Settings → Community Plugins → Local REST API → generate a new key for this Mac. No action needed for Claude Code — it uses the vault files directly.
Clone project repos manually (first session only)
After this, the SessionStart hook handles it automatically

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:

Terminal — clone all project repos
# 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
The auto-sync hook also covers: llc-build, april-created-projects, ai-video-agency. Clone those too if you need them on the Mac.
4
Jarvis Engine
~20 min
npm install in jarvis-terminal + jarvis-rag-mcp
Install Node.js dependencies for the bridge and MCP server
Terminal
cd ~/jarvis-terminal && npm install --no-audit --no-fund
cd ~/jarvis-rag-mcp  && npm install --no-audit --no-fund
Both should complete without errors. Ignore audit warnings.
Copy ~/.jarvis-terminal-config.json from the PC
Contains ALL API keys — this file is never synced to GitHub
MANUAL
This file is NOT auto-synced. It holds your live API keys (OpenAI, ElevenLabs, Anthropic, Notion). You must copy it manually from the PC.

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):

~/.jarvis-terminal-config.json
{
  "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"
}
Minimum for RAG to work: openai_api_key. The rest unlock voice + Notion activity feed.
Install graphify
Builds the knowledge graph from your Obsidian vault
Terminal
pip3 install graphifyy

Test it (from inside the vault):

Verify graphify works
cd ~/Documents/Jarvis
graphify . --update
Always cd ~/Documents/Jarvis first — graphify reads the vault's manifest from the current directory.
5
Services & MCP
~15 min
Register jarvis-rag MCP server
Makes RAG search available in every Claude Code session
Terminal
claude mcp add jarvis-rag --scope user -- node /Users/$(whoami)/jarvis-rag-mcp/server.js
Check: claude mcp list → should show jarvis-rag ✓ Connected (only after the bridge is running in Step 18)
If it says "already exists" — it was restored from your ~/.claude clone. Run claude mcp list to confirm it's there.
Set up Jarvis bridge to auto-start at login
Mac equivalent of the Windows Scheduled Task — runs at every login

Create a launchd plist so the Jarvis bridge starts automatically every time you log in to your Mac Mini:

Terminal — create launchd plist
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
Verify bridge is alive: curl http://127.0.0.1:6789/status → should return {"ok":true,...}
Start Jarvis bridge (manual first boot)
launchd will handle restarts after this — just do it once
Terminal — start bridge
# 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
Dashboard is live at: http://127.0.0.1:6789/dashboard
Trigger initial RAG reindex
Builds the vault search index — ~$0.01, ~5-10 min first time
Terminal — kick reindex
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'
Uses OpenAI text-embedding-3-small — about $0.01 for ~4,000 chunks. Incremental reindexes after this cost fractions of a cent.
Done when status shows "indexing": false and a chunk count (typically 3,000–5,000).
6
Verify Everything
~10 min
Open Claude Code — verify session continuity
Should auto-pull latest memory and pick up from the last PC session
Terminal
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.

Ask: "what was I working on last session?" — Jarvis should pull from session logs and give you a real answer.
Verify jarvis-rag MCP is connected
RAG search must show as connected in claude mcp list
Terminal
claude mcp list
jarvis-rag should show ✓ Connected. If it shows Disconnected, the bridge isn't running — check Step 18.
Open the dashboard
Jarvis command center — works in any browser
Terminal
open http://127.0.0.1:6789/dashboard
Dashboard loads with: Command Center, Projects, RAG pill, Cost meter, Voice HUD, Terminal (xterm.js).
Set up Obsidian Local REST API for this device
Per-device key — needed only if you use Obsidian MCP tools

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):

~/.claude/settings.local.json
{
  "obsidian_api_key": "YOUR_KEY_HERE"
}
Use curl.exe -k (not PowerShell Invoke-RestMethod) if you test the Obsidian REST API directly — TLS self-signed cert.
Run full system check
One command verifies all critical services
Terminal — final smoke test
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
All green = you're done. The Mac Mini is now an exact mirror of the PC. Open Claude Code and get to work.

Daily workflow (after setup)

🟢 Open Claude Code → SessionStart hook auto-pulls latest memory, session logs, all repos
🟢 Work normally → Jarvis bridge auto-started at login, RAG search available instantly
🟢 Close Claude Code → Stop hook auto-pushes memory, session log written to vault
🟢 Switch to PC / MacBook → open Claude Code, SessionStart pulls everything → pick up exactly where you left off

Troubleshooting quick reference

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)