An agent that runs while you sleep
What “always on” means, three ways to get there, and what the UPS bought you.
“Set up an agent that runs in the background of my life” is three separate problems wearing one coat. Pull them apart and each one is small.
What always on means
It comes back after a reboot. A process macOS starts at login and restarts if it dies. You said setting the mini up to come back on its own felt like more trouble than it was worth. It is a 30-line launchd file, and one is in Downloads. The UPS you bought carries the mini through the short outages; launchd handles the rare long one. launchd, the boring hero.
You can reach it. An agent you can only talk to by sitting at the mini is an expensive cron job. Channels push a message from Telegram, Discord, or iMessage into a running session and carry the reply back. That is the whole “background of my life” part, and it is the try-now below.
It remembers. CLAUDE.md you know. The two you may
not be using are auto memory, where Claude writes its own notes about
your corrections per repository, and subagent memory, a
memory: field that gives a subagent its own notes across
sessions. For everything else, a folder of markdown in git, the
pod-vault pattern, owned by the agent. Memory that
survives restarts.
Three ways, ranked by effort
| Way | What you get | Effort | Honest limit |
|---|---|---|---|
| Scheduled tasks in the Claude Code desktop app | Claude runs a task on a schedule on your mini, with your files | Ten minutes | Scheduled, not conversational. It does not wait for you to text it |
| A live session plus a channel, kept alive by launchd | Text your bot from anywhere, it works against your real files, replies in the same chat | An evening | Permission prompts pause the session while you are away unless you scope what it may do |
Headless claude -p driven by launchd, cron, or n8n |
You own the loop. Any trigger, any output format, chain it into scripts | A weekend, then it compounds | You are now maintaining a small system |
The recommendation is the middle row. It is the one that matches what you described, and it is the one Jeff’s crew runs.
Try this now
An evening. A Telegram bot that reaches a Claude Code session on your mini. Use your home account, not the work one. Channels need claude.ai authentication and are not available through Bedrock.
- Install Bun, which the channel plugins run on:
brew install oven-sh/bun/bun. Then in Telegram, open BotFather, send/newbot, and copy the token. - In Claude Code on the mini:
/plugin install telegram@claude-plugins-official
/telegram:configure <paste the token>
- Quit Claude Code. Start it again inside tmux so it survives you closing the terminal:
tmux new -s agent
claude --channels plugin:telegram@claude-plugins-official- Message your bot from your phone. It replies with a pairing code. Back in Claude Code:
/telegram:access pair <code>
/telegram:access policy allowlist
- Make it come back after a reboot. The launchd file in Downloads starts that tmux session at login
and restarts it if it dies. Copy it to
~/Library/LaunchAgents/andlaunchctl loadit.
How you know it worked. Text the bot “what is in my home directory” from your phone and get an answer. Then restart the mini, wait a minute, and text it again.
One thing to decide before you walk away from it. If Claude hits a permission prompt while you are on your phone, the session waits. Either give it a folder it may work in without asking, or accept that some texts get answered when you are back at the keyboard. Both are fine. Pick one on purpose, and read Guardrails first, because “what it may do on its own” is a list you write, not a mode you pick.
Read more
- launchd, Memory, Guardrails, Name your crew
- Channels, the source for the steps above, with Discord and iMessage variants
- Desktop scheduled tasks and Routines
- Headless mode