Back GitHub

Handbook · Neoism Agent

Scheduled Workflows#

Scheduled workflows are agent prompts stored as Markdown files. YAML frontmatter controls where, when, and how the agent runs. The Markdown body is the prompt submitted to a normal durable Neoism Agent conversation.

Locations#

Scope Canonical directory
Project <workspace>/.neoism/workflows/
Global ~/.config/neoism/workflows/
Config override $NEOISM_AGENT_CONFIG_DIR/workflows/

Neoism also recognizes singular workflow/ directories and the inherited $HOME/.neoism config root. Global workflows run separately in each tracked workspace, because every workflow conversation needs a workspace and project context.

Files can be nested under these directories. Every workflow file must use the .md extension.

Complete example#

---
id: daily-review
name: Daily workspace review
active: true
directory: packages/web
schedule:
  frequency: daily
  interval: 1
  time: 9:30 AM
  timezone: America/Los_Angeles
agent: build
model:
  providerId: anthropic
  modelId: claude-sonnet-4
permissions:
  read: allow
  edit: deny
  bash:
    default: deny
    allow:
      - git status*
      - git diff*
---

Review recent changes and outstanding tasks for this package.
Return a concise report. Do not modify files.

Frontmatter reference#

Field Required Meaning
id Yes Stable lowercase slug containing letters, numbers, ., _, or -.
name Yes Human-readable workflow and conversation title.
active No true enables automatic execution. Defaults to false.
schedule Yes One-time or recurring schedule described below.
directory No Existing relative, home-relative, or absolute execution directory. Project workflows default to the workspace root; global workflows default to the OS home directory.
agent No Configured agent name. The normal default agent is used when omitted.
model No Provider, model, and optional variant selection.
skill No Configured skill whose content is prepended to the prompt.
permissions No Workflow permission overrides. Agent permissions are inherited when omitted.

Unknown fields, invalid combinations, empty prompts, and malformed values produce a workflow diagnostic instead of silently changing behavior.

Conversation directory and project#

When directory is omitted, a project workflow under <workspace>/.neoism/workflows/ creates its conversation in the tracked workspace root:

id: root-review
name: Root review
active: true
schedule:
  frequency: daily
  time: 09:00

The resulting session remains attached to the root project and is available in normal agent session history. A global workflow under ~/.config/neoism/workflows/ instead defaults to the operating system home directory ($HOME on Linux and macOS, and the user profile directory on Windows).

Set directory to run in a specific project subdirectory:

directory: packages/web

Relative paths resolve from that workflow's default directory: the workspace root for project workflows and the OS home directory for global workflows. Home-relative and absolute paths are also supported:

directory: ~/Documents/x/y
directory: /srv/projects/example

The directory must already exist. Neoism canonicalizes it, records the exact directory on the conversation, and performs normal project discovery there. A directory inside a Git worktree is categorized under that Git project. A directory outside a Git worktree is categorized as global.

Activation and hot reload#

active: true

Neoism uses native filesystem events. Creating, saving, atomically replacing, renaming, or deleting workflow files immediately triggers a debounced reconciliation. There is no short filesystem polling loop.

Saving active: false pauses future automatic runs without deleting history. Saving active: true activates or reactivates the workflow. Prompt, schedule, directory, agent, model, skill, and permission edits are loaded before the next run.

The activate and pause API routes remain available as temporary runtime overrides. A later source-file change makes frontmatter authoritative again.

One-time schedules#

Use an ISO calendar date, an optional time, and a timezone:

schedule:
  date: 2026-09-15
  time: 10:40 PM
  timezone: America/Chicago

time defaults to 00:00. timezone defaults to UTC.

A completed one-time workflow does not run again. Activating it after its timestamp has passed does not run it retroactively.

Complete timestamp#

Use at for an RFC 3339 timestamp containing its UTC offset:

schedule:
  at: 2026-09-15T22:40:00-05:00

at cannot be combined with date, time, frequency, interval, minute, weekdays, or monthDay.

Recurring schedules#

Hourly#

schedule:
  frequency: hourly
  interval: 2
  minute: 15
  timezone: UTC

This runs every second matching hour at 15 minutes past the hour.

Daily#

schedule:
  frequency: daily
  interval: 1
  time: 09:30
  timezone: America/Los_Angeles

Weekly#

schedule:
  frequency: weekly
  interval: 1
  time: 8:00 AM
  timezone: Europe/London
  weekdays: [monday, thursday]

Weekdays accept full names or mon, tue, wed, thu, fri, sat, and sun.

Monthly#

schedule:
  frequency: monthly
  interval: 1
  time: 10:00
  timezone: UTC
  monthDay: 31

monthDay accepts 1 through 31. If the selected day is beyond the end of a month, Neoism uses that month's final day.

Schedule field compatibility#

Schedule kind Fields
One-time date date, optional time, optional timezone
One-time timestamp at
Hourly frequency, optional interval, optional minute, optional timezone
Daily frequency, optional interval, optional time, optional timezone
Weekly frequency, optional interval, required weekdays, optional time, optional timezone
Monthly frequency, optional interval, optional monthDay, optional time, optional timezone

interval defaults to 1 and must be at least 1. Fields from different schedule kinds cannot be mixed.

Date, time, and timezone formats#

Dates use one unambiguous format:

YYYY-MM-DD

Accepted local time formats are:

22:40
22:40:30
10:40 PM
10:40:30 PM

AM and PM are case-insensitive. Ambiguous locale dates such as 8/9/26 and free-form phrases such as tomorrow morning are intentionally rejected.

Use an IANA timezone such as:

timezone: America/Chicago
timezone: Europe/London
timezone: UTC

timezone: local resolves the operating system's current IANA timezone. Named timezones are safer when a workflow may move between computers.

During daylight-saving transitions, nonexistent local times move forward to the first valid minute. Ambiguous local times run once at the earlier occurrence.

Permissions#

Omit permissions to inherit the selected agent and global configuration:

agent: build

Use a direct action for all targets in one permission group:

permissions:
  read: allow
  edit: deny
  bash: deny

Actions are allow, deny, and ask. Scheduled workflows cannot explicitly use ask, because unattended runs cannot wait indefinitely for approval.

Use default and pattern lists for narrow overrides:

permissions:
  bash:
    default: deny
    allow:
      - notify-send*
      - git status*
    deny:
      - rm *

Pattern precedence is deterministic: explicit deny patterns override allow, explicit allow overrides ask, and all explicit patterns override default. Workflow rules are applied after configured agent rules.

Notification example#

---
id: workflow-notification
name: Workflow notification test
active: true
schedule:
  date: 2026-08-23
  time: 10:40 PM
  timezone: America/Chicago
permissions:
  bash:
    default: deny
    allow:
      - notify-send*
---

Run exactly this command with the bash tool:

`notify-send "Neoism Workflow" "Workflow worked"`

Do not perform any other action.

Agent, model, and skill#

Select a configured agent:

agent: build

Select a model:

model:
  providerId: anthropic
  modelId: claude-sonnet-4
  variant: high

Load a configured skill before the workflow prompt:

skill: release-review

When omitted, Neoism uses the normal agent and model selection for the execution directory.

Execution and recovery#

At the scheduled timestamp, Neoism durably claims the run before creating a session. One activation cannot overlap itself. The session and run remain visible in normal history.

If the daemon was offline for several recurring occurrences, Neoism coalesces the backlog to the latest missed occurrence instead of replaying every interval. A one-time run is eligible only when it was activated before its timestamp.

If Neoism restarts during an unfinished run, that run is marked interrupted instead of automatically repeating possible side effects. Invalid or deleted active source files are paused rather than executing stale prompts.

Preview, manual runs, and history#

The agent server exposes:

GET  /workflow
GET  /workflow/{id}
GET  /workflow/{id}/preview
POST /workflow/{id}/activate
POST /workflow/{id}/pause
POST /workflow/{id}/run
GET  /workflow/{id}/runs?limit=50

Pass the workspace with ?directory=/path/to/workspace or the x-neoism-directory header. Preview returns upcoming UTC timestamps and local representations. Manual runs do not change source activation state.