MIT Licensed · Self-hosted · Runs on 127.0.0.1

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.

Stays on your computer Role-based access Encrypted secrets Full audit trail
The gap

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.

Method A

Basic scheduled tasks

Runs quietly until it doesn't. No history, no alerts, and no way to verify whether last night's job completed.

Method B

Hosted AI scheduler

You get dashboards and alerts, but you surrender your provider credentials and let job data leave your network.

Recommended
Method C · BatchAgent

Local telemetry-first execution

Same dashboard, roles, audit trail, and alerting—running securely on your computer under your own control.

12 roles. One scheduler underneath.

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 Leads
Support Leads

ticket-trend-digest

recurring-issue patterns across the week, so a fix ships instead of the same ticket forever.

Support Staff
Support Staff

ticket-triage-digest

overnight tickets categorized by urgency, first-response drafts ready.

NOC Centre Workers
NOC Centre Workers

alert-noise-digest

an overnight alert flood, deduped and summarized so the handoff starts with real incidents, not 200 raw pings.

Call Center Managers
Call Center Managers

call-volume-digest

yesterday's call volume, handle time, and abandonment trends, before the morning huddle.

Everything is a plugin

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.

Connection

Claude CLI

Authenticate with your existing Claude CLI session — no separate API key to manage.

Connection

Anthropic API

Direct Anthropic API access via your own key, encrypted at rest.

Connection

OpenAI

GPT models via your OpenAI API key, isolated the same way as every other provider.

Connection

Ollama

Local models, zero API key, zero data leaving your machine.

Job template

sys-log-analysis

The flagship self-diagnosis job — seeded and ready to run on day one.

System

RBAC

Admin / Operator / Viewer roles, installed like any other plugin.

Buy & download plugins — coming soon
Four parts, each doing one job.

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

SIGNED

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.

PermissionAdminOperatorViewer
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.

OPENACKNOWLEDGEDRESOLVED
P1 · AUTO-ESCALATED3rd failure, same source

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.

ChannelTransportRetriesRouting
EmailSMTP, STARTTLS/TLS30s / 2m / 5mAll / P1-only
WebhookHTTPS only, 15s timeout30s / 2m / 5mHMAC-SHA256 signed
No provider exposes this. So we made you enter it once.

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.

jobs / keyword-refresh RUNNING

Input tokens

0

Output tokens

0

Estimated cost
$0.00

Last 7 runs

Ships as a seeded demo job

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.

01

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.

02

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.

03

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.

04

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.

reports/log-analysis/latest.md
P1nightly-report: provider auth expired3rd occurrence

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.

Runs on your machine

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.

01

127.0.0.1 only

The dashboard is never reachable off the local machine.

02

No shell execution

Job commands run as argument arrays, never through a shell, so there’s no command injection surface.

03

Secrets encrypted at rest

Unlocked by a passphrase you set once. BatchAgent never stores it.

04

Signed, sandboxed plugins

Verified before load, isolated in their own process, and given only the credentials you explicitly grant.

05

Every action audited

Secret reveals, plugin installs, role changes — all attributed to the user who did it.

06

Rate-limited login & unlock

Repeated guessing gets an account lock, not a second try.

Audit log, last 6
03:58RUNsys-log-analysis completed, 0 errors.
03:41PRE-FLIGHTnightly-report: provider auth expired.
03:41INCIDENTopened, scoped to claude-provider-2.
01:02AUTHsd logged in from 127.0.0.1.
00:15RUNkeyword-refresh completed, 0 errors.
00:00SECRETsd revealed CLAUDE_SESSION (admin-gated).
Not a personal agent

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.

The breakdown
 n8nOpenClawBatchAgent
What it isGeneral workflow & integration automationPersonal AI assistant, chat-drivenScheduler for unattended AI-driven jobs
How you interactVisual node editorChat apps: WhatsApp, Telegram, Slack, and moreA local dashboard, no chat interface
AI's roleOne node among hundreds of integrationsThe core: an agent that decides and acts for you in real timeThe core: every job targets a Model via a plugin
Execution modelTrigger-based workflows (webhook/schedule/event)Interactive and proactive agent actionsScheduled, unattended, cron-based
System accessSandboxed to workflow nodesBroad: files, shell commands, browser controlTightly scoped: no shell exec, a plugin sees only the credentials it’s granted
Multi-user accessRBAC on enterprise/cloud tiersSingle-user, personal toolRBAC built in: Admin/Operator/Viewer + custom
Reliability & opsPer-workflow retry/error branches you configureNot a focus: no incident or audit systemBuilt-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.
Down to the numbers

Spec sheet.

PLATE A · SYSTEM
PlatformWindows
RequirementNode.js 18+
Dashboard127.0.0.1:4180
LicenseMIT
PLATE B · ACCESS & DATA
RolesAdmin · Operator · Viewer · custom
SecretsEncrypted at rest
PluginsSigned · sandboxed
Audit logAppend-only
Scheduling & Execution

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.

Visibility

A local dashboard, run history, plugin management, and a tray icon for at-a-glance health without a browser open.

Five steps, in order

Here's how I'd get it running on your machine.

01

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.

02

Get the code

Nothing to provision. It’s a plain Node.js app.

03

Run try-batchagent.bat

Installs dependencies, seeds three harmless demo jobs, starts BatchAgent.

04

Open the dashboard

http://127.0.0.1:4180, once the console tells you it’s listening.

05

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.

console

$ 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.