Turnstile bot protection (sign-in, sign-up, password-reset): - Register Better Auth's captcha plugin with the cloudflare-turnstile provider; endpoints listed explicitly rather than relying on defaults. /reset-password is intentionally excluded — it is reached only via a single-use emailed token. - Add an explicit-render Turnstile widget component. Tokens are single-use, so each form resets the challenge after a failed submit; submit stays disabled until a token is held. - Read the site key server-side and pass it down as a prop, so rotating it does not require a rebuild. - Fail fast in production when TURNSTILE_SECRET_KEY is missing, and when a secret is set without a site key (that combination would demand a token no form can produce, locking every user out). - Pass a throwaway secret during `next build` in the Dockerfile, mirroring the existing BETTER_AUTH_SECRET treatment, so image builds don't need it. CSP fixes in middleware (these blocked Turnstile entirely): - Add frame-src for challenges.cloudflare.com. Without it the widget's iframe fell back to default-src 'self' and was blocked outright. - Allow 'unsafe-eval' and websockets in DEVELOPMENT only. `next dev` compiles with eval(), so the strict policy threw EvalError and killed hydration — no client JS ran at all, which also meant form submit handlers never fired. Production policy is unchanged and still strict. Also included (concurrent work in the tree): - Admin organizations pages and lib/admin/orgs. - Episode moderation migration, SEO metadata (sitemap, robots, JSON-LD, OG/Twitter images, manifest), Umami analytics, not-found page. Local dev database: docker-compose.dev.yml provisions Postgres 18 on port 5443 (5432-5442 are in use by other local projects). Note: `npx tsc --noEmit` currently fails in app/(app)/team/page.tsx — an `invitations` prop the component does not accept. This predates the commit and will fail `next build` until fixed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
119 lines
6.2 KiB
TypeScript
119 lines
6.2 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { LegalDoc, type LegalSection } from "@/components/marketing/legal-doc";
|
|
import { pageMetadata } from "@/lib/seo";
|
|
|
|
/** Shared by the page metadata and the document's structured data. */
|
|
const PATH = "/terms";
|
|
const DESCRIPTION =
|
|
"The Terms of Service governing your use of Podcast Distribution AI — accounts, plans and billing, acceptable use, content ownership, warranties and liability.";
|
|
|
|
export const metadata: Metadata = pageMetadata({
|
|
title: "Terms of Service",
|
|
description: DESCRIPTION,
|
|
path: PATH,
|
|
});
|
|
|
|
const UPDATED = "June 7, 2026";
|
|
|
|
const SECTIONS: LegalSection[] = [
|
|
{
|
|
heading: "Acceptance of these terms",
|
|
paragraphs: [
|
|
"By creating an account or using Podcast Distribution AI (the \"Service\"), you agree to these Terms of Service. If you are using the Service on behalf of an organization, you represent that you are authorized to bind that organization to these terms.",
|
|
],
|
|
},
|
|
{
|
|
heading: "The Service",
|
|
paragraphs: [
|
|
"Podcast Distribution AI is an AI platform that turns a topic into a produced podcast episode — writing the script, synthesizing multi-voice audio, and generating cover art — and helps you repurpose that content. Features and limits vary by plan and may change as we improve the Service.",
|
|
],
|
|
},
|
|
{
|
|
heading: "Accounts and eligibility",
|
|
paragraphs: [
|
|
"You must provide accurate account information, keep your credentials and API keys confidential, and are responsible for all activity under your account. You must be old enough to form a binding contract in your jurisdiction. Notify us promptly of any unauthorized use.",
|
|
],
|
|
},
|
|
{
|
|
heading: "Acceptable use",
|
|
paragraphs: [
|
|
"You agree not to use the Service to create or distribute content that is illegal, infringing, deceptive, hateful, harassing, sexually exploitative, or that impersonates a real person's voice or identity without authorization. You may not attempt to bypass usage limits, security controls, or rate limits, or use the Service to build a competing model.",
|
|
],
|
|
bullets: [
|
|
"We screen topics and generated scripts with automated moderation and may flag, hold, or remove content that violates these terms.",
|
|
"We may suspend or terminate accounts that abuse the Service or put it, our providers, or other users at risk.",
|
|
],
|
|
},
|
|
{
|
|
heading: "AI-generated content and ownership",
|
|
paragraphs: [
|
|
"Subject to your compliance with these terms and the terms of our AI providers, you own the scripts, audio, and artwork you generate and are responsible for how you use and publish them. AI output can be inaccurate, biased, or unintentionally similar to existing works — you are responsible for reviewing it for accuracy, rights, and suitability before publishing. The Service and generated output are provided on an \"as is\" basis.",
|
|
],
|
|
},
|
|
{
|
|
heading: "Plans, billing, and cancellation",
|
|
paragraphs: [
|
|
"Paid plans are billed in advance through Stripe or PayPal on a recurring basis until cancelled. By subscribing you authorize us and our processors to charge your payment method for each renewal at the then-current price. You can cancel at any time from the billing page or provider portal; cancellation takes effect at the end of the current billing period. Except where required by law, payments are non-refundable.",
|
|
],
|
|
},
|
|
{
|
|
heading: "Usage limits",
|
|
paragraphs: [
|
|
"Each plan includes monthly allowances for scripts, audio, artwork, repurposing, seats, and maximum episode length. Allowances reset at the start of each calendar month and are enforced at generation time. Exceeding a limit pauses the relevant feature until the next period or until you upgrade.",
|
|
],
|
|
},
|
|
{
|
|
heading: "API access",
|
|
paragraphs: [
|
|
"Eligible plans may access the Podcast Distribution AI API using keys you generate. Keep keys secret; requests are attributed to, and count against, the owning account, and are subject to rate and usage limits. We may revoke keys that are abused.",
|
|
],
|
|
},
|
|
{
|
|
heading: "Third-party services",
|
|
paragraphs: [
|
|
"The Service relies on third parties including OpenAI, ElevenLabs, Stripe, PayPal, and Resend. Your use of features powered by these providers is also subject to their terms, and we are not responsible for their acts or omissions.",
|
|
],
|
|
},
|
|
{
|
|
heading: "Disclaimers and limitation of liability",
|
|
paragraphs: [
|
|
"To the maximum extent permitted by law, the Service is provided without warranties of any kind, and Podcast Distribution AI is not liable for indirect, incidental, or consequential damages, or for any loss of data, profits, or goodwill. Our total liability for any claim relating to the Service is limited to the amount you paid us in the twelve months before the claim.",
|
|
],
|
|
},
|
|
{
|
|
heading: "Termination",
|
|
paragraphs: [
|
|
"You may stop using the Service and delete your account at any time. We may suspend or terminate access if you breach these terms or to protect the Service. Provisions that by their nature should survive termination (such as ownership, disclaimers, and limitations of liability) will survive.",
|
|
],
|
|
},
|
|
{
|
|
heading: "Changes to these terms",
|
|
paragraphs: [
|
|
"We may update these terms as the Service evolves. Material changes will be reflected by updating the date above, and your continued use after changes take effect constitutes acceptance.",
|
|
],
|
|
},
|
|
{
|
|
heading: "Governing law",
|
|
paragraphs: [
|
|
"These terms are governed by the laws of the jurisdiction in which Podcast Distribution AI is established, without regard to conflict-of-laws rules. Nothing here limits any non-waivable rights you have under your local law.",
|
|
],
|
|
},
|
|
{
|
|
heading: "Contact",
|
|
paragraphs: ["Questions about these terms? Email legal@podcastdistributionai.com."],
|
|
},
|
|
];
|
|
|
|
export default function TermsPage() {
|
|
return (
|
|
<LegalDoc
|
|
title="Terms of Service"
|
|
updated={UPDATED}
|
|
intro="These Terms of Service govern your access to and use of Podcast Distribution AI. Please read them carefully — they include important information about your rights, billing, acceptable use, and the limits of our liability."
|
|
sections={SECTIONS}
|
|
path={PATH}
|
|
description={DESCRIPTION}
|
|
/>
|
|
);
|
|
}
|