Skip to main content

Overview

Unlike traditional AI assistants that wait for you to prompt them, NanoClaw Pro checks in on you at scheduled times throughout the day. This proactive behavior helps you stay organized, surface unresolved tasks, and build better habits.

How It Works

Proactive check-ins are implemented using NanoClaw’s built-in task scheduler (src/task-scheduler.ts:242). Each check-in is a scheduled task that runs as a full agent with access to all tools and memory.
Check-ins run in your main channel’s context, giving them access to your memory system and the ability to send messages directly to you.

Morning Check-in (9am)

Every morning at 9am, NanoClaw Pro sends you three questions:
gm! three questions:
1. what did you work on yesterday?
2. what are you working on today?
3. what's one thing you're grateful for?

Implementation Details

The morning check-in is a cron task created using the mcp__nanoclaw__schedule_task tool:
{
  "prompt": "You are Andy, a proactive AI assistant. It's morning check-in time...",
  "schedule_type": "cron",
  "schedule_value": "0 9 * * *"  // Daily at 9am
}
Before sending the check-in message:
  1. Reads your profile from ~/memory/context/profile.md
  2. Searches memory using qmd to find what you’re currently working on
  3. Personalizes the message based on your specific projects and context

Dynamic Reminder Detection

After you respond, the morning check-in automatically scans for time-sensitive mentions:

Birthday Reminders

“my friend’s birthday is monday” → creates a reminder for Sunday

Deadline Tracking

“i have a deadline friday” → creates a check-in for Thursday

Follow-ups

“remind me to follow up with X” → schedules a follow-up task

Events

“meeting at 3pm” → creates a reminder 30 minutes before
Dynamic reminders are created automatically using mcp__nanoclaw__schedule_task — you don’t need to explicitly ask for a reminder.

Afternoon Wrap-up (4pm)

At 4pm daily, NanoClaw Pro surfaces anything that needs follow-up:
hey, wrapping up the day —
- [surfaces 1-2 things from today that need follow-up]
- anything you want done before end of day?
- any emails or messages to send? just say it out loud and i'll write it

What Happens During Wrap-up

  1. Reviews today’s conversations to find unresolved items
  2. Creates scheduled tasks for tomorrow based on your responses
  3. Offers to draft emails/messages — you just describe them out loud
  4. Updates memory by appending to ~/memory/notes/daily-log.md
  5. Embeds new memory by running qmd update && qmd embed

Configuration

Customizing Check-in Times

Check-in times are configured when you run /proactive-agent. The skill asks for your timezone and creates cron tasks accordingly. To change check-in times after setup:
# List your current tasks to find the IDs
@Andy list my scheduled tasks

# Update the schedule using the task ID
@Andy update task 1 to run at 7am instead
Or modify the cron expression directly in the SQLite database:
-- View current tasks
SELECT id, prompt, schedule_value FROM scheduled_tasks;

-- Update morning check-in to 7am
UPDATE scheduled_tasks 
SET schedule_value = '0 7 * * *' 
WHERE prompt LIKE '%morning check-in%';
Direct database modifications require restarting NanoClaw for changes to take effect.

Customizing Message Style

The default style is casual and lowercase. You can customize this by updating your group’s CLAUDE.md:
## Writing Style
- Always lowercase
- No em dashes  
- Emojis sparingly (0-1 per message)
- Casual and personable, like a friend
- Short messages, not walls of text
To change the style:
@Andy remember: use formal language and proper capitalization in check-ins

Disabling Check-ins

To pause check-ins temporarily:
@Andy pause my scheduled tasks
To disable specific check-ins:
@Andy list my scheduled tasks
@Andy pause task 1  # Morning check-in
@Andy pause task 2  # Afternoon wrap-up
To resume:
@Andy resume task 1

Technical Implementation

Task Execution Flow

When a check-in task becomes due:
  1. Scheduler loop (src/task-scheduler.ts:250) polls every 60 seconds for due tasks
  2. Task is enqueued in the group’s message queue (src/task-scheduler.ts:265)
  3. Container spawns with the task prompt as input (src/container-runner.ts:258)
  4. Agent executes with access to:
    • Memory system (qmd)
    • File operations (Read/Write/Edit)
    • Message sending (mcp__nanoclaw__send_message)
    • Task creation (mcp__nanoclaw__schedule_task)
  5. Result is sent to your channel via sendMessage (src/task-scheduler.ts:189)
  6. Next run scheduled using computeNextRun() (src/task-scheduler.ts:31)

Preventing Drift

Interval-based tasks anchor to the scheduled time, not execution time, to prevent cumulative drift:
// From src/task-scheduler.ts:31
export function computeNextRun(task: ScheduledTask): string | null {
  if (task.schedule_type === 'interval') {
    const ms = parseInt(task.schedule_value, 10);
    // Anchor to scheduled time, not now, to prevent drift
    let next = new Date(task.next_run!).getTime() + ms;
    while (next <= now) {
      next += ms;
    }
    return new Date(next).toISOString();
  }
}

Best Practices

Respond Thoughtfully

Check-ins build your memory over time. Detailed responses help the agent learn your patterns and preferences.

Use Natural Language

Mention time-sensitive things casually — “my meeting is thursday” works better than structured data.

Review Task List Weekly

Check @Andy list all tasks weekly to remove outdated reminders.

Update Your Profile

Keep ~/memory/context/profile.md current with your active projects and preferences.

Troubleshooting

Check-ins Not Arriving

Check if tasks are scheduled:
@Andy list my scheduled tasks
Verify tasks are active:
SELECT id, prompt, status, next_run 
FROM scheduled_tasks 
WHERE status = 'active';
Check scheduler is running:
tail -f logs/nanoclaw.log | grep "Scheduler loop"

Check-ins Too Generic

Solution: Update your memory and profile:
# Add project details to memory
echo "## Current Projects\n\n- Building NanoClaw Pro docs\n- Learning TypeScript" > ~/memory/projects/current.md

# Embed the new memory
QMD_DIR=~/.qmd ~/.local/bin/qmd update && ~/.local/bin/qmd embed

Wrong Timezone

Check current timezone setting:
grep TIMEZONE .env
Update timezone:
echo "TIMEZONE=America/New_York" >> .env
# Restart NanoClaw
launchctl kickstart -k gui/$(id -u)/com.nanoclaw

Build docs developers (and LLMs) love