A stripped-down fork of SlowClaw focused on one job:
- run in a single workspace
- execute/schedule workspace scripts
- persist app data locally in SQLite
- serve a simple bundled web UI
The binary name is slowclaw.
- Workspace-only file access policy (hard-enforced in app config/policy)
- CLI + gateway (
/pair,/pair/new-code,/webhook,/health,/metrics) - Cron scheduling
workspace-script <relative/path>scheduled command support- PocketBase delivery for cron/heartbeat output
- Gateway-managed local SQLite store for chat/drafts/history metadata
memory/folder structure (unchanged)- Bundled web UI (local-first gateway API frontend)
- Full-system access / configurable extra roots (
allowed_roots) - External channel integrations (Telegram, WhatsApp, Discord, Slack, etc.)
- Gateway dashboard REST API (
/api/*), SSE, and WebSocket chat endpoints - Old dashboard frontend pages and integration UI
Scheduled scripts are still real process execution. App-level workspace checks are useful, but not a kernel sandbox.
Read SECURITY.md and follow the Workspace-Only Fork Hardening (Before Install) section.
Minimum recommendation:
- dedicated OS user
- dedicated workspace directory
- container/VM (preferred) or Linux sandbox backend (
bwrap/ firejail / Landlock) - restrict network egress unless needed
Required:
- Rust toolchain (
rustc,cargo)
Optional (for rebuilding the web UI):
- Node.js 18+
cargo build --releaseBinary path:
./target/release/slowclaw./target/release/slowclaw gatewayOpen:
http://127.0.0.1:8080/(or your configured gateway port)
The gateway startup log prints the actual UI URL and local store path.
Recommended for full scheduling + chat worker runtime:
./target/release/slowclaw daemonIf pairing is enabled, use the startup pairing code:
curl -X POST http://127.0.0.1:8080/pair -H 'X-Pairing-Code: <code>'Then send prompts:
curl -X POST http://127.0.0.1:8080/webhook \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{"message":"hello"}'Use a stable config/workspace root so files are easy to find:
export ZEROCLAW_CONFIG_DIR="$HOME/.zeroclaw"Avoid pointing ZEROCLAW_WORKSPACE at temporary directories (/tmp, OS temp folders).
By default, temp workspace overrides are ignored unless you explicitly opt in with:
export ZEROCLAW_ALLOW_TEMP_WORKSPACE=1Use this when Mac is already paired and you want to pair phone too.
./target/release/slowclaw pair new-code --token '<existing_bearer_token>'You can also set:
export ZEROCLAW_GATEWAY_TOKEN='<existing_bearer_token>'
./target/release/slowclaw pair new-codeNotes:
- Existing paired sessions remain valid.
config.tomlstores hashed tokens, not plaintext bearer tokens.- You can copy the current token from the web UI: Profile -> Gateway & App Settings -> Show Token / Copy Token.
On first gateway boot, SlowClaw initializes state/local_data.db and automatically checks for
legacy PocketBase data directories (including Application Support/.../pocketbase/pb_data).
If found, it imports legacy records (chat_messages, drafts, post_history,
journal_entries, media_assets, artifacts) before serving traffic.
Optional override for migration source:
ZEROCLAW_LEGACY_POCKETBASE_DATA_DIR=/absolute/path/to/pb_data ./target/release/slowclaw gatewayUse the cron CLI and the workspace-script command form.
Example script (must live inside the workspace):
mkdir -p scripts
cat > scripts/ping.sh <<'SH'
#!/usr/bin/env bash
set -euo pipefail
date > ./last-run.txt
SH
chmod +x scripts/ping.shSchedule it every 15 minutes:
./target/release/slowclaw cron add '*/15 * * * *' 'workspace-script scripts/ping.sh'Notes:
- Path must be workspace-relative.
- Keep scripts small and reviewed.
- Prefer
workspace-scriptover long shell chains. - App policy is not a substitute for OS sandboxing.
The bundled UI is now a local-first React app backed by gateway APIs (replacing the old dashboard).
To rebuild the UI bundle:
cd web
npm install
npm run buildThe gateway serves static assets under /_app/ and uses SPA fallback for /.
Important:
- The web bundle is embedded in the Rust binary at compile time.
- After
webchanges, rebuild both UI and binary:
cd web && npm run build
cd .. && cargo build --releaseThis repo now includes a Tauri v2 scaffold at:
web/src-tauri/
Included:
- secure credential bridge commands (
get_secret,set_secret,delete_secret) backed by OS keyring tauri.conf.json- default capability file
- npm scripts for iOS/Android init + dev
Install before running mobile commands:
- Xcode (full app)
- Rust iOS targets:
rustup target add aarch64-apple-ios x86_64-apple-ios aarch64-apple-ios-sim
- CocoaPods:
brew install cocoapods
cd web
npm install
npm run tauri:ios:initcd web
npm run tauri:ios:dev- Gateway build still uses
npm run build(/_app/asset base) for embedded Rust gateway UI. - Tauri build uses
npm run build:tauri(./asset base) and is wired insrc-tauri/tauri.conf.json. - After
tauri ios init, open the generated Xcode project and set:- camera + microphone usage descriptions
- local network usage description
- ATS exceptions for local HTTP testing if you keep laptop gateway on plain
http://.
iPhone Safari on http://<LAN-IP>:<port> may not expose live getUserMedia recording APIs.
In this fork, Audio/Video buttons fall back to file/capture picker automatically when live recording is unavailable.
Exposed routes now:
GET /healthGET /metricsPOST /pairPOST /pair/new-codePOST /webhookGET /api/chat/messagesPOST /api/chat/messagesPOST /api/media/uploadPOST /api/journal/textGET /api/library/itemsGET /api/library/textPOST /api/library/save-textGET /api/media/{path}GET /andGET /_app/*(static UI)
Removed from the gateway surface in this fork:
/api/events/ws/chat- external channel webhook endpoints (
/whatsapp,/linq,/wati,/nextcloud-talk, etc.)
memory/β agent memory structure (kept intact for future use)pb_data/β legacy PocketBase runtime data (auto-import source)pb_migrations/β legacy PocketBase migrationspocketbase/β legacy PocketBase binary/schema assetsweb/β bundled web UI source/buildscripts/β workspace scripts you schedule
Recommended local checks:
cargo check
git diff --check