The Machine finds out what to do and does it JeroenCorthout released TheMachine, an early-release, self-hosted personal assistant inbox for OpenClaw that reads Gmail, Google Calendar, Slack, Salesflare CRM, Android notifications, WhatsApp and OpenClaw Gateway failures into a private SQLite database and delivers short suggestions to Telegram. The service contains no model itself; all interpretation runs in the owner's existing OpenClaw main agent, and tapping "Do it" triggers an isolated preparation turn that drafts an email, makes a fix or does research. Managed installation is Linux-only, requires Python 3.12+, and fresh installs leave AI reviews and Telegram delivery off until the owner runs ./install.sh --activate. A private, self-hosted assistant inbox for OpenClaw https://docs.openclaw.ai . It reads your email, calendar, chat and phone notifications, has your own OpenClaw agent look for what actually needs you, and sends a few short suggestions to Telegram. Tap Do it and the agent carries the task out. Early release: intended for a single owner who already uses OpenClaw. Managed installation is Linux-only. All screenshots and demo content below are synthetic. git clone https://github.com/JeroenCorthout/TheMachine.git cd TheMachine python3 demo.py Open http://127.0.0.1:8788/ http://127.0.0.1:8788/ . Only Python 3.12+ is needed: no OpenClaw, accounts, API keys or installation. Buttons change a disposable in-memory demo; nothing is sent or run. Stop with Ctrl+C. Use --port 8789 if the port is busy. git clone https://github.com/JeroenCorthout/TheMachine.git ~/.openclaw/workspace/tools/personal-assistant cd ~/.openclaw/workspace/tools/personal-assistant ./install.sh Read Requirements requirements first. The installer checks prerequisites, asks for your owner identity and source choices, writes the config and secrets, installs the systemd user service and the OpenClaw plugin, and ends with a health check and the remaining manual steps connecting Gmail, exposing the dashboard on your tailnet . Fresh installs collect configured sources but leave AI reviews and Telegram delivery off . Once you have connected the sources, checked assistant sources and read Security model security-model , run ./install.sh --activate . Run the installer again to upgrade; ./install.sh --uninstall removes it again see Install install . Contents: What it does what-it-does · Architecture architecture · Requirements requirements · Install install · Configuration configuration · Sources sources · Reviews reviews · Telegram and the dashboard telegram-and-the-dashboard · Do it do-it · Security model security-model · Command line command-line · Operations operations · Adding a source adding-a-source · Known limitations known-limitations · Tests tests - Collects signals from Gmail, Google Calendar, Slack, the Salesflare CRM, Android notifications through the OpenClaw node app , WhatsApp through a local wacli store and the OpenClaw Gateway's own failures. Collection is incremental and read-only by default; everything goes into one private SQLite database with full-text search. - Reviews waiting signals in isolated turns of your existing OpenClaw main agent. The agent saves a suggestion only when something is worth your time: an unanswered request, a deadline, a problem it can fix. - Delivers suggestions as Telegram cards through your existing OpenClaw bot, with a phone-friendly dashboard installable as an app, with optional push notifications on your tailnet. - Acts when you tap Do it : the agent drafts the email with a Send button , makes the fix, or does the research, and reports back on the same card. Change lets you reply with instructions; Snooze , Dismiss and Mark done work as you'd expect, and your choices steer later reviews. The service itself contains no model. All interpretation happens in your OpenClaw agent, with your model provider. Gmail · Calendar · Slack · CRM · Android notifications · WhatsApp · OpenClaw Gateway │ read-only collectors, one thread and checkpoint per account ▼ assistant.py systemd user service → private SQLite + full-text search, local API on 127.0.0.1 │ ▼ OpenClaw main agent, isolated review turns started by the service → short suggestions │ ▼ Telegram bot via OpenClaw ⇄ owner decisions ⇄ dashboard on your tailnet · assistant CLI │ ▼ Do it → isolated preparation turn of the same agent → result, draft + Send, or blocker | Path | Role | |---|---| | assistant.py | Collectors, SQLite store, local API, dashboard server, Telegram outbox, review and preparation workers | | dashboard.html , sw.js , manifest.webmanifest , brand/ | Owner dashboard and installable web app | | cli.py | The assistant command line | | next actions.py | Approved email sends Gmail via gog | | preparation state.py , rollout health.py | Preparation bookkeeping and health checks | | openclaw-plugin/ | personal-assistant-bridge : the assistant signals tool, Telegram buttons and replies, Android feed capture, review/preparation guards | | .mjs | Small Node helpers that call the OpenClaw Gateway openclaw-root.mjs finds the installed package | | integrations/browser-lease.py | Shares the OpenClaw browser between concurrent Do it runs | | AGENTS.md , PREPARATION.md | Instructions the plugin gives the agent for reviews and for Do it runs templates; see below | | install.sh , installer.py | Install, upgrade and uninstall | | config.example.json | Every configuration key with example values | | deploy/ | Example systemd units and Caddyfile | | test .py , test .mjs | Offline tests | Python's standard library and SQLite are enough: no database server, queue, web framework or extra scheduler. Runtime data lives in ~/.local/share/personal-assistant/ : config.json , events.sqlite , tokens and receipts. Data model. The main tables are events with an event search full-text index , checkpoints , sync activity , analyses reviews , review runs , suggestions , decisions , deliveries the Telegram outbox , preparations and action jobs approved sends . Provider IDs deduplicate events per account; a changed event gets a new version and becomes reviewable again. Each source page commits its events and next cursor in one transaction, so a crash replays the page instead of losing or duplicating it. Boundaries. Every account has an explicit ID and boundary work:Acme , personal:phone , owner:system … . Every read names its accounts explicitly; app names and chat labels never decide which company an item belongs to. - Linux with systemd user services macOS works for development and tests, not as a managed service . - Python 3.12+ standard library only . - Node.js 24.16+ within the 24.x series, or 26.1+ =24.16.0 <25 || =26.1.0 , matching the pinned OpenClaw engine range . Node 22 and 25 are unsupported. The installer resolves mise/asdf shims and the installed npm package. - OpenClaw 2026.10.2 , with the Gateway running and its Telegram channel set up with your bot. Other versions are untested; see Known limitations known-limitations . - Optional, per feature: - gog Google Workspace CLI for Gmail and Calendar OAuth per account, file keyring . - Tailscale for dashboard access the dashboard only serves your Tailscale identity . - Caddy only to serve the dashboard on a custom domain deploy/Caddyfile . - wacli for WhatsApp; a Maton connection for Slack; a Salesflare API key. - The OpenClaw Android app paired as a node for phone notifications. ./install.sh interactive install, or upgrade ./install.sh --non-interactive same, answers from environment variables below ./install.sh --no-start write files/link plugin; do not start service or reload plugin ./install.sh --activate existing install: enable AI reviews and Telegram delivery ./install.sh --skip-plugin leave the OpenClaw plugin alone ./install.sh --uninstall remove service, plugin and CLI link; keep your data ./install.sh --uninstall --purge also delete ~/.local/share/personal-assistant What it does, in order: 1. Prerequisites: Python, Node and the openclaw CLI are required, with fix hints. gog , tailscale , caddy and wacli are optional per feature. systemctl is required to start the managed service; use --no-start for manual setup. 2. Config: if ~/.local/share/personal-assistant/config.json doesn't exist, a short wizard your name, Telegram chat ID, Tailscale login, dashboard host, time zone, which sources builds it from config.example.json . An existing config is kept as is; only missing top-level keys get their defaults, and install paths app dir , openclaw , node , openclaw package dir are refreshed. 3. Secrets: creates api-token , owner-token and the Web Push key vapid.json when absent, mode 600 in a 700 directory. Existing secrets are never replaced. 4. CLI: links ~/.local/bin/assistant to cli.py . 5. Plugin: openclaw plugins install --link --force --accept-capabilities openclaw-plugin/ , openclaw plugins enable personal-assistant-bridge , then a reload. Running the installer accepts the local bridge's OpenClaw capability consent: it registers the assistant tool, owner Telegram commands and event hooks described in the security model. The plugin reads AGENTS.md and PREPARATION.md from app dir this checkout , so edits there apply to the next turn. 6. Service: writes ~/.config/systemd/user/personal-assistant.service with this checkout's paths, then daemon-reload , enable and restart . 7. Health: waits for http://127.0.0.1: