Workloads

Everything slow belongs off the request, and it is one line to put it there.

Imports, exports, mail, image processing, webhooks, nightly rollups, and third-party syncs are the work that decides whether an app feels fast. Jobs are files in app/Jobs/, dispatched from anywhere, retried on their own terms, and visible in the dashboard while they run.

What this always turns out to involve.

The work that arrives whether you planned for it or not.

Retries need intent

Blind retries turn one failing webhook into a thousand duplicate charges.

Scheduling is infrastructure

A crontab on one box is a single point of failure nobody has documented.

Failures go quiet

A queue without visibility is a place where work disappears and nobody is paged.

Local parity

If jobs only run in production, they are only debugged in production.

What is already in the box.

All of it in the same install, typed against the rest of your application.

Jobs as files

app/Jobs/ holds one class per unit of work, with queue, tries, backoff, timeout, and rate declared on it.

Dispatch anywhere

dispatch, dispatchIf, dispatchAfter, and dispatchNow from an action, a listener, a command, or another job.

Batches and chains

Group work, track progress, and run a completion callback when the last member finishes.

Scheduling in code

app/Scheduler.ts declares recurring work in TypeScript, so the schedule is reviewed like any other change.

Drivers

Database, Redis, and SQS behind one API, chosen in config/queue.ts and swappable per environment.

Visible failures

The dashboard shows pending, running, and failed jobs, with retry and payload inspection.

The layers it leans on.

Every one of these ships in the same install. Follow one to see what it covers.

From the command line.

Buddy scaffolds, runs, and ships this the same way it does the rest of the app.

buddy make:job SyncInventory buddy queue:work --queue=integrations buddy queue:failed

Projects of this shape usually grow into one of these.