FitWhen to use it — and when not
Use it when
- Jobs longer than ~30 seconds: research, reports, batch processing, video
- Agents that wait on external systems
- Mobile, where users will switch apps
Skip it when
- Quick answers — background mode adds friction
- When the user must review each step live
AnatomyThe parts of the pattern
- Hand-offClear message: running in background, rough ETA.
- Task trayRunning tasks with progress, always reachable.
- NotificationIn-app toast, plus push/email for long jobs.
- ResultOne click from the notification to the output.
- CancelStop a task you no longer need.
GuidelinesDo & don’t
Do
- Give an ETA range, not a precise promise.
- Let people keep working in the same window.
- Deep-link the notification straight to the result.
Don’t
- Lose the job when the tab closes.
- Notify on every step — notify on done or needs-input.
- Hide running tasks behind a settings page.
In the wildReal-world examples
ChatGPT deep researchOpenAI CodexDevinGoogle Jules
Products named for reference only — no affiliation, and the demo above is an original illustration, not a copy of their UI.
For engineersImplementation notes
- Run jobs in a queue (not the request lifecycle); return a job id immediately.
- Push status over websockets/SSE while the tab is open, and web push/email when it is not.
- Make jobs idempotent and resumable so retries do not double-charge.