An OpenClaw plugin that acts as an executive function prosthetic for skill practice. It provides body-doubling, scaffolded daily sessions, and gentle accountability for users with ADHD and executive function challenges who are learning skills like instruments or languages.
On a low-motivation day, practic provides enough external structure -- the nudge, the plan, the step-by-step guidance -- that the user practices instead of skipping. Lowering the bar beats a zero.
- Scaffolded practice sessions -- step-by-step guidance through warmup, main work, and cool-down with check-ins
- Energy-aware modes -- "light day" lowers the bar instead of skipping; a 10-minute session beats a zero
- Homework capture -- capture assignments after lessons and distribute them across practice days
- Item frequency modes -- items can be "distributed" (spread across the week, e.g. Danish homework) or "every-session" (practiced every day, e.g. guitar scales)
- Weekly planning -- generates a day-by-day practice plan with checkboxes, viewable in Obsidian
- Daily nudges -- heartbeat-triggered reminders at your preferred practice time per discipline
- Gentle resume -- after a break, references your last positive session instead of highlighting the gap
- Lesson prep reminders -- the day before a scheduled lesson, suggests what to review
- Item tracking -- tracks songs, exercises, and chapters with spaced repetition suggestions
- Goal countdown -- set a recital, exam, or trip date and get focus cues woven into sessions
- Shake it up -- variety injection picks underplayed items when practice feels stale
- Teacher reports -- lesson-to-lesson practice summaries with structured metrics, ready to share before a lesson
- Weekly reflections -- auto-generated end-of-week narrative appended to the weekly plan, synthesized by the local model
- Skip/break handling -- "skip today" or "need a week off" acknowledged without guilt or judgment
- Multi-discipline -- separate vault folders for each skill (guitar, Danish, etc.)
Practic runs as a stateless MCP server that OpenClaw calls via HTTP. All state lives in an Obsidian vault as markdown files with YAML frontmatter.
OpenClaw (Haiku) --> /mcp --> Practic MCP Server --> Obsidian Vault
|
OpenClaw Heartbeat --> nudge tools --+
|
Ollama (qwen3.6:27b) <-- report/reflection data --+
- MCP server (Express +
@modelcontextprotocol/sdkv1) exposes practice tools - Obsidian vault stores daily logs, weekly plans, item registries, reports, and config per discipline
- Heartbeat tasks call MCP tools to determine when and what to nudge
- Subagent (Ollama qwen3.6:27b) synthesizes teacher reports and weekly reflections from aggregated data
/practice/
guitar/
weekly/2026-W19.md # Weekly plan with day-by-day checkboxes + reflection
daily/2026-05-07.md # Daily practice log
items.md # Item registry (songs, exercises, scales)
goals.md # Active goal and archived goals
config.md # Lesson schedule, preferences, nudge time
danish/
...same structure...
reports/
guitar-2026-05-08.md # Teacher report (lesson-to-lesson period)
| Technology | Version | Purpose |
|---|---|---|
| TypeScript | ^5.9 | Language (strict mode) |
| Node.js | 22 LTS | Runtime |
| Express | ^4.22 | HTTP server |
| @modelcontextprotocol/sdk | ^1.29 | MCP protocol |
| Zod | ^3.25 | Input validation |
| gray-matter | ^4.0 | YAML frontmatter parsing |
| date-fns | ^4.1 | Date arithmetic |
Practic exposes 25 tools across 8 modules. OpenClaw's agent calls these via the /mcp endpoint.
| Module | Tools | Purpose |
|---|---|---|
| Session | start_session, complete_session |
Begin/end a scaffolded practice session with warmup, main work, cool-down |
| Items | list_items, add_item, update_item |
Manage the item registry (songs, exercises, scales, chapters) |
| Logs | get_daily_log, skip_day |
Read today's practice log or record a skip |
| Breaks | set_break, get_break_status, list_disciplines |
Schedule time off and check discipline availability |
| Planning | capture_homework, generate_weekly_plan, get_weekly_plan, set_lesson_schedule |
Homework distribution, weekly plan generation, lesson config |
| Nudges | check_nudge_status, get_resume_nudge, get_lesson_prep |
Heartbeat-driven reminders and lesson prep suggestions |
| Goals | set_goal, get_goal, archive_goal, shake_it_up |
Performance goals with countdown cues and variety injection |
| Reports | generate_teacher_report, save_teacher_report, get_reflection_data, save_reflection |
Practice reports for teachers and weekly reflections appended to plans |
npm install
npm run devThe server starts on PORT (default 3000) and expects VAULT_PATH to point to your Obsidian vault.
VAULT_PATH=/path/to/obsidian/vault PORT=3000 npm run devEnvironment variables:
| Variable | Default | Description |
|---|---|---|
VAULT_PATH |
/home/node/vault |
Path to the Obsidian vault root |
PORT |
3000 |
HTTP server port |
Designed to run as a container in K3s alongside OpenClaw:
# Build the image
docker build -t mcp-practic .
# Or use the build helper
./build-and-push.sh [image-name] [tag]K8s manifests are in deploy/. You'll want to customize these for your cluster:
deploy/deployment.yaml-- updateimage,nodeSelector,TZ, andimagePullSecretsfor your environmentdeploy/openclaw-patches/-- replace placeholder usernames inAGENTS-practice.mdandHEARTBEAT-practice.yaml
kubectl apply -k deploy/The deploy/openclaw-patches/ directory contains the config fragments to add to OpenClaw's configmap:
openclaw-mcp-registration.json-- MCP server registration blockAGENTS-practice.md-- Agent instructions for the practice workflowHEARTBEAT-practice.yaml-- Heartbeat task definitions for daily nudges
See deploy/openclaw-patches/README.md for step-by-step integration instructions.
- Friction is the enemy -- every interaction should be as low-effort as possible
- Lowering the bar > skipping -- "light day" is always an option
- No guilt, no judgment -- missed days are acknowledged without pressure
- External structure compensates for internal executive function gaps
- Praise completion, don't punish absence
MIT