Real-Time AI Video: Building Progress Tracking That Doesn't Gaslight Your Users
May 20, 2026 • ArchyPress

The Problem With AI Progress Bars
A progress bar that lies is worse than no progress bar. It creates false expectations, generates support tickets, and — in the case of AI video generation — causes users to cancel jobs that were about to complete. Most AI-powered apps handle async job feedback with one of two antipatterns: a spinner that provides no signal, or a fake progress bar that increments at a fixed rate regardless of actual job status. Both erode user trust.
ArchySocial's video generation uses Azure OpenAI Sora-2 to produce social media video clips. Generation takes 30–120 seconds depending on video length and model load. That's a long time to stare at a fake progress bar.
Users will tolerate waiting if they believe progress is real. The only thing more frustrating than slow software is slow software that lies about how slow it is.
The Architecture: Jobs, Polling, and Recovery
Sora-2 video generation is inherently async: you submit a request, receive a job ID, and poll until the job reaches terminal state (succeeded or failed). ArchySocial models this as a persistent job record:
Job ID stored in the database at submission time
Status polling via a server function that calls the OpenAI Jobs API
Frontend polls the server function on a configurable interval
Terminal states (completed, failed) update the record and stop polling
In-progress states return estimated progress percentage from the API response
The critical addition was auto-resume for stale jobs. If a user closes the browser mid-generation and returns later, the frontend detects that the job record exists in a non-terminal state and automatically resumes polling — picking up where it left off without requiring the user to re-initiate anything.
Honest Progress Reporting
Sora-2's API returns a progress field (0–1.0) on in-progress jobs. ArchySocial maps this directly to the displayed percentage with no smoothing or fake acceleration. The tradeoff: the progress bar sometimes jumps, and sometimes stays at the same value for extended periods.
This is intentional. Users who see a bar stuck at 73% for 20 seconds are receiving accurate information: the model is at 73% and hasn't progressed in 20 seconds. That's better than a bar that races to 100% and then freezes while the backend catches up.
Handling Failure States Gracefully
AI video generation fails more often than text or image generation — context window limits, NSFW content detection, model timeouts, and infrastructure issues all terminate jobs early. ArchySocial's failure handling distinguishes between:
Retryable failures: model timeout, rate limit, infrastructure error — user sees 'Generation timed out. Retry?' with one click
Terminal failures: content policy violation, invalid prompt — user sees specific error message and guidance
Stale jobs: job ID present but no status update in 5 minutes — treated as retryable timeout

Best Practices for Async AI Generation UX
Persist job state immediately: write the job ID to persistent storage before the API call returns, not after; if the call succeeds but the write fails, you've lost the job
Show real progress, not estimated progress: if the API provides progress data, use it; fake interpolation optimises for looking good at the cost of trust
Auto-resume on page load: check for non-terminal jobs on component mount and resume polling; don't make users re-trigger generation
Distinguish retryable from terminal failures: different failure types need different UX responses; conflating them with a generic error message frustrates users
Test with throttled connections: async job UI needs to work on slow connections where poll responses take several seconds; spinner states and loading guards matter more than they do on fast connections
Generate Video Content With ArchySocial
AI video generation for social posts — with honest progress tracking and auto-resume. Try it on ArchySocial.