[GH-ISSUE #3134] SVG logo file specified in admin panel UI is not loaded from local path if not named logo-light.svg #35742

Open
opened 2026-06-18 20:58:24 -05:00 by GiteaMirror · 7 comments
Owner

Originally created by @SpencerDub on GitHub (May 23, 2026).
Original GitHub issue: https://github.com/fosrl/pangolin/issues/3134

Describe the Bug

When a path to a local SVG, with filename logo.svg, is provided for a custom logo in the admin console UI, the logo does not load, and the browser console reports a 404 for that request.

By comparison, when a path to a local PNG, named logo.png, in the same directory, with the same permissions, is provided through the admin dashboard UI, the PNG loads correctly.

Environment

  • OS Type & Version: Ubuntu 24.04.4 LTS
  • Pangolin Version: v1.18.4
    • Enterprise Edition enabled and validated for personal use
  • Gerbil Version: v1.4.0
  • Traefik Version: v3.6
  • Newt Version: v1.12
  • Encountered on Browser Versions:
    • Firefox Snap for Ubuntu, 150.0.1 (64-bit)
    • Chromium, Version 128.0.6613.137 (Official Build) Built on Ubuntu

To Reproduce

  1. As instructed in Branding documentation, create a new bind mount in the Docker Compose file. The relevant section of the Docker Compose file will look like this:
volumes:
  - ./config:/app/config
  - ./branding:/app/public/branding
  1. Create the branding/ directory in the instructed location, adjacent to the Docker Compose file.
  2. Restart the Docker container.
  3. Copy a PNG logo file and a SVG logo file to the branding/ directory, as logo.png and logo.svg. For example, you can use this image, downloaded as SVG and as PNG. Do not name the logo logo-light.svg!
  4. From within the Pangolin admin panel, under Organization Settings/Authentication Pages, insert /branding/logo.svg as the Logo URL or Path. Save settings.
  5. In a separate browser, navigate to a Pangolin resource so you can see the login page.
  6. For testing, change the logo path to the PNG image, at /branding/logo.png, save settings, and re-visit the login page.

Expected Behavior

The SVG logo file loads when referenced.

Additional Details

I have ensured that the SVG and PNG files have identical permissions: owned by the same user and group, and both set to chmod 754 (rwxr-xr--) permissions. Even when this is the case, the PNG loads but the SVG does not. I have also tested with the SVG set to 777 perms. Still fails to load.

Running curl https://[PANGOLIN URL]/branding/logo.png from my desktop accesses the PNG file. Running curl https://[PANGOLIN URL]/branding/logo.svg returns this 214.40 KB HTML response, which is the same response I get when I run curl against a nonsense path, like curl https://[PANGOLIN URL]/fizzlewhip/tog689.

Additional Discussion

Originally created by @SpencerDub on GitHub (May 23, 2026). Original GitHub issue: https://github.com/fosrl/pangolin/issues/3134 ### Describe the Bug When a path to a local SVG, with filename `logo.svg`, is provided for a custom logo in the admin console UI, the logo does not load, and the browser console reports a 404 for that request. By comparison, when a path to a local PNG, named `logo.png`, in the same directory, with the same permissions, is provided through the admin dashboard UI, the PNG loads correctly. ### Environment - OS Type & Version: Ubuntu 24.04.4 LTS - Pangolin Version: v1.18.4 - Enterprise Edition enabled and validated for personal use - Gerbil Version: v1.4.0 - Traefik Version: v3.6 - Newt Version: v1.12 - Encountered on Browser Versions: - Firefox Snap for Ubuntu, 150.0.1 (64-bit) - Chromium, Version 128.0.6613.137 (Official Build) Built on Ubuntu ### To Reproduce 1. As instructed in [Branding documentation](https://docs.pangolin.net/manage/branding), create a new bind mount in the Docker Compose file. The relevant section of the Docker Compose file will look like this: ``` volumes: - ./config:/app/config - ./branding:/app/public/branding ``` 2. Create the `branding/` directory in the instructed location, adjacent to the Docker Compose file. 3. Restart the Docker container. 4. Copy a PNG logo file and a SVG logo file to the `branding/` directory, **as `logo.png` and `logo.svg`**. For example, you can use [this image](https://openclipart.org/detail/352687/flat-bug-simple-icon), downloaded as SVG and as PNG. Do not name the logo `logo-light.svg`! 5. From within the Pangolin admin panel, under Organization Settings/Authentication Pages, insert `/branding/logo.svg` as the Logo URL or Path. Save settings. 6. In a separate browser, navigate to a Pangolin resource so you can see the login page. 7. For testing, change the logo path to the PNG image, at `/branding/logo.png`, save settings, and re-visit the login page. ### Expected Behavior The SVG logo file loads when referenced. ### Additional Details I have ensured that the SVG and PNG files have identical permissions: owned by the same user and group, and both set to chmod 754 (rwxr-xr--) permissions. Even when this is the case, the PNG loads but the SVG does not. I have also tested with the SVG set to 777 perms. Still fails to load. Running `curl https://[PANGOLIN URL]/branding/logo.png` from my desktop accesses the PNG file. Running `curl https://[PANGOLIN URL]/branding/logo.svg` returns [this 214.40 KB HTML response](https://pastebin.com/EvkAGgB6), which is the same response I get when I run `curl` against a nonsense path, like `curl https://[PANGOLIN URL]/fizzlewhip/tog689`. ### Additional Discussion - [Thread on Reddit](https://www.reddit.com/r/PangolinReverseProxy/comments/1tl096u/why_isnt_my_custom_logo_loading/) - #3133
GiteaMirror added the stale label 2026-06-18 20:58:24 -05:00
Author
Owner

@AstralDestiny commented on GitHub (May 23, 2026):

Image

/config/privateConfig.yml

acme:
  acme_json_path: /acme.json
  resolver: cloudflare

# Respective part below
branding:
  app_name: "MyApp"
  
  logo:
    light_path: "/branding/logo-light.svg"
    dark_path: "/branding/logo-light.svg"
  
  colors:
    light:
      primary: "hsl(212, 65%, 35%)"
      ring: "hsl(212, 65%, 35%)"
      primary-foreground: "hsl(0 0% 98%)"
    dark:
      primary: "hsl(212, 65%, 45%)"
      ring: "hsl(212, 65%, 35%)"
      primary-foreground: "hsl(0 0% 98%)"

    volumes:
      - ./config:/app/config:rw
      - ./traefik/acme.json:/acme.json:ro
      - ./branding:/app/public/branding:ro

and if I don't populate the privateConfig,

Image Image

Wasn't able to replicate did you down and up when you populated the private config into the same folder as config.yml (case sensitive) (privateConfig.yml)

Used your svg you gave me.

<!-- gh-comment-id:4526112282 --> @AstralDestiny commented on GitHub (May 23, 2026): <img width="521" height="711" alt="Image" src="https://github.com/user-attachments/assets/b428d793-f119-4a3e-959f-199485144bc2" /> /config/privateConfig.yml ``` acme: acme_json_path: /acme.json resolver: cloudflare # Respective part below branding: app_name: "MyApp" logo: light_path: "/branding/logo-light.svg" dark_path: "/branding/logo-light.svg" colors: light: primary: "hsl(212, 65%, 35%)" ring: "hsl(212, 65%, 35%)" primary-foreground: "hsl(0 0% 98%)" dark: primary: "hsl(212, 65%, 45%)" ring: "hsl(212, 65%, 35%)" primary-foreground: "hsl(0 0% 98%)" ``` ``` volumes: - ./config:/app/config:rw - ./traefik/acme.json:/acme.json:ro - ./branding:/app/public/branding:ro ``` and if I don't populate the privateConfig, <img width="516" height="593" alt="Image" src="https://github.com/user-attachments/assets/357175b8-2ad2-4bfd-8c7a-7877b92f9be0" /> <img width="841" height="315" alt="Image" src="https://github.com/user-attachments/assets/4c35861b-e2cf-4e30-ada1-e05f6c7374d5" /> Wasn't able to replicate did you down and up when you populated the private config into the same folder as config.yml (case sensitive) (privateConfig.yml) Used your svg you gave me.
Author
Owner

@SpencerDub commented on GitHub (May 23, 2026):

@AstralDestiny Thanks for trying to replicate.

Further troubleshooting/response

  • privateConfig.yml is named exactly like that, and is adjacent to config.yml with identical permissions and ownership.
  • I did another round of down and up just now. Still fails.
  • I have removed the privateConfig.yml file to test if there was interference between the config file and the UI-set preferences. Still fails.

Partial resolution

I renamed the SVG logo from logo.svg to logo-light.svg, and updated the path in the UI dashboard to /branding/logo-light.svg. (For clarity, at this time, there is no existing privateConfig.yml file, so all config is done via UI.) This worked.

Out of curiosity, I then renamed the SVG to logo-dark.svg and updated the path. This broke again.

Can you replicate this? An easy test would be using a logo file named logo.svg instead of logo-light.svg (as described in the issue report above).

I can make do for now with logo-light.svg, but I'm curious: is Pangolin supposed to be able to accept local SVG logos with any filename, or only logo-light.svg?

<!-- gh-comment-id:4526255962 --> @SpencerDub commented on GitHub (May 23, 2026): @AstralDestiny Thanks for trying to replicate. ### Further troubleshooting/response - `privateConfig.yml` is named exactly like that, and is adjacent to `config.yml` with identical permissions and ownership. - I did another round of down and up just now. Still fails. - I have removed the `privateConfig.yml` file to test if there was interference between the config file and the UI-set preferences. Still fails. ### Partial resolution I renamed the SVG logo from `logo.svg` to `logo-light.svg`, and updated the path in the UI dashboard to `/branding/logo-light.svg`. (For clarity, at this time, there is no existing `privateConfig.yml` file, so all config is done via UI.) **This worked.** Out of curiosity, I then renamed the SVG to `logo-dark.svg` and updated the path. This broke again. Can you replicate this? An easy test would be using a logo file named `logo.svg` instead of `logo-light.svg` (as described in the issue report above). I can make do for now with `logo-light.svg`, but I'm curious: is Pangolin supposed to be able to accept local SVG logos with any filename, or _only_ `logo-light.svg`?
Author
Owner

@AstralDestiny commented on GitHub (May 23, 2026):

Possibly like how the acme part of privateConfig only accepted acme.json and not just anything matching the file

<!-- gh-comment-id:4526267202 --> @AstralDestiny commented on GitHub (May 23, 2026): Possibly like how the acme part of privateConfig only accepted acme.json and not just anything matching the file
Author
Owner

@AstralDestiny commented on GitHub (May 23, 2026):

Anyways bugged the others. :)

<!-- gh-comment-id:4526272656 --> @AstralDestiny commented on GitHub (May 23, 2026): Anyways bugged the others. :)
Author
Owner

@SpencerDub commented on GitHub (May 23, 2026):

Appreciate it! Thanks for your feedback, it helped me narrow in on the behavior.

<!-- gh-comment-id:4526274778 --> @SpencerDub commented on GitHub (May 23, 2026): Appreciate it! Thanks for your feedback, it helped me narrow in on the behavior.
Author
Owner

@SpencerDub commented on GitHub (May 23, 2026):

Question

Will SVG logo files not named logo-light.svg work if specified in privateConfig.yml instead of the UI?

Process

I re-added a privateConfig.yml file with the following content:

branding:
  logo:
    light_path: "/branding/logo-light.svg"
    dark_path: "/branding/bug_logo.svg"

where /branding/bug_logo.svg exists and is the ladybug image, as linked above, and /branding/logo-light.svg exists and is the logo I wish to use for my instance.

I then restarted the container with docker compose down and docker compose up -d. I went into the admin panel and clicked the "Remove Branding" button.

Results

The specified SVG logos load as expected.

Pangolin login screen, light mode, showing a correctly loaded instance logo Pangolin login screen, dark mode, showing a correctly loaded ladybug logo

Tentative Conclusion

The reported issue is related to setting SVG logos not named logo-light.svg from the administration UI, using a local path.

<!-- gh-comment-id:4526440257 --> @SpencerDub commented on GitHub (May 23, 2026): ### Question Will SVG logo files _not_ named `logo-light.svg` work if specified in `privateConfig.yml` instead of the UI? ### Process I re-added a `privateConfig.yml` file with the following content: ``` branding: logo: light_path: "/branding/logo-light.svg" dark_path: "/branding/bug_logo.svg" ``` where `/branding/bug_logo.svg` exists and is the ladybug image, as linked above, and `/branding/logo-light.svg` exists and is the logo I wish to use for my instance. I then restarted the container with `docker compose down` and `docker compose up -d`. I went into the admin panel and clicked the "Remove Branding" button. ### Results The specified SVG logos load as expected. <img width="366" height="500" alt="Pangolin login screen, light mode, showing a correctly loaded instance logo" src="https://github.com/user-attachments/assets/645b6be6-0d57-450e-bbf9-b5d2905fa9bb" /> <img width="373" height="500" alt="Pangolin login screen, dark mode, showing a correctly loaded ladybug logo" src="https://github.com/user-attachments/assets/91fadf47-ce72-488c-b507-55e02daa71d0" /> ### Tentative Conclusion The reported issue is related to setting SVG logos not named `logo-light.svg` **from the administration UI**, using a local path.
Author
Owner

@github-actions[bot] commented on GitHub (Jun 7, 2026):

This issue has been automatically marked as stale due to 14 days of inactivity. It will be closed in 14 days if no further activity occurs.

<!-- gh-comment-id:4640972050 --> @github-actions[bot] commented on GitHub (Jun 7, 2026): This issue has been automatically marked as stale due to 14 days of inactivity. It will be closed in 14 days if no further activity occurs.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/pangolin#35742