Install
openclaw skills install @entguinee-afk/kid-safe-assistant-setupDeploy a locked-down OpenClaw chat assistant for a child: sandboxed tools, safety rules, photo/voice chat, parent progress digest
openclaw skills install @entguinee-afk/kid-safe-assistant-setupDeploys a locked-down, web-chat-only OpenClaw assistant for a child, on a resource-constrained home server, plus a private weekly progress digest for the parent. Derived from a real deployment (two children sharing one container on a 4GB mini PC running Home Assistant OS + Docker).
Use this when a parent wants to give a child their own AI assistant for homework help, with hard safety boundaries and without exposing an admin dashboard, raw tool access, or the parent's own accounts.
openclaw-<child> container (own image, own network, own volume).free -h / swap usage first), add the child as
a second agent inside an existing kid-assistant container instead:
workspace at ~/.openclaw/workspace-<child>, its own SOUL/IDENTITY/USER/
AGENTS files, own WhatsApp account if used. This roughly halves memory
versus a second full container. Disable unused plugin modules (browser,
canvas, ollama, openai, talk-voice, xai, etc.) to shrink RSS further —
keep only what's actually used (e.g. device-pair, a TTS provider,
whatsapp).tools.profile: minimal plus an explicit tools.deny list covering exec,
fs, web, browser, sessions, messaging, plugins — the child's assistant
should have zero tool access, full stop. Disable elevated.--session-id $(date +%s), since a
reused session can recall tools from its own history even after the
profile changes) that no tools are exposed.tools.deny (e.g. a claude binary giving Bash access outside OpenClaw's
control), neutralize it (e.g. rename claude → claude.disabled) so the
model can't reach it.In the child's own language, tutoring tone:
Add capability clauses to match whatever the web chat page actually offers (see §4) — don't let the persona say "I can't do X" for something the page already supports. Concretely worth including: reading photos of lessons/ sheet music (name it as a specific capability, e.g. "you know how to read a score exactly like a math exercise" — a generic "I can help with school subjects" undersells it and the model will otherwise deny the capability by default), light language-learning tutoring (vocabulary, short exercises, not grammar lectures), and how the child should interpret "read this aloud" requests given the actual TTS mechanism in place.
A parent generally wants the child to have "a chat page like mine" without the config/dashboard access that would let them read a sibling's conversations or change rules. Build a minimal reverse-proxy web app instead of exposing the OpenClaw dashboard:
/v1/chat/completions endpoint with
model: openclaw/<agentId> and a user: web:<child>:<conv> session key.{conv, messages:[{role, text, ts}]}), where "new conversation" just
increments conv and pushes a sep marker — never truncate history. This
is what makes a later progress digest (§6) possible.If the code volume is mounted :ro into the running container (recommended,
§4), you can't docker exec a write into it. Use a disposable helper
container that mounts the same named volume without :ro:
cat new-file | docker run --rm -i -v <app_volume>:/srv/chat alpine \
sh -c 'cat > /srv/chat/<file>'
Piping through stdin like this avoids host/container path-namespace
mismatches (a bind-mount source path that doesn't exist on the actual Docker
host gets silently auto-created as an empty directory, which breaks a plain
docker cp or -v hostfile:... approach if your shell isn't actually on
the Docker host). Then recreate or restart the real container — if it reads
the file into memory once at startup rather than per-request, a restart is
required for the change to take effect. Reconstruct the docker run command
from docker inspect <container> (image, cmd, port bindings, cap-drop,
memory, healthcheck, log config, volumes) if the original command wasn't
saved, rather than guessing flags.
Rather than giving the parent raw transcript access (which reopens the privacy/trust question the whole design avoids), add a narrow, token-gated, read-only export the parent's own (full-access) assistant can pull from on a schedule:
GET /export/<child>?token=...&since=<ms> route to the web chat
server, guarded by a random shared-secret token (crypto.timingSafeEqual,
not ===) stored in an env file — separate from the per-child login
passwords. It returns only {role, text, ts} for messages at/after
since; nothing else about the account.agentTurn payload, --announce --channel whatsapp --to <parent>) whose prompt: loads the export token from a credentials file,
computes "7 days ago" itself, curls the export endpoint for each child,
and asks the model to summarize subjects covered / homework done /
perceptible progress — explicitly instructed to never repeat the raw
message text, only a synthesis. Test it once with a manual trigger
(openclaw cron run <id>) before trusting the schedule, and check
openclaw cron runs --id <id> for delivery status.tools.profile: coding (or similar) can silently strip the message
tool from a cron job, so a task "succeeds" but delivers nothing — always
give cron jobs an explicit --announce/delivery target and check a real
run's delivery status, not just its exit code.--health-cmd explicitly for the
real service when recreating a container from a stock image.