Retries need intent
Blind retries turn one failing webhook into a thousand duplicate charges.
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.
The work that arrives whether you planned for it or not.
Blind retries turn one failing webhook into a thousand duplicate charges.
A crontab on one box is a single point of failure nobody has documented.
A queue without visibility is a place where work disappears and nobody is paged.
If jobs only run in production, they are only debugged in production.
All of it in the same install, typed against the rest of your application.
app/Jobs/ holds one class per unit of work, with queue, tries, backoff, timeout, and rate declared on it.
dispatch, dispatchIf, dispatchAfter, and dispatchNow from an action, a listener, a command, or another job.
Group work, track progress, and run a completion callback when the last member finishes.
app/Scheduler.ts declares recurring work in TypeScript, so the schedule is reviewed like any other change.
Database, Redis, and SQS behind one API, chosen in config/queue.ts and swappable per environment.
The dashboard shows pending, running, and failed jobs, with retry and payload inspection.
Every one of these ships in the same install. Follow one to see what it covers.
Buddy scaffolds, runs, and ships this the same way it does the rest of the app.
Projects of this shape usually grow into one of these.