deploy: show a warming page while a cold-started app wakes - #392
Merged
Merged
Conversation
Deployed apps on sleeping microVMs hung for the full 20s dial timeout and then showed raw gateway JSON — they looked broken while merely waking. The deployment proxy now tracks when each upstream last answered; a document GET/HEAD to an upstream not seen healthy recently gets a short first-byte window, and on a dial timeout or connection failure the browser receives an auto-refreshing warming page instead of an error blob. Applies to every proxy path (path-prefix, subdomain, and admin routes) since they share the layer.
ReganBell
added a commit
that referenced
this pull request
Aug 13, 2026
Deployed apps on sleeping microVMs hung for the full 20s dial timeout and then showed raw gateway JSON — they looked broken while merely waking. The deployment proxy now tracks when each upstream last answered; a document GET/HEAD to an upstream not seen healthy recently gets a short first-byte window, and on a dial timeout or connection failure the browser receives an auto-refreshing warming page instead of an error blob. Applies to every proxy path (path-prefix, subdomain, and admin routes) since they share the layer. **Deployment notes** Behavior flip at the proxy: browser GET/HEAD to an upstream not seen healthy in 60s now gets a 4sfirstbytewindowthenanHTML503warmingpage(autoretry2mingiveup)insteadof 4s first-byte window then an HTML 503 warming page (auto-retry, 2min give-up) instead of hanging the full dial timeout and landing on raw gateway JSON — anything programmatically fetching app pages with document Accept headers and expecting JSON errors sees HTML now; non-document requests keep the JSON 502/504 contract No config, no DB; recently-healthy upstreams keep the full timeout so slow pages aren't misclassified <!-- codesmith:footer --> --- <a href="https://app.blacksmith.sh/yc-software/codesmith/qm/pr/392"><picture><source media="(prefers-color-scheme: dark)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v2.svg"><source media="(prefers-color-scheme: light)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-light-v2.svg"><img alt="View with [code]smith" src="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v2.svg"></picture></a> <a href="https://backend.blacksmith.sh/track/enable-autofix?expires=1789237848&installation_model_id=19911&pr_number=392&repository=yc-software%2Fqm&return_to=https%3A%2F%2Fgithub.com%2Fyc-software%2Fqm%2Fpull%2F392&signature=854169d0df2b3fb067e0b3f7a4cdcbf454d271d06dc19308e3dadfd4a5e23694"><picture><source media="(prefers-color-scheme: dark)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-light.svg"><img alt="Autofix with [code]smith" src="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark.svg"></picture></a> <sup>Need help on this PR? Tag <code>@codesmith-bot</code> with what you need. Autofix is disabled.</sup> <!-- codesmith:autofix:disabled --> <!-- /codesmith:footer -->
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Deployed apps on sleeping microVMs hung for the full 20s dial timeout and then showed raw gateway JSON — they looked broken while merely waking. The deployment proxy now tracks when each upstream last answered; a document GET/HEAD to an upstream not seen healthy recently gets a short first-byte window, and on a dial timeout or connection failure the browser receives an auto-refreshing warming page instead of an error blob. Applies to every proxy path (path-prefix, subdomain, and admin routes) since they share the layer.
Deployment notes
Behavior flip at the proxy: browser GET/HEAD to an upstream not seen healthy in 60s now gets a
4sfirstbytewindowthenanHTML503warmingpage(autoretry2mingiveup)insteadof
4s first-byte window then an HTML 503 warming page (auto-retry, 2min give-up) instead of
hanging the full dial timeout and landing on raw gateway JSON — anything programmatically
fetching app pages with document Accept headers and expecting JSON errors sees HTML now;
non-document requests keep the JSON 502/504 contract
No config, no DB; recently-healthy upstreams keep the full timeout so slow pages aren't
misclassified
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.