import { buttonVariants } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import { Check, ExternalLink } from "lucide-react"; import { CLOUD_SIGNUP_LINK, DOCS_LINK, GITHUB_LINK } from "./constants"; import NavBar from "./Navbar"; const CONTACT_EMAIL = "mailto:support@karakeep.app"; const pricingTiers = [ { name: "Free", price: "$0", period: "", description: "Trying Karakeep out", features: [ "10 bookmarks", "20MB storage", "Mobile & web apps", "Browser extensions", ], buttonText: "Get Started", buttonVariant: "outline" as const, popular: false, }, { name: "Pro", price: "$4", period: "per month", description: "For serious bookmark collectors", features: [ "50,000 bookmarks", "50GB storage", "AI-powered tagging", "Full-text search", "Mobile & web apps", "Browser extensions", ], buttonText: "Get Started", buttonVariant: "default" as const, popular: true, }, { name: "Self-Hosted", price: "Free", period: "forever", description: "Complete control and privacy", features: [ "Unlimited bookmarks", "Unlimited storage", "Complete data control", "Mobile & web apps", "Browser extensions", "Community support", ], buttonText: "View on GitHub", buttonVariant: "outline" as const, popular: false, isGitHub: true, }, { name: "Corporate", price: "Custom", period: "per seat", description: "For teams and organizations", features: [ "Everything in Pro", "Custom deployment & domain", "Single Sign-On (SSO)", "User management", "Priority support", ], buttonText: "Contact Us", buttonVariant: "outline" as const, popular: false, isContact: true, }, ]; function PricingHeader() { return (

Simple{" "} Pricing

Choose the plan that works best for you

); } function PricingCards() { const renderCard = (tier: (typeof pricingTiers)[number]) => (

{tier.name}

{tier.price} {tier.period && ( /{tier.period} )}

{tier.description}

{tier.isContact ? ( {tier.buttonText} ) : tier.isGitHub ? ( {tier.buttonText} ) : ( {tier.buttonText} )}
); return (
{/* First 3 tiers */}
{pricingTiers.slice(0, 3).map(renderCard)}
{/* Corporate tier - centered below */}
{renderCard(pricingTiers[3])}
); } function FAQ() { const faqs = [ { question: "What happens to my data if I cancel?", answer: "Your data will be available for 30 days after cancellation. You can export your bookmarks at any time.", }, { question: "Are there any restrictions in the self-hosted version?", answer: "No. The selhosted version is completely free, fully-featured, and open source. You just need to provide your own hosting infrastructure.", }, { question: "Do you offer refunds?", answer: "Yes, we offer a 7-day money-back guarantee for all paid plans.", }, { question: "How should I contact you if I have any questions?", answer: "You can reach us at support@karakeep.app", }, ]; return (

Frequently Asked Questions

{faqs.map((faq) => (

{faq.question}

{faq.answer}

))}
); } function Footer() { const currentYear = new Date().getFullYear(); return (
© 2024-{currentYear}{" "} Localhost Labs Ltd
Docs GitHub
); } export default function Pricing() { return (
); }