A personal-assistant pattern for Claude Code. Scheduled tasks — morning briefings, calendar nudges, email triage, whatever — fire as new turns inside the chat you're already in, not as separate sidebar sessions or background daemons. Works the same in the desktop app and terminal CLI.
Claude Code already handles the easy parts: persistent persona via
CLAUDE.md imports, markdown memory, skills. Weaver bundles those into
a personal-assistant shape, but the bundle isn't the point.
The load-bearing piece is /loops — a file-based registry for
ambient scheduled prompts that fire as new turns in the active chat
(via CronCreate), plus a daily keepalive loop that renews
everything past Claude Code's 7-day session-scoped cron expiry. That's
what lets you have an ambient personal assistant without running a
daemon or a separate channels matrix.
Strip Weaver to its smallest interesting form and it's
.claude/skills/loops/ plus .claude/loops/keepalive.md. The persona
files are skin on top.
Claude Code + a claude.ai subscription. Either surface works:
- Desktop app — claude.ai/download
- Terminal CLI —
brew install --cask claude-codeon macOS, or the one-line installer on macOS/Linux/WSL
mkdir ~/weaver- CLI:
cd ~/weaver && claude - Desktop: New session, set Project folder to
~/weaver
Hello, world. Please clone `https://github.com/ethanbeard/weaver`
into the current directory, then tell me to
type `/clear` to reload the session.The "Hello, world" opener seeds a pleasant auto-title on the session. The agent handles the clone and tells you what to do next.
/clear picks up the new CLAUDE.md. Send any message after and the
/onboard skill fires automatically — four short questions (your name,
the agent's name, its vibe, its emoji), plus optional capability setup
and phone pairing. Takes about a minute.
If /clear doesn't pick up the files, exit and reopen Claude in the
same directory.
The reason this project exists. Scheduled tasks fire as new turns inside the currently active chat. If your session is paired with the Claude iOS app via Remote Control, you see them on your phone too — same chat, mirrored.
Each loop is a markdown file in .claude/loops/ with YAML frontmatter
(cron, enabled, description) and a prompt body. Manage them via the
/loops skill — it wraps CronCreate so each loop lands in the
registry and survives the 7-day cron expiry.
/loops # list everything
/loops add # add a new loop interactively
/loops enable foo # turn on
/loops disable foo # turn off
/loops remove foo # delete
/loops sync # reconcile registry with active crons
Two loops ship with the workspace:
keepalive(enabled) — fires daily at 03:07 and runs/loops sync, renewing anything within 48 hours of expiring. Don't disable this unless you know what you're doing.heartbeat(disabled) — fires every 30 minutes and acts on whatever's inHEARTBEAT.md. Empty checklist = silent fire. Useful for batching periodic checks (mail, calendar, weather) into one cadence. Enable with/loops enable heartbeat.
Add your own by saying "check my email every weekday at 8am and let
me know if anything's urgent" — the agent invokes /loops add for
you.
| File | Purpose |
|---|---|
CLAUDE.md |
Entry point the harness loads. @-imports the rest. |
IDENTITY.md, SOUL.md, USER.md, TOOLS.md |
Who the agent is, who you are. Editable by either of you. |
AGENTS.md |
Operating instructions + session-startup checklist. |
MEMORY.md, memory/ |
Curated long-term memory + daily journal. Agent-maintained. |
HEARTBEAT.md |
Checklist the heartbeat loop reads when enabled. |
BOOTSTRAP.md |
Human-readable docs for the first-run ritual. Not executed — see .claude/skills/onboard/. |
.claude/skills/ |
onboard, loops, import-skill, weather, plus optional setup skills. |
.claude/loops/ |
Scheduled-prompt registry. Managed via /loops. |
.claude/.onboarded |
Flag written when onboarding finishes. Remove to replay. |
Everything is markdown. Everything is editable by you or the agent.
- Phone access — type
/remote-control(built-in Claude Code command) to pair the iOS app with your current session. For auto-enable on new sessions,/config→ Enable Remote Control for all sessions. /install-launchagent— for dedicated always-on machines (Mac mini) running the CLI with tmux. Not needed if you use the desktop app with Open at login./install-imessage-channel— SMS-style bridge via iMessage. Terminal CLI only. Remote Control already covers "reach my agent from my phone" — this is for the Messages-app UX specifically.
Ask the agent: "Import the weather skill from <url>" or point at any
SKILL.md. The import-skill skill fetches, ports, and installs at
project scope (.claude/skills/) or personal scope
(~/.claude/skills/).
Or write your own at .claude/skills/<name>/SKILL.md. See
Anthropic's skills docs.
- No daemon, no gateway, no channels matrix.
CronCreate+keepalivereplace all of it. The only "always-on" requirement is a Claude Code session being open somewhere. - No install script.
mkdir, open Claude, paste a paragraph. - No shell hooks, no
settings.jsonchanges. Default Claude Code settings work. - No self-deleting files. Onboarding is an idempotent skill gated on a flag file.
- Minimal shipped skills. One example (
weather), the onboarding skill, the loops registry, and optional setup skills. Everything else is/import-skillon demand.
Persona file templates (AGENTS.md, SOUL.md, IDENTITY.md,
USER.md, TOOLS.md, HEARTBEAT.md) are adapted from the
OpenClaw workspace templates (MIT). The
CLAUDE.md import structure, /onboard ritual, /loops registry,
and setup skills are original to this project.