Automation
Scheduled prompts, stopping conditions, headless runs, and deep links — the smaller pieces that make Claudin run without someone watching.
Scheduled prompts
Three tools handle it: CronCreate takes a standard 5-field cron expression, a prompt to enqueue when it fires, and two flags — recurring (default true) and durable (default false). A non-durable job lives only in the running process's memory; a durable one is written to .claudin/scheduled_tasks.json and survives a restart. CronList and CronDelete round it out. There's no daemon — everything fires from inside a running Claudin process, on a timer, only while the REPL is idle. If Claudin isn't running, a durable job just waits on disk until the next launch, at which point missed one-shots surface for catch-up. CLAUDE_CODE_DISABLE_CRON=1 turns the whole scheduler off.
A related, narrower tool, ScheduleWakeup, handles one-shot, session-only delays — no cron expression, just a delay in seconds and an optional prompt.
The /loop skill sits on top of both, picking the right primitive for how it's called:
| Usage | What happens |
|---|---|
/loop 5m check the deploy | Fixed interval — a recurring CronCreate job. |
/loop check the deploy | Dynamic — the model picks its own delay each iteration via ScheduleWakeup. |
/loop (no arguments) | Maintenance mode — reads .claudin/loop.md or ~/.claudin/loop.md if present, else a built-in maintenance prompt. |
Stopping conditions
/goal <condition> sets a session-scoped stopping condition: every time the assistant tries to stop, an LLM judge checks the transcript against the condition and blocks the stop until it holds, then clears itself automatically. /goal clear ends it early; bare /goal shows the condition, iteration count, elapsed time, and tokens used. It works in headless mode too — there's no user around to say "keep going," so the goal does that instead. Limits: 4,000-character condition, 120-second judge timeout, 50 iterations interactive / 10 non-interactive.
This is a different mechanism from Task tracking (TaskCreate/TaskList/TaskGet) — Tasks track discrete units of work; a goal gates whether the session is allowed to stop at all, implemented as a session-scoped Stop hook.
Headless mode
-p/--print runs Claudin non-interactively — the prompt is a separate argument (claudin -p "text") — for scripts, CI, or piping into other tools.
| Flag | Meaning |
|---|---|
--output-format text|json|stream-json | Structured output, including cost. |
--input-format stream-json | Stream input in, requires stream-json output. |
--include-partial-messages | Stream partial assistant messages (requires -p + stream-json). |
--no-session-persistence | Don't write session state to disk. |
claudin -p "summarize the failing tests" --output-format json
Launch from a link
A claude-cli://open URI opens a new terminal window with Claudin already running:
claude-cli://open
claude-cli://open?q=hello+world
claude-cli://open?q=fix+tests&repo=owner/repo
claude-cli://open?cwd=/path/to/project
q pre-fills the prompt input — it does not submit it, so a link can't silently trigger an instruction without someone pressing Enter. cwd sets the working directory directly; repo resolves an owner/repo slug against locally known clones if cwd isn't given.
A separate scheme, cc://, is unrelated: it's for connecting to an already-running Claudin session on another machine (claudin open <cc-url>), not for pre-filling a prompt from a webpage.