- Timestamp:
- 06/24/2026 05:26:24 AM (3 months ago)
- Branches:
- main
- Children:
- 6bd25d1
- Parents:
- 5eef817
- Location:
- src
- Files:
-
- 3 added
- 3 edited
-
assets/fonts/fraunces-og.ttf (added)
-
middleware/render.js (modified) (1 diff)
-
routes/og.js (added)
-
server.js (modified) (2 diffs)
-
services/OgImageService.js (added)
-
views/shell.ejs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/middleware/render.js
r5eef817 r69815b2 137 137 cspNonce: () => '', 138 138 currentPath: req.path, 139 // Absolute origin (for building absolute URLs like the generated og:image). 140 ogOrigin: (process.env.PUBLIC_BASE_URL || `${req.protocol}://${req.get('host') || ''}`).replace(/\/+$/, ''), 139 141 ...data, 140 142 }; -
src/server.js
r5eef817 r69815b2 63 63 import adminEpkRoutes from './routes/admin-epk.js'; 64 64 import changelogRoutes from './routes/changelog.js'; 65 import ogRoutes from './routes/og.js'; 65 66 66 67 // SESSION_SECRET: use the env var if set. Otherwise auto-generate a strong one … … 222 223 app.use(federationRoutes); 223 224 225 // Themed OG cards (/og/:slug.png) — resolve the site by slug themselves, so they 226 // run before resolveSite and need no site context. 227 app.use('/og', ogRoutes); 228 224 229 app.use(resolveSite); 225 230 app.use(loadAudioTracks); -
src/views/shell.ejs
r5eef817 r69815b2 57 57 ? socialDescr 58 58 : (safeSite.default_description || safeSite.description || ''); 59 const _socialImage = (typeof socialImage !== 'undefined' && socialImage) 60 ? socialImage 61 : (safeSite.og_image_default || safeSite.default_cover || ''); 59 // og:image — custom (post/site) first; otherwise the auto-generated themed card 60 // (/og/<slug>.png), so every site has a branded social preview by default. 61 let _socialImage = '', _ogGenerated = false; 62 if (typeof socialImage !== 'undefined' && socialImage) _socialImage = socialImage; 63 else if (safeSite.og_image_default) _socialImage = safeSite.og_image_default; 64 else if (safeSite.default_cover) _socialImage = safeSite.default_cover; 65 else if (safeSite.slug && typeof ogOrigin !== 'undefined' && ogOrigin) { 66 _socialImage = ogOrigin + '/og/' + encodeURIComponent(safeSite.slug) + '.png'; 67 _ogGenerated = true; 68 } 62 69 const _ogType = isPostPage ? 'article' : 'website'; 63 70 … … 139 146 <meta property="og:image" content="<%= _e(_socialImage) %>"> 140 147 <meta property="og:image:alt" content="<%= _e(_socialTitle) %>"> 148 <% if (_ogGenerated) { %> 149 <meta property="og:image:width" content="1200"> 150 <meta property="og:image:height" content="630"> 151 <meta property="og:image:type" content="image/png"> 152 <% } %> 141 153 <% } %> 142 154 <% if (_canonical) { %><meta property="og:url" content="<%= _e(_canonical) %>"><% } %>
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)