Files
OpenFrame/lib/seo.ts
T
yusufipk 6c6df3cf1d feat: hosted-first landing + accurate fair source licensing copy
- Replace unsubstantiated hero claim with client sign-off messaging
- Rename Open Source (Self-hosted) to Fair Source (Self-hosted) with FSL
  explanation (source visible, self-hostable, Apache 2.0 after two years)
- Put Hosted Cloud first in pricing with Recommended badge and trial note
- Move self-hosting hero link to GitHub, out of primary CTA path
- Add FAQ entries for FSL licensing and 7-day free trial
- Align license language across landing, README, terms, SEO, comparisons
- Fix contact email to [email protected] everywhere (mailto links,
  notification sender fallbacks) and SEO fallback domain
2026-07-12 18:32:38 +07:00

47 lines
1.2 KiB
TypeScript

const FALLBACK_SITE_URL = 'https://open-frame.net';
function normalizeSiteUrl(rawUrl: string | undefined): string {
if (!rawUrl) {
return FALLBACK_SITE_URL;
}
const trimmed = rawUrl.trim();
if (!trimmed) {
return FALLBACK_SITE_URL;
}
const withProtocol = /^https?:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`;
try {
return new URL(withProtocol).origin;
} catch {
return FALLBACK_SITE_URL;
}
}
export function getSiteUrl(): string {
return normalizeSiteUrl(process.env.NEXT_PUBLIC_APP_URL ?? process.env.NEXTAUTH_URL);
}
export const seoConfig = {
name: 'OpenFrame',
title: 'Fair Source Video Review Platform',
description:
'OpenFrame is a fair source video review platform for collecting timestamped feedback with text and voice comments.',
keywords: [
'fair source video review platform',
'video review platform',
'video review tool',
'timestamped video feedback',
'video collaboration',
'video annotation',
'creative review workflow',
],
url: getSiteUrl(),
ogImage: '/meta.webp',
logoPath: '/icon.svg',
logo: '/icon.svg?v=2',
githubUrl: 'https://github.com/yusufipk/OpenFrame',
} as const;