diff --git a/src/sys/linux/main.cpp b/src/sys/linux/main.cpp
index a6c804b..d275a48 100644
--- a/src/sys/linux/main.cpp
+++ b/src/sys/linux/main.cpp
@@ -1062,15 +1062,23 @@ static void Sys_HandlePendingQuitSignal( void ) {
 
 #ifdef __EMSCRIPTEN__
 static void Sys_BrowserFrame( void * ) {
-	static bool browserVideoSettingsNormalized = false;
-	if ( !browserVideoSettingsNormalized && cvarSystem != NULL ) {
+	if ( cvarSystem != NULL ) {
 		// Browser canvases cannot use SDL desktop fullscreen, and the low-spec
-		// resolution-scale path depends on optional desktop shader assets.
-		cvarSystem->SetCVarBool( "r_fullscreen", false );
-		cvarSystem->SetCVarInteger( "r_screenFraction", 100 );
-		cvarSystem->SetCVarInteger( "r_resolutionScaleMode", 0 );
-		cvarSystem->SetCVarInteger( "r_swapInterval", 1 );
-		browserVideoSettingsNormalized = true;
+		// resolution-scale path depends on optional desktop shader assets. A
+		// full ReloadEngine reconstructs archived cvars, so enforce these
+		// browser-only invariants before every rendered frame.
+		if ( cvarSystem->GetCVarBool( "r_fullscreen" ) ) {
+			cvarSystem->SetCVarBool( "r_fullscreen", false );
+		}
+		if ( cvarSystem->GetCVarInteger( "r_screenFraction" ) != 100 ) {
+			cvarSystem->SetCVarInteger( "r_screenFraction", 100 );
+		}
+		if ( cvarSystem->GetCVarInteger( "r_resolutionScaleMode" ) != 0 ) {
+			cvarSystem->SetCVarInteger( "r_resolutionScaleMode", 0 );
+		}
+		if ( cvarSystem->GetCVarInteger( "r_swapInterval" ) != 1 ) {
+			cvarSystem->SetCVarInteger( "r_swapInterval", 1 );
+		}
 	}
 
 	common->Async();
