diff --git a/frontend/src/config/pricingConfig.tsx b/frontend/src/config/pricingConfig.tsx
index f85a20b00..b5978274f 100644
--- a/frontend/src/config/pricingConfig.tsx
+++ b/frontend/src/config/pricingConfig.tsx
@@ -24,41 +24,45 @@ export const PRICING_PLANS: PricingPlan[] = [
{
text: "25 messages per week",
included: true,
- icon:
+ icon:
},
{
text: "End-to-end encryption",
included: true,
- icon:
+ icon:
},
{
text: "Access to core AI features",
included: true,
- icon:
+ icon:
},
{
text: "Search Chat History",
included: true,
- icon:
+ icon:
},
- { text: "Rename Chats", included: true, icon: },
- { text: "Image Upload", included: false, icon: },
+ {
+ text: "Rename Chats",
+ included: true,
+ icon:
+ },
+ { text: "Image Upload", included: false, icon: },
{
text: "Document Upload (PDF, TXT, MD)",
included: false,
- icon:
+ icon:
},
{
text: "Voice Recording (Whisper)",
included: false,
- icon:
+ icon:
},
{
text: "Paid AI models including Gemma 4 31B, GLM 5.2, and Kimi K2.6",
included: false,
- icon:
+ icon:
},
- { text: "API Access", included: false, icon: }
+ { text: "API Access", included: false, icon: }
],
ctaText: "Start Free"
},
@@ -70,40 +74,44 @@ export const PRICING_PLANS: PricingPlan[] = [
{
text: "All features from Free",
included: true,
- icon:
+ icon:
},
{
text: "Enough messages for casual use",
included: true,
- icon:
+ icon:
},
{
text: "AI Naming of Chats",
included: true,
- icon:
+ icon:
},
{
text: "Gemma 4 31B",
included: true,
- icon:
+ icon:
+ },
+ {
+ text: "Image Upload",
+ included: true,
+ icon:
},
- { text: "Image Upload", included: true, icon: },
{
text: "Document Upload (PDF, TXT, MD)",
included: false,
- icon:
+ icon:
},
{
text: "Voice Recording (Whisper)",
included: false,
- icon:
+ icon:
},
{
text: "GLM 5.2 + Kimi K2.6",
included: false,
- icon:
+ icon:
},
- { text: "API Access", included: false, icon: }
+ { text: "API Access", included: false, icon: }
],
ctaText: "Start Chatting"
},
@@ -115,33 +123,37 @@ export const PRICING_PLANS: PricingPlan[] = [
{
text: "All features from Free",
included: true,
- icon:
+ icon:
},
{
text: "Generous usage for power users",
included: true,
- icon:
+ icon:
+ },
+ {
+ text: "Image Upload",
+ included: true,
+ icon:
},
- { text: "Image Upload", included: true, icon: },
{
text: "Document Upload (PDF, TXT, MD)",
included: true,
- icon:
+ icon:
},
{
text: "Voice Recording (Whisper Large v3)",
included: true,
- icon:
+ icon:
},
{
text: "All AI models including GLM 5.2 and Kimi K2.6",
included: true,
- icon:
+ icon:
},
{
text: "API Access (use plan credits via API)",
included: true,
- icon:
+ icon:
}
],
ctaText: "Start Chatting",
@@ -155,43 +167,47 @@ export const PRICING_PLANS: PricingPlan[] = [
{
text: "All features from Pro",
included: true,
- icon:
+ icon:
},
{
text: "20x more usage than Pro",
included: true,
- icon:
+ icon:
},
{
text: "Priority support",
included: true,
- icon:
+ icon:
},
{
text: "Early Access to features and models",
included: true,
- icon:
+ icon:
+ },
+ {
+ text: "Image Upload",
+ included: true,
+ icon:
},
- { text: "Image Upload", included: true, icon: },
{
text: "Document Upload (PDF, TXT, MD)",
included: true,
- icon:
+ icon:
},
{
text: "Voice Recording (Whisper Large v3)",
included: true,
- icon:
+ icon:
},
{
text: "All AI models including GLM 5.2 and Kimi K2.6",
included: true,
- icon:
+ icon:
},
{
text: "API Access (use plan credits via API)",
included: true,
- icon:
+ icon:
}
],
ctaText: "Start Chatting"
@@ -204,53 +220,57 @@ export const PRICING_PLANS: PricingPlan[] = [
{
text: "All features from Pro",
included: true,
- icon:
+ icon:
},
{
text: "2x more usage than Pro per team member",
included: true,
- icon:
+ icon:
},
{
text: "Priority support",
included: true,
- icon:
+ icon:
},
{
text: "Unified billing",
included: true,
- icon:
+ icon:
},
{
text: "Pool chat credits among team",
included: true,
- icon:
+ icon:
},
{
text: "Early Access to features and models",
included: true,
- icon:
+ icon:
+ },
+ {
+ text: "Image Upload",
+ included: true,
+ icon:
},
- { text: "Image Upload", included: true, icon: },
{
text: "Document Upload (PDF, TXT, MD)",
included: true,
- icon:
+ icon:
},
{
text: "Voice Recording (Whisper Large v3)",
included: true,
- icon:
+ icon:
},
{
text: "All AI models including GLM 5.2 and Kimi K2.6",
included: true,
- icon:
+ icon:
},
{
text: "API Access (use plan credits via API)",
included: true,
- icon:
+ icon:
}
],
ctaText: "Start Chatting"
diff --git a/frontend/src/routes/pricing.tsx b/frontend/src/routes/pricing.tsx
index f2c9ddf51..eec1ac784 100644
--- a/frontend/src/routes/pricing.tsx
+++ b/frontend/src/routes/pricing.tsx
@@ -1,12 +1,19 @@
import { createFileRoute, useNavigate } from "@tanstack/react-router";
-import { useState, useEffect, useCallback } from "react";
+import { useState, useEffect, useCallback, type ReactNode } from "react";
import { useOpenSecret } from "@opensecret/react";
-import { TopNav } from "@/components/TopNav";
import { FullPageMain } from "@/components/FullPageMain";
import { getBillingService } from "@/billing/billingService";
import { useQuery } from "@tanstack/react-query";
-import { MarketingHeader } from "@/components/MarketingHeader";
-import { Loader2, Check, AlertTriangle, AlertCircle, Bitcoin, Tag } from "lucide-react";
+import {
+ Loader2,
+ Check,
+ AlertTriangle,
+ AlertCircle,
+ Bitcoin,
+ Tag,
+ ChevronDown,
+ ArrowLeft
+} from "lucide-react";
import { Alert, AlertDescription } from "@/components/ui/alert";
import type { DiscountResponse } from "@/billing/billingApi";
import { Badge } from "@/components/ui/badge";
@@ -17,11 +24,14 @@ import { PRICING_PLANS } from "@/config/pricingConfig";
import { VerificationModal } from "@/components/VerificationModal";
import { TeamSeatDialog } from "@/components/TeamSeatDialog";
import { isIOS, isAndroid, isMobile, isTauri } from "@/utils/platform";
+import { cn } from "@/utils/utils";
import packageJson from "../../package.json";
// File type constants for upload features
const SUPPORTED_IMAGE_FORMATS = [".jpg", ".png", ".webp"];
const SUPPORTED_DOCUMENT_FORMATS = [".pdf", ".txt", ".md"];
+const pricingPageClassName =
+ "min-h-dvh bg-[#e2e2e2] py-12 pt-10 text-[#221a18] dark:bg-background dark:text-foreground sm:pt-14";
type PricingSearchParams = {
selected_plan?: string;
@@ -42,33 +52,83 @@ interface Product {
function PricingSkeletonCard() {
return (
-
-
-
-
-
-
-
-
+
);
}
+function PricingHero() {
+ return (
+
+
+
+
+ Simple, Transparent Pricing
+
+
+
Start with our free tier and upgrade as you grow.
+
All plans include end-to-end encrypted AI chat.
+
+
+
+ );
+}
+
+function PricingReturnButton({
+ isLoggedIn,
+ onClick
+}: {
+ isLoggedIn: boolean;
+ onClick: () => void;
+}) {
+ return (
+
+
+
+ {isLoggedIn ? "Chat" : "Home"}
+
+
+ );
+}
+
+function FAQItem({ question, children }: { question: string; children: ReactNode }) {
+ return (
+
+
+ {question}
+
+
+
+ {children}
+
+
+ );
+}
+
function PricingFAQ() {
return (
-
-
FAQ
+
+ FAQ
-
-
- What is the difference between the plans?
-
-
+
+
The plans are sized to grow with your needs.
@@ -81,57 +141,42 @@ function PricingFAQ() {
Enterprise: Message us at support@trymaple.ai
-
+
-
-
- How private is Maple?
-
-
+
+
Encrypted end to end. Maple uses confidential computing to secure the code that access
user data and LLM data. Your account has its own private key that encrypts your chats
and the responses from the AI model. Every user has their own personal data vault that
can't be read by anyone else, not even us.
-
+
-
-
- How do you synchronize my chat history across devices?
-
-
+
+
We use a secure synchronization protocol that ensures your encrypted chat history is
synced across all your devices. This means that you can start a conversation on one
device and pick it up where you left off on another device, without compromising your
security or privacy.
-
+
-
-
- Is this safe to use with my company's confidential information?
-
-
+
+
The service is encrypted end-to-end, so your confidential information is private between
you and the AI. Consult your company's security policy.
-
+
-
-
- Can companies use my data to train their AI models?
-
-
+
+
No. When you chat with AI in Maple, nobody knows what is being said back and forth. Thus
data is not able to be used for training new AI models by any company.
-
+
-
-
- Which file types are supported for document and image upload?
-
-
+
+
We support a range of file types for both images and documents.
Images:
@@ -155,13 +200,10 @@ function PricingFAQ() {
There is a 1 file limit per chat prompt with a 10MB file size limit per file.
-
+
-
-
- Can I use my subscription for API access?
-
-
+
+
Yes! Pro, Max, and Team plans include API access. Your subscription credits work
seamlessly with the API.
@@ -172,17 +214,14 @@ function PricingFAQ() {
Purchase extra credits to extend your usage anytime
-
+
-
-
- How did you build this?
-
-
+
+
Maple is made using{" "}
OpenSecret
@@ -191,9 +230,9 @@ function PricingFAQ() {
privacy to users by turning on encryption by default. If you're a developer, go see how
easy it is to build with.
-
+
-
+
);
}
@@ -684,23 +723,11 @@ function PricingPage() {
if (productsLoading || (isLoggedIn && isBillingStatusLoading)) {
return (
<>
-
-
-
- Simple, Transparent Pricing
-
- }
- subtitle={
-
-
Start with our free tier and upgrade as you grow.
-
All plans include end-to-end encrypted AI chat.
-
- }
- />
+
+ navigate({ to: "/" })} />
+
-
+
@@ -721,28 +748,24 @@ function PricingPage() {
return (
<>
-
-
-
+
+ navigate({ to: "/" })} />
+
-
-
+
+
-
-
+
Unable to Load Pricing
-
{errorMessage}
+
{errorMessage}
window.location.reload()}
- className="mt-4
- dark:bg-white/90 dark:text-black dark:hover:bg-[hsl(var(--purple))]/80 dark:hover:text-[hsl(var(--foreground))] dark:active:bg-white/80
- bg-background text-foreground hover:bg-[hsl(var(--purple))] hover:text-[hsl(var(--foreground))] active:bg-background/80
- border border-[hsl(var(--purple))]/30 hover:border-[hsl(var(--purple))]
- px-8 py-4 rounded-lg text-xl font-light transition-all duration-300
- shadow-[0_0_15px_rgba(var(--purple-rgb),0.2)] hover:shadow-[0_0_25px_rgba(var(--purple-rgb),0.3)]"
+ className="mt-4 h-11 px-8 text-base"
>
Retry
@@ -758,28 +781,16 @@ function PricingPage() {
return (
<>
-
-
-
- Simple, Transparent Pricing
-
- }
- subtitle={
-
-
Start with our free tier and upgrade as you grow.
-
All plans include end-to-end encrypted AI chat.
-
- }
- />
+
+ navigate({ to: "/" })} />
+
{/* Payment Callback Status Messages */}
{success && (
-
-
-
+
+
+
Payment successful! Your subscription has been updated.
@@ -788,9 +799,9 @@ function PricingPage() {
{canceled && (
-
-
-
+
+
Payment canceled. Your subscription remains unchanged.
@@ -810,17 +821,17 @@ function PricingPage() {
{/* Promotion Banner */}
{discount?.active && (
-
-
-
+
+
+
-
{discount.name}
-
+
{discount.name}
+
{discount.description}
-
+
{discount.percent_off}% OFF
@@ -844,7 +855,7 @@ function PricingPage() {
return (
{filteredPlans.map((plan) => {
// Find the matching product from server data
@@ -916,58 +927,71 @@ function PricingPage() {
return (
{plan.popular && !isCurrentPlan && (
-
- Most Popular
-
+
)}
- {isCurrentPlan && (
-
- Current Plan
-
- )}
- {showPromoBadge && (
-
- {promoDiscountPercent}% OFF
-
- )}
- {showBitcoinBadge && (
-
- {bitcoinYearlyDiscountPercent}% OFF
-
- )}
-
-
- {plan.name}
- {useBitcoin && !isFreeplan && !isTeamPlan ? " (Yearly)" : ""}
- {isCurrentPlan && }
-
-
-
- {isTeamPlan && useBitcoin
- ? "Team plan is not available with Bitcoin payment."
- : plan.description}
-
+
+
+ {plan.popular && !isCurrentPlan && (
+
+ Most Popular
+
+ )}
+ {isCurrentPlan && (
+
+ Current Plan
+
+ )}
+ {showPromoBadge && (
+
+ {promoDiscountPercent}% OFF
+
+ )}
+ {showBitcoinBadge && (
+
+ {bitcoinYearlyDiscountPercent}% OFF
+
+ )}
+
+
+
+
+ {plan.name}
+ {useBitcoin && !isFreeplan && !isTeamPlan ? " (Yearly)" : ""}
+ {isCurrentPlan && }
+
+
+
+ {isTeamPlan && useBitcoin
+ ? "Team plan is not available with Bitcoin payment."
+ : plan.description}
+
+
{/* Features List */}
-
+
{plan.features.map((feature, index) => (
-
+
{feature.text !== "" &&
(feature.icon ||
(feature.included ? (
-
+
) : null))}
{feature.text}
@@ -979,46 +1003,40 @@ function PricingPage() {
{!isFreeplan ? (
<>
-
- ${displayPrice}
-
+
${displayPrice}
{(showBitcoinBadge || showPromoBadge) && (
-
+
${monthlyOriginalPrice}
)}
-
-
- {isTeamPlan ? "per user" : ""}
-
-
- per month
-
+
+ {isTeamPlan ? "per user" : ""}
+ per month
-
+
{showBitcoinBadge && (
<>
-
+
Billed yearly at ${yearlyDiscountedPrice}
-
+
Save {bitcoinYearlyDiscountPercent}% with annual billing
>
)}
{showPromoBadge && useBitcoin && !isTeamPlan && (
<>
-
+
Billed yearly at ${yearlyDiscountedPrice}
-
+
Save {promoDiscountPercent}% with annual billing
>
)}
{showPromoBadge && !useBitcoin && (
-
+
{promoDiscountPercent}% off
{promoDurationMonths
? ` for first ${promoDurationMonths} month${promoDurationMonths > 1 ? "s" : ""}`
@@ -1029,15 +1047,17 @@ function PricingPage() {
>
) : (
- ${monthlyPrice}
-
+ ${monthlyPrice}
+
per month
)}
-
handleButtonClick(
product || {
@@ -1062,15 +1082,11 @@ function PricingPage() {
(useBitcoin && isTeamPlan) ||
(isIOSPlatform && !isFreeplan && product?.is_available === false)
}
- className={`w-full
- dark:bg-white/90 dark:text-black dark:hover:bg-[hsl(var(--purple))]/80 dark:hover:text-[hsl(var(--foreground))] dark:active:bg-white/80
- bg-background text-foreground hover:bg-[hsl(var(--purple))] hover:text-[hsl(var(--foreground))] active:bg-background/80
- border border-[hsl(var(--purple))]/30 hover:border-[hsl(var(--purple))]
- px-4 sm:px-8 py-3 sm:py-4 rounded-lg text-lg sm:text-xl font-light
- transition-all duration-300 shadow-[0_0_15px_rgba(var(--purple-rgb),0.2)]
- hover:shadow-[0_0_25px_rgba(var(--purple-rgb),0.3)] disabled:opacity-50
- disabled:cursor-not-allowed flex items-center justify-center gap-2
- group-hover:bg-[hsl(var(--purple))] group-hover:text-[hsl(var(--foreground))] dark:group-hover:text-[hsl(var(--foreground))] dark:group-hover:bg-[hsl(var(--purple))]/80`}
+ className={cn(
+ "h-12 w-full gap-2 text-base",
+ !(plan.popular && !isCurrentPlan) && "bg-white/40 dark:bg-white/0",
+ useBitcoin && isTeamPlan && "cursor-not-allowed"
+ )}
>
{useBitcoin && isTeamPlan
? "Not Available"
@@ -1091,7 +1107,7 @@ function PricingPage() {
}
}
)}
-
+
);
@@ -1100,19 +1116,19 @@ function PricingPage() {
);
})()}
-
+
{!isIOSPlatform && (
navigate({ to: "/redeem" })}
- className="text-base text-foreground/70 hover:text-foreground transition-colors underline underline-offset-4 decoration-foreground/30 hover:decoration-foreground"
+ className="text-sm font-medium text-[#747474] underline underline-offset-4 decoration-neutral-900/20 transition-colors hover:text-[hsl(var(--maple-primary-strong))] hover:decoration-[hsl(var(--maple-primary-strong))] dark:text-muted-foreground dark:decoration-white/20 dark:hover:text-[hsl(var(--maple-primary))] dark:hover:decoration-[hsl(var(--maple-primary))]"
>
Have a subscription pass code?
)}
-
-
-
+
{isGuestUser && (
-
+
Anonymous accounts must pay with Bitcoin (yearly only)
)}