--send-at--send-at to any kimaki send command. It accepts a one-time UTC ISO timestamp (ending in Z) or a cron expression:12345678# One-time: run at a specific UTC time kimaki send --channel <channel-id> --prompt 'Review open PRs' \ --send-at '2026-03-01T09:00:00Z' # Recurring: every Monday at 9am UTC kimaki send --channel <channel-id> \ --prompt 'Run the test suite and summarize failures' \ --send-at '0 9 * * 1'
Z, and cron expressions fire in UTC too. Convert from your local time before scheduling.cron 0 7 * * * │ ▼ ┌─────────┐ ┌──────────┐ ┌───────────┐ │ read │ ───▶ │ post │ ───▶ │ you reply │ │ inbox │ │ digest │ │ (mark) │ └─────────┘ └──────────┘ └───────────┘
123kimaki send --channel <channel-id> \ --prompt 'Use the zele CLI to read my unread emails. Post a concise digest grouped by sender and importance. List the message IDs so I can act on them.' \ --send-at '0 7 * * *'
zele commands. The whole loop, read then act, happens from one Discord thread.--notify-only. It posts a thread you can reply to later:123kimaki send --session <session-id> \ --prompt 'Reminder: <@user-id> the staging API key created today expires 2026-06-01. Renew it before it breaks prod.' \ --send-at '2026-05-28T09:00:00Z' --notify-only
0 9 1 * * monthly schedule.send flags (--notify-only, --worktree, --agent, --model, --user) work with --send-at. The exception is --wait, which is incompatible since the task runs in the future.--pre-run to run a shell command in the project directory before a scheduled occurrence starts. This example uses crisp-cli to start a support session only when Crisp has unread customer messages.scripts/should-run-support.ts:12345678910111213141516171819202122232425#!/usr/bin/env bun import { $ } from 'bun' type Conversation = { session_id: string unread?: { operator?: number } preview_message?: { from?: string } } const output = await $`crisp-cli list_website_conversations`.text() const response = Bun.YAML.parse(output) as { items?: Conversation[] } const requests = (response.items ?? []).filter((conversation) => { return ( (conversation.unread?.operator ?? 0) > 0 && conversation.preview_message?.from === 'user' ) }) const sessionIds = requests.map((conversation) => conversation.session_id) if (sessionIds.length === 0) process.exit(1) console.log(Bun.YAML.stringify({ sessionIds }))
from: user check excludes operator replies. Install and configure the CLI once before scheduling:12pnpm add -g crisp-cli crisp-cli config --token '<crisp-mcp-token>'
1234kimaki send --channel <channel-id> \ --send-at '*/5 * * * *' \ --pre-run 'bun scripts/should-run-support.ts' \ --prompt 'Read the Crisp session IDs in the pre-run output. Use crisp-cli to inspect each conversation and draft a support reply.'
--allow-concurrency only when parallel runs are safe.1234kimaki task list kimaki task edit <id> --prompt "new prompt" [--send-at "new schedule"] \ [--pre-run "command"] [--allow-concurrency true|false] kimaki task delete <id>
/tasks slash command lists scheduled tasks in Discord with cancel buttons. For the full kimaki send reference and CI usage, see CI & Automation.