Task Queue Management
Enqueue and dequeue tasks with metadata, tags, priorities, and ETAs. Higher-priority work claims first.
Distributed task queue · Rust core, multi-language clients
Enqueue, dispatch, and observe background work across a fleet of workers. A Rust-fast core with client libraries for Rust, Python, and Java, a live operations dashboard, and an MCP server for agent-driven workflows — all from one binary.
App
Install from
brew install chopflow
One install — broker, CLI, and MCP server. The macOS app bundles all of it in a single .dmg. Workers ship separately.
Core
Rust-fast core
Clients
Multi-language clients
Observe
Live ops dashboard
Built for control
Clear task state, explicit resource ownership, and failure semantics you can reason about.
Enqueue and dequeue tasks with metadata, tags, priorities, and ETAs. Higher-priority work claims first.
Assign tasks to workers by tag and resource availability, with bounded per-worker concurrency. Pull model: workers fetch work, the broker never pushes — backpressure is implicit.
Workers ack success or failure; failures retry with exponential backoff and a computed ETA, then dead-letter.
CPU, GPU, and memory allocation and live utilization per worker.
Client libraries for Rust, Python, and Java — Celery-like @task and AsyncResult on the Python side.
Queue length, latency, throughput, and resource utilization, live (≤2s poll).
Drive the queue from any MCP-compatible agent — Claude Desktop, Cursor, or your own. Enqueue, inspect, schedule, and run LLM tasks with a synchronous wait, no glue code.
Every task carries a priority. Ready work is claimed priority DESC, eta ASC, so urgent jobs jump the line without separate queues.
Cron and one-shot ETA schedules with overlap policies. Recurring jobs are first-class — materialize, dispatch, and observe them like any task.
Task lifecycle
Every task moves through an explicit lifecycle. Claims, retries, cancellation, and dead-lettering remain visible from submission to terminal state.
Client submits payload, metadata, tags, priority, and ETA.
Broker persists the task until it becomes eligible.
A matching worker pulls and claims available work.
Lease and worker ownership stay observable.
Worker reports a result or structured failure.
Result and terminal metadata are persisted.
Multi-language client
Define work in the language your team already knows. ChopFlow handles durable state, scheduling, dispatch, and observation underneath.
from chopflow import task, Client
@task(tags=["ml"], resources={"gpu": 1}, ack_late=True)
def train_model(dataset, hyperparams):
return {"accuracy": 0.95}
result = train_model.delay("imagenet", {"lr": 0.001})
output = result.get(timeout=3600, propagate=False)use chopflow::{task, Client};
#[task(tags = ["ml"], resources = {"gpu": 1})]
async fn train_model(dataset: &str, hyperparams: Hyperparams) -> Result<Accuracy> {
Ok(Accuracy { value: 0.95 })
}
let result = train_model.delay("imagenet", &hyperparams);
let output = result.get().await?;chopflow_broker start --host 127.0.0.1 --port 8000 --http-port 8080 --open
chopflow_worker start -b http://localhost:8000 -t default -r cpu:1
Default storage: SQLite in WAL mode · Transports: gRPC via tonic + HTTP/JSON via axum
coreShared task models, state transitions, and protocol types.
brokerPersistence, scheduling, leases, retries, and APIs.
workerPull-based execution, heartbeats, and acknowledgments.
cliLocal startup, configuration, and operator commands.
dashboardEmbedded live console and native Tauri shell.
mcpModel Context Protocol server — agents drive the queue.
Embedded operations
The broker embeds the dashboard, so there is no separate frontend deployment to operate. The same interface also ships as a native macOS app through Tauri.
Inspect queues, worker capacity, task attempts, timing, and terminal failures from one consistent operational view.
FAQ
The practical details before you run ChopFlow in production.
@task decorator and AsyncResult for Python. Workers and the CLI speak gRPC to the broker; browsers and external tooling speak HTTP/JSON.Running from a previous run is reset to Queued, since its worker is gone. No silently dropped work.rust-embed and served on the HTTP port — one process, no Node build, no separate deploy. The same UI also ships as a native macOS app through Tauri.gpu,ml) and capacity (CPU, GPU, memory). The dispatcher only hands a task to a worker whose tags match and whose resources are available.experiment directory ships reproducible configs and analysis scripts. See the GitHub repo for current status and the roadmap.$ chopflow broker start --http-port 8080 --open