···295295 }
296296297297 await Promise.all(promises);
298298+299299+ // Invalidate cached OG image so the next scrape regenerates it.
300300+ // Fire-and-forget; server checks auth against the signed-cookie session.
301301+ fetch(`/${data.did}/og-new.png`, { method: 'DELETE' }).catch(() => {});
298302}
299303300304export function createEmptyCard(page: string) {
+10-1
src/lib/website/EditableWebsite.svelte
···2121 import { tick, type Component } from 'svelte';
2222 import type { CardDefinition, CreationModalComponentProps } from '../cards/types';
2323 import { dev } from '$app/environment';
2424+ import { page } from '$app/state';
2425 import { setIsCoarse, setIsMobile, setSelectedCardId, setSelectCard } from './context';
2526 import BaseEditingCard from '../cards/_base/BaseCard/BaseEditingCard.svelte';
2627 import Context from './Context.svelte';
···55565657 // Check if floating login button will be visible (to hide MadeWithBlento)
5758 const showLoginOnEditPage = $derived(!user.isLoggedIn);
5959+6060+ const ogImageUrl = $derived.by(() => {
6161+ const origin = page.url.origin;
6262+ if (page.data.customDomain) return `${origin}/og-new.png`;
6363+ const handle = data.profile?.handle;
6464+ const actor = handle && handle !== 'handle.invalid' ? handle : data.did;
6565+ return `${origin}/${actor}/og-new.png`;
6666+ });
58675968 // Snapshot the original cards so savePage can detect deletions.
6069 const originalCards: Item[] = structuredClone(data.cards);
···516525<Head
517526 favicon={getImage(data.publication, data.did, 'icon') || data.profile.avatar}
518527 title={getName(data)}
519519- image={'/' + data.handle + '/og-new.png'}
528528+ image={ogImageUrl}
520529 accentColor={data.publication?.preferences?.accentColor}
521530 baseColor={data.publication?.preferences?.baseColor}
522531/>