The self-hosted scheduler
for unattended AI jobs.
Local. Self-hosted. Plugin-based.
BatchAgent runs your scheduled AI work on your own computer, under your own control. It handles cron scheduling, provider plugins, role-based access, and clear incident alerts, so you always know what ran and what didn't. Nothing about your jobs or credentials leaves your machine unless you decide to send it somewhere.
The gap between “runs quietly” and “runs safely.”
Most scheduling tools only whisper that a task finished. BatchAgent closes the gap with visibility, alerting, and control for every job you run.
Basic scheduled tasks
Runs quietly until it doesn't. No history, no alerts, and no way to verify whether last night's job completed.
Hosted AI scheduler
You get dashboards and alerts, but you surrender your provider credentials and let job data leave your network.
Local telemetry-first execution
Same dashboard, roles, audit trail, and alerting—running securely on your computer under your own control.
Every job below runs the same way: cron-triggered, plugin-executed, logged and escalated like any other. Only the content changes.
These are only the ones I've mapped out so far. If you can describe the job in a sentence, BatchAgent can probably run it on a schedule.
Support Leadsticket-trend-digest
recurring-issue patterns across the week, so a fix ships instead of the same ticket forever.
Support Staffticket-triage-digest
overnight tickets categorized by urgency, first-response drafts ready.
NOC Centre Workersalert-noise-digest
an overnight alert flood, deduped and summarized so the handoff starts with real incidents, not 200 raw pings.
Call Center Managerscall-volume-digest
yesterday's call volume, handle time, and abandonment trends, before the morning huddle.
A growing library of connections, jobs, and system capabilities.
Every provider, job template, and system capability ships as a signed, isolated plugin — the six below run today. A plugin marketplace with buy-and-download support is coming.
Claude CLI
Authenticate with your existing Claude CLI session — no separate API key to manage.
Anthropic API
Direct Anthropic API access via your own key, encrypted at rest.
OpenAI
GPT models via your OpenAI API key, isolated the same way as every other provider.
Ollama
Local models, zero API key, zero data leaving your machine.
sys-log-analysis
The flagship self-diagnosis job — seeded and ready to run on day one.
RBAC
Admin / Operator / Viewer roles, installed like any other plugin.
Built from four pieces that never step on each other.
Add a provider without touching the core
Every job points at a Model — a provider plus a model name, never a hardcoded integration. Every provider plugin is signed and checked before it's loaded, and runs in its own isolated process.
Isolated
A broken plugin can't take down the scheduler, and a plugin only ever sees the credentials you explicitly hand it. Never your full secrets vault.
Pre-flight check
Confirms a provider is reachable and authenticated before a job runs, so an expired login fails fast and visibly instead of silently.
Smart fallback
A plugin can define a fallback model, but it only triggers for failures a retry can actually fix. Never for something that would just fail the same way twice.
JOB
MODEL
provider + model
PLUGIN
isolated process
FALLBACK
on timeout only
Everyone sees only what their role allows
Every person gets their own account. No more sharing one login across a team. Three roles ship out of the box, and admins can build custom roles from individual permissions when those don't fit. Every reveal, role change, and plugin install is attributed to the person who did it, logged separately from job output.
| Permission | Admin | Operator | Viewer |
|---|---|---|---|
| Run & pause jobs | ✓ | ✓ | ✕ |
| View logs & history | ✓ | ✓ | ✓ |
| Reveal secrets | ✓ | ✕ | ✕ |
| Manage roles & users | ✓ | ✕ | ✕ |
Secrets stay encrypted at rest. Revealing one is an admin-gated, audited action, not a click anyone can make. Custom roles compose the same permissions differently.
One incident, not ten alerts
BatchAgent groups repeat failures from the same source into a single incident and counts how many times it's happened, instead of raising a new one every time. Acknowledging just says "I've seen this." Resolving requires a reason, so there's a record of why it was closed, not just that it was.
Transient blips close themselves once a provider recovers. Anything that reaches P1 never auto-closes — a person has to resolve it.
Told when it matters, not flooded when it doesn't
Email and webhooks run off the same event and the same retry logic, so a flapping provider doesn't turn into fifty emails. If a notification itself fails three times, it becomes its own incident instead of vanishing quietly. Every message is templated — priority, source, status, and affected jobs get filled in automatically.
| Channel | Transport | Retries | Routing |
|---|---|---|---|
| SMTP, STARTTLS/TLS | 30s / 2m / 5m | All / P1-only | |
| Webhook | HTTPS only, 15s timeout | 30s / 2m / 5m | HMAC-SHA256 signed |
Know what every job actually costs.
BatchAgent tracks input and output tokens on every run and estimates cost from the per-million-token pricing you enter for your provider. It rolls up into a per-job history you can actually read, not just a number that resets every month.
Input tokens
0
Output tokens
0
Last 7 runs
The job that watches all the others.
sys-log-analysis reads BatchAgent's own run history, figures out what actually broke, and writes a plain report. I built it so I'd stop scrolling through logs at midnight.
Reads what changed
It reads the app log plus every job's run log, but only what's new since the last check, capped at 30 problems a run, so it never re-reports the same old failure forever.
Finds the root cause
For each one, it finds the root cause, checks whether it’s happened before, and proposes a concrete fix. Not just restates that an error occurred.
Three-strike escalation
The same repeat failure count that drives incident escalation feeds this job too. Three strikes on one issue and it’s already P1 before you’ve opened the report.
Protected and seeded
Protected from accidental deletion and seeded on first run alongside two other harmless demo jobs. It’s the one worth running twice, so you can watch it compare against its own history.
Root cause
The provider session expired roughly 14 hours before this run started.
Recurring
Yes, the same issue was flagged in the previous report.
Fix
Re-authenticate the provider, or let this job's fallback model take over automatically.
Escalated to P1: 3 repeat failures on this source.
Answers to no one else.
Nothing about your jobs, secrets, or run history leaves the box unless you configure a notification channel to send it somewhere. Here's what's actually built in.
01127.0.0.1 only
The dashboard is never reachable off the local machine.
02No shell execution
Job commands run as argument arrays, never through a shell, so there’s no command injection surface.
03Secrets encrypted at rest
Unlocked by a passphrase you set once. BatchAgent never stores it.
04Signed, sandboxed plugins
Verified before load, isolated in their own process, and given only the credentials you explicitly grant.
05Every action audited
Secret reveals, plugin installs, role changes — all attributed to the user who did it.
06Rate-limited login & unlock
Repeated guessing gets an account lock, not a second try.
BatchAgent isn't a new agent in your stack.
It won't message you back over WhatsApp, browse the web on your behalf, or decide what to do next. It doesn't do anything an agent does. It's the layer underneath: the thing that runs the AI jobs you've already defined, unattended, on a schedule, and tells you the moment one of them breaks.
| n8n | OpenClaw | BatchAgent | |
|---|---|---|---|
| What it is | General workflow & integration automation | Personal AI assistant, chat-driven | Scheduler for unattended AI-driven jobs |
| How you interact | Visual node editor | Chat apps: WhatsApp, Telegram, Slack, and more | A local dashboard, no chat interface |
| AI's role | One node among hundreds of integrations | The core: an agent that decides and acts for you in real time | The core: every job targets a Model via a plugin |
| Execution model | Trigger-based workflows (webhook/schedule/event) | Interactive and proactive agent actions | Scheduled, unattended, cron-based |
| System access | Sandboxed to workflow nodes | Broad: files, shell commands, browser control | Tightly scoped: no shell exec, a plugin sees only the credentials it’s granted |
| Multi-user access | RBAC on enterprise/cloud tiers | Single-user, personal tool | RBAC built in: Admin/Operator/Viewer + custom |
| Reliability & ops | Per-workflow retry/error branches you configure | Not a focus: no incident or audit system | Built-in incident lifecycle, audit trail, self-diagnosis job |
| You'd reach for this when… | You want to connect app A to app B, maybe with an AI step in the middle. | You want to hand an AI agent your accounts and let it act for you in real time. | You want to run an AI job unattended, on a schedule, and know the moment it breaks. That's exactly why I built this. |
Spec sheet.
Full cron expressions, plus a visual builder for anyone who’d rather not hand-write cron syntax. Overlap-safe queueing, and a supervisor that restarts BatchAgent itself if it crashes.
A local dashboard, run history, plugin management, and a tray icon for at-a-glance health without a browser open.
Here's how I'd get it running on your machine.
Install Node.js
Node.js 18 or newer is the only real prerequisite, plus a signed-in account for at least one AI provider plugin. Claude support ships today.
Get the code
Nothing to provision. It’s a plain Node.js app.
Run try-batchagent.bat
Installs dependencies, seeds three harmless demo jobs, starts BatchAgent.
Open the dashboard
http://127.0.0.1:4180, once the console tells you it’s listening.
Claim your admin account
A one-time setup token appears in the console the first time. Use it to create your account, then it’s retired.
$ try-batchagent.bat
Installing dependencies…
Seeding 3 demo jobs…
BatchAgent listening on 127.0.0.1:4180
Setup token: BA-7f3a9e2c — use it once, then it's gone.