# Research: Link Preview (Open Graph Meta-Tags) **Feature**: 012-link-preview | **Date**: 2026-03-09 ## R1: How to Serve Dynamic Meta-Tags from a Vue SPA ### Problem Vue SPA serves a single `index.html` for all routes via Spring Boot's `PathResourceResolver` fallback in `WebConfig.java`. Social media crawlers (WhatsApp, Telegram, Signal, Twitter/X) do NOT execute JavaScript — they only read the initial HTML response. The current `index.html` contains no Open Graph meta-tags. ### Decision: Server-Side HTML Template Injection Intercept HTML page requests in the Spring Boot backend. Before serving `index.html`, parse the route, fetch event data if applicable, and inject `` tags into the `` section. ### Rationale - **No new dependencies**: Uses Spring Boot's existing resource serving + simple string manipulation. - **No SSR framework needed**: Avoids adding Nuxt, Vite SSR, or a prerendering service. - **Universal**: Works for all clients (not just crawlers), improving SEO for all visitors. - **Simple**: The backend already serves `index.html` for all non-API/non-static routes. We just need to modify *what* HTML is returned. ### Alternatives Considered | Alternative | Rejected Because | |---|---| | **Vue SSR (Nuxt/Vite SSR)** | Massive architectural change. Overkill for injecting a few meta-tags. Violates KISS. | | **Prerendering service (prerender.io, rendertron)** | External dependency that may phone home. Violates Privacy by Design. Adds operational complexity. | | **User-agent sniffing** | Fragile — crawler UA strings change frequently. Serving different content to crawlers vs. users is considered cloaking by some search engines. | | **Static prerendering at build time** | Events are dynamic — created at runtime. Cannot prerender at build time. | | **`