Nextcloud 32 Upgrade Issue: Fixing the Talk App WASM Warning
The Problem
After upgrading to Nextcloud 32, which automatically upgrades all installed apps including the Talk/Spreed app, the administration panel displays a warning about WASM (WebAssembly) support under the “Background blur” section:
Could not check for WASM loading support. Please check manually if your web server serves `.wasm` files. To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule.This warning appears even when:
- Apache has the correct
AddType application/wasm .wasmdirective - WASM files are being served with the correct MIME type
- The Nextcloud container can reach itself through the reverse proxy
- All connectivity checks pass successfully
- Background blur feature works correctly
This issue has been reported in the Nextcloud community forum by several users experiencing the same problem after upgrading Talk.
Environment
- Nextcloud: 32.0.2 (issue occurs during upgrade)
- Talk/Spreed App: 22.0.4+ (issue introduced in this version)
- Backend: Apache in Incus container (IP: 10.0.0.50)
- Reverse Proxy: Nginx (IP: 10.0.0.10)
- OS: Debian 12
Root Cause
The issue is a bug in the Nextcloud Talk/Spreed app version 22.0.4. The setup check in /var/www/nextcloud/apps/spreed/lib/SetupCheck/BackgroundBlurLoading.php looks for a specific WASM file that no longer exists:
$url = $this->urlGenerator->linkTo('spreed', 'js/tflite.wasm');However, in Talk version 22.0.4, the background blur feature was refactored to use different WASM files:
vision_wasm_internal.wasmvision_wasm_nosimd_internal.wasmolm.wasm
The developers renamed the WASM files during refactoring but forgot to update the health check code, resulting in a false positive warning.
Verification Steps
Before applying the fix, verify that WASM files are actually being served correctly and that the issue is indeed just the health check.
1. Check that WASM files exist
ls -la /var/www/nextcloud/apps/spreed/js/*.wasmExpected output:
-rw-r--r-- 1 www-data www-data 153573 Nov 20 15:53 olm.wasm
-rw-r--r-- 1 www-data www-data 9574032 Nov 20 15:53 vision_wasm_internal.wasm
-rw-r--r-- 1 www-data www-data 9448638 Nov 20 15:53 vision_wasm_nosimd_internal.wasm2. Verify MIME type is served correctly
curl -I https://your-nextcloud-domain.com/apps/spreed/js/olm.wasmLook for:
HTTP/2 200
content-type: application/wasm3. Test that the missing file indeed returns 404
curl -I https://your-nextcloud-domain.com/apps/spreed/js/tflite.wasmThis should return:
HTTP/2 4044. Verify PHP can fetch WASM files
From inside the Nextcloud container:
php -r "
\$ch = curl_init('https://your-nextcloud-domain.com/apps/spreed/js/olm.wasm');
curl_setopt(\$ch, CURLOPT_NOBODY, true);
curl_setopt(\$ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt(\$ch, CURLOPT_HEADER, true);
curl_exec(\$ch);
\$info = curl_getinfo(\$ch);
echo 'HTTP Code: ' . \$info['http_code'] . \"\n\";
echo 'Content-Type: ' . \$info['content_type'] . \"\n\";
curl_close(\$ch);
"Expected output:
HTTP Code: 200
Content-Type: application/wasmIf all these checks pass (existing WASM files work, only tflite.wasm is missing), then WASM is configured correctly and you just need to fix the outdated health check.
The Solution
Create a minimal, valid WASM placeholder file to satisfy the health check. This approach is safer than a symlink because it won’t conflict with future Talk updates that might use tflite.wasm for its intended purpose.
Step 1: Create a minimal valid WASM file
cd /var/www/nextcloud/apps/spreed/js/
# Create a minimal valid WASM module (8 bytes: magic number + version)
printf '\x00\x61\x73\x6d\x01\x00\x00\x00' > tflite.wasm
chown www-data:www-data tflite.wasm
chmod 644 tflite.wasmThis creates the smallest possible valid WASM file:
- Bytes 0-3:
\x00\x61\x73\x6d– WASM magic number (literally “\0asm”) - Bytes 4-7:
\x01\x00\x00\x00– WASM version 1
Step 2: Verify the file was created correctly
ls -la tflite.wasmShould show:
-rw-r--r-- 1 www-data www-data 8 Nov 20 20:15 tflite.wasmVerify it’s a valid WASM file:
file tflite.wasmShould return:
tflite.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)Step 3: Test accessibility
curl -I https://your-nextcloud-domain.com/apps/spreed/js/tflite.wasmShould now return:
HTTP/2 200
content-type: application/wasmStep 4: Clear caches and verify
sudo -u www-data php /var/www/nextcloud/occ maintenance:repairRefresh the admin overview page (Settings → Administration → Overview) with a hard refresh (Ctrl+Shift+R in most browsers). The warning should disappear immediately.
Why This Approach Works
This minimal WASM file satisfies the health check requirements:
- Valid WASM format – It’s a legitimate WASM module that browsers and servers recognize
- Minimal size – Only 8 bytes, the smallest valid WASM module possible
- Correct MIME type – Apache/Nginx serve it as
application/wasm - Future-proof – Won’t conflict if Talk updates implement a real
tflite.wasm - Safe placeholder – Clearly not a functional module, just satisfies the check
The health check only verifies that:
- The file is reachable via HTTPS through the public domain
- It returns HTTP 200 status code
- The MIME type is correctly set to
application/wasm - The file is valid WASM format
Our placeholder file satisfies all these requirements without creating dependencies on other files.
Understanding the Misleading Warning Message
The warning message can be quite misleading because it suggests DNS or firewall issues:
“This failure may be the result of a server-side DNS mismatch or outbound firewall rule.”
In reality, if your Nextcloud can connect to itself (which you verified with curl from inside the container), those aren’t the problems. The real issue is simply that the specific file the health check is looking for doesn’t exist – not because of misconfiguration, but because it was renamed in the codebase.
This has led many system administrators down the wrong troubleshooting path, checking DNS configurations, firewall rules, and reverse proxy settings when everything was actually configured correctly.
Why a Placeholder Instead of a Symlink?
You might wonder why we create a placeholder file instead of symlinking to an existing WASM file. Here’s why this approach is superior:
- Future-proof – If Talk updates add a real
tflite.wasmfor TensorFlow Lite functionality, a symlink would conflict and cause issues - Clear intent – An 8-byte placeholder clearly indicates “this is just for the health check”
- No dependencies – The health check doesn’t depend on other WASM files continuing to exist
- Minimal overhead – Only 8 bytes vs linking to a 9.5MB vision module
- Safe updates – When Talk fixes the bug, you can simply delete this file without worrying about breaking other functionality
Alternative: Ignoring the Warning
Since the background blur feature works perfectly with the existing vision_wasm_internal.wasm file, you could simply ignore this warning until Talk releases a fix. It’s purely cosmetic and doesn’t affect any functionality:
- Background blur works correctly
- Video calls function normally
- All WASM features are operational
However, the placeholder file fix only takes a few seconds and provides a clean admin panel. When Talk releases an update that fixes the health check, you can simply remove the placeholder:
rm /var/www/nextcloud/apps/spreed/js/tflite.wasmFor Nextcloud Developers
This is a bug that should be fixed in the Talk/Spreed app. The health check code in lib/SetupCheck/BackgroundBlurLoading.php needs updating to check for the actual WASM files used by the application (vision_wasm_internal.wasm) rather than the obsolete tflite.wasm.
A proper fix would be:
// Check for any existing WASM file instead of hardcoding an obsolete one
$wasmFiles = ['vision_wasm_internal.wasm', 'vision_wasm_nosimd_internal.wasm', 'olm.wasm'];
foreach ($wasmFiles as $file) {
if (file_exists($appPath . '/js/' . $file)) {
$url = $this->urlGenerator->linkTo('spreed', 'js/' . $file);
// run existing check
break;
}
}If you encounter this issue, consider reporting it on the Nextcloud Talk GitHub repository.
Conclusion
This issue is a perfect example of how health checks can become outdated when code is refactored. While the warning message suggests network configuration problems, the actual issue is simply a reference to a renamed file. Once you understand the root cause, the fix is straightforward.
The background blur feature itself works perfectly in Talk 22.0.4+ – it’s just the health check that needs updating. The minimal placeholder WASM file provides a clean, future-proof workaround that won’t conflict with future Talk updates. When the developers fix the health check, you can simply delete the 8-byte placeholder file.
Remember: The warning doesn’t mean your WASM support is broken – it just means the health check is looking for the wrong file. Your background blur feature is working fine!
What Happens When Talk Fixes This Bug?
When Nextcloud Talk releases an update that fixes the health check (likely by checking for vision_wasm_internal.wasm instead of tflite.wasm), you have two options:
- Keep the placeholder – It’s only 8 bytes and won’t cause any issues
- Remove the placeholder – Simply delete it:
rm /var/www/nextcloud/apps/spreed/js/tflite.wasm
If Talk ever implements actual TensorFlow Lite functionality and ships a real tflite.wasm file, the update process will automatically replace your placeholder with the real file.
