Skip to content

Screenshot proxy returns 'File not found' for all apps registered since 2026 #17

Closed

Description

@tschuegy

Description

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)

  1. AppSettingsController::fetchApps() converts screenshot URLs to proxy URLs: https://usercontent.apps.nextcloud.com/{base64(original_url)}
  2. Frontend (settings-apps-view-*.js) in mounted(): creates new Image() with the proxy URL
  3. Image.onload sets screenshotLoaded = true → screenshot is displayed
  4. 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.

Activity

  1. edward-ly commented on Mar 23, 2026

    @edward-ly
    Contributor

    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.

  2. chenasraf commented on Apr 7, 2026

    @chenasraf

    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.

  3. tschuegy commented on Apr 8, 2026

    @tschuegy
    Author

    Hi @nickvergessen, it still doesn't work for me. Installed the latest version 33.0.2.2

    Image
  4. ms74ro commented on Oct 16, 2026

    @ms74ro
    Image Nextcloud v35.0.2; the application screenshots are not visible.
  5. Harpik1 commented on Oct 28, 2026

    @Harpik1

    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 another https://usercontent.apps.nextcloud.com/<base64> URL, which only then decodes to the real image.

    Example (app: Journal CalDAV):

    $ echo '<outer base64>' | base64 -d
    https://usercontent.apps.nextcloud.com/aHR0cHM6Ly9jb2RlYmVyZy5vcmcvYnZkYm9zL2pvdXJuYWxfY2FsZGF2L3Jhdy9icmFuY2gvbWFpbi9zY3JlZW5zaG90cy9qdHgtYm9hcmQucG5n
    
    $ echo 'aHR0cHM6Ly9jb2RlYmVyZy5vcmcvYnZkYm9zL2pvdXJuYWxfY2FsZGF2L3Jhdy9icmFuY2gvbWFpbi9zY3JlZW5zaG90cy9qdHgtYm9hcmQucG5n' | base64 -d
    https://codeberg.org/bvdbos/journal_caldav/raw/branch/main/screenshots/jtx-board.png
    

    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.

  6. edward-ly commented on Oct 28, 2026

    @edward-ly
    Contributor

    ^ This is being fixed in nextcloud/server#64771.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions