← All requests
0

add page-specific titles to shared link previews

Openthriz0 (GitHub) · · edited

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 · Kaneo
  • Project board · Kaneo
  • Project backlog · Kaneo
  • Project settings · Kaneo
  • Workspace settings · Kaneo
  • Account settings · Kaneo
  • Invitation · Kaneo
  • Sign 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 to https://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:

https://github.com/usekaneo/kaneo/blob/067102b44909c40886a7a5843a0882f3b04dc3ac/apps/web/index.html#L5-L35

Nginx serves this same application shell as the fallback for every frontend route:

https://github.com/usekaneo/kaneo/blob/067102b44909c40886a7a5843a0882f3b04dc3ac/apps/web/nginx.kaneo.conf#L55-L59

Kaneo already has route-specific page titles on the client side through the PageTitle component:

https://github.com/usekaneo/kaneo/blob/067102b44909c40886a7a5843a0882f3b04dc3ac/apps/web/src/components/page-title.tsx#L14-L21

Suggested acceptance criteria:

  • A task URL produces a Task · Kaneo preview.
  • A project settings URL produces a Project settings · Kaneo preview.
  • An account settings URL produces an Account settings · Kaneo preview.
  • 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.

Issue #1553

Discussion 1

Sign in to comment.

Keyboard shortcuts

Anywhere

Go to requests
gh
Go to changelog
gc
Go to notifications
gn
Next or previous page
norp
Leave a text field or close a menu
Esc
Show this list
?

Requests

Move to the next or previous request
jork
Open the selected request
oorEnter
Vote on the selected request
v
Search
/
New request
c

Request

Vote
v
Write a comment
c
Edit
e