personal agent

Local-first · daily assistant

You get a lot done every day. By tomorrow, most of it has already slipped away.

personal agent is a daily self-assistant that runs on your own machine — turning everyday activity into a living profile, a self-updating website, and a triaged morning digest. Everything stays local; only what you point it at ever leaves.


Your first morning, in three steps

About five minutes from clone to your first run.

01

Install

Clone the repo and install it into a virtual environment. Python 3.11 or newer — that's the whole dependency footprint.

git clone https://github.com/tzhouam/personal-agent && cd personal-agent
python -m venv .venv && source .venv/bin/activate
pip install -e .
02

Set up

Run the guided wizard. It walks every section — LLM, GitHub, email — writes your .env, and validates each one live, so a wrong key fails now, not at 7 a.m. tomorrow.

assistant init          # guided setup, validated live
assistant init --check  # re-check anytime: ✅ / ⚠️ / ❌
Recommended model

MiMo mimo-v2.5 on the standard plan — natively multimodal, so photos and receipts just work. Paste this into your .env:

ANTHROPIC_BASE_URL=https://token-plan-cn.xiaomimimo.com/anthropic
ANTHROPIC_MODEL=mimo-v2.5
ANTHROPIC_DEFAULT_HAIKU_MODEL=mimo-v2.5
LLM_SUPPORTS_IMAGES=true
03

Run

Dry-run first — it writes the digest to disk without sending anything. Happy? Drop the flag for the real thing, then let cron run it each morning.

assistant run --dry-run    # full pipeline, nothing sent
assistant run              # the real thing

# once a day, early morning:
0 7 * * *  assistant run || assistant run --resume

Every setting, by hand

The wizard writes all of this and validates it live — but if you'd rather edit .env yourself, here's every group. Run assistant init --check when you're done.

GitHubrequired

A fine-grained personal access token — read-only access to your repos and notifications is enough. It powers the activity collector.

Create a fine-grained token ↗
GITHUB_TOKEN=github_pat_…
GITHUB_USER=your-username
Email · Resendrequired · pick one

The easiest delivery path — a free API key from resend.com sends your daily digest.

Get a Resend key ↗
RESEND_API_KEY=re_…
RESEND_FROM=onboarding@resend.dev
DIGEST_TO=you@example.com
Email · SMTPor this one

Instead of — or alongside — Resend. With Gmail it also unlocks the inbox collector and email chat; use an app password, not your login.

Create a Gmail app password ↗
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=you@gmail.com
SMTP_PASSWORD=app-password
DIGEST_TO=you@gmail.com
Résumé syncoptional

Point it at your Overleaf git-bridge (or any git remote holding your .tex), then run assistant resume-init. Every edit is gated on your explicit okay.

Overleaf Git setup ↗
RESUME_REMOTE_URL=https://git:TOKEN@git.overleaf.com/PROJECT_ID
Websiteoptional

Publish your profile to a GitHub Pages repo. The password encrypts the private todos / reading / routines pages in your browser.

Create the Pages repo ↗
WEBSITE_REPO=you/you.github.io
WEBSITE_PASSWORD=a-strong-passphrase
Web searchoptional

Sharpens chat answers and task research. Keyless DuckDuckGo works out of the box; add a key for better results.

Get a Gemini key ↗
GEMINI_API_KEY=   # recommended
TAVILY_API_KEY=   # or this
Multi-model · MoAoptional

Route each role to its own model (LLM_ROLES), or run Mixture-of-Agents — several models propose in parallel and one aggregates — on the offline roles (LLM_MIXTURE). A dead or empty member is dropped, so it keeps working as long as one proposal survives.

Multi-model routing docs ↗
LLM_ROLES={"chat":{"model":"mimo-v2.5"}}   # one line needs no quotes
# each member is {model, base_url?, api_key?}; span lines only if 'single-quoted'
LLM_MIXTURE='{"members":[
  {"model":"mimo-v2.5","base_url":"https://token-plan-cn.xiaomimimo.com/anthropic","api_key":"tp-…"},
  {"model":"qwen3.6-plus","base_url":"https://dashscope.aliyuncs.com/apps/anthropic","api_key":"sk-…"}],
  "aggregator":{"model":"deepseek-v4-pro","base_url":"https://api.deepseek.com/anthropic","api_key":"sk-…"},
  "roles":["pipeline"]}'

Every knob — website marks sync, WeChat announce, research sources — is documented inline in .env.template.


What you wake up to

One quiet run each morning turns yesterday into four things worth having.

Morning digest

Triaged before coffee

GitHub notifications sorted red / yellow / white against your profile, new papers worth reading, and your open todos — one email.

Living profile

Backed by what you did

A picture of you that keeps itself current — every skill cited to something you actually shipped. Nothing invented.

Personal site

Renders itself, honestly

Publishes a website straight from your profile, rendered deterministically — no model ever writes a public page.

Résumé sync

Aligned, never auto-pushed

Keeps your résumé matched to your profile, gated on a compile and your explicit okay — never pushed without you.


Optional · chat channel

Chat from your phone

Email chat works the moment setup finishes. For WeChat — plus proactive reminders and a gateway that can run your daily schedule — connect it through OpenClaw. The agent stays the only brain; OpenClaw is just transport.

step c prints a QR in your terminal — scan it here
a

Install the gateway

# the gateway needs Node ≥ 22.19
npm i -g openclaw @tencent-weixin/openclaw-weixin
b

Link the bridge plugin

# from the repo — --link tracks it, so updates are a git pull
openclaw plugins install --link ./openclaw-plugin
c

Scan to log in

openclaw channels login --channel openclaw-weixin

The gateway binds to the account that scans, so the sender is always you — no pairing to approve. It can also run your daily digest and weekly consolidation as cron jobs, so a WeChat setup needs no separate scheduler.


Then just talk to it

Day to day, you text it — over WeChat or email. Log spending, track workouts, send a receipt photo, or hand it a whole multi-step task.

you
Lunch was 45
agent
✔ logged: expense 45 CNY · food · lunch · 12:30
you
receipt.jpg
agent
Read ¥68 · 面点王 · 12:30 from the receipt — ✔ logged as food.
you
Look into three Sichuan places and remind me to book Friday
agent
On it — I'll work through it step by step and message you the result. ⏱ reminder set for Friday.

Local-first. Open source. Yours.

Everything runs and stays on your machine. The only things that leave are the LLM calls, your digest email, and the sites you point it at.