Mac Mini Personal Agent Setup
Short setup notes for turning a fresh Mac Mini into a personal agent machine: reset macOS, install the development basics, set up Codex, create a private knowledge repo, connect a Telegram bot, and let OpenClaw send daily task reminders.
Reset macOS
On the Mac Mini:
- Apple menu ->
System Settings General->Transfer or ResetErase All Content and Settings- Follow the assistant and confirm the erase.
After reboot:
- Choose language, country, and Wi-Fi.
- Migration Assistant:
Not Now. - Sign in with Apple ID if desired.
- Create the main admin user.
- Enable FileVault.
- Disable analytics sharing.
- Open
System Settings->General->Sharing. - Turn on
Remote Login. - Optional: turn on
Screen Sharing. - Set the computer name, for example
agent-mini.
Development Setup
Follow the macOS dev setup flow, but skip the OS upgrade step.
Install Homebrew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Install baseline tools:
brew install nvm git gh
mkdir -p ~/.nvm
Add nvm to ~/.zshrc:
export NVM_DIR="$HOME/.nvm"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && . "/opt/homebrew/opt/nvm/nvm.sh"
Install Node:
source ~/.zshrc
nvm install --lts
nvm use --lts
Install editor and terminal tools:
brew install --cask visual-studio-code ghostty font-jetbrains-mono-nerd-font
brew install starship
echo 'eval "$(starship init zsh)"' >> ~/.zshrc
Set up GitHub SSH:
ssh-keygen -t ed25519 -C "your_email@example.com"
cat ~/.ssh/id_ed25519.pub
Add the public key in GitHub:
Settings -> SSH and GPG keys -> New SSH key
Authenticate GitHub CLI:
gh auth login
Codex and Optional Agent Tools
This setup focuses on Codex because OpenClaw needs it. Claude Code and OpenCode are optional extra agent CLIs.
Install Codex:
curl -fsSL https://chatgpt.com/codex/install.sh | sh
Optional:
curl -fsSL https://claude.ai/install.sh | bash
curl -fsSL https://opencode.ai/install | bash
Authenticate Codex:
codex
For Codex, choose Sign in with ChatGPT unless the machine is intended for
API-key-based automation.
If you installed the optional tools, authenticate those too:
claude
opencode
Private Knowledge Repository
Create a private GitHub repository for personal knowledge:
mkdir -p ~/src/personal-knowledge
cd ~/src/personal-knowledge
git init
gh repo create personal-knowledge --private --source=. --remote=origin
A simple OKF-style layout works well:
personal-knowledge/
index.md
tasks/
inbox.md
people/
projects/
references/
Example index.md:
---
type: Index
title: Personal Knowledge
description: Private knowledge base for local agents.
---
# Personal Knowledge
- [[tasks/inbox]]
- [[projects]]
- [[people]]
Example tasks/inbox.md:
---
type: Task List
title: Task Inbox
---
# Task Inbox
- [ ] 2026-06-13: Set up Mac Mini personal agent
- [ ] Renew passport (recurring: yearly, next: 2027-01-01) - see [[passport-renewal]]
Use one checkbox per task, dates as YYYY-MM-DD, and next: for recurring
tasks.
Telegram Bot
In Telegram:
- Open
@BotFather. - Run
/newbot. - Pick a display name.
- Pick a username ending in
bot. - Save the bot token.
- Optional settings:
/setdescription/setuserpic/setprivacy
Keep privacy enabled unless the bot must read all group messages.
OpenClaw
Install and onboard OpenClaw:
curl -fsSL https://openclaw.ai/install.sh | bash
openclaw onboard --install-daemon
openclaw gateway status
During onboarding:
- Choose OpenAI or Codex auth if offered.
- Use the Codex or ChatGPT login already created above.
- Configure Telegram with the BotFather token.
- Keep the direct-message policy as pairing or allowlist, not public open access.
If configuring manually, use ~/.openclaw/openclaw.json:
{
channels: {
telegram: {
enabled: true,
botToken: "PASTE_BOTFATHER_TOKEN",
dmPolicy: "pairing"
}
}
}
Start and pair:
openclaw gateway restart
openclaw logs --follow
Message the Telegram bot, then approve the pairing code:
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
Daily Task Reminder
Create a daily OpenClaw reminder:
openclaw cron create "0 8 * * *" \
"Read ~/src/personal-knowledge/tasks/inbox.md. Send me a short reminder of overdue and due-today tasks." \
--name "Daily personal task reminder" \
--tz "America/Los_Angeles" \
--session isolated \
--announce \
--channel telegram \
--to "<YOUR_TELEGRAM_USER_ID>"
If you do not know your Telegram user ID, ask the bot directly. It can walk through sending a message to the bot and reading the Telegram chat ID from the bot updates.
Check it:
openclaw cron list
openclaw cron run <job-id> --wait
openclaw doctor