Skip to content

Add Per-Team Branded Share Subdomains On lawn.video (PROMPT) #32

@PraiseXI

Description

@PraiseXI

Problem

Share links currently use the app’s current origin, so teams do not get a branded share URL.

Relevant places:

  • src/components/ShareDialog.tsx
  • app/routes/dashboard/-project.tsx
  • convex/schema.ts
  • convex/shareLinks.ts

If the intended product direction is to keep shared links on lawn.video, then teams should still be able to get team-specific
share URLs without needing full custom domain setup.

Goal

Add per-team share subdomains on lawn.video, for example:

  • https://acme.lawn.video/share/<token>
  • https://acme.lawn.video/watch/<publicId>

This should preserve the repo’s priorities:

  • performance above all else
  • good defaults
  • convenience
  • security

Why This Approach

Compared to full custom domains, team subdomains on lawn.video are:

  • simpler to configure
  • faster to ship
  • easier to make the default
  • less likely to create auth/cookie/domain edge cases
  • more consistent with a low-friction share workflow

This fits the project better than making users manage DNS in v1.

Scope

In scope:

  • assign each team a share subdomain on lawn.video
  • use that subdomain automatically for public watch links and restricted share links
  • generate/copy/open links using that team subdomain by default
  • add any necessary host resolution for incoming share traffic

Out of scope unless straightforward:

  • user-provided custom domains
  • moving the dashboard app to team subdomains
  • advanced brand customization beyond the hostname

Requirements

  • Each team gets a unique, stable subdomain on lawn.video
  • Subdomains should be generated with good defaults from the team slug or another stable team identifier
  • Collisions must be handled safely
  • Copied share links should use the team’s subdomain automatically
  • Existing share protections must keep working:
    • expiration
    • password protection
    • download flags
  • The implementation must not weaken auth or expose the wrong team’s content on the wrong host

Suggested Implementation

Data model

Add a team-level share hostname/subdomain field or derived hostname strategy.

At minimum:

  • a unique team share slug/subdomain
  • validation and collision handling
  • ability to resolve incoming hostnames to the correct team

URL generation

Replace window.location.origin-based share URL generation with:

  • https://<team-subdomain>.lawn.video for eligible share/watch links
  • fallback to the default app origin where necessary

This should require no extra setup for normal users.

Routing

Add host-based resolution for share pages so the incoming *.lawn.video hostname maps to the correct team context.

Defaults

Prefer automatic defaults:

  • generate the share subdomain from the team slug if possible
  • avoid adding a settings flow unless needed
  • keep the common path instant and simple

Security Requirements

  • Subdomains must be unique and tied to exactly one team
  • A team’s subdomain must not expose another team’s share links
  • Existing share-link auth rules must continue to apply
  • Public endpoints should be reviewed carefully for host-based isolation issues

Performance Requirements

  • Share-link creation and copying should remain immediate
  • Avoid unnecessary client-side waterfalls
  • Avoid per-link configuration
  • Keep the default share workflow as fast as it is now

Acceptance Criteria

  • A team has a stable share subdomain on lawn.video
  • Public watch and restricted share links use that subdomain by default
  • Visiting the subdomain link loads the correct shared video page
  • Existing share protections still work
  • The implementation keeps the share flow fast and low-friction
  • Team isolation remains intact

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions