Wrong photo count in share pages, duplicated <meta> tags #2796

Closed
opened 2026-02-05 07:03:39 +03:00 by OVERLORD · 0 comments
Owner

Originally created by @codeceptsDE on GitHub (Apr 8, 2024).

The bug

When sharing an album via link, the (opengraph/...) preview displays "0 shared photos & videos" as description, irrespective of the actual count.
The wrong description is gathered from the duplicated <meta> tags in the share page's <head>.
There, the <meta name="description", <meta propterty="og: and <meta name=twitter: tags appear twice: once with count 0, and at the end with the correct count. In fact, the <meta name="description" even appears a third time.
The displayed count in the actual page body is correct.

The OS that Immich Server is running on

Docker on Debian

Version of Immich Server

v1.101.0

Version of Immich Mobile App

Platform with the issue

  • Server
  • Web
  • Mobile

Your docker-compose.yml content

-

Your .env content

-

Reproduction steps

1. Create an album with some pictures in it
2. Create and copy a public share link
3a. Share it using an app that digests Open Graph Meta Tags (Signal, WhatsApp, ...)
3b. or visit this link and check the <head>

Additional information

The initially sent <head> looks like this, and (only) contains the description mentioning 0 photos:

initial header
<head>
      <!-- (used for SSR) -->
      
      <meta name="description" content="0 shared photos & videos" />
  
      <!-- Facebook Meta Tags -->
      <meta property="og:type" content="website" />
      <meta property="og:title" content="Test Album" />
      <meta property="og:description" content="0 shared photos & videos" />
      <meta property="og:image" content="/api/asset/thumbnail/redacted-hash-1?key=redacted-key-1" />
  
      <!-- Twitter Meta Tags -->
      <meta name="twitter:card" content="summary_large_image" />
      <meta name="twitter:title" content="Test Album" />
      <meta name="twitter:description" content="0 shared photos & videos" />
  
      <meta name="twitter:image" content="/api/asset/thumbnail/redacted-hash-1?key=redacted-key-1" />
  
      <meta charset="utf-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1" />
      <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
      <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png" />
      <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png" />
      <link rel="icon" type="image/png" sizes="48x48" href="/favicon-48.png" />
      <link rel="icon" type="image/png" sizes="96x96" href="/favicon-96.png" />
      <link rel="icon" type="image/png" sizes="144x144" href="/favicon-144.png" />
      <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180.png" />
      
		  <link rel="modulepreload" href="/_app/immutable/entry/start.BtuCG57Q.js">
		  <link rel="modulepreload" href="/_app/immutable/chunks/entry.Cvo-FpGt.js">
		  <link rel="modulepreload" href="/_app/immutable/chunks/scheduler.B_8IifyR.js">
		  <link rel="modulepreload" href="/_app/immutable/chunks/index.Cno4wYCv.js">
		  <link rel="modulepreload" href="/_app/immutable/chunks/control.CYgJF_JY.js">
		  <link rel="modulepreload" href="/_app/immutable/entry/app.CXFWIA10.js">
		  <link rel="modulepreload" href="/_app/immutable/chunks/preload-helper.D6kgxu3v.js">
		  <link rel="modulepreload" href="/_app/immutable/chunks/fetch-client.CUHQ0TcQ.js">
		  <link rel="modulepreload" href="/_app/immutable/chunks/fetch-errors.uU89CZb4.js">
		  <link rel="modulepreload" href="/_app/immutable/chunks/index.C_ZQAE17.js">
      <script>
        /**
         * Prevent FOUC on page load.
         */
        const colorThemeKeyName = 'color-theme';
        let theme;
        const fallbackTheme = { value: 'dark', system: false };
        let item = localStorage.getItem(colorThemeKeyName);
        if (item === 'dark' || item === 'light') {
          fallbackTheme.value = item;
          item = JSON.stringify(fallbackTheme);
          localStorage.setItem(colorThemeKeyName, item);
        }
  
        theme = JSON.parse(localStorage.getItem(colorThemeKeyName));
  
        if (theme) {
          if (theme.system) {
            if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
              theme.value = 'dark';
            } else {
              theme.value = 'light';
            }
          }
        } else {
          theme = fallbackTheme;
        }
  
        if (theme.value === 'light') {
          document.documentElement.classList.remove('dark');
        } else {
          document.documentElement.classList.add('dark');
        }
      </script>
  
      <link rel="stylesheet" href="/custom.css" />
</head>

After all scripts have run, the following lines get appended at the end (whitespace by me). They do contain the correct count.

additional html header content after scripts
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/nodes/0.DD-cy1e1.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/globals.D0QH3NT1.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/stores.B03-bvUI.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/each.BwOGGep0.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/asset-utils.DGf9_sCB.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/handle-error.CSVE2nDC.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/constants.Bpz8U4eZ.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/assets.store.DW3flLtC.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/utils.DVWwBkqH.js">
  link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/mdi.BV22mFDw.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/immich-logo.oA_amK1Z.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/user.store.DgX5F5CA.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/isObject.C1QGnB9O.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/index.D90jsEsb.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/byte-units.DO_suu0W.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/full-screen-modal.DCalyMo3.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/icon.CitxRCSk.js">
  <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/full-screen-modal.BbkrCrrJ.css">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/tweened.CPMdlHcf.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/index.BN8E8CJA.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/file-uploader.qDRhNFoP.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/button.v8vGQN72.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/server-config.store.IRC7NiWS.js">
  <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/0.tIvUB-tA.css">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/nodes/1.QXGy38w3.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/nodes/3.DiArypaa.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/nodes/2.D8oVbPCF.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/drag-and-drop-files.store.B7Pog2dh.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/nodes/26.DMPkv4nB.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/auth.Ceg-WeSQ.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/index.De_1-CT6.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/select-all-assets.BzR5ReHe.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/asset-viewing.store.mRMzDq3m.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/confirm-dialogue.BhmYBszv.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/asset-interaction.store.DPVdCmuj.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/await_block.BlewDEB9.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/search.store.DAlb-nd0.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/actions.BkwPCzvi.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/context.DIEM_g3G.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/control-app-bar.B6F-Oi8Y.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/thumbnail.DqVrA8TF.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/_baseAssignValue.W6g5Whkg.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/_Uint8Array.DvXTXgW_.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/_baseOrderBy.DV8hZIM-.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/_baseIsEqual.Ch7U8cuK.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/sortBy.XwzQlGAa.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/date-time.BYjMqNhs.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/loading-spinner.DVWs1VqT.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/portal.Br4wOV3m.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/show-shortcuts.Bu6LcXwQ.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/index.CRKz8IfQ.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/_commonjsHelpers.Cpj98o6Y.js">
  <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/asset-interaction.CGKq8xGP.css">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/download-action.MmWCB3dZ.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/menu-option.BLweWlp5.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/theme-button.DYzPFfyz.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/svg-paths.DbvdwnkZ.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/date-input.DQSnZWXn.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/album-summary.CCASde5K.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/gallery-viewer.DBveSN9m.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/asset-viewer.DIADuSJM.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/create-shared-link-modal.BqsR7kR2.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/link-button.CsxwjmuM.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/base-modal.FP0tnRy3.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/setting-input-field.BB_LoDkx.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/slider.vcv1dGfy.js">
  <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/slider.BBXJsz-u.css">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/password-field.CANFI-Zp.js">
  <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/password-field.CS2a_IZa.css">
  <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/create-shared-link-modal.BXkSff4r.css">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/slideshow.store.CPd74ZbY.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/dropdown.BUY6g8_R.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/isEqual.C3aOr1pq.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/user-avatar.CaIx_lib.js">
  <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/slideshow.Ms20_H8Y.css">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/album-selection-modal.BiJOBHN0.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/context-menu.CGc3neFn.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/context-menu.Cq37Xao7.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/change-location.cyCL-Ais.js">
  <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/person.BXgx_P9E.js">
  <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/asset-viewer.CeAujpVS.css">
  <title>Test Album</title>
  <link rel="manifest" href="/manifest.json">
  <meta name="theme-color" content="currentColor">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2048-2732.fwp6Mnv1.png" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2732-2048.jOsVZbjH.png" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1668-2388.CksGwLMT.png" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> 
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2388-1668.D_LOzq4n.png" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1536-2048.CrADJBaU.png" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2048-1536.CWjKc89z.png" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1668-2224.DOKa-KY3.png" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2224-1668.BzXLZnrP.png" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1620-2160.JH4Mgnb-.png" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2160-1620.lYW7omrw.png" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1290-2796.Dl_iQwcQ.png" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2796-1290.BnQZ3ZCK.png" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1179-2556.BsSwDIAl.png" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2556-1179.7vTA5SZb.png" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1284-2778.BFr0RH02.png" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2778-1284.BYczaWmT.png" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1170-2532.DFj8yr_L.png" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2532-1170.BNqP3wVp.png" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1125-2436.B794NZP4.png" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2436-1125.DqWdbo6S.png" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1242-2688.CAABK-rM.png" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2688-1242.Dd466Tc7.png" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-828-1792.DU0yixAw.png" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1792-828.C8I8cgbe.png" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1242-2208.CoTZo0Tn.png" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2208-1242.HHGTmLaT.png" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-750-1334.BbUurNCS.png" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1334-750.DOUeOlsd.png" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-640-1136.CKW01CIt.png" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
  <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1136-640.CqrpG6nt.png" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
  <meta name="description" content="5 shared photos &amp; videos.">
  <meta property="og:type" content="website">
  <meta property="og:title" content="Test Album">
  <meta property="og:description" content="5 shared photos &amp; videos.">
  <meta property="og:image" content="/api/asset/thumbnail/redacted-hash-1?format=WEBP">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:title" content="Test Album">
  <meta name="twitter:description" content="5 shared photos &amp; videos.">
  <meta name="twitter:image" content="/api/asset/thumbnail/redacted-hash-1?format=WEBP">
  <meta name="description" content="5 shared photos &amp; videos.">

The relevant sections are:

before scripts (beginning of header):

    <!-- (used for SSR) -->
    
    <meta name="description" content="0 shared photos &amp; videos">

    <!-- Facebook Meta Tags -->
    <meta property="og:type" content="website">
    <meta property="og:title" content="Test Album">
    <meta property="og:description" content="0 shared photos &amp; videos">
    <meta property="og:image" content="/api/asset/thumbnail/redacted-hash-1?key=redacted-key-1">

    <!-- Twitter Meta Tags -->
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:title" content="Test Album">
    <meta name="twitter:description" content="0 shared photos &amp; videos">

    <meta name="twitter:image" content="/api/asset/thumbnail/redacted-hash-1?key=redacted-key-1">

and after (end of header):

  <meta name="description" content="5 shared photos &amp; videos.">
  <meta property="og:type" content="website">
  <meta property="og:title" content="Test Album">
  <meta property="og:description" content="5 shared photos &amp; videos.">
  <meta property="og:image" content="/api/asset/thumbnail/redacted-hash-1?format=WEBP">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:title" content="Test Album">
  <meta name="twitter:description" content="5 shared photos &amp; videos.">
  <meta name="twitter:image" content="/api/asset/thumbnail/redacted-hash-1?format=WEBP">
  <meta name="description" content="5 shared photos &amp; videos.">

Note how <meta name="description" even appears a third time.

Thoughts on a possible fix

I am unsure how different apps deal with metadata information and js. I suspect it may not be enough if the metadata tags are replaced once the scripts have loaded (instead of accidentally duplicating), because not all apps may wait until js has run.
But if it's possible to load the thumbnail on the first request, so should be the photo count, I would assume.

Originally created by @codeceptsDE on GitHub (Apr 8, 2024). ### The bug When sharing an album via link, the (opengraph/...) preview displays "0 shared photos & videos" as description, irrespective of the actual count. The wrong description is gathered from the duplicated `<meta>` tags in the share page's `<head>`. There, the `<meta name="description"`, `<meta propterty="og:` and `<meta name=twitter:` tags appear twice: once with count 0, and at the end with the correct count. In fact, the `<meta name="description"` even appears a third time. The displayed count in the actual page body is correct. ### The OS that Immich Server is running on Docker on Debian ### Version of Immich Server v1.101.0 ### Version of Immich Mobile App - ### Platform with the issue - [ ] Server - [X] Web - [ ] Mobile ### Your docker-compose.yml content ```YAML - ``` ### Your .env content ```Shell - ``` ### Reproduction steps ```bash 1. Create an album with some pictures in it 2. Create and copy a public share link 3a. Share it using an app that digests Open Graph Meta Tags (Signal, WhatsApp, ...) 3b. or visit this link and check the <head> ``` ### Additional information The initially sent `<head>` looks like this, and (only) contains the description mentioning 0 photos: <details> <summary>initial header</summary> ``` <head> <!-- (used for SSR) --> <meta name="description" content="0 shared photos & videos" /> <!-- Facebook Meta Tags --> <meta property="og:type" content="website" /> <meta property="og:title" content="Test Album" /> <meta property="og:description" content="0 shared photos & videos" /> <meta property="og:image" content="/api/asset/thumbnail/redacted-hash-1?key=redacted-key-1" /> <!-- Twitter Meta Tags --> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content="Test Album" /> <meta name="twitter:description" content="0 shared photos & videos" /> <meta name="twitter:image" content="/api/asset/thumbnail/redacted-hash-1?key=redacted-key-1" /> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" /> <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png" /> <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png" /> <link rel="icon" type="image/png" sizes="48x48" href="/favicon-48.png" /> <link rel="icon" type="image/png" sizes="96x96" href="/favicon-96.png" /> <link rel="icon" type="image/png" sizes="144x144" href="/favicon-144.png" /> <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180.png" /> <link rel="modulepreload" href="/_app/immutable/entry/start.BtuCG57Q.js"> <link rel="modulepreload" href="/_app/immutable/chunks/entry.Cvo-FpGt.js"> <link rel="modulepreload" href="/_app/immutable/chunks/scheduler.B_8IifyR.js"> <link rel="modulepreload" href="/_app/immutable/chunks/index.Cno4wYCv.js"> <link rel="modulepreload" href="/_app/immutable/chunks/control.CYgJF_JY.js"> <link rel="modulepreload" href="/_app/immutable/entry/app.CXFWIA10.js"> <link rel="modulepreload" href="/_app/immutable/chunks/preload-helper.D6kgxu3v.js"> <link rel="modulepreload" href="/_app/immutable/chunks/fetch-client.CUHQ0TcQ.js"> <link rel="modulepreload" href="/_app/immutable/chunks/fetch-errors.uU89CZb4.js"> <link rel="modulepreload" href="/_app/immutable/chunks/index.C_ZQAE17.js"> <script> /** * Prevent FOUC on page load. */ const colorThemeKeyName = 'color-theme'; let theme; const fallbackTheme = { value: 'dark', system: false }; let item = localStorage.getItem(colorThemeKeyName); if (item === 'dark' || item === 'light') { fallbackTheme.value = item; item = JSON.stringify(fallbackTheme); localStorage.setItem(colorThemeKeyName, item); } theme = JSON.parse(localStorage.getItem(colorThemeKeyName)); if (theme) { if (theme.system) { if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { theme.value = 'dark'; } else { theme.value = 'light'; } } } else { theme = fallbackTheme; } if (theme.value === 'light') { document.documentElement.classList.remove('dark'); } else { document.documentElement.classList.add('dark'); } </script> <link rel="stylesheet" href="/custom.css" /> </head> ``` </details> After all scripts have run, the following lines get appended at the end (whitespace by me). They do contain the correct count. <details> <summary>additional html header content after scripts</summary> ``` <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/nodes/0.DD-cy1e1.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/globals.D0QH3NT1.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/stores.B03-bvUI.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/each.BwOGGep0.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/asset-utils.DGf9_sCB.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/handle-error.CSVE2nDC.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/constants.Bpz8U4eZ.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/assets.store.DW3flLtC.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/utils.DVWwBkqH.js"> link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/mdi.BV22mFDw.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/immich-logo.oA_amK1Z.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/user.store.DgX5F5CA.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/isObject.C1QGnB9O.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/index.D90jsEsb.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/byte-units.DO_suu0W.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/full-screen-modal.DCalyMo3.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/icon.CitxRCSk.js"> <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/full-screen-modal.BbkrCrrJ.css"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/tweened.CPMdlHcf.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/index.BN8E8CJA.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/file-uploader.qDRhNFoP.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/button.v8vGQN72.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/server-config.store.IRC7NiWS.js"> <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/0.tIvUB-tA.css"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/nodes/1.QXGy38w3.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/nodes/3.DiArypaa.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/nodes/2.D8oVbPCF.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/drag-and-drop-files.store.B7Pog2dh.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/nodes/26.DMPkv4nB.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/auth.Ceg-WeSQ.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/index.De_1-CT6.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/select-all-assets.BzR5ReHe.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/asset-viewing.store.mRMzDq3m.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/confirm-dialogue.BhmYBszv.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/asset-interaction.store.DPVdCmuj.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/await_block.BlewDEB9.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/search.store.DAlb-nd0.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/actions.BkwPCzvi.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/context.DIEM_g3G.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/control-app-bar.B6F-Oi8Y.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/thumbnail.DqVrA8TF.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/_baseAssignValue.W6g5Whkg.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/_Uint8Array.DvXTXgW_.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/_baseOrderBy.DV8hZIM-.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/_baseIsEqual.Ch7U8cuK.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/sortBy.XwzQlGAa.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/date-time.BYjMqNhs.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/loading-spinner.DVWs1VqT.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/portal.Br4wOV3m.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/show-shortcuts.Bu6LcXwQ.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/index.CRKz8IfQ.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/_commonjsHelpers.Cpj98o6Y.js"> <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/asset-interaction.CGKq8xGP.css"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/download-action.MmWCB3dZ.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/menu-option.BLweWlp5.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/theme-button.DYzPFfyz.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/svg-paths.DbvdwnkZ.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/date-input.DQSnZWXn.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/album-summary.CCASde5K.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/gallery-viewer.DBveSN9m.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/asset-viewer.DIADuSJM.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/create-shared-link-modal.BqsR7kR2.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/link-button.CsxwjmuM.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/base-modal.FP0tnRy3.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/setting-input-field.BB_LoDkx.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/slider.vcv1dGfy.js"> <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/slider.BBXJsz-u.css"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/password-field.CANFI-Zp.js"> <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/password-field.CS2a_IZa.css"> <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/create-shared-link-modal.BXkSff4r.css"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/slideshow.store.CPd74ZbY.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/dropdown.BUY6g8_R.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/isEqual.C3aOr1pq.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/user-avatar.CaIx_lib.js"> <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/slideshow.Ms20_H8Y.css"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/album-selection-modal.BiJOBHN0.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/context-menu.CGc3neFn.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/context-menu.Cq37Xao7.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/change-location.cyCL-Ais.js"> <link rel="modulepreload" as="script" crossorigin="" href="https://redacted.domain/_app/immutable/chunks/person.BXgx_P9E.js"> <link rel="stylesheet" href="https://redacted.domain/_app/immutable/assets/asset-viewer.CeAujpVS.css"> <title>Test Album</title> <link rel="manifest" href="/manifest.json"> <meta name="theme-color" content="currentColor"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2048-2732.fwp6Mnv1.png" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2732-2048.jOsVZbjH.png" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1668-2388.CksGwLMT.png" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2388-1668.D_LOzq4n.png" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1536-2048.CrADJBaU.png" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2048-1536.CWjKc89z.png" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1668-2224.DOKa-KY3.png" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2224-1668.BzXLZnrP.png" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1620-2160.JH4Mgnb-.png" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2160-1620.lYW7omrw.png" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1290-2796.Dl_iQwcQ.png" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2796-1290.BnQZ3ZCK.png" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1179-2556.BsSwDIAl.png" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2556-1179.7vTA5SZb.png" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1284-2778.BFr0RH02.png" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2778-1284.BYczaWmT.png" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1170-2532.DFj8yr_L.png" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2532-1170.BNqP3wVp.png" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1125-2436.B794NZP4.png" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2436-1125.DqWdbo6S.png" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1242-2688.CAABK-rM.png" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2688-1242.Dd466Tc7.png" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-828-1792.DU0yixAw.png" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1792-828.C8I8cgbe.png" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1242-2208.CoTZo0Tn.png" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-2208-1242.HHGTmLaT.png" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-750-1334.BbUurNCS.png" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1334-750.DOUeOlsd.png" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-640-1136.CKW01CIt.png" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="https://redacted.domain/_app/immutable/assets/apple-splash-1136-640.CqrpG6nt.png" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <meta name="description" content="5 shared photos &amp; videos."> <meta property="og:type" content="website"> <meta property="og:title" content="Test Album"> <meta property="og:description" content="5 shared photos &amp; videos."> <meta property="og:image" content="/api/asset/thumbnail/redacted-hash-1?format=WEBP"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:title" content="Test Album"> <meta name="twitter:description" content="5 shared photos &amp; videos."> <meta name="twitter:image" content="/api/asset/thumbnail/redacted-hash-1?format=WEBP"> <meta name="description" content="5 shared photos &amp; videos."> ``` </details> The relevant sections are: ### before scripts (beginning of header): ``` <!-- (used for SSR) --> <meta name="description" content="0 shared photos &amp; videos"> <!-- Facebook Meta Tags --> <meta property="og:type" content="website"> <meta property="og:title" content="Test Album"> <meta property="og:description" content="0 shared photos &amp; videos"> <meta property="og:image" content="/api/asset/thumbnail/redacted-hash-1?key=redacted-key-1"> <!-- Twitter Meta Tags --> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:title" content="Test Album"> <meta name="twitter:description" content="0 shared photos &amp; videos"> <meta name="twitter:image" content="/api/asset/thumbnail/redacted-hash-1?key=redacted-key-1"> ``` ### and after (end of header): ``` <meta name="description" content="5 shared photos &amp; videos."> <meta property="og:type" content="website"> <meta property="og:title" content="Test Album"> <meta property="og:description" content="5 shared photos &amp; videos."> <meta property="og:image" content="/api/asset/thumbnail/redacted-hash-1?format=WEBP"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:title" content="Test Album"> <meta name="twitter:description" content="5 shared photos &amp; videos."> <meta name="twitter:image" content="/api/asset/thumbnail/redacted-hash-1?format=WEBP"> <meta name="description" content="5 shared photos &amp; videos."> ``` Note how `<meta name="description"` even appears a third time. ## Thoughts on a possible fix I am unsure how different apps deal with metadata information and js. I suspect it may not be enough if the metadata tags are replaced once the scripts have loaded (instead of accidentally duplicating), because not all apps may wait until js has run. But if it's possible to load the thumbnail on the first request, so should be the photo count, I would assume.
OVERLORD added the good first issue🖥️web labels 2026-02-05 07:03:40 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: immich-app/immich#2796