Scheduling

Automate recurring tasks with cron schedules, heartbeats, and webhooks

Foxl can run tasks on schedules - automating work 24/7 without you having to prompt it each time.

Three Trigger Types

Cron (Time-Based)

Standard cron expressions for time-based scheduling. Tell the agent in natural language and it creates the schedule automatically.

What you sayCron expressionWhen it runs
"Every morning at 7am"0 7 * * *Daily at 7:00 AM
"Every Monday at 9am"0 9 * * 1Mondays at 9:00 AM
"Every hour"0 * * * *Top of every hour
"First of every month"0 0 1 * *1st of month, midnight

Heartbeat (Periodic)

Runs at a fixed interval. Foxl ships one heartbeat, the Feed Generator, switched off: once you turn it on it wakes hourly between 07:00 and 23:00 and surfaces items into your Notifications feed rather than replying in a chat. Everything about it lives under Settings > Heartbeat - the switch, Run now, the check frequency (every 15 minutes up to once a day, or a custom interval from 1 minute to 7 days), active hours or Always on, and the instructions, which are HEARTBEAT.md in your workspace. On the Schedules page it is a locked row: change its cadence, but it cannot be deleted. You can add heartbeat-type schedules of your own with their own interval and prompt.

Waiting for something to happen

HEARTBEAT.md takes an optional watch block with a shell command. Foxl runs that cheap command on the interval and wakes the agent only when its output or exit code changed - then hands the agent that output, so the run starts already knowing what it is reacting to.

The block takes command, an optional timeout in seconds (default 20), and mode: changed (the default - wake when exit code or output differ from last time) or mode: nonempty (wake whenever the command prints anything, the right shape for a command that lists work).

A 24/7 agent then stops paying for a model turn every interval just to discover that nothing happened, which means the interval can get shorter rather than longer.

Off unless you configure it. Because HEARTBEAT.md is a file the agent can write, the command is armed only when you set it: send it with the Feed Generator settings (PATCH /api/heartbeat/config with { "watch": { "command": "...", "mode": "changed" } }; "watch": null removes it). That writes the block into the file and records the command outside the workspace. A watch that appears in the file any other way is refused and logged, and the command goes through your tool approval rules like any shell command - a run nobody approves is skipped, not executed.

Webhook (External Trigger)

HTTP endpoints that trigger agent tasks when called from external services.

  • GitHub push events trigger code review
  • Calendar events trigger meeting preparation
  • Custom integrations via webhook URLs

A webhook schedule listens at POST http://127.0.0.1:13847/api/webhook/<your-path> on the desktop's local server. Like every other /api/ call it must carry the desktop's connection token (x-connection-token header or ?tkn=), so in practice it is called by something on your own machine - a script, a git hook, a local automation - rather than from the open internet.

What ships with the page

Schedules arrives with four pre-made jobs, all switched off:

Pre-made scheduleWhen
Morning BriefingWeekdays at 08:30
Evening Wrap-UpWeekdays at 18:00
Weekly ReviewFridays at 17:00
Memory Tidy - a pass over what Foxl remembers about youSundays at 22:00

They are there so the page shows what an agent can do on a schedule instead of an empty list. Nothing runs until you turn one on - Foxl does not start doing work on your machine because you installed it.

Otherwise they are completely ordinary schedules: edit the prompt, change the time, Run now, delete. Deleting one is permanent and it does not come back on the next launch. When you want it back, "Start from a pre-made schedule" appears under the list showing exactly the ones you do not currently have.

Creating Schedules

Just tell the agent what you want automated:

"Summarize my email every morning at 8am"

The agent will:

  1. Create a cron schedule (0 8 * * *)
  2. Set the task prompt ("Check Gmail and summarize unread emails")
  3. Start executing on schedule

You can also be more specific:

"Every weekday at 6pm, check my GitHub notifications and send me a summary on Slack"

Managing Schedules

Open the Schedules page in the sidebar to see:

  • All active schedules with their trigger type and timing
  • Human-readable descriptions (e.g., "Every day at 7:00 AM")
  • Run history with success/failure status and duration
  • Enable/disable toggles for each schedule

Unattended runs are where a rate limit or an outage hurts most. Settings > Model & provider > Automatic fallback lets you list models to try, in order, when the one you picked is unavailable; it only engages after Foxl's own retries are exhausted, and it is off until you turn it on.

On OpenRouter, the Only free models switch in the same pane applies to scheduled runs too, so a key with no credit can still run a schedule.

Use Cases

Morning Briefing

Schedule a daily briefing that checks your email, calendar, and news:

"Every morning at 7am, read my Gmail, check my Google Calendar for today, and give me a briefing"

Competitive Monitoring

Track competitor activity on a daily basis:

"Every day at noon, check competitor.com for any new blog posts or product updates"

Git Status Reports

Get daily summaries of repository activity:

"Every weekday at 5pm, show me a summary of today's git commits across all my repos"

Health Checks

Monitor your services with regular pings:

"Every 5 minutes, check if api.myapp.com is responding and alert me if it's down"

Schedules run on your computer, so it has to be awake and Foxl's local server has to be up. With Settings > General > Keep running when closed on (see Background service) the scheduler lives in the background service, so quitting the app window does not pause it. If the machine sleeps, schedules pause either way.

A missed run is skipped unless you ask otherwise. If a cron job was due at 7am while your laptop was asleep it does not fire retroactively when you wake it - only the next scheduled time does. Each schedule has a Run if missed switch in its editor: turn it on and Foxl runs it once on the next startup instead. Plan accordingly for critical automations - keep the service running or use an always-on machine.

Execution History

Every schedule run is logged with:

  • Timestamp
  • Duration
  • Success or failure status
  • Output summary

View the full history on the Schedules page or ask the agent: "Show me the last 5 runs of my morning briefing schedule."

On this page