add page-specific titles to shared link previews
Problem Statement
When any Kaneo URL is shared in Slack, Teams, Discord, or another application that generates link previews, the preview always displays:
Kaneo - All you need. Nothing you don't.
This happens regardless of whether the link points to a task, a project board, workspace settings, project settings, account settings, an invitation, or another page.
As a result, shared Kaneo links are difficult to identify before opening them. This is particularly confusing for generic pages such as settings pages, where Kaneo could provide a meaningful page title without exposing any project, workspace, task, or user information.
Kaneo already updates the browser tab title after the application loads, but link preview crawlers receive the initial static HTML metadata.
Proposed Solution
Generate page-specific Open Graph and Twitter Card titles from the matched route or page type in the initial HTML response.
For example:
Task · KaneoProject board · KaneoProject backlog · KaneoProject settings · KaneoWorkspace settings · KaneoAccount settings · KaneoInvitation · KaneoSign in · Kaneo
The preview does not need to include task titles, project names, workspace names, user names, or any other resource data.
The metadata should:
- Be available in the initial HTML response without requiring JavaScript.
- Use only a generic label associated with the route.
- Use the actual shared URL for
og:url,twitter:url, and the canonical URL instead of always pointing tohttps://kaneo.app. - Fall back to the existing generic Kaneo metadata for unknown routes.
Public resource-specific previews containing actual project or task information could be considered separately, but are not required for this feature.
Alternative Solutions
Kaneo could continue updating only document.title after the frontend loads. However, this does not solve the problem for link preview crawlers, which generally read metadata from the initial HTML response.
Another alternative would be to keep the same generic preview for every route, but this provides no indication of what kind of Kaneo page the link points to.
Relevant Context
The current application shell defines the same static title and social metadata for every route:
Nginx serves this same application shell as the fallback for every frontend route:
Kaneo already has route-specific page titles on the client side through the PageTitle component:
Suggested acceptance criteria:
- A task URL produces a
Task · Kaneopreview. - A project settings URL produces a
Project settings · Kaneopreview. - An account settings URL produces an
Account settings · Kaneopreview. - The correct metadata is present in the initial HTML response without executing JavaScript.
- No task title, project name, workspace name, user information, or other resource data is exposed.
- Unknown routes retain the generic Kaneo preview.
Does this feature align with Kaneo's focus on simplicity?
Yes. The feature reuses information Kaneo already has about each route and does not require database lookups, new settings, or platform-specific integrations. It only makes existing shared links easier to understand.
Originally requested by @thriz0 on 2026-08-10. Original GitHub request #1553.
ROA-899
Original GitHub comment