You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Screenshot proxy returns 'File not found' for all apps registered since 2026 #17
The screenshot proxy at usercontent.apps.nextcloud.com returns "File not found" (HTTP 200, but body is the literal string File not found instead of image data) for all apps registered since 2026. Older apps work fine.
This causes the Nextcloud admin UI ("Available Apps") to show the gear placeholder icon instead of the app's screenshot, because the Image.onload handler never fires (the response is not a valid image).
Evidence
App
Registered
Proxy Result
contacts
2016-10
PNG OK ✅
calendar
2016-10
PNG OK ✅
deck
2017-02
PNG OK ✅
workflow_pdf_converter
2018-11
PNG OK ✅
opsdash
2026-03-04
File not found ❌
linkboard
2026-03-07
File not found ❌
eimzo_sign
2026-03-12
File not found ❌
The direct GitHub URLs all work fine (HTTP 200, correct Content-Type: image/png). Only the proxy fails to serve the files.
Steps to Reproduce
# Broken — app registered in 2026:
curl -s "https://usercontent.apps.nextcloud.com/$(echo -n 'https://raw.githubusercontent.com/tschuegy/linkboard-nextcloud/main/img/screenshots/screenshot_GUI.png'| base64 -w0)"# Returns: "File not found"# Working — older app:
curl -s "https://usercontent.apps.nextcloud.com/$(echo -n 'https://raw.githubusercontent.com/nextcloud/tasks/master/screenshots/tasks-1.png'| base64 -w0)"| head -c 8 | xxd
# Returns: valid PNG data (89504e47...)
How the screenshot display works (Nextcloud Core)
AppSettingsController::fetchApps() converts screenshot URLs to proxy URLs: https://usercontent.apps.nextcloud.com/{base64(original_url)}
Frontend (settings-apps-view-*.js) in mounted(): creates new Image() with the proxy URL
Image.onload sets screenshotLoaded = true → screenshot is displayed
Since the proxy returns "File not found" (not a valid image), onload never fires → screenshotLoaded stays false → gear icon is shown
Expected Behavior
The proxy should return the actual image data (fetched from the original URL) with the correct Content-Type header, as it does for older apps.
Affected Nextcloud Versions
All versions — the proxy is an external service, so the Nextcloud server version is irrelevant. The issue affects the admin UI of any Nextcloud instance browsing the app store.
Thanks for the reminder. I transferred this issue to the usercontent.apps.nextcloud.com repo where it's appropriate. We'll try to get this fixed as soon as possible.
Hi @edward-ly, thanks for addressing this issue. It has been bugging me for a while and for the life of me I couldn't figure out why my screenshots didn't show.
Has the sync been run since this was merged into master? I am still seeing a problem on 2 of my apps (forum and pantry) - the screenshots simply don't work on my instance's app store.
I'm seeing a related problem on Nextcloud 35.0.2.2 (Docker, All-in-One). In Apps → Discover/Browse, most apps show the gear placeholder instead of an icon, and the sidebar screenshot area shows a black box with the text "Preview not available / Image not recognized", followed by a base64 string.
What I found
The image URL used by the UI is double-wrapped. The outer URL is https://usercontent.apps.nextcloud.com/<base64>, and that base64 decodes to anotherhttps://usercontent.apps.nextcloud.com/<base64> URL, which only then decodes to the real image.
If I open the single-level URL https://usercontent.apps.nextcloud.com/aHR0cHM6Ly9jb2RlYmVyZy5vcmcvYnZkYm9zL2pvdXJuYWxfY2FsZGF2L3Jhdy9icmFuY2gvbWFpbi9zY3JlZW5zaG90cy9qdHgtYm9hcmQucG5n
directly in the browser, the PNG loads correctly. So the proxy itself works for this image, but the double-wrapped URL that the UI requests does not, and the proxy responds with an image saying "Image not recognized".
The same "Image not recognized" placeholder appears on many other apps, with the same base64 pattern (e.g. an aHR0cHM6Ly91c2VyY29udGVudC5hcHBzLm5leHRjbG91ZC5jb20v... prefix, which is the base64 of https://usercontent.apps.nextcloud.com/).
Things I ruled out on my side
The server has outbound access (curl -sI https://raw.githubusercontent.com/... from inside the Nextcloud container returns HTTP/2 200).
The images are requested directly by the browser from usercontent.apps.nextcloud.com, so my reverse proxy and server network are not involved.
appstoreurl is not set (default).
Clearing the appstore cache in appdata did not help.
Nothing related appears in nextcloud.log at debug level.
Possible cause
It looks like the screenshot/icon URLs coming from the app store data may already be proxy URLs, and the server wraps them a second time. I haven't confirmed this, and it may be a separate issue from the "File not found" responses described above, but the symptoms (gear placeholders in the app list) are the same. Happy to provide more details or test anything if useful.
Activity
edward-ly commentedon Mar 23, 2026
Thanks for the reminder. I transferred this issue to the
usercontent.apps.nextcloud.comrepo where it's appropriate. We'll try to get this fixed as soon as possible.chenasraf commentedon Apr 7, 2026
Hi @edward-ly, thanks for addressing this issue. It has been bugging me for a while and for the life of me I couldn't figure out why my screenshots didn't show.
Has the sync been run since this was merged into master? I am still seeing a problem on 2 of my apps (forum and pantry) - the screenshots simply don't work on my instance's app store.
tschuegy commentedon Apr 8, 2026
Hi @nickvergessen, it still doesn't work for me. Installed the latest version 33.0.2.2
ms74ro commentedon Oct 16, 2026
Harpik1 commentedon Oct 28, 2026
I'm seeing a related problem on Nextcloud 35.0.2.2 (Docker, All-in-One). In Apps → Discover/Browse, most apps show the gear placeholder instead of an icon, and the sidebar screenshot area shows a black box with the text "Preview not available / Image not recognized", followed by a base64 string.
What I found
The image URL used by the UI is double-wrapped. The outer URL is
https://usercontent.apps.nextcloud.com/<base64>, and that base64 decodes to anotherhttps://usercontent.apps.nextcloud.com/<base64>URL, which only then decodes to the real image.Example (app: Journal CalDAV):
If I open the single-level URL
https://usercontent.apps.nextcloud.com/aHR0cHM6Ly9jb2RlYmVyZy5vcmcvYnZkYm9zL2pvdXJuYWxfY2FsZGF2L3Jhdy9icmFuY2gvbWFpbi9zY3JlZW5zaG90cy9qdHgtYm9hcmQucG5ndirectly in the browser, the PNG loads correctly. So the proxy itself works for this image, but the double-wrapped URL that the UI requests does not, and the proxy responds with an image saying "Image not recognized".
The same "Image not recognized" placeholder appears on many other apps, with the same base64 pattern (e.g. an
aHR0cHM6Ly91c2VyY29udGVudC5hcHBzLm5leHRjbG91ZC5jb20v...prefix, which is the base64 ofhttps://usercontent.apps.nextcloud.com/).Things I ruled out on my side
curl -sI https://raw.githubusercontent.com/...from inside the Nextcloud container returns HTTP/2 200).usercontent.apps.nextcloud.com, so my reverse proxy and server network are not involved.appstoreurlis not set (default).nextcloud.logat debug level.Possible cause
It looks like the screenshot/icon URLs coming from the app store data may already be proxy URLs, and the server wraps them a second time. I haven't confirmed this, and it may be a separate issue from the "File not found" responses described above, but the symptoms (gear placeholders in the app list) are the same. Happy to provide more details or test anything if useful.
edward-ly commentedon Oct 28, 2026
^ This is being fixed in nextcloud/server#64771.