diff --git a/app/layout.tsx b/app/layout.tsx index 0ddae53..963f792 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -2,21 +2,24 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; import { Providers } from "./providers"; +import { GoogleAnalytics } from "@/components/GoogleAnalytics"; +import { + GoogleTagManager, + GoogleTagManagerNoscript, +} from "@/components/GoogleTagManager"; import { JsonLd } from "@/components/JsonLd"; import { Matomo } from "@/components/Matomo"; +import { MicrosoftClarity } from "@/components/MicrosoftClarity"; const inter = Inter({ subsets: ["latin"] }); const SITE_URL = "https://songs2vid.com"; const SITE_NAME = "Songs2VID"; const DEFAULT_TITLE = - "Songs2VID - Fast Audio to Video Converter for YouTube | TunesToTube Alternative"; + "Songs2VID - Automated Audio to Video Pipeline for Content Creators"; const DEFAULT_DESCRIPTION = - "Convert MP3, WAV, and audio files into YouTube videos instantly. The fastest, privacy-focused online tool to upload music, beats, and podcasts directly to YouTube."; -const OG_TITLE = "Songs2VID - Fast Audio to Video Converter for YouTube"; -const OG_DESCRIPTION = - "Convert MP3 & audio files into YouTube videos instantly without heavy editing."; -const TWITTER_DESCRIPTION = "Convert MP3 & audio files into YouTube videos instantly."; + "Convert MP3/WAV tracks and cover art into YouTube-ready videos instantly. Automated, Docker-ready, and lightweight pipeline."; +const OG_IMAGE = "https://songs2vid.com/og-image.png"; export const metadata: Metadata = { metadataBase: new URL(SITE_URL), @@ -26,7 +29,16 @@ export const metadata: Metadata = { }, description: DEFAULT_DESCRIPTION, keywords: [ + "upload mp3 to youtube", + "upload flac to youtube", + "upload wav to youtube", + "mp3 to youtube hd", + "jpg to video", "mp3 to youtube", + "mp3 to youtube converter", + "upload mp3", + "mp3 uploader", + "youtube upload", "audio to video converter", "upload audio to youtube", "tunestotube alternative", @@ -42,26 +54,26 @@ export const metadata: Metadata = { canonical: SITE_URL, }, openGraph: { - title: OG_TITLE, - description: OG_DESCRIPTION, + title: DEFAULT_TITLE, + description: DEFAULT_DESCRIPTION, url: SITE_URL, siteName: SITE_NAME, type: "website", locale: "en_US", images: [ { - url: "/logo.png", - width: 512, - height: 512, + url: OG_IMAGE, + width: 1200, + height: 630, alt: SITE_NAME, }, ], }, twitter: { card: "summary_large_image", - title: OG_TITLE, - description: TWITTER_DESCRIPTION, - images: ["/logo.png"], + title: DEFAULT_TITLE, + description: DEFAULT_DESCRIPTION, + images: [OG_IMAGE], }, robots: { index: true, @@ -83,9 +95,15 @@ export default function RootLayout({ }>) { return ( +
+webhookUrl) you provide for automation (for
+ example n8n or Make) - see section 3.5
+ - If you purchase a Pro subscription or Free-plan extra credits, payment processing is handled - by Stripe. We do not store full payment card details on our servers. We may receive and store - billing status, Stripe customer and subscription identifiers, Checkout session or payment - references, purchase amounts, and credit pack size for fulfilled top-ups. + If you purchase an Independent Producer subscription, a Developer & Automation + subscription, an Enterprise arrangement, or Free-plan extra credits, payment processing is + handled by Stripe. We do not store full payment card details on our servers. We may receive + and store billing status, Stripe customer and subscription identifiers, Checkout session or + payment references, plan identifiers, purchase amounts, and credit pack size for fulfilled + top-ups. +
+ ++ On Developer & Automation and Enterprise plans (and self-hosted deployments where + enabled), you may supply an absolute HTTP(S) callback URL when creating a render job. We + store that URL with the job record and, when encoding or upload reaches a terminal state, + may POST a JSON payload to it. Typical fields include event type, job and item identifiers, + status, optional YouTube video ID, error message, and completion timestamp. +
++ You choose the destination (for example your n8n webhook, Make scenario, or your own + server). We do not control how that endpoint stores or shares the payload. Only set URLs you + own or are authorized to use. Delivery is best-effort; we do not guarantee receipt or + retention by the receiving system.
webhookUrl,
+ we send job status JSON to that URL as described in section 3.5
+ GTM-PZL4HXBR, which may deploy Google Analytics and other measurement tags we
+ configure. See{" "}
+
+ Google's Privacy Policy
+
+ .
+ These providers process data only as necessary to deliver their services and under @@ -186,8 +267,9 @@ export default function PrivacyPage() {
We do not sell, share, transfer, or disclose Google user data obtained via Google OAuth / YouTube APIs to third parties, except as needed to operate the Service infrastructure under - our control or when required by law. Google / YouTube themselves process data when we call - their APIs on your behalf to perform actions you initiate. + our control, when required by law, or when you explicitly configure a job webhook that may + include a YouTube video ID you caused to be published. Google / YouTube themselves process + data when we call their APIs on your behalf to perform actions you initiate.
You can revoke Songs2VID's access to your Google account at any time in{" "} @@ -196,7 +278,7 @@ export default function PrivacyPage() { target="_blank" rel="noopener noreferrer" > - Google Account → Security → Third-party access + Google Account - Security - Third-party access . After revocation (or when tokens can no longer be refreshed), we will stop using those credentials and delete or invalidate stored YouTube OAuth tokens and related connection data @@ -208,18 +290,24 @@ export default function PrivacyPage() {
webhookUrl) is
+ kept while your account remains active and may be purged on account deletion, subject to
+ short-term backups and troubleshooting logs
- You may delete your account from Dashboard → Settings (account deletion + You may delete your account from Dashboard - Settings (account deletion control) or by emailing{" "} {LEGAL_OPERATOR.email}. Deletion removes account and connection data from active systems subject to legal retention obligations @@ -245,7 +333,7 @@ export default function PrivacyPage() {
@@ -262,11 +350,43 @@ export default function PrivacyPage() {
We also use Matomo, a self-hosted analytics tool on{" "}
- analytics.atakanozban.com, on our website (including the landing page and
- dashboard) and documentation site. Matomo helps us understand how people use Songs2VID so we
- can improve functionality, reliability, and content. Typical data includes pages viewed,
- approximate location derived from IP, device/browser type, referring site, and interaction
- events. We configure Matomo for our domains under *.songs2vid.com.
+ analytics.atakanozban.com, Google Analytics 4 (measurement
+ IDs G-9XCHRS7LJR and G-2V3FSMMPQX), and{" "}
+ Microsoft Clarity (project y4hxg6t7s6) on our website
+ (including the landing page and dashboard) and documentation site. These tools help us
+ understand how people use Songs2VID so we can improve functionality, reliability, and
+ content. Typical data includes pages viewed, approximate location derived from IP,
+ device/browser type, referring site, interaction events, and (for Clarity) anonymized
+ session recordings and heatmaps. We configure Matomo for our domains under{" "}
+ *.songs2vid.com. Google Analytics is provided by Google LLC; see{" "}
+
+ Google's Privacy Policy
+
+ . Microsoft Clarity is provided by Microsoft Corporation; see{" "}
+
+ Microsoft's Privacy Statement
+
+ .
+
+ We also use Google Tag Manager (container GTM-PZL4HXBR) to
+ load and manage measurement tags on our website, including Google Analytics. Tag Manager is
+ a delivery mechanism; tags it loads may set cookies or collect usage data as described in
+ this section.
+
+ We use Google Search Console to verify site ownership and review search + indexing and performance reports (such as queries, impressions, and clicks) for + songs2vid.com. Search Console is operated by Google LLC and is not a page-level visitor + tracking pixel.
We collect this analytics data to improve the Service, not to sell personal profiles to @@ -280,17 +400,18 @@ export default function PrivacyPage() {
We implement appropriate technical and organizational measures to protect your data, - including encryption in transit, encrypted storage of YouTube OAuth tokens at rest, access - controls, and isolated processing environments. No method of transmission or storage is - 100% secure. + including encryption in transit, encrypted storage of YouTube OAuth tokens at rest, hashed + API keys, access controls, and isolated processing environments. No method of transmission + or storage is 100% secure.
If data is transferred outside your country, we ensure appropriate safeguards such as standard contractual clauses or equivalent mechanisms where required by law. Google, Stripe, - and infrastructure providers may process data in other countries as described in their - policies. + Microsoft, and infrastructure providers may process data in other countries as described in + their policies. Webhook destinations you configure may also receive data in other countries + under your control.